forked from createskyblue/OpenT12
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Event.cpp
283 lines (246 loc) · 8.12 KB
/
Event.cpp
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
#include "OpenT12.h"
//事件计时器
uint32_t EventTimerUpdate = 0;
//屏保事件计时器
static uint32_t ScreenProtectorTimer = 0;
/***
* @description: 用户有动作时将会触发此函数
* @param {*}
* @return {*}
*/
void TimerUpdateEvent(void) {
//printf("重置时间计时器\n");
EventTimerUpdate = millis();
ScreenProtectorTimer = millis();
pages_Tip_Display_timer = EventTimerUpdate;
}
/***
* @description: 单击功率爆发技能 事件
* @param {*}
* @return {*}
*/
uint32_t BoostTimer = 0;
void BoostButton_EventLoop(void) {
//单击 进行短时功率爆发
if (SYSKey == 1) {
if (!BoostEvent) {
BoostEvent = true;
BoostTimer = millis();
} else BoostEvent = false;
}
//功率爆发技能计时器
if (millis() - BoostTimer > BoostTime * 1000) {
//技能时间到
BoostEvent = false;
}
}
/***
* @description: 双击快速召唤PID设置
* @param {*}
* @return {*}
*/
void FastPID_MenuSummon_EventLoop(void){
//若发现双击,则快速打开PID菜单
if (SYSKey == 3) System_PIDMenu_Init();
}
/***
* @description: 计时器事件Loop
* @param {*}
* @return {*}
*/
void TimerEventLoop(void) {
//事件事件距离计时器
uint32_t TimerEventTimer = millis() - EventTimerUpdate;
//更新BOOST提温事件
BoostButton_EventLoop();
//更新PID菜单快速召唤事件
FastPID_MenuSummon_EventLoop();
//刷新手柄触发开关事件:可引发手柄休眠事件
SW_WakeLOOP();
//更新休眠和停机时间 停机优先级 > 休眠优先级
if (ShutdownTime != 0 && TimerEventTimer > Minute2Millis(ShutdownTime)) {
//系统停机
ShutdownEvent = true;
SleepEvent = false;
}else if (TipCallSleepEvent || SleepTime != 0 && TimerEventTimer > Minute2Millis(SleepTime)) {
//进入休眠
SleepEvent = true;
//锁定编码器,因为休眠模式中不允许修改设定温度
Counter_LOCK_Flag = true;
}else{
if (SleepEvent) {
SleepEvent = false;
Counter_LOCK_Flag = false;
}
ShutdownEvent = false;
//不休眠\不停机 则重置屏保计时器,确保不会进入屏保
ScreenProtectorTimer = millis();
}
//休眠超过一段时间后进入屏保程序
if (ScreenProtectorTime != 0
&& millis() - ScreenProtectorTimer > ScreenProtectorTime * 1000)
SleepScreenProtectFlag = true; //开启屏保程序
else SleepScreenProtectFlag = false;
//printf("无动作时间%ld,停机计时%ld,休眠计时%ld\n", TimerEventTimer, Minute2Millis(ShutdownTime), Minute2Millis(SleepTime));
}
/***
* @description: 更新系统状态码
* @param {*}
* @return {*}
*/
void SYS_StateCode_Update(void) {
static uint32_t TipEventTimer = 0; //烙铁安装移除事件计时器:防止事件临界抖动
if (CalculateTemp((double)LastADC,PTemp) > 500) {
if (millis() - TipEventTimer > TipEvent_CoolTime) {
if (TipInstallEvent) {
//播放设备移除音效
SetSound(TipRemove);
//移除烙铁头
ERROREvent = true;
TipInstallEvent = false;
TimerUpdateEvent(); //刷新事件:外界环境变更
TipEventTimer = millis(); //重置烙铁安装移除事件计时器
Log(LOG_INFO, "烙铁头移除");
}
}
}
else
{
if (millis() - TipEventTimer > TipEvent_CoolTime) {
if (!TipInstallEvent) {
//播放设备安装音效
SetSound(TipInstall);
//安装烙铁头
ERROREvent = false;
TipInstallEvent = true;
TimerUpdateEvent(); //刷新事件:外界环境变更
TipEventTimer = millis(); //重置烙铁安装移除事件计时器
Log(LOG_INFO, "烙铁头安装");
//烙铁插入,如果有多个配置则弹出菜单以供选择
if (TipTotal > 1) {
//弹出配置选择菜单
System_TipMenu_Init();
}
}
}
}
//更新状态码
if (PID_Output > 180) {
//加热状态
TempCTRL_Status = TEMP_STATUS_HEAT;
}else {
if (TempGap < 10) {
//温差接近目标值:正常
TempCTRL_Status = TEMP_STATUS_WORKY;
}else{
//进行PID微调:维持
TempCTRL_Status = TEMP_STATUS_HOLD;
}
}
if (ERROREvent==true) {
//系统错误
TempCTRL_Status = TEMP_STATUS_ERROR;
}else if (BoostEvent) {
//快速升温事件
TempCTRL_Status = TEMP_STATUS_BOOST;
}
if (ShutdownEvent) {
//烙铁进入停机模式
TempCTRL_Status = TEMP_STATUS_OFF;
//进入关机事件
ShutdownEventLoop();
}else if (SleepEvent) {
//烙铁进入休眠模式
TempCTRL_Status = TEMP_STATUS_SLEEP;
}
//到温声效播放事件
static uint32_t TempToneStabilitytimer = 0; //到温稳定状态计时器,确保真正播放到温音效
//到达预定温度 并且足够稳定才能播放到温音效
if (TempGap <= 6 && TempCTRL_Status != TEMP_STATUS_ERROR) {
//温差接近目标值:正常
if (!TempToneFlag && millis() - TempToneStabilitytimer > TempToneStabilitytime) {
//printf("尝试播放到温音效");
SetSound(Beep3);
TempToneFlag = true;
}
}else {
//printf("音效失败 温度:%d 状态:%d 稳定:%d\n", TipTemperature > PID_Setpoint - 10, TempCTRL_Status != TEMP_STATUS_ERROR, millis() - TempToneStabilitytimer > TempToneStabilitytime);
TempToneStabilitytimer = millis();
if (TempGap >= 20) TempToneFlag = false;
}
//欠压警告
if (UndervoltageAlert!=0 && SYS_Voltage < UndervoltageAlert) UnderVoltageEvent = true;
else UnderVoltageEvent = false;
}
/***
* @description: 关机事件安全警告画面;重要提示:为了确保您的安全,不建议禁用此功能!
* @param {*}
* @return {*}
*/
void ShutdownEventLoop(void) {
//尝试关闭功率管输出
SetPOWER(0);
//关闭Display()中的PlaySoundLoop
PlaySoundLoopState = false;
//屏保以及警示画面
while(1) {
Clear();
DrawIntensiveComputing();
//文字闪烁
if ((millis() / 1000) % 2) DrawMsgBox("请关闭电源!");
Display();
}
}
bool EnterPasswd(void) {
//空密码无需授权
if (strlen(BootPasswd)==0) return 1;
char passwdBuffer[20] = { 0 };
TextEditor("[需要授权]", passwdBuffer);
if (strcmp(passwdBuffer, BootPasswd)) return 0;
return 1;
}
void SetPasswd(void) {
if (!EnterPasswd()) {
Pop_Windows("身份验证失败");
return;
}
char passwdBuffer[2][20] = {0};
TextEditor("[设置新密码]", passwdBuffer[0]);
TextEditor("[确认密码]", passwdBuffer[1]);
if (strcmp(passwdBuffer[0], passwdBuffer[1])) {
Pop_Windows("两次密码不一致");
return;
}
strcpy(BootPasswd, passwdBuffer[0]);
Pop_Windows("密码已更新");
}
/***
* @description: 手柄休眠中断引脚
* @param {*}
* @return {*}
*/
void ICACHE_RAM_ATTR SW_IRQHandler(void) {
//printf("休眠中断 GPIO:%d\n", digitalRead(SW_PIN));
//重置事件计时器
TimerUpdateEvent();
}
/***
* @description: 手柄休眠引脚循环检测
* @param {*}
* @return {*}
*/
void SW_WakeLOOP(void) {
static bool lastState = 1; //默认上拉
bool state = digitalRead(SW_PIN);
if (state != lastState) {
lastState = state;
//重置无动作计时器
TimerUpdateEvent();
}
//如果手柄触发模式是干簧管(磁力触发)则进入休眠模式
if (HandleTrigger == HANDLETRIGGER_ReedSwitch) {
//默认上拉,当磁力开关触发时引脚状态应该为低电平
if (state == 0) TipCallSleepEvent = true;
else TipCallSleepEvent = false;
}else TipCallSleepEvent = false;
}