Added the display auto power off functionality
This commit is contained in:
parent
453f4cdd6e
commit
1e453eb5d8
@ -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;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user