Split LedSingle into multiple tasks
This commit is contained in:
parent
0db5b2eb9a
commit
f8f79c816a
@ -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;
|
||||||
@ -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++) {
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user