Added the display auto power off functionality
This commit is contained in:
parent
453f4cdd6e
commit
1e453eb5d8
@ -1,8 +1,6 @@
|
||||
#include "ScreenManager.h"
|
||||
|
||||
ScreenManager::ScreenManager(Adafruit_SSD1306 &display, SDCardManager *sdCardManager) : _displayRef(display), _error(OK)
|
||||
, _displayColorInverted(false), _displayDimmed(false), _enabled(true), _refreshRateHz(1), _refreshInterval(1000), _timeRef(0),_forceRefresh(false)
|
||||
, _currentView(NO_CURRENT_VIEW), _tail(NULL)
|
||||
ScreenManager::ScreenManager(Adafruit_SSD1306 &display, SDCardManager *sdCardManager) : _displayRef(display)
|
||||
, _viewNotFound{&(displayError), (ErrorInfo *)malloc(sizeof(ErrorInfo)), RESERVED_VIEW_UID, NULL, NULL}
|
||||
, _viewFuncUndefined{&(displayError), (ErrorInfo *)malloc(sizeof(ErrorInfo)), RESERVED_VIEW_UID, NULL, NULL}
|
||||
, _currentViewUndefined{&(displayError), (ErrorInfo *)malloc(sizeof(ErrorInfo)), RESERVED_VIEW_UID, NULL, NULL}
|
||||
@ -46,6 +44,7 @@ boolean ScreenManager::applyCfgFromSD()
|
||||
_displayRef.invertDisplay(cfgDictionary->get("INVERTED")->booleanValue());
|
||||
_displayRef.dim(cfgDictionary->get("DIMMED")->booleanValue());
|
||||
_displayRef.setTextColor(WHITE);
|
||||
setAutoOFFDelay(cfgDictionary->get("AUTO_OFF")->uintValue());
|
||||
|
||||
delete cfgDictionary;
|
||||
return true;
|
||||
@ -212,6 +211,13 @@ ScreenManager::ViewLink* ScreenManager::getLinkByUID(ViewLinkedList viewLinkedLi
|
||||
|
||||
void ScreenManager::run()
|
||||
{
|
||||
//We handle the auto off logic here
|
||||
if(_autoOFFDelay && _enabled)
|
||||
{
|
||||
if(millis() - _autoOFFDelayRef > _autoOFFDelay)
|
||||
setEnabled(false);
|
||||
}
|
||||
|
||||
if((millis() - _timeRef < _refreshInterval && !_forceRefresh) || !_enabled) return;
|
||||
|
||||
_timeRef = millis();
|
||||
@ -262,7 +268,8 @@ void ScreenManager::forceRefresh()
|
||||
|
||||
boolean ScreenManager::displayView(const uint8_t UID)
|
||||
{
|
||||
if(!_enabled) return true;
|
||||
_autoOFFDelayRef = millis();
|
||||
if(!_enabled) return false;
|
||||
_forceRefresh = true;
|
||||
ViewLink *viewLink = getLinkByUID(_viewLinkedList, UID);
|
||||
|
||||
@ -290,6 +297,8 @@ boolean ScreenManager::displayView(const uint8_t UID)
|
||||
|
||||
void ScreenManager::displayNextView()
|
||||
{
|
||||
_autoOFFDelayRef = millis();
|
||||
if(!_enabled) return;
|
||||
_forceRefresh = true;
|
||||
_error = OK;
|
||||
if(isListEmpty(_viewLinkedList))return;
|
||||
@ -323,6 +332,8 @@ void ScreenManager::displayNextView()
|
||||
|
||||
void ScreenManager::displayPreviousView()
|
||||
{
|
||||
_autoOFFDelayRef = millis();
|
||||
if(!_enabled) return;
|
||||
_forceRefresh = true;
|
||||
_error = OK;
|
||||
if(isListEmpty(_tail))return;
|
||||
@ -368,11 +379,14 @@ void ScreenManager::dimDisplay(const boolean dimmed)
|
||||
|
||||
void ScreenManager::sleep()
|
||||
{
|
||||
_enabled = false;
|
||||
_displayRef.sleep();
|
||||
}
|
||||
|
||||
void ScreenManager::wakeUp()
|
||||
{
|
||||
_enabled = true;
|
||||
_autoOFFDelayRef = millis();
|
||||
_displayRef.wakeUp();
|
||||
}
|
||||
|
||||
@ -423,13 +437,17 @@ void ScreenManager::clearViews()
|
||||
|
||||
void ScreenManager::setEnabled(boolean value)
|
||||
{
|
||||
_enabled = value;
|
||||
if(value)
|
||||
wakeUp();
|
||||
else
|
||||
sleep();
|
||||
}
|
||||
|
||||
void ScreenManager::setAutoOFFDelay(const uint64_t delay)
|
||||
{
|
||||
_autoOFFDelay = delay;
|
||||
}
|
||||
|
||||
boolean ScreenManager::getEnabled()
|
||||
{
|
||||
return _enabled;
|
||||
@ -454,6 +472,11 @@ int ScreenManager::getCurrentViewUID() const
|
||||
return _currentView->UID < 0 ? -1 : _currentView->UID;
|
||||
}
|
||||
|
||||
uint64_t ScreenManager::getAutoOFFDelay() const
|
||||
{
|
||||
return _autoOFFDelay;
|
||||
}
|
||||
|
||||
boolean ScreenManager::displayError(Adafruit_SSD1306 &display, void *pData)
|
||||
{
|
||||
const ErrorInfo *errorInfo = (ErrorInfo *) pData;
|
||||
|
@ -38,6 +38,7 @@ class ScreenManager
|
||||
void sleep();
|
||||
void wakeUp();
|
||||
void setEnabled(boolean value);
|
||||
void setAutoOFFDelay(const uint64_t delay);
|
||||
boolean getEnabled();
|
||||
boolean init();
|
||||
void run();
|
||||
@ -48,6 +49,7 @@ class ScreenManager
|
||||
Orientation getDisplayOrientation() const;
|
||||
boolean isDisplayDimmed() const;
|
||||
int getCurrentViewUID() const;
|
||||
uint64_t getAutoOFFDelay() const;
|
||||
unsigned char getViewCount();
|
||||
|
||||
|
||||
@ -66,15 +68,15 @@ class ScreenManager
|
||||
|
||||
Adafruit_SSD1306 &_displayRef;
|
||||
ViewLinkedList _viewLinkedList;
|
||||
Error _error;
|
||||
boolean _displayColorInverted;
|
||||
boolean _displayDimmed;
|
||||
boolean _enabled;
|
||||
uint8_t _refreshRateHz;
|
||||
uint16_t _refreshInterval;
|
||||
uint64_t _timeRef;
|
||||
boolean _forceRefresh;
|
||||
ViewLink *_currentView, *_tail;
|
||||
Error _error = OK;
|
||||
boolean _displayColorInverted = false;
|
||||
boolean _displayDimmed = false;
|
||||
boolean _enabled = true;
|
||||
uint8_t _refreshRateHz = 1;
|
||||
uint16_t _refreshInterval = 1000;
|
||||
uint64_t _timeRef = 0, _autoOFFDelayRef = 0, _autoOFFDelay = 0;
|
||||
boolean _forceRefresh = false;
|
||||
ViewLink *_currentView = NO_CURRENT_VIEW, *_tail = nullptr;
|
||||
ViewLink _viewNotFound, _viewFuncUndefined, _currentViewUndefined, _viewFunctionFailedToExecute;
|
||||
SDCardManager *_sdCardManager;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user