From ab8679e7b9e6d131938bf81571e79ed1a9755ba9 Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Mon, 20 Nov 2023 22:02:44 +0100 Subject: [PATCH] Migrate Display_Graphic to TaskScheduler --- include/Display_Graphic.h | 8 +-- src/Display_Graphic.cpp | 108 ++++++++++++++++++++------------------ src/main.cpp | 3 +- 3 files changed, 62 insertions(+), 57 deletions(-) diff --git a/include/Display_Graphic.h b/include/Display_Graphic.h index 9fe202c4..3aec4f27 100644 --- a/include/Display_Graphic.h +++ b/include/Display_Graphic.h @@ -2,6 +2,7 @@ #pragma once #include "defaults.h" +#include #include enum DisplayType_t { @@ -16,8 +17,7 @@ public: DisplayGraphicClass(); ~DisplayGraphicClass(); - void init(DisplayType_t type, uint8_t data, uint8_t clk, uint8_t cs, uint8_t reset); - void loop(); + void init(Scheduler* scheduler, DisplayType_t type, uint8_t data, uint8_t clk, uint8_t cs, uint8_t reset); void setContrast(uint8_t contrast); void setStatus(bool turnOn); void setOrientation(uint8_t rotation = DISPLAY_ROTATION); @@ -28,10 +28,13 @@ public: bool enableScreensaver = true; private: + void loop(); void printText(const char* text, uint8_t line); void calcLineHeights(); void setFont(uint8_t line); + Task _loopTask; + U8G2* _display; bool _displayTurnedOn; @@ -41,7 +44,6 @@ private: uint8_t _mExtra; uint16_t _period = 1000; uint16_t _interval = 60000; // interval at which to power save (milliseconds) - uint32_t _lastDisplayUpdate = 0; uint32_t _previousMillis = 0; char _fmtText[32]; bool _isLarge = false; diff --git a/src/Display_Graphic.cpp b/src/Display_Graphic.cpp index 26991cb5..aec3d3b0 100644 --- a/src/Display_Graphic.cpp +++ b/src/Display_Graphic.cpp @@ -39,7 +39,7 @@ DisplayGraphicClass::~DisplayGraphicClass() 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; 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); setStatus(true); } + + scheduler->addTask(_loopTask); + _loopTask.setCallback(std::bind(&DisplayGraphicClass::loop, this)); + _loopTask.setIterations(TASK_FOREVER); + _loopTask.setInterval(_period); + _loopTask.enable(); } void DisplayGraphicClass::calcLineHeights() @@ -137,62 +143,60 @@ void DisplayGraphicClass::loop() return; } - if ((millis() - _lastDisplayUpdate) > _period) { + _loopTask.setInterval(_period); - _display->clearBuffer(); - bool displayPowerSave = false; + _display->clearBuffer(); + bool displayPowerSave = false; - //=====> Actual Production ========== - if (Datastore.getIsAtLeastOneReachable()) { - displayPowerSave = false; - if (Datastore.getTotalAcPowerEnabled() > 999) { - 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); + //=====> Actual Production ========== + if (Datastore.getIsAtLeastOneReachable()) { + displayPowerSave = false; + if (Datastore.getTotalAcPowerEnabled() > 999) { + snprintf(_fmtText, sizeof(_fmtText), i18n_current_power_kw[_display_language], (Datastore.getTotalAcPowerEnabled() / 1000)); } else { - // Get current time - time_t now = time(nullptr); - strftime(_fmtText, sizeof(_fmtText), i18n_date_format[_display_language], localtime(&now)); - printText(_fmtText, 3); + snprintf(_fmtText, sizeof(_fmtText), i18n_current_power_w[_display_language], Datastore.getTotalAcPowerEnabled()); } - _display->sendBuffer(); - - _mExtra++; - _lastDisplayUpdate = millis(); - - if (!_displayTurnedOn) { - displayPowerSave = true; - } - - _display->setPowerSave(displayPowerSave); + 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 { + // 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) diff --git a/src/main.cpp b/src/main.cpp index 48c9aa04..2a1b5927 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -114,6 +114,7 @@ void setup() // Initialize Display MessageOutput.print("Initialize Display... "); Display.init( + &scheduler, static_cast(pin.display_type), pin.display_data, pin.display_clk, @@ -156,6 +157,4 @@ void loop() WebApi.loop(); yield(); - Display.loop(); - yield(); } \ No newline at end of file