Added the display auto power off functionality

This commit is contained in:
Th3maz1ng 2022-04-17 21:50:05 +02:00
parent 453f4cdd6e
commit 1e453eb5d8
2 changed files with 39 additions and 14 deletions

View File

@ -1,8 +1,6 @@
#include "ScreenManager.h" #include "ScreenManager.h"
ScreenManager::ScreenManager(Adafruit_SSD1306 &display, SDCardManager *sdCardManager) : _displayRef(display), _error(OK) ScreenManager::ScreenManager(Adafruit_SSD1306 &display, SDCardManager *sdCardManager) : _displayRef(display)
, _displayColorInverted(false), _displayDimmed(false), _enabled(true), _refreshRateHz(1), _refreshInterval(1000), _timeRef(0),_forceRefresh(false)
, _currentView(NO_CURRENT_VIEW), _tail(NULL)
, _viewNotFound{&(displayError), (ErrorInfo *)malloc(sizeof(ErrorInfo)), RESERVED_VIEW_UID, NULL, NULL} , _viewNotFound{&(displayError), (ErrorInfo *)malloc(sizeof(ErrorInfo)), RESERVED_VIEW_UID, NULL, NULL}
, _viewFuncUndefined{&(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} , _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.invertDisplay(cfgDictionary->get("INVERTED")->booleanValue());
_displayRef.dim(cfgDictionary->get("DIMMED")->booleanValue()); _displayRef.dim(cfgDictionary->get("DIMMED")->booleanValue());
_displayRef.setTextColor(WHITE); _displayRef.setTextColor(WHITE);
setAutoOFFDelay(cfgDictionary->get("AUTO_OFF")->uintValue());
delete cfgDictionary; delete cfgDictionary;
return true; return true;
@ -212,6 +211,13 @@ ScreenManager::ViewLink* ScreenManager::getLinkByUID(ViewLinkedList viewLinkedLi
void ScreenManager::run() 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; if((millis() - _timeRef < _refreshInterval && !_forceRefresh) || !_enabled) return;
_timeRef = millis(); _timeRef = millis();
@ -262,7 +268,8 @@ void ScreenManager::forceRefresh()
boolean ScreenManager::displayView(const uint8_t UID) boolean ScreenManager::displayView(const uint8_t UID)
{ {
if(!_enabled) return true; _autoOFFDelayRef = millis();
if(!_enabled) return false;
_forceRefresh = true; _forceRefresh = true;
ViewLink *viewLink = getLinkByUID(_viewLinkedList, UID); ViewLink *viewLink = getLinkByUID(_viewLinkedList, UID);
@ -290,6 +297,8 @@ boolean ScreenManager::displayView(const uint8_t UID)
void ScreenManager::displayNextView() void ScreenManager::displayNextView()
{ {
_autoOFFDelayRef = millis();
if(!_enabled) return;
_forceRefresh = true; _forceRefresh = true;
_error = OK; _error = OK;
if(isListEmpty(_viewLinkedList))return; if(isListEmpty(_viewLinkedList))return;
@ -323,6 +332,8 @@ void ScreenManager::displayNextView()
void ScreenManager::displayPreviousView() void ScreenManager::displayPreviousView()
{ {
_autoOFFDelayRef = millis();
if(!_enabled) return;
_forceRefresh = true; _forceRefresh = true;
_error = OK; _error = OK;
if(isListEmpty(_tail))return; if(isListEmpty(_tail))return;
@ -368,11 +379,14 @@ void ScreenManager::dimDisplay(const boolean dimmed)
void ScreenManager::sleep() void ScreenManager::sleep()
{ {
_enabled = false;
_displayRef.sleep(); _displayRef.sleep();
} }
void ScreenManager::wakeUp() void ScreenManager::wakeUp()
{ {
_enabled = true;
_autoOFFDelayRef = millis();
_displayRef.wakeUp(); _displayRef.wakeUp();
} }
@ -423,13 +437,17 @@ void ScreenManager::clearViews()
void ScreenManager::setEnabled(boolean value) void ScreenManager::setEnabled(boolean value)
{ {
_enabled = value;
if(value) if(value)
wakeUp(); wakeUp();
else else
sleep(); sleep();
} }
void ScreenManager::setAutoOFFDelay(const uint64_t delay)
{
_autoOFFDelay = delay;
}
boolean ScreenManager::getEnabled() boolean ScreenManager::getEnabled()
{ {
return _enabled; return _enabled;
@ -454,6 +472,11 @@ int ScreenManager::getCurrentViewUID() const
return _currentView->UID < 0 ? -1 : _currentView->UID; return _currentView->UID < 0 ? -1 : _currentView->UID;
} }
uint64_t ScreenManager::getAutoOFFDelay() const
{
return _autoOFFDelay;
}
boolean ScreenManager::displayError(Adafruit_SSD1306 &display, void *pData) boolean ScreenManager::displayError(Adafruit_SSD1306 &display, void *pData)
{ {
const ErrorInfo *errorInfo = (ErrorInfo *) pData; const ErrorInfo *errorInfo = (ErrorInfo *) pData;

View File

@ -38,6 +38,7 @@ class ScreenManager
void sleep(); void sleep();
void wakeUp(); void wakeUp();
void setEnabled(boolean value); void setEnabled(boolean value);
void setAutoOFFDelay(const uint64_t delay);
boolean getEnabled(); boolean getEnabled();
boolean init(); boolean init();
void run(); void run();
@ -48,6 +49,7 @@ class ScreenManager
Orientation getDisplayOrientation() const; Orientation getDisplayOrientation() const;
boolean isDisplayDimmed() const; boolean isDisplayDimmed() const;
int getCurrentViewUID() const; int getCurrentViewUID() const;
uint64_t getAutoOFFDelay() const;
unsigned char getViewCount(); unsigned char getViewCount();
@ -66,15 +68,15 @@ class ScreenManager
Adafruit_SSD1306 &_displayRef; Adafruit_SSD1306 &_displayRef;
ViewLinkedList _viewLinkedList; ViewLinkedList _viewLinkedList;
Error _error; Error _error = OK;
boolean _displayColorInverted; boolean _displayColorInverted = false;
boolean _displayDimmed; boolean _displayDimmed = false;
boolean _enabled; boolean _enabled = true;
uint8_t _refreshRateHz; uint8_t _refreshRateHz = 1;
uint16_t _refreshInterval; uint16_t _refreshInterval = 1000;
uint64_t _timeRef; uint64_t _timeRef = 0, _autoOFFDelayRef = 0, _autoOFFDelay = 0;
boolean _forceRefresh; boolean _forceRefresh = false;
ViewLink *_currentView, *_tail; ViewLink *_currentView = NO_CURRENT_VIEW, *_tail = nullptr;
ViewLink _viewNotFound, _viewFuncUndefined, _currentViewUndefined, _viewFunctionFailedToExecute; ViewLink _viewNotFound, _viewFuncUndefined, _currentViewUndefined, _viewFunctionFailedToExecute;
SDCardManager *_sdCardManager; SDCardManager *_sdCardManager;