Add an optional implementation of button debounce

This commit is contained in:
Alessandro Genova
2025-08-06 21:29:44 -04:00
parent bf9d89106f
commit 9d91ff3090
2 changed files with 21 additions and 0 deletions

View File

@ -67,6 +67,9 @@ typedef struct {
movement_timeout_index_t timeout_index;
volatile bool is_down;
volatile rtc_counter_t down_timestamp;
#if MOVEMENT_DEBOUNCE_TICKS
volatile rtc_counter_t up_timestamp;
#endif
} movement_button_t;
/* Pieces of state that can be modified by the various interrupt callbacks.
@ -1270,12 +1273,24 @@ static movement_event_type_t _process_button_event(bool pin_level, movement_butt
uint32_t counter = watch_rtc_get_counter();
#if MOVEMENT_DEBOUNCE_TICKS
if (
(counter - button->up_timestamp) <= MOVEMENT_DEBOUNCE_TICKS &&
(counter - button->down_timestamp) <= MOVEMENT_DEBOUNCE_TICKS
) {
return event_type;
}
#endif
button->is_down = pin_level;
if (pin_level) {
button->down_timestamp = counter;
event_type = button->down_event;
} else {
#if MOVEMENT_DEBOUNCE_TICKS
button->up_timestamp = counter;
#endif
if ((counter - button->down_timestamp) >= MOVEMENT_LONG_PRESS_TICKS) {
event_type = button->down_event + 3;
} else {

View File

@ -101,4 +101,10 @@ const watch_face_t watch_faces[] = {
*/
#define MOVEMENT_DEFAULT_LED_DURATION 1
/* Optionally debounce button presses (disable by default).
* A value of 4 is a good starting point if you have issues
* with multiple button presses firing.
*/
#define MOVEMENT_DEBOUNCE_TICKS 0
#endif // MOVEMENT_CONFIG_H_