This commit is contained in:
2025-11-08 22:01:10 +01:00
parent 042d38b0f5
commit a66a3ce2dc

48
main.c
View File

@ -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)
{
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