diff --git a/main.c b/main.c index b9438c9..04652e2 100644 --- a/main.c +++ b/main.c @@ -20,6 +20,7 @@ #define MAIN_LOOP_SLEEP 10U // Main loop delay in ms #define BUTTON_LONG_PRESS_DURATION_MS 1000U // Long press threshold +#define BUTTON_SHORT_PRESS_DURATION_MS 100U // Short press threshold #define BUTTON_IGNORE_DURATION_MS 2000U // Time button ignored after long press #define BUTTON_CONFIRMATION_BLINK_LOOPS 10U // Blink animation for confirmation #define BUTTON_CONFIRMATION_BLINK_DURATION_MS 50U @@ -27,11 +28,21 @@ /** Convert milliseconds to system ticks */ #define MS_TO_TICKS(ms) ((ms) / MAIN_LOOP_SLEEP) +typedef enum _Mode +{ + ANIMATION, + STATIC_GLOW, + STATIC_FULL, + MAX_COUNT, +} eMode; + /** Global flags */ volatile bool bLedEnabled = true; -volatile bool bBtnPressed = false; +volatile bool bBtnLongPressed = false; +volatile eMode eModeCurrent = ANIMATION; // Forward declarations +static inline void toggleMode(void); void blinkLed(bool resetCounters); static inline void leds_off(void); static inline void leds_on(void); @@ -57,13 +68,14 @@ int main(void) battery_level_indicator(); // TODO: Implement bool bLedEnabledOld = bLedEnabled; + eModeCurrent = ANIMATION; while (true) { handleSwitch(); // Check switch state // Light LEDs while button is pressed - if (bBtnPressed) + if (bBtnLongPressed) { leds_on(); } @@ -101,9 +113,22 @@ int main(void) } else { - if (bLedEnabled && !bBtnPressed) + if (bLedEnabled && !bBtnLongPressed) { - blinkLed(false); // run normal blink + switch (eModeCurrent) + { + case ANIMATION: + blinkLed(false); // run normal blink + break; + case STATIC_GLOW: + blinkLed(false); // run normal blink + break; + case STATIC_FULL: + blinkLed(false); // run normal blink + break; + default: + break; + } } } @@ -111,6 +136,14 @@ int main(void) } } +/** + * @brief Move to next mode + */ +static inline void toggleMode(void) +{ + eModeCurrent = (eModeCurrent + 1) % MAX_COUNT; +} + /** * @brief Turn off all controlled LEDs (PA1, PA2, PA3) */ @@ -150,16 +183,21 @@ static void handleSwitch(void) if (pressed) { - bBtnPressed = true; + bBtnLongPressed = true; if (pressTicks < 0xFFFF) pressTicks++; // Prevent overflow } else { - bBtnPressed = false; + bBtnLongPressed = false; pressTicks = 0; } + if (prevPressed && pressTicks >= MS_TO_TICKS(BUTTON_SHORT_PRESS_DURATION_MS)) + { + toggleMode(); + } + if (prevPressed && pressTicks >= MS_TO_TICKS(BUTTON_LONG_PRESS_DURATION_MS)) { bLedEnabled = !bLedEnabled; // Toggle LED blinking