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"
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;

View File

@ -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;