From 55426b5f2dc59221147fb10159f65ab144b105ece580aeb66bd12f6c060bb215 Mon Sep 17 00:00:00 2001 From: localhorst Date: Sat, 8 Nov 2025 22:27:49 +0100 Subject: [PATCH] check mode change only on btn release --- main.c | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/main.c b/main.c index 55d8613..8726cbc 100644 --- a/main.c +++ b/main.c @@ -42,16 +42,16 @@ volatile bool bBtnLongPressed = false; volatile eMode eModeCurrent = ANIMATION_BLINK; // Forward declarations +ISR(PORTA_PORT_vect); +static void software_reset(void); +static inline void leds_off(void); +static inline void leds_on(void); +static void battery_level_indicator(void); +static bool handleSwitch(void); static inline void toggleMode(void); void ledAnimationBlink(bool resetCounters); void ledAnimationGlow(void); void ledStaticFull(void); -static inline void leds_off(void); -static inline void leds_on(void); -static void battery_level_indicator(void); -static void handleSwitch(void); -static void software_reset(void); -ISR(PORTA_PORT_vect); /** * @brief Main entry point @@ -74,7 +74,7 @@ int main(void) while (true) { - handleSwitch(); // Check switch state + bBtnLongPressed = handleSwitch(); // Check switch state // Light LEDs while button is pressed if (bBtnLongPressed) @@ -176,7 +176,7 @@ static void battery_level_indicator(void) * * A long press toggles ::bLedEnabled. */ -static void handleSwitch(void) +static bool handleSwitch(void) { static uint16_t pressTicks = 0; ///< Press duration counter static bool prevPressed = false; ///< Previous button state @@ -185,27 +185,32 @@ static void handleSwitch(void) if (pressed) { - bBtnLongPressed = true; if (pressTicks < 0xFFFF) pressTicks++; // Prevent overflow } else { - bBtnLongPressed = false; + // Button released + if (prevPressed) + { + // Check if it was a short press (not a long press) + if (pressTicks >= MS_TO_TICKS(BUTTON_SHORT_PRESS_DURATION_MS) && + pressTicks < MS_TO_TICKS(BUTTON_LONG_PRESS_DURATION_MS)) + { + toggleMode(); + } + } + 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)) + if (pressed && pressTicks >= MS_TO_TICKS(BUTTON_LONG_PRESS_DURATION_MS)) { bLedEnabled = !bLedEnabled; // Toggle LED blinking } prevPressed = pressed; + return pressed; } /**