Skip to content

Commit 9f18530

Browse files
committed
long press cancels multi click
1 parent 5de0dc1 commit 9f18530

File tree

1 file changed

+20
-7
lines changed

1 file changed

+20
-7
lines changed

src/helpers/ui/MomentaryButton.cpp

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#include "MomentaryButton.h"
22

3+
#define MULTI_CLICK_WINDOW_MS 280
4+
35
MomentaryButton::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

4446
void 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

Comments
 (0)