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.
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 {
*/
#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_