Skip to content

Commit ce31fd7

Browse files
committed
multi click support including buzzer toggle
1 parent a93a0fe commit ce31fd7

File tree

4 files changed

+89
-7
lines changed

4 files changed

+89
-7
lines changed

examples/companion_radio/ui-new/UITask.cpp

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,10 @@ void UITask::loop() {
495495
c = checkDisplayOn(KEY_SELECT);
496496
} else if (ev == BUTTON_EVENT_LONG_PRESS) {
497497
c = handleLongPress(KEY_ENTER);
498+
} else if (ev == BUTTON_EVENT_DOUBLE_CLICK) {
499+
c = handleDoubleClick(KEY_ENTER);
500+
} else if (ev == BUTTON_EVENT_TRIPLE_CLICK) {
501+
c = handleTripleClick(KEY_ENTER);
498502
}
499503
#endif
500504
#if defined(WIO_TRACKER_L1)
@@ -604,10 +608,43 @@ char UITask::handleLongPress(char c) {
604608
return c;
605609
}
606610

607-
/*
608-
void UITask::handleButtonTriplePress() {
609-
MESH_DEBUG_PRINTLN("UITask: triple press triggered");
610-
// Toggle buzzer quiet mode
611+
char UITask::handleDoubleClick(char c) {
612+
MESH_DEBUG_PRINTLN("UITask: double click triggered");
613+
c = 0;
614+
return c;
615+
}
616+
617+
char UITask::handleTripleClick(char c) {
618+
MESH_DEBUG_PRINTLN("UITask: triple click triggered");
619+
toggleBuzzer();
620+
c = 0;
621+
return c;
622+
}
623+
624+
void UITask::toggleGPS() {
625+
if (_sensors != NULL) {
626+
// toggle GPS on/off
627+
int num = _sensors->getNumSettings();
628+
for (int i = 0; i < num; i++) {
629+
if (strcmp(_sensors->getSettingName(i), "gps") == 0) {
630+
if (strcmp(_sensors->getSettingValue(i), "1") == 0) {
631+
_sensors->setSettingValue("gps", "0");
632+
soundBuzzer(UIEventType::ack);
633+
showAlert("GPS: Disabled", 600);
634+
} else {
635+
_sensors->setSettingValue("gps", "1");
636+
soundBuzzer(UIEventType::ack);
637+
showAlert("GPS: Enabled", 600);
638+
}
639+
_next_refresh = 0;
640+
break;
641+
}
642+
}
643+
}
644+
}
645+
646+
void UITask::toggleBuzzer() {
647+
// Toggle buzzer quiet mode
611648
#ifdef PIN_BUZZER
612649
if (buzzer.isQuiet()) {
613650
buzzer.quiet(false);
@@ -620,4 +657,3 @@ void UITask::handleButtonTriplePress() {
620657
_next_refresh = 0; // trigger refresh
621658
#endif
622659
}
623-
*/

examples/companion_radio/ui-new/UITask.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ class UITask : public AbstractUITask {
3737
// Button action handlers
3838
char checkDisplayOn(char c);
3939
char handleLongPress(char c);
40+
char handleDoubleClick(char c);
41+
char handleTripleClick(char c);
4042

4143
void setCurrScreen(UIScreen* c);
4244

@@ -55,6 +57,10 @@ class UITask : public AbstractUITask {
5557
bool hasDisplay() const { return _display != NULL; }
5658
bool isButtonPressed() const;
5759

60+
void toggleBuzzer();
61+
void toggleGPS();
62+
63+
5864
// from AbstractUITask
5965
void msgRead(int msgcount) override;
6066
void newMsg(uint8_t path_len, const char* from_name, const char* text, int msgcount) override;

src/helpers/ui/MomentaryButton.cpp

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ MomentaryButton::MomentaryButton(int8_t pin, int long_press_millis, bool reverse
99
cancel = 0;
1010
_long_millis = long_press_millis;
1111
_threshold = 0;
12+
_click_count = 0;
13+
_last_click_time = 0;
14+
_multi_click_window = 500;
15+
_pending_click = false;
1216
}
1317

1418
MomentaryButton::MomentaryButton(int8_t pin, int long_press_millis, int analog_threshold) {
@@ -20,6 +24,10 @@ MomentaryButton::MomentaryButton(int8_t pin, int long_press_millis, int analog_t
2024
cancel = 0;
2125
_long_millis = long_press_millis;
2226
_threshold = analog_threshold;
27+
_click_count = 0;
28+
_last_click_time = 0;
29+
_multi_click_window = 500;
30+
_pending_click = false;
2331
}
2432

2533
void MomentaryButton::begin() {
@@ -35,6 +43,8 @@ bool MomentaryButton::isPressed() const {
3543

3644
void MomentaryButton::cancelClick() {
3745
cancel = 1;
46+
_click_count = 0;
47+
_pending_click = false;
3848
}
3949

4050
bool MomentaryButton::isPressed(int level) const {
@@ -60,10 +70,14 @@ int MomentaryButton::check(bool repeat_click) {
6070
// button UP
6171
if (_long_millis > 0) {
6272
if (down_at > 0 && (unsigned long)(millis() - down_at) < _long_millis) { // only a CLICK if still within the long_press millis
63-
event = BUTTON_EVENT_CLICK;
73+
_click_count++;
74+
_last_click_time = millis();
75+
_pending_click = true;
6476
}
6577
} else {
66-
event = BUTTON_EVENT_CLICK; // any UP results in CLICK event when NOT using long_press feature
78+
_click_count++;
79+
_last_click_time = millis();
80+
_pending_click = true;
6781
}
6882
if (event == BUTTON_EVENT_CLICK && cancel) {
6983
event = BUTTON_EVENT_NONE;
@@ -87,5 +101,25 @@ int MomentaryButton::check(bool repeat_click) {
87101
}
88102
}
89103

104+
if (_pending_click && (millis() - _last_click_time) >= _multi_click_window) {
105+
switch (_click_count) {
106+
case 1:
107+
event = BUTTON_EVENT_CLICK;
108+
break;
109+
case 2:
110+
event = BUTTON_EVENT_DOUBLE_CLICK;
111+
break;
112+
case 3:
113+
event = BUTTON_EVENT_TRIPLE_CLICK;
114+
break;
115+
default:
116+
// For 4+ clicks, treat as triple click?
117+
event = BUTTON_EVENT_TRIPLE_CLICK;
118+
break;
119+
}
120+
_click_count = 0;
121+
_pending_click = false;
122+
}
123+
90124
return event;
91125
}

src/helpers/ui/MomentaryButton.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
#define BUTTON_EVENT_NONE 0
66
#define BUTTON_EVENT_CLICK 1
77
#define BUTTON_EVENT_LONG_PRESS 2
8+
#define BUTTON_EVENT_DOUBLE_CLICK 3
9+
#define BUTTON_EVENT_TRIPLE_CLICK 4
810

911
class MomentaryButton {
1012
int8_t _pin;
@@ -13,6 +15,10 @@ class MomentaryButton {
1315
int _long_millis;
1416
int _threshold; // analog mode
1517
unsigned long down_at;
18+
uint8_t _click_count;
19+
unsigned long _last_click_time;
20+
int _multi_click_window;
21+
bool _pending_click;
1622

1723
bool isPressed(int level) const;
1824

0 commit comments

Comments
 (0)