Skip to content

Commit

Permalink
Split LedSingle into multiple tasks
Browse files Browse the repository at this point in the history
  • Loading branch information
tbnobody committed Nov 23, 2023
1 parent 0db5b2e commit f8f79c8
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 18 deletions.
8 changes: 4 additions & 4 deletions include/Led_Single.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,11 @@ class LedSingleClass {
void turnAllOn();

private:
void loop();
void setLoop();
void outputLoop();

Task _loopTask;
Task _setTask;
Task _outputTask;

enum class LedState_t {
On,
Expand All @@ -28,9 +30,7 @@ class LedSingleClass {

LedState_t _ledState[PINMAPPING_LED_COUNT];
LedState_t _allState;
TimeoutHelper _updateTimeout;
TimeoutHelper _blinkTimeout;
uint8_t _ledActive = 0;
};

extern LedSingleClass LedSingle;
35 changes: 21 additions & 14 deletions src/Led_Single.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,9 @@ LedSingleClass::LedSingleClass()

void LedSingleClass::init(Scheduler* scheduler)
{
bool ledActive = false;

_blinkTimeout.set(500);
_updateTimeout.set(LEDSINGLE_UPDATE_INTERVAL);
turnAllOn();

auto& pin = PinMapping.get();
Expand All @@ -28,25 +29,29 @@ void LedSingleClass::init(Scheduler* scheduler)
if (pin.led[i] >= 0) {
pinMode(pin.led[i], OUTPUT);
digitalWrite(pin.led[i], LOW);
_ledActive++;
ledActive = true;
}

_ledState[i] = LedState_t::Off;
}

scheduler->addTask(_loopTask);
_loopTask.setCallback(std::bind(&LedSingleClass::loop, this));
_loopTask.setIterations(TASK_FOREVER);
_loopTask.enable();
if (ledActive) {
scheduler->addTask(_outputTask);
_outputTask.setCallback(std::bind(&LedSingleClass::outputLoop, this));
_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) {
return;
}

if (_updateTimeout.occured() && _allState == LedState_t::On) {
if (_allState == LedState_t::On) {
const CONFIG_T& config = Configuration.get();

// Update network status
Expand All @@ -73,12 +78,14 @@ void LedSingleClass::loop()
}
}

_updateTimeout.reset();
} else if (_updateTimeout.occured() && _allState == LedState_t::Off) {
} else if (_allState == LedState_t::Off) {
_ledState[0] = LedState_t::Off;
_ledState[1] = LedState_t::Off;
}
}

void LedSingleClass::outputLoop()
{
auto& pin = PinMapping.get();
for (uint8_t i = 0; i < PINMAPPING_LED_COUNT; i++) {

Expand Down

0 comments on commit f8f79c8

Please sign in to comment.