ProtoTracer  1.0
Real-time 3D rendering and animation engine
Loading...
Searching...
No Matches
SingleButtonMenuHandler.tpp
Go to the documentation of this file.
1#pragma once
2
3template <uint8_t menuCount>
4IntervalTimer MenuHandler<menuCount>::menuChangeTimer;
5
6template <uint8_t menuCount>
7long MenuHandler<menuCount>::previousMillisHold;
8
9template <uint8_t menuCount>
10uint16_t MenuHandler<menuCount>::holdingTime;
11
12template <uint8_t menuCount>
13uint8_t MenuHandler<menuCount>::currentMenu;
14
15template <uint8_t menuCount>
16uint8_t MenuHandler<menuCount>::currentValue[menuCount];
17
18template <uint8_t menuCount>
19uint8_t MenuHandler<menuCount>::maxValue[menuCount];
20
21template <uint8_t menuCount>
22uint8_t MenuHandler<menuCount>::pin;
23
24template <uint8_t menuCount>
25bool MenuHandler<menuCount>::holdingState;
26
27template <uint8_t menuCount>
28bool MenuHandler<menuCount>::previousState;
29
30template <uint8_t menuCount>
31void MenuHandler<menuCount>::UpdateState() {
32 long currentTime = millis();
33 bool pinState = digitalRead(pin);
34 long timeOn = 0;
35
36 if (pinState && !previousState) { // Pin not pressed, not triggered -> reset time
37 previousMillisHold = currentTime;
38 } else if (pinState && previousState) { // Pin not pressed, was triggered -> measure time
39 timeOn = currentTime - previousMillisHold;
40
41 previousState = false;
42 } else if (!pinState) { // Pin is pressed,
43 previousState = true;
44 }
45
46 if (timeOn > holdingTime && pinState) {
47 previousMillisHold = currentTime;
48
49 WriteEEPROM(currentMenu, currentValue[currentMenu]);
50
51 currentMenu += 1;
52 if (currentMenu >= menuCount) currentMenu = 0;
53 } else if (timeOn > 50 && pinState) {
54 previousMillisHold = currentTime;
55
56 currentValue[currentMenu] += 1;
57 if (currentValue[currentMenu] >= maxValue[currentMenu]) currentValue[currentMenu] = 0;
58 }
59}
60
61template <uint8_t menuCount>
62uint8_t MenuHandler<menuCount>::ReadEEPROM(uint16_t index) {
63 return EEPROM.read(index);
64}
65
66template <uint8_t menuCount>
67void MenuHandler<menuCount>::WriteEEPROM(uint16_t index, uint8_t value) {
68 EEPROM.write(index, value);
69}
70
71template <uint8_t menuCount>
72void MenuHandler<menuCount>::Begin() {
73 menuChangeTimer.begin(UpdateState, 1000);
74}
75
76template <uint8_t menuCount>
77bool MenuHandler<menuCount>::Initialize(uint8_t pin, uint16_t holdingTime) {
78 MenuHandler::holdingState = true;
79
80 MenuHandler::previousState = false;
81
82 pinMode(pin, INPUT_PULLUP);
83
84 MenuHandler::pin = pin;
85 MenuHandler::holdingTime = holdingTime;
86
87 for (uint8_t i = 0; i < menuCount; i++) {
88 currentValue[i] = ReadEEPROM(i);
89 }
90
91 return ReadEEPROM(menuCount + 1) != 255;
92}
93
94template <uint8_t menuCount>
95void MenuHandler<menuCount>::SetDefaultValue(uint16_t menu, uint8_t value) {
96 if (menu >= menuCount) return;
97
98 currentValue[menu] = value;
99
100 WriteEEPROM(menu, value);
101}
102
103template <uint8_t menuCount>
104void MenuHandler<menuCount>::SetInitialized() {
105 WriteEEPROM(menuCount + 1, 0);
106}
107
108template <uint8_t menuCount>
109void MenuHandler<menuCount>::SetMenuMax(uint8_t menu, uint8_t maxValue) {
110 if (menu >= menuCount) return;
111
112 MenuHandler::maxValue[menu] = maxValue;
113}
114
115template <uint8_t menuCount>
116uint8_t MenuHandler<menuCount>::GetMenuValue(uint8_t menu) {
117 return currentValue[menu];
118}
119
120template <uint8_t menuCount>
121uint8_t MenuHandler<menuCount>::GetCurrentMenu() {
122 return currentMenu;
123}