check mode change only on btn release
This commit is contained in:
35
main.c
35
main.c
@ -42,16 +42,16 @@ volatile bool bBtnLongPressed = false;
|
|||||||
volatile eMode eModeCurrent = ANIMATION_BLINK;
|
volatile eMode eModeCurrent = ANIMATION_BLINK;
|
||||||
|
|
||||||
// Forward declarations
|
// 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);
|
static inline void toggleMode(void);
|
||||||
void ledAnimationBlink(bool resetCounters);
|
void ledAnimationBlink(bool resetCounters);
|
||||||
void ledAnimationGlow(void);
|
void ledAnimationGlow(void);
|
||||||
void ledStaticFull(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
|
* @brief Main entry point
|
||||||
@ -74,7 +74,7 @@ int main(void)
|
|||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
handleSwitch(); // Check switch state
|
bBtnLongPressed = handleSwitch(); // Check switch state
|
||||||
|
|
||||||
// Light LEDs while button is pressed
|
// Light LEDs while button is pressed
|
||||||
if (bBtnLongPressed)
|
if (bBtnLongPressed)
|
||||||
@ -176,7 +176,7 @@ static void battery_level_indicator(void)
|
|||||||
*
|
*
|
||||||
* A long press toggles ::bLedEnabled.
|
* A long press toggles ::bLedEnabled.
|
||||||
*/
|
*/
|
||||||
static void handleSwitch(void)
|
static bool handleSwitch(void)
|
||||||
{
|
{
|
||||||
static uint16_t pressTicks = 0; ///< Press duration counter
|
static uint16_t pressTicks = 0; ///< Press duration counter
|
||||||
static bool prevPressed = false; ///< Previous button state
|
static bool prevPressed = false; ///< Previous button state
|
||||||
@ -185,27 +185,32 @@ static void handleSwitch(void)
|
|||||||
|
|
||||||
if (pressed)
|
if (pressed)
|
||||||
{
|
{
|
||||||
bBtnLongPressed = true;
|
|
||||||
if (pressTicks < 0xFFFF)
|
if (pressTicks < 0xFFFF)
|
||||||
pressTicks++; // Prevent overflow
|
pressTicks++; // Prevent overflow
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
bBtnLongPressed = false;
|
// Button released
|
||||||
pressTicks = 0;
|
if (prevPressed)
|
||||||
}
|
{
|
||||||
|
// Check if it was a short press (not a long press)
|
||||||
if (prevPressed && pressTicks >= MS_TO_TICKS(BUTTON_SHORT_PRESS_DURATION_MS))
|
if (pressTicks >= MS_TO_TICKS(BUTTON_SHORT_PRESS_DURATION_MS) &&
|
||||||
|
pressTicks < MS_TO_TICKS(BUTTON_LONG_PRESS_DURATION_MS))
|
||||||
{
|
{
|
||||||
toggleMode();
|
toggleMode();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (prevPressed && pressTicks >= MS_TO_TICKS(BUTTON_LONG_PRESS_DURATION_MS))
|
pressTicks = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pressed && pressTicks >= MS_TO_TICKS(BUTTON_LONG_PRESS_DURATION_MS))
|
||||||
{
|
{
|
||||||
bLedEnabled = !bLedEnabled; // Toggle LED blinking
|
bLedEnabled = !bLedEnabled; // Toggle LED blinking
|
||||||
}
|
}
|
||||||
|
|
||||||
prevPressed = pressed;
|
prevPressed = pressed;
|
||||||
|
return pressed;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user