#pragma once #define BTN_DEFAULT_DEBOUNCE_MS 20 #define BTN_DEFAULT_LONGPRESSED_MS 1000 #define BTN_DEFAULT_REPEAT_MS 200 // States for state machine typedef enum { IDLE = 0, DEBOUNCE, PRESSED, LONGPRESSED, REPEAT, MAX_STATE } ButtonState_t; // Struct for button typedef struct ButtonKey ButtonKey_t; typedef void (*buttonPressed_t)(ButtonKey_t *key); typedef void (*buttonLongPressed_t)(ButtonKey_t *key); typedef void (*buttonRepeat_t)(ButtonKey_t *key); struct ButtonKey { uint8_t instance; // Button name/number ButtonState_t state; // Button current state GPIO_TypeDef *gpio_port; // GPIO Port for a button uint16_t gpio_pin; // GPIO Pin for a button GPIO_PinState pushed_state; uint32_t last_tick; // Last remembered time before steps uint32_t timer_debounce; // Fixed, settable time for debounce timer uint32_t timer_long_pressed; // Fixed, adjustable time for long press timer uint32_t timer_repeat_delay; // Fixed, adjustable interval time buttonPressed_t buttonReleased; // A callback for button released buttonPressed_t buttonPressed; // A callback for button pressed buttonLongPressed_t buttonLongPressed; // A callback for long pressed buttonRepeat_t buttonRepeat; // A callback for repeat }; // Public functions void buttonHandler(ButtonKey_t *key);