-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbutton.d
45 lines (37 loc) · 1.01 KB
/
button.d
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
module button;
import stmbridge;
import clock;
private enum BUTTON_INTERVAL = 50;
public enum KeyState { IDLE, PRESSED, RELEASED }
struct Button {
uint GPIO_BANK;
ushort GPIO_PIN;
ulong next_time;
bool last_state = true;
bool current_state = true;
this(uint bank, ushort pin) {
GPIO_BANK = bank;
GPIO_PIN = pin;
}
KeyState keyChange() {
KeyState keyState = KeyState.IDLE;
bool state = gpio_get(GPIO_BANK, GPIO_PIN) == GPIO_PIN;
if (state != last_state) {
next_time = system_millis + BUTTON_INTERVAL;
}
if (next_time < system_millis) {
if (current_state != state) {
current_state = state;
keyState = current_state ? KeyState.PRESSED : KeyState.RELEASED;
}
}
last_state = state;
return keyState;
}
bool keyDown() {
return keyChange() == KeyState.PRESSED;
}
bool keyUp() {
return keyChange == KeyState.RELEASED;
}
}