11#include " MomentaryButton.h"
22
3+ #define MULTI_CLICK_WINDOW_MS 280
4+
35MomentaryButton::MomentaryButton (int8_t pin, int long_press_millis, bool reverse, bool pulldownup) {
46 _pin = pin;
57 _reverse = reverse;
@@ -11,7 +13,7 @@ MomentaryButton::MomentaryButton(int8_t pin, int long_press_millis, bool reverse
1113 _threshold = 0 ;
1214 _click_count = 0 ;
1315 _last_click_time = 0 ;
14- _multi_click_window = 260 ;
16+ _multi_click_window = MULTI_CLICK_WINDOW_MS ;
1517 _pending_click = false ;
1618}
1719
@@ -26,7 +28,7 @@ MomentaryButton::MomentaryButton(int8_t pin, int long_press_millis, int analog_t
2628 _threshold = analog_threshold;
2729 _click_count = 0 ;
2830 _last_click_time = 0 ;
29- _multi_click_window = 260 ;
31+ _multi_click_window = MULTI_CLICK_WINDOW_MS ;
3032 _pending_click = false ;
3133}
3234
@@ -43,7 +45,9 @@ bool MomentaryButton::isPressed() const {
4345
4446void MomentaryButton::cancelClick () {
4547 cancel = 1 ;
48+ down_at = 0 ;
4649 _click_count = 0 ;
50+ _last_click_time = 0 ;
4751 _pending_click = false ;
4852}
4953
@@ -94,11 +98,16 @@ int MomentaryButton::check(bool repeat_click) {
9498 }
9599
96100 if (_long_millis > 0 && down_at > 0 && (unsigned long )(millis () - down_at) >= _long_millis) {
97- event = BUTTON_EVENT_LONG_PRESS;
98- down_at = 0 ;
99- _click_count = 0 ;
100- _last_click_time = 0 ;
101- _pending_click = false ;
101+ if (_pending_click) {
102+ // long press during multi-click detection - cancel pending clicks
103+ cancelClick ();
104+ } else {
105+ event = BUTTON_EVENT_LONG_PRESS;
106+ down_at = 0 ;
107+ _click_count = 0 ;
108+ _last_click_time = 0 ;
109+ _pending_click = false ;
110+ }
102111 }
103112 if (down_at > 0 && repeat_click) {
104113 unsigned long diff = (unsigned long )(millis () - down_at);
@@ -108,6 +117,10 @@ int MomentaryButton::check(bool repeat_click) {
108117 }
109118
110119 if (_pending_click && (millis () - _last_click_time) >= _multi_click_window) {
120+ if (down_at > 0 ) {
121+ // still pressed - wait for button release before processing clicks
122+ return event;
123+ }
111124 switch (_click_count) {
112125 case 1 :
113126 event = BUTTON_EVENT_CLICK;
0 commit comments