Prusa-Firmware-MMU/src/modules/leds.cpp

60 lines
1.3 KiB
C++

/// @file leds.cpp
#include "leds.h"
#include "../hal/shr16.h"
#include "timebase.h"
namespace modules {
namespace leds {
LEDs leds;
void LED::SetMode(leds::Mode mode) {
state.mode = mode;
// set initial state of LEDs correctly - transition from one mode to another
switch (state.mode) {
case leds::Mode::blink1:
case leds::Mode::off:
state.on = 0;
break;
case leds::Mode::blink0:
case leds::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 leds::Mode::blink0:
state.on = oddPeriod;
break;
case leds::Mode::blink1:
state.on = !oddPeriod;
break;
default: // do nothing
break;
}
return state.on;
}
void LEDs::Step() {
uint16_t millis = mt::timebase.Millis();
bool oddPeriod = ((millis / (config::ledBlinkPeriodMs / 2)) & 0x01U) != 0;
uint16_t result = 0;
for (uint8_t i = 0; i < ledPairs * 2; i++) {
result <<= 1;
result |= leds[i].Step(oddPeriod);
}
if (result != cachedState) {
hal::shr16::shr16.SetLED(result);
cachedState = result;
}
}
} // namespace leds
} // namespace modules