From 1e453eb5d881844d6307cd4007ebd76631af16b1 Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Sun, 17 Apr 2022 21:50:05 +0200 Subject: [PATCH] Added the display auto power off functionality --- src/app/ScreenManager.cpp | 33 ++++++++++++++++++++++++++++----- src/app/ScreenManager.h | 20 +++++++++++--------- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/app/ScreenManager.cpp b/src/app/ScreenManager.cpp index 88cbc7e..b3b9ce4 100644 --- a/src/app/ScreenManager.cpp +++ b/src/app/ScreenManager.cpp @@ -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; diff --git a/src/app/ScreenManager.h b/src/app/ScreenManager.h index 441f3db..061a792 100644 --- a/src/app/ScreenManager.h +++ b/src/app/ScreenManager.h @@ -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;