Migrate Display_Graphic to TaskScheduler

This commit is contained in:
Thomas Basler 2023-11-20 22:02:44 +01:00
parent ad1f1b690c
commit ab8679e7b9
3 changed files with 62 additions and 57 deletions

View File

@ -2,6 +2,7 @@
#pragma once #pragma once
#include "defaults.h" #include "defaults.h"
#include <TaskSchedulerDeclarations.h>
#include <U8g2lib.h> #include <U8g2lib.h>
enum DisplayType_t { enum DisplayType_t {
@ -16,8 +17,7 @@ public:
DisplayGraphicClass(); DisplayGraphicClass();
~DisplayGraphicClass(); ~DisplayGraphicClass();
void init(DisplayType_t type, uint8_t data, uint8_t clk, uint8_t cs, uint8_t reset); void init(Scheduler* scheduler, DisplayType_t type, uint8_t data, uint8_t clk, uint8_t cs, uint8_t reset);
void loop();
void setContrast(uint8_t contrast); void setContrast(uint8_t contrast);
void setStatus(bool turnOn); void setStatus(bool turnOn);
void setOrientation(uint8_t rotation = DISPLAY_ROTATION); void setOrientation(uint8_t rotation = DISPLAY_ROTATION);
@ -28,10 +28,13 @@ public:
bool enableScreensaver = true; bool enableScreensaver = true;
private: private:
void loop();
void printText(const char* text, uint8_t line); void printText(const char* text, uint8_t line);
void calcLineHeights(); void calcLineHeights();
void setFont(uint8_t line); void setFont(uint8_t line);
Task _loopTask;
U8G2* _display; U8G2* _display;
bool _displayTurnedOn; bool _displayTurnedOn;
@ -41,7 +44,6 @@ private:
uint8_t _mExtra; uint8_t _mExtra;
uint16_t _period = 1000; uint16_t _period = 1000;
uint16_t _interval = 60000; // interval at which to power save (milliseconds) uint16_t _interval = 60000; // interval at which to power save (milliseconds)
uint32_t _lastDisplayUpdate = 0;
uint32_t _previousMillis = 0; uint32_t _previousMillis = 0;
char _fmtText[32]; char _fmtText[32];
bool _isLarge = false; bool _isLarge = false;

View File

@ -39,7 +39,7 @@ DisplayGraphicClass::~DisplayGraphicClass()
delete _display; delete _display;
} }
void DisplayGraphicClass::init(DisplayType_t type, uint8_t data, uint8_t clk, uint8_t cs, uint8_t reset) void DisplayGraphicClass::init(Scheduler* scheduler, DisplayType_t type, uint8_t data, uint8_t clk, uint8_t cs, uint8_t reset)
{ {
_display_type = type; _display_type = type;
if (_display_type > DisplayType_t::None) { if (_display_type > DisplayType_t::None) {
@ -49,6 +49,12 @@ void DisplayGraphicClass::init(DisplayType_t type, uint8_t data, uint8_t clk, ui
setContrast(DISPLAY_CONTRAST); setContrast(DISPLAY_CONTRAST);
setStatus(true); setStatus(true);
} }
scheduler->addTask(_loopTask);
_loopTask.setCallback(std::bind(&DisplayGraphicClass::loop, this));
_loopTask.setIterations(TASK_FOREVER);
_loopTask.setInterval(_period);
_loopTask.enable();
} }
void DisplayGraphicClass::calcLineHeights() void DisplayGraphicClass::calcLineHeights()
@ -137,62 +143,60 @@ void DisplayGraphicClass::loop()
return; return;
} }
if ((millis() - _lastDisplayUpdate) > _period) { _loopTask.setInterval(_period);
_display->clearBuffer(); _display->clearBuffer();
bool displayPowerSave = false; bool displayPowerSave = false;
//=====> Actual Production ========== //=====> Actual Production ==========
if (Datastore.getIsAtLeastOneReachable()) { if (Datastore.getIsAtLeastOneReachable()) {
displayPowerSave = false; displayPowerSave = false;
if (Datastore.getTotalAcPowerEnabled() > 999) { if (Datastore.getTotalAcPowerEnabled() > 999) {
snprintf(_fmtText, sizeof(_fmtText), i18n_current_power_kw[_display_language], (Datastore.getTotalAcPowerEnabled() / 1000)); snprintf(_fmtText, sizeof(_fmtText), i18n_current_power_kw[_display_language], (Datastore.getTotalAcPowerEnabled() / 1000));
} else {
snprintf(_fmtText, sizeof(_fmtText), i18n_current_power_w[_display_language], Datastore.getTotalAcPowerEnabled());
}
printText(_fmtText, 0);
_previousMillis = millis();
}
//<=======================
//=====> Offline ===========
else {
printText(i18n_offline[_display_language], 0);
// check if it's time to enter power saving mode
if (millis() - _previousMillis >= (_interval * 2)) {
displayPowerSave = enablePowerSafe;
}
}
//<=======================
//=====> Today & Total Production =======
snprintf(_fmtText, sizeof(_fmtText), i18n_yield_today_wh[_display_language], Datastore.getTotalAcYieldDayEnabled());
printText(_fmtText, 1);
snprintf(_fmtText, sizeof(_fmtText), i18n_yield_total_kwh[_display_language], Datastore.getTotalAcYieldTotalEnabled());
printText(_fmtText, 2);
//<=======================
//=====> IP or Date-Time ========
if (!(_mExtra % 10) && NetworkSettings.localIP()) {
printText(NetworkSettings.localIP().toString().c_str(), 3);
} else { } else {
// Get current time snprintf(_fmtText, sizeof(_fmtText), i18n_current_power_w[_display_language], Datastore.getTotalAcPowerEnabled());
time_t now = time(nullptr);
strftime(_fmtText, sizeof(_fmtText), i18n_date_format[_display_language], localtime(&now));
printText(_fmtText, 3);
} }
_display->sendBuffer(); printText(_fmtText, 0);
_previousMillis = millis();
_mExtra++;
_lastDisplayUpdate = millis();
if (!_displayTurnedOn) {
displayPowerSave = true;
}
_display->setPowerSave(displayPowerSave);
} }
//<=======================
//=====> Offline ===========
else {
printText(i18n_offline[_display_language], 0);
// check if it's time to enter power saving mode
if (millis() - _previousMillis >= (_interval * 2)) {
displayPowerSave = enablePowerSafe;
}
}
//<=======================
//=====> Today & Total Production =======
snprintf(_fmtText, sizeof(_fmtText), i18n_yield_today_wh[_display_language], Datastore.getTotalAcYieldDayEnabled());
printText(_fmtText, 1);
snprintf(_fmtText, sizeof(_fmtText), i18n_yield_total_kwh[_display_language], Datastore.getTotalAcYieldTotalEnabled());
printText(_fmtText, 2);
//<=======================
//=====> IP or Date-Time ========
if (!(_mExtra % 10) && NetworkSettings.localIP()) {
printText(NetworkSettings.localIP().toString().c_str(), 3);
} else {
// Get current time
time_t now = time(nullptr);
strftime(_fmtText, sizeof(_fmtText), i18n_date_format[_display_language], localtime(&now));
printText(_fmtText, 3);
}
_display->sendBuffer();
_mExtra++;
if (!_displayTurnedOn) {
displayPowerSave = true;
}
_display->setPowerSave(displayPowerSave);
} }
void DisplayGraphicClass::setContrast(uint8_t contrast) void DisplayGraphicClass::setContrast(uint8_t contrast)

View File

@ -114,6 +114,7 @@ void setup()
// Initialize Display // Initialize Display
MessageOutput.print("Initialize Display... "); MessageOutput.print("Initialize Display... ");
Display.init( Display.init(
&scheduler,
static_cast<DisplayType_t>(pin.display_type), static_cast<DisplayType_t>(pin.display_type),
pin.display_data, pin.display_data,
pin.display_clk, pin.display_clk,
@ -156,6 +157,4 @@ void loop()
WebApi.loop(); WebApi.loop();
yield(); yield();
Display.loop();
yield();
} }