-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathMenu.ino
More file actions
83 lines (75 loc) · 2.03 KB
/
Menu.ino
File metadata and controls
83 lines (75 loc) · 2.03 KB
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
#include "Menu.h"
char MenuItem::displayBuffer[17];
const char * MenuList::line2() {
return subItems[curItem]->name;
}
MenuItem * MenuList::onKeyPressed(int keys) {
if(curItem > 0 && (keys == Menu::KEY_LEFT)) {
--curItem;
return this;
} else if (subItems[curItem + 1] && (keys == Menu::KEY_RIGHT)) {
++curItem;
return this;
} else if(keys == Menu::KEY_DOWN) {
return subItems[curItem];
}
return NULL;
}
void Menu::displayRefresh() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(currentMenu->line1());
lcd.setCursor(0, 1);
lcd.print(currentMenu->line2());
}
void Menu::onKeyPressed(int keys) {
if(keys == Menu::KEY_UP && currentMenu->parent && currentMenu->parent != currentMenu) {
currentMenu->onExit();
currentMenu = currentMenu->parent;
} else {
MenuItem *nextMenu = currentMenu->onKeyPressed(keys);
if(nextMenu == currentMenu->parent) {
currentMenu->onExit();
currentMenu = currentMenu->parent;
} else if(nextMenu && nextMenu != currentMenu) {
currentMenu = nextMenu;
currentMenu->onEnter();
}
}
displayRefresh();
}
MenuItem * MenuConfirm::onKeyPressed(int keys) {
if(keys == Menu::KEY_DOWN) {
onConfirmed();
return parent;
}
return NULL;
}
void Menu::readKeys() {
if(!currentMenu)
return;
// Read keys in a fashion that returns only one pressed key at a time
int keys = 0;
keys = digitalRead(upKeyPin) ? 0 : KEY_UP;
keys = !keys ? (digitalRead(downKeyPin) ? 0 : KEY_DOWN) : keys;
keys = !keys ? (digitalRead(leftKeyPin) ? 0 : KEY_LEFT) : keys;
keys = !keys ? (digitalRead(rightKeyPin) ? 0 : KEY_RIGHT) : keys;
if(keys) {
if(keys != lastKeyState) {
keyRepeat = KEY_REPEAT_FIRST;
keyRepeatCount = 0;
onKeyPressed(keys);
} else {
// Key hold
if(!--keyRepeat) {
++keyRepeatCount;
if(keyRepeatCount >= KEY_REPEAT_ACCEL_THRES)
keyRepeat = KEY_REPEAT_FAST;
else
keyRepeat = KEY_REPEAT_NEXT;
onKeyPressed(keys);
}
}
}
lastKeyState = keys;
}