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
#include "defaults.h"
#include <TaskSchedulerDeclarations.h>
#include <U8g2lib.h>
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;

View File

@ -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,7 +143,7 @@ void DisplayGraphicClass::loop()
return;
}
if ((millis() - _lastDisplayUpdate) > _period) {
_loopTask.setInterval(_period);
_display->clearBuffer();
bool displayPowerSave = false;
@ -185,14 +191,12 @@ void DisplayGraphicClass::loop()
_display->sendBuffer();
_mExtra++;
_lastDisplayUpdate = millis();
if (!_displayTurnedOn) {
displayPowerSave = true;
}
_display->setPowerSave(displayPowerSave);
}
}
void DisplayGraphicClass::setContrast(uint8_t contrast)

View File

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