From 20d86bf1e3dfdfb4c0a3ea557b54f0bea0f5c214 Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Sun, 8 Feb 2026 16:18:49 +0530 Subject: Handle button state --- src/button.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/button.c (limited to 'src/button.c') diff --git a/src/button.c b/src/button.c new file mode 100644 index 0000000..34d799c --- /dev/null +++ b/src/button.c @@ -0,0 +1,57 @@ +#include +#include + +#include "avr/interrupt.h" +#include "button.h" +#include "rtc.h" + +bool is_button_active = false; + +uint16_t button_tick_count = 0; + +ISR(PCINT0_vect, ISR_FLATTEN) { button_tick(); } + +void button_tick() { + switch (check_button_state()) { + case BUTTON_PRESSED: + if (seconds <= 10) + seconds = 0; + else + seconds -= 10; + break; + case BUTTON_LONG_PRESSED: + seconds += 10; + break; + default: + break; + } +} + +enum ButtonState check_button_state() { + if (is_button_active && button_tick_count >= LONG_PRESS_TICK_COUNT) { + button_tick_count = 0; + is_button_active = false; + return BUTTON_LONG_PRESSED; + } + + bool in_debounce_period = is_button_active && button_tick_count > 0 && + button_tick_count < DEBOUNCE_TICK_COUNT; + + // Ignore readings from debounce period + if (!in_debounce_period) { + DDRA &= ~(1 << PA0); + PORTA &= ~(1 << PA0); + is_button_active = (PINA & (1 << PA0)) == 0; + } + + if (is_button_active) { + button_tick_count++; + } else { + if (button_tick_count >= DEBOUNCE_TICK_COUNT) { + button_tick_count = 0; + return BUTTON_PRESSED; + } + } + + return BUTTON_IDLE; +} -- cgit v1.3.1