diff --git a/src/helpers/ui/MomentaryButton.cpp b/src/helpers/ui/MomentaryButton.cpp index 0446c639..0ea4b027 100644 --- a/src/helpers/ui/MomentaryButton.cpp +++ b/src/helpers/ui/MomentaryButton.cpp @@ -1,5 +1,7 @@ #include "MomentaryButton.h" +#define MULTI_CLICK_WINDOW_MS 280 + MomentaryButton::MomentaryButton(int8_t pin, int long_press_millis, bool reverse, bool pulldownup) { _pin = pin; _reverse = reverse; @@ -11,7 +13,7 @@ MomentaryButton::MomentaryButton(int8_t pin, int long_press_millis, bool reverse _threshold = 0; _click_count = 0; _last_click_time = 0; - _multi_click_window = 260; + _multi_click_window = MULTI_CLICK_WINDOW_MS; _pending_click = false; } @@ -26,7 +28,7 @@ MomentaryButton::MomentaryButton(int8_t pin, int long_press_millis, int analog_t _threshold = analog_threshold; _click_count = 0; _last_click_time = 0; - _multi_click_window = 260; + _multi_click_window = MULTI_CLICK_WINDOW_MS; _pending_click = false; } @@ -43,7 +45,9 @@ bool MomentaryButton::isPressed() const { void MomentaryButton::cancelClick() { cancel = 1; + down_at = 0; _click_count = 0; + _last_click_time = 0; _pending_click = false; } @@ -94,11 +98,16 @@ int MomentaryButton::check(bool repeat_click) { } if (_long_millis > 0 && down_at > 0 && (unsigned long)(millis() - down_at) >= _long_millis) { - event = BUTTON_EVENT_LONG_PRESS; - down_at = 0; - _click_count = 0; - _last_click_time = 0; - _pending_click = false; + if (_pending_click) { + // long press during multi-click detection - cancel pending clicks + cancelClick(); + } else { + event = BUTTON_EVENT_LONG_PRESS; + down_at = 0; + _click_count = 0; + _last_click_time = 0; + _pending_click = false; + } } if (down_at > 0 && repeat_click) { unsigned long diff = (unsigned long)(millis() - down_at); @@ -108,6 +117,10 @@ int MomentaryButton::check(bool repeat_click) { } if (_pending_click && (millis() - _last_click_time) >= _multi_click_window) { + if (down_at > 0) { + // still pressed - wait for button release before processing clicks + return event; + } switch (_click_count) { case 1: event = BUTTON_EVENT_CLICK;