forked from dbprof/ny-led-matrix
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbuttonMinim.h
92 lines (84 loc) · 1.97 KB
/
buttonMinim.h
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
#pragma pack(push,1)
typedef struct {
bool holdedFlag: 1;
bool btnFlag: 1;
bool pressF: 1;
bool clickF: 1;
bool holdF: 1;
} buttonMinimFlags;
#pragma pack(pop)
class buttonMinim {
public:
buttonMinim(uint8_t pin, boolean type); // type true - pullDOWN, false - input pullUP
boolean pressed();
boolean clicked();
boolean holding();
boolean holded();
private:
buttonMinimFlags flags;
void tick();
uint32_t _btnTimer;
byte _pin;
boolean _type;
};
buttonMinim::buttonMinim(uint8_t pin, boolean type) {
_pin = pin;
_type = type;
if (!_type) pinMode(_pin, INPUT_PULLUP);
else pinMode(_pin, INPUT);
}
void buttonMinim::tick() {
boolean btnState = digitalRead(_pin) ^ _type;
if (!btnState && !flags.btnFlag && ((uint32_t)millis() - _btnTimer > 90)) {
flags.btnFlag = true;
_btnTimer = millis();
flags.pressF = true;
flags.holdedFlag = true;
}
if (btnState && flags.btnFlag && ((uint32_t)millis() - _btnTimer < 350)) {
flags.btnFlag = false;
_btnTimer = millis();
flags.clickF = true;
flags.holdF = false;
}
if (flags.btnFlag && ((uint32_t)millis() - _btnTimer > 600)) {
if (!btnState) {
flags.holdF = true;
} else {
flags.btnFlag = false;
flags.holdF = false;
_btnTimer = millis();
}
}
}
boolean buttonMinim::pressed() {
buttonMinim::tick();
if (flags.pressF) {
flags.pressF = false;
return true;
}
else return false;
}
boolean buttonMinim::clicked() {
buttonMinim::tick();
if (flags.clickF) {
flags.clickF = false;
return true;
}
else return false;
}
boolean buttonMinim::holding() {
buttonMinim::tick();
if (flags.holdF) {
return true;
}
else return false;
}
boolean buttonMinim::holded() {
buttonMinim::tick();
if (flags.holdF && flags.holdedFlag) {
flags.holdedFlag = false;
return true;
}
else return false;
}