Split LedSingle into multiple tasks

This commit is contained in:
Thomas Basler 2023-11-21 21:30:58 +01:00
parent 0db5b2eb9a
commit f8f79c816a
2 changed files with 25 additions and 18 deletions

View File

@ -16,9 +16,11 @@ public:
void turnAllOn(); void turnAllOn();
private: private:
void loop(); void setLoop();
void outputLoop();
Task _loopTask; Task _setTask;
Task _outputTask;
enum class LedState_t { enum class LedState_t {
On, On,
@ -28,9 +30,7 @@ private:
LedState_t _ledState[PINMAPPING_LED_COUNT]; LedState_t _ledState[PINMAPPING_LED_COUNT];
LedState_t _allState; LedState_t _allState;
TimeoutHelper _updateTimeout;
TimeoutHelper _blinkTimeout; TimeoutHelper _blinkTimeout;
uint8_t _ledActive = 0;
}; };
extern LedSingleClass LedSingle; extern LedSingleClass LedSingle;

View File

@ -18,8 +18,9 @@ LedSingleClass::LedSingleClass()
void LedSingleClass::init(Scheduler* scheduler) void LedSingleClass::init(Scheduler* scheduler)
{ {
bool ledActive = false;
_blinkTimeout.set(500); _blinkTimeout.set(500);
_updateTimeout.set(LEDSINGLE_UPDATE_INTERVAL);
turnAllOn(); turnAllOn();
auto& pin = PinMapping.get(); auto& pin = PinMapping.get();
@ -28,25 +29,29 @@ void LedSingleClass::init(Scheduler* scheduler)
if (pin.led[i] >= 0) { if (pin.led[i] >= 0) {
pinMode(pin.led[i], OUTPUT); pinMode(pin.led[i], OUTPUT);
digitalWrite(pin.led[i], LOW); digitalWrite(pin.led[i], LOW);
_ledActive++; ledActive = true;
} }
_ledState[i] = LedState_t::Off; _ledState[i] = LedState_t::Off;
} }
scheduler->addTask(_loopTask); if (ledActive) {
_loopTask.setCallback(std::bind(&LedSingleClass::loop, this)); scheduler->addTask(_outputTask);
_loopTask.setIterations(TASK_FOREVER); _outputTask.setCallback(std::bind(&LedSingleClass::outputLoop, this));
_loopTask.enable(); _outputTask.setIterations(TASK_FOREVER);
_outputTask.enable();
scheduler->addTask(_setTask);
_setTask.setCallback(std::bind(&LedSingleClass::setLoop, this));
_setTask.setInterval(LEDSINGLE_UPDATE_INTERVAL * TASK_MILLISECOND);
_setTask.setIterations(TASK_FOREVER);
_setTask.enable();
}
} }
void LedSingleClass::loop() void LedSingleClass::setLoop()
{ {
if (_ledActive == 0) { if (_allState == LedState_t::On) {
return;
}
if (_updateTimeout.occured() && _allState == LedState_t::On) {
const CONFIG_T& config = Configuration.get(); const CONFIG_T& config = Configuration.get();
// Update network status // Update network status
@ -73,12 +78,14 @@ void LedSingleClass::loop()
} }
} }
_updateTimeout.reset(); } else if (_allState == LedState_t::Off) {
} else if (_updateTimeout.occured() && _allState == LedState_t::Off) {
_ledState[0] = LedState_t::Off; _ledState[0] = LedState_t::Off;
_ledState[1] = LedState_t::Off; _ledState[1] = LedState_t::Off;
} }
}
void LedSingleClass::outputLoop()
{
auto& pin = PinMapping.get(); auto& pin = PinMapping.get();
for (uint8_t i = 0; i < PINMAPPING_LED_COUNT; i++) { for (uint8_t i = 0; i < PINMAPPING_LED_COUNT; i++) {