-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathButton.cpp
69 lines (56 loc) · 1.29 KB
/
Button.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
#include "Button.h"
Button::Button(int pin)
{
this->pin = pin;
pinMode(pin, INPUT_PULLUP);
}
ButtonState Button::read()
{
// TODO: Add debouncer
bool pressed = digitalRead(pin);
//Serial.println("button pressed");
bool down = pressed && !wasPressed;
bool up = !pressed && wasPressed;
long pressDuration = 0;
if (down){
lastDown = millis();
}
if (up){
lastUp = millis();
pressDuration = lastUp - lastDown;
}
wasPressed = pressed;
bool isLongPress;
bool isSinglePress;
if (pressed){
isLongPress = millis() - lastDown >= 1000;
} else if (up){
isLongPress = pressDuration >= 1000;
} else {
isLongPress = false;
}
if (up){
isSinglePress = pressDuration < 500 && pressDuration > 20;
} else {
isSinglePress = false;
}
bool isDoublePress = isSinglePress && millis() - lastSinglePress < 500 && millis() - lastDoublePress > 1000;
if (isDoublePress){
lastDoublePress = millis();
}
if (isSinglePress){
lastSinglePress = millis();
}
bool sendLongPress = isLongPress && !wasLong;
wasLong = isLongPress;
return ButtonState {
pressed,
down,
up,
sendLongPress,
isSinglePress,
isDoublePress,
lastDown,
lastUp
};
}