56 lines
1.1 KiB
C++
56 lines
1.1 KiB
C++
#include "leds.h"
|
|
#include "../hal/shr16.h"
|
|
|
|
namespace modules {
|
|
namespace leds {
|
|
|
|
LEDs leds;
|
|
|
|
void LED::SetMode(Mode mode) {
|
|
state.mode = mode;
|
|
// set initial state of LEDs correctly - transition from one mode to another
|
|
switch (state.mode) {
|
|
case Mode::blink1:
|
|
case Mode::off:
|
|
state.on = 0;
|
|
break;
|
|
|
|
case Mode::blink0:
|
|
case Mode::on:
|
|
state.on = 1;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
bool LED::Step(bool oddPeriod) {
|
|
switch (state.mode) {
|
|
// on and off don't change while stepping
|
|
case Mode::blink0:
|
|
state.on = oddPeriod;
|
|
break;
|
|
case Mode::blink1:
|
|
state.on = !oddPeriod;
|
|
break;
|
|
default: // do nothing
|
|
break;
|
|
}
|
|
return state.on;
|
|
}
|
|
|
|
void LEDs::Step(uint16_t delta_ms) {
|
|
ms += delta_ms;
|
|
bool oddPeriod = ((ms / 1000U) & 0x01U) != 0;
|
|
uint16_t result = 0;
|
|
for (int8_t i = ledPairs * 2 - 1; i >= 0; --i) {
|
|
result <<= 1;
|
|
result |= leds[i].Step(oddPeriod);
|
|
}
|
|
|
|
hal::shr16::shr16.SetLED(result);
|
|
}
|
|
|
|
} // namespace leds
|
|
} // namespace modules
|