/
FiveButton.cpp
108 lines (85 loc) · 2.95 KB
/
FiveButton.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include "Arduino.h"
#include "FiveButton.h"
FiveButton::FiveButton(int pin, bool useInternalPullup) {
_pin = pin;
_useInternalPullup = useInternalPullup;
if (_useInternalPullup) {
pinMode(_pin, INPUT_PULLUP);
} else {
pinMode(_pin, INPUT);
}
isButtonPressed = HIGH;
wasButtonPressed = HIGH;
isWaitingForDoubleClick = false;
isDoubleClickOnNextRelease = false;
isTripleClickOnNextRelease = false;
isSingleClickAllowed = true;
}
int FiveButton::checkButton() {
int event = 0;
isButtonPressed = digitalRead(_pin);
// Button pressed down
if (isButtonPressed == LOW && wasButtonPressed == HIGH && (millis() - buttonReleaseTime) > DEBOUNCE_TIME)
{
buttonPressTime = millis();
ignoreButtonRelease = false;
if ((millis() - buttonReleaseTime) < DOUBLE_CLICK_GAP && !isDoubleClickOnNextRelease && isWaitingForDoubleClick)
isDoubleClickOnNextRelease = true;
else if ((millis() - buttonReleaseTime) < TRIPLE_CLICK_GAP && !isTripleClickOnNextRelease && isWaitingForDoubleClick)
isTripleClickOnNextRelease = true;
isWaitingForDoubleClick = false;
}
// Button released
else if (isButtonPressed == HIGH && wasButtonPressed == LOW && (millis() - buttonPressTime) > DEBOUNCE_TIME)
{
if (!ignoreButtonRelease)
{
buttonReleaseTime = millis();
if (!isTripleClickOnNextRelease && !isDoubleClickOnNextRelease)
isWaitingForDoubleClick = true;
else if (isTripleClickOnNextRelease)
{
event = 3; // Triple click event
isTripleClickOnNextRelease = false;
isWaitingForDoubleClick = false;
isSingleClickAllowed = false;
}
else if (isDoubleClickOnNextRelease)
{
event = 2; // Double click event
isTripleClickOnNextRelease = false;
isWaitingForDoubleClick = false;
isSingleClickAllowed = false;
}
// Test for normal click event: DOUBLE_CLICK_GAP expired
if (isWaitingForDoubleClick && !isTripleClickOnNextRelease && !isDoubleClickOnNextRelease &&
isSingleClickAllowed && event != 2)
{
event = 1; // Single click event
isWaitingForDoubleClick = false;
}
// Test for hold
if ((millis() - buttonPressTime) >= HOLD_TIME)
{
// Trigger "normal" hold
if (!didHoldEventHappen)
{
event = 4; // Hold event
ignoreButtonRelease = true;
didHoldEventHappen = true;
return event; // Return immediately to avoid long hold detection below
}
// Trigger "long" hold
if ((millis() - buttonPressTime) >= LONG_HOLD_TIME) {
if (!didLongHoldEventHappen)
{
event = 5; // Long hold event
didLongHoldEventHappen = true;
return event; // Return immediately to avoid further processing
}
}
}
}
}
wasButtonPressed = isButtonPressed;
}