3template <uint8_t menuCount>
4IntervalTimer MenuHandler<menuCount>::menuChangeTimer;
6template <uint8_t menuCount>
7long MenuHandler<menuCount>::previousMillisHold;
9template <uint8_t menuCount>
10uint16_t MenuHandler<menuCount>::holdingTime;
12template <uint8_t menuCount>
13uint8_t MenuHandler<menuCount>::currentMenu;
15template <uint8_t menuCount>
16uint8_t MenuHandler<menuCount>::currentValue[menuCount];
18template <uint8_t menuCount>
19uint8_t MenuHandler<menuCount>::maxValue[menuCount];
21template <uint8_t menuCount>
22uint8_t MenuHandler<menuCount>::pin;
24template <uint8_t menuCount>
25bool MenuHandler<menuCount>::holdingState;
27template <uint8_t menuCount>
28bool MenuHandler<menuCount>::previousState;
30template <uint8_t menuCount>
31void MenuHandler<menuCount>::UpdateState() {
32 long currentTime = millis();
33 bool pinState = digitalRead(pin);
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;
41 previousState = false;
42 } else if (!pinState) { // Pin is pressed,
46 if (timeOn > holdingTime && pinState) {
47 previousMillisHold = currentTime;
49 WriteEEPROM(currentMenu, currentValue[currentMenu]);
52 if (currentMenu >= menuCount) currentMenu = 0;
53 } else if (timeOn > 50 && pinState) {
54 previousMillisHold = currentTime;
56 currentValue[currentMenu] += 1;
57 if (currentValue[currentMenu] >= maxValue[currentMenu]) currentValue[currentMenu] = 0;
61template <uint8_t menuCount>
62uint8_t MenuHandler<menuCount>::ReadEEPROM(uint16_t index) {
63 return EEPROM.read(index);
66template <uint8_t menuCount>
67void MenuHandler<menuCount>::WriteEEPROM(uint16_t index, uint8_t value) {
68 EEPROM.write(index, value);
71template <uint8_t menuCount>
72void MenuHandler<menuCount>::Begin() {
73 menuChangeTimer.begin(UpdateState, 1000);
76template <uint8_t menuCount>
77bool MenuHandler<menuCount>::Initialize(uint8_t pin, uint16_t holdingTime) {
78 MenuHandler::holdingState = true;
80 MenuHandler::previousState = false;
82 pinMode(pin, INPUT_PULLUP);
84 MenuHandler::pin = pin;
85 MenuHandler::holdingTime = holdingTime;
87 for (uint8_t i = 0; i < menuCount; i++) {
88 currentValue[i] = ReadEEPROM(i);
91 return ReadEEPROM(menuCount + 1) != 255;
94template <uint8_t menuCount>
95void MenuHandler<menuCount>::SetDefaultValue(uint16_t menu, uint8_t value) {
96 if (menu >= menuCount) return;
98 currentValue[menu] = value;
100 WriteEEPROM(menu, value);
103template <uint8_t menuCount>
104void MenuHandler<menuCount>::SetInitialized() {
105 WriteEEPROM(menuCount + 1, 0);
108template <uint8_t menuCount>
109void MenuHandler<menuCount>::SetMenuMax(uint8_t menu, uint8_t maxValue) {
110 if (menu >= menuCount) return;
112 MenuHandler::maxValue[menu] = maxValue;
115template <uint8_t menuCount>
116uint8_t MenuHandler<menuCount>::GetMenuValue(uint8_t menu) {
117 return currentValue[menu];
120template <uint8_t menuCount>
121uint8_t MenuHandler<menuCount>::GetCurrentMenu() {