-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbutton.ino
170 lines (138 loc) · 5.67 KB
/
button.ino
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
bool brightDirection;
static bool startButtonHolding = false; // флаг: кнопка удерживается для изменения яркости/скорости/масштаба лампы кнопкой
void buttonTick()
{
if (!buttonEnabled) // события кнопки не обрабатываются, если она заблокирована
{
return;
}
touch.tick();
uint8_t clickCount = touch.hasClicks() ? touch.getClicks() : 0U;
// однократное нажатие
if (clickCount == 1U)
{
if (dawnFlag)
{
manualOff = true;
dawnFlag = false;
FastLED.setBrightness(modes[currentMode].Brightness);
changePower();
}
else
{
ONflag = !ONflag;
changePower();
}
settChanged = true;
eepromTimeout = millis();
loadingFlag = true;
}
// двухкратное нажатие
if (ONflag && clickCount == 2U)
{
if (++currentMode >= (int8_t)MODE_AMOUNT) currentMode = 0;
FastLED.setBrightness(modes[currentMode].Brightness);
loadingFlag = true;
settChanged = true;
eepromTimeout = millis();
FastLED.clear();
delay(1);
}
// трёхкратное нажатие
if (ONflag && clickCount == 3U)
{
if (--currentMode < 0) currentMode = MODE_AMOUNT - 1;
FastLED.setBrightness(modes[currentMode].Brightness);
loadingFlag = true;
settChanged = true;
eepromTimeout = millis();
FastLED.clear();
delay(1);
}
// пятикратное нажатие
if (clickCount == 5U) // вывод IP на лампу
{
if (espMode == 1U)
{
loadingFlag = true;
while (!fillString(WiFi.localIP().toString().c_str(), CRGB::White)) {
delay(1);
ESP.wdtFeed();
}
loadingFlag = true;
}
}
// шестикратное нажатие
if (clickCount == 6U) // вывод текущего времени бегущей строкой
{
printTime(thisTime, true, ONflag);
}
// семикратное нажатие
if (ONflag && clickCount == 7U) // смена рабочего режима лампы: с WiFi точки доступа на WiFi клиент или наоборот
{
espMode = (espMode == 0U) ? 1U : 0U;
EepromManager::SaveEspMode(&espMode);
#ifdef GENERAL_DEBUG
LOG.printf_P(PSTR("Рабочий режим лампы изменён и сохранён в энергонезависимую память\nНовый рабочий режим: ESP_MODE = %d, %s\nРестарт...\n"),
espMode, espMode == 0U ? F("WiFi точка доступа") : F("WiFi клиент (подключение к роутеру)"));
delay(1000);
#endif
showWarning(CRGB::Red, 3000U, 500U); // мигание красным цветом 3 секунды - смена рабочего режима лампы, перезагрузка
ESP.restart();
}
// кнопка только начала удерживаться
if (ONflag && touch.isHolded())
{
brightDirection = !brightDirection;
startButtonHolding = true;
}
// кнопка нажата и удерживается
if (ONflag && touch.isStep())
{
switch (touch.getHoldClicks())
{
case 0U: // просто удержание (до удержания кнопки кликов не было) - изменение яркости
{
uint8_t delta = modes[currentMode].Brightness < 10U // определение шага изменения яркости: при яркости [1..10] шаг = 1, при [11..16] шаг = 3, при [17..255] шаг = 15
? 1U
: 5U;
modes[currentMode].Brightness =
constrain(brightDirection
? modes[currentMode].Brightness + delta
: modes[currentMode].Brightness - delta,
1, 255);
FastLED.setBrightness(modes[currentMode].Brightness);
#ifdef GENERAL_DEBUG
LOG.printf_P(PSTR("Новое значение яркости: %d\n"), modes[currentMode].Brightness);
#endif
break;
}
case 1U: // удержание после одного клика - изменение скорости
{
modes[currentMode].Speed = constrain(brightDirection ? modes[currentMode].Speed + 1 : modes[currentMode].Speed - 1, 1, 255);
#ifdef GENERAL_DEBUG
LOG.printf_P(PSTR("Новое значение скорости: %d\n"), modes[currentMode].Speed);
#endif
break;
}
case 2U: // удержание после двух кликов - изменение масштаба
{
modes[currentMode].Scale = constrain(brightDirection ? modes[currentMode].Scale + 1 : modes[currentMode].Scale - 1, 1, 100);
#ifdef GENERAL_DEBUG
LOG.printf_P(PSTR("Новое значение масштаба: %d\n"), modes[currentMode].Scale);
#endif
break;
}
default:
break;
}
settChanged = true;
eepromTimeout = millis();
}
// кнопка отпущена после удерживания
if (ONflag && !touch.isHold() && startButtonHolding) // кнопка отпущена после удерживания, нужно отправить MQTT сообщение об изменении яркости лампы
{
startButtonHolding = false;
loadingFlag = true;
}
}