64 lines
1.5 KiB
C++
64 lines
1.5 KiB
C++
#include "led_alert.h"
|
|
|
|
namespace LedAlert {
|
|
|
|
namespace {
|
|
constexpr uint8_t PIN_RED = 4;
|
|
constexpr uint8_t PIN_GREEN = 16;
|
|
constexpr uint8_t PIN_BLUE = 17;
|
|
|
|
constexpr uint32_t GREEN_BLINK_INTERVAL_MS = 400;
|
|
constexpr uint32_t RED_BLINK_INTERVAL_MS = 150;
|
|
|
|
bool initialized = false;
|
|
bool blinkState = false;
|
|
uint32_t lastToggleMs = 0;
|
|
Mode lastMode = Mode::Off;
|
|
|
|
void setAllOff() {
|
|
digitalWrite(PIN_RED, HIGH);
|
|
digitalWrite(PIN_GREEN, HIGH);
|
|
digitalWrite(PIN_BLUE, HIGH);
|
|
}
|
|
}
|
|
|
|
void begin() {
|
|
pinMode(PIN_RED, OUTPUT);
|
|
pinMode(PIN_GREEN, OUTPUT);
|
|
pinMode(PIN_BLUE, OUTPUT);
|
|
setAllOff();
|
|
initialized = true;
|
|
}
|
|
|
|
bool update(Mode mode, uint32_t nowMs) {
|
|
if (!initialized) begin();
|
|
|
|
if (mode == Mode::Off) {
|
|
setAllOff();
|
|
blinkState = false;
|
|
lastMode = mode;
|
|
return false;
|
|
}
|
|
|
|
if (mode != lastMode) {
|
|
lastToggleMs = nowMs;
|
|
blinkState = true;
|
|
lastMode = mode;
|
|
}
|
|
|
|
uint32_t interval = (mode == Mode::EmergencyRed) ? RED_BLINK_INTERVAL_MS : GREEN_BLINK_INTERVAL_MS;
|
|
uint8_t pin = (mode == Mode::EmergencyRed) ? PIN_RED : PIN_GREEN;
|
|
|
|
if (nowMs - lastToggleMs >= interval) {
|
|
lastToggleMs = nowMs;
|
|
blinkState = !blinkState;
|
|
}
|
|
|
|
digitalWrite(pin, blinkState ? LOW : HIGH);
|
|
digitalWrite(mode == Mode::EmergencyRed ? PIN_GREEN : PIN_RED, HIGH);
|
|
digitalWrite(PIN_BLUE, HIGH);
|
|
|
|
return blinkState;
|
|
}
|
|
|
|
} |