]> git.earman.xyz Git - sensor-watch.git/commitdiff
Add an optional implementation of button debounce
authorAlessandro Genova <ales.genova@gmail.com>
Thu, 7 Aug 2025 01:29:44 +0000 (21:29 -0400)
committerAlessandro Genova <ales.genova@gmail.com>
Sat, 3 Jan 2026 01:07:56 +0000 (20:07 -0500)
movement.c
movement_config.h

index 49df5023c1a22b655348f7a26a1a86a5706008db..aa90f034623a44798cdcd934551dcc04e9a949e4 100644 (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 {
index f5f6b2b408c91c939647c3645cc6d9369aaf1502..9633de87883de876d946c72a0fcc1ca3d60c655f 100644 (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_