Sat, 20 Oct 2018 13:23:15 +0200
Initial checkin brewboard
0 | 1 | /** |
2 | * @file buttons.c | |
3 | * @brief The touch buttons. | |
4 | */ | |
5 | ||
6 | #include "config.h" | |
7 | ||
8 | ||
9 | sButton Buttons[MAXBUTTONS]; // 40 buttons on a screen. | |
10 | int level = 1; // Keyboard level. | |
11 | ||
12 | extern uint8_t VNC_pointer_button; | |
13 | extern uint16_t VNC_pointer_x; | |
14 | extern uint16_t VNC_pointer_y; | |
15 | ||
16 | //static const char *TAG = "buttons"; | |
17 | ||
18 | #define EDIT_TYPE_TEXT 0 | |
19 | #define EDIT_TYPE_INT 1 | |
20 | #define EDIT_TYPE_FLOAT 2 | |
21 | ||
22 | ||
23 | /***************************************************************************/ | |
24 | ||
25 | ||
26 | void WaitTouchReleased(void) | |
27 | { | |
28 | int tx, ty; | |
29 | ||
30 | // Do raw reads. | |
31 | while (TFT_read_touch(&tx, &ty, 1) == 1) { | |
32 | vTaskDelay(50 / portTICK_PERIOD_MS); | |
33 | } | |
34 | } | |
35 | ||
36 | ||
37 | ||
38 | void Buttons_Clear(void) | |
39 | { | |
40 | int i; | |
41 | ||
42 | for (i = 0; i < MAXBUTTONS; i++) { | |
43 | if ((Buttons[i].x != -1) && strlen(Buttons[i].text)) { | |
44 | TFT_fillRect(Buttons[i].x, Buttons[i].y, Buttons[i].w, Buttons[i].h, TFT_BLACK); | |
45 | } | |
46 | Buttons[i].x = -1; | |
47 | } | |
48 | } | |
49 | ||
50 | ||
51 | ||
52 | void Buttons_Add(int x, int y, int w, int h, char *txt, int order) | |
53 | { | |
54 | Buttons[order].x = x; | |
55 | Buttons[order].y = y; | |
56 | Buttons[order].w = w; | |
57 | Buttons[order].h = h; | |
58 | strncpy(Buttons[order].text, txt, 11); | |
59 | Buttons[order].dark = Buttons[order].small = false; | |
60 | } | |
61 | ||
62 | ||
63 | ||
64 | void Buttons_Show(void) | |
65 | { | |
66 | int i; | |
67 | const color_t KEY_NORM = { 191, 191, 191}; | |
68 | const color_t KEY_DARK = { 95, 95, 95}; | |
69 | const color_t KEY_LOCK = { 127, 127, 255}; | |
70 | ||
71 | _fg = TFT_BLACK; | |
72 | ||
73 | for (i = 0; i < MAXBUTTONS; i++) { | |
74 | if (Buttons[i].x != -1) { | |
75 | ||
76 | if (Buttons[i].lock) { | |
77 | _fg = TFT_BLACK; | |
78 | TFT_fillRoundRect(Buttons[i].x, Buttons[i].y, Buttons[i].w, Buttons[i].h, 5, KEY_LOCK); | |
79 | } else if (Buttons[i].dark) { | |
80 | _fg = TFT_WHITE; | |
81 | TFT_fillRoundRect(Buttons[i].x, Buttons[i].y, Buttons[i].w, Buttons[i].h, 5, KEY_DARK); | |
82 | } else { | |
83 | _fg = TFT_BLACK; | |
84 | TFT_fillRoundRect(Buttons[i].x, Buttons[i].y, Buttons[i].w, Buttons[i].h, 5, KEY_NORM); | |
85 | } | |
86 | TFT_drawRoundRect(Buttons[i].x, Buttons[i].y, Buttons[i].w, Buttons[i].h, 5, TFT_LIGHTGREY); | |
87 | if (Buttons[i].small) | |
88 | TFT_setFont(DEFAULT_FONT, NULL); // DEF_SMALL_FONT | |
89 | else | |
90 | TFT_setFont(DEJAVU18_FONT, NULL); | |
91 | font_transparent = 1; | |
92 | TFT_print(Buttons[i].text, | |
93 | Buttons[i].x + ((Buttons[i].w - TFT_getStringWidth(Buttons[i].text)) / 2), | |
94 | Buttons[i].y + 1 + ((Buttons[i].h - TFT_getfontheight()) / 2)); | |
95 | } | |
96 | } | |
97 | ||
98 | font_transparent = 0; | |
99 | } | |
100 | ||
101 | ||
102 | ||
103 | int Buttons_Search(int x, int y) | |
104 | { | |
105 | int i; | |
106 | ||
107 | for (i = 0; i < MAXBUTTONS; i++) { | |
108 | if (Buttons[i].x != -1) { | |
109 | if ((x >= Buttons[i].x) && (x <= (Buttons[i].x + Buttons[i].w)) && | |
110 | (y >= Buttons[i].y) && (y <= (Buttons[i].y + Buttons[i].h))) { | |
111 | return i; | |
112 | } | |
113 | } | |
114 | } | |
115 | ||
116 | return -1; | |
117 | } | |
118 | ||
119 | ||
120 | ||
121 | int Buttons_Scan(void) | |
122 | { | |
123 | int tx, ty, rc; | |
124 | static int ox = -1, oy = -1, vx = -1, vy = -1; | |
125 | static bool t_pressed = false, v_pressed = false; | |
126 | ||
127 | if (TFT_read_touch(&tx, &ty, 0)) { | |
128 | t_pressed = true; | |
129 | ox = tx; | |
130 | oy = ty; | |
131 | return -1; | |
132 | } else if (t_pressed) { | |
133 | rc = Buttons_Search(ox, oy); | |
134 | t_pressed = false; | |
135 | ox = oy = -1; | |
136 | return rc; | |
137 | } | |
138 | ||
139 | if (VNC_pointer_button & 0x07) { | |
140 | v_pressed = true; | |
141 | vx = VNC_pointer_x; | |
142 | vy = VNC_pointer_y; | |
143 | return -1; | |
144 | } else if (v_pressed) { | |
145 | rc = Buttons_Search(vx, vy); | |
146 | v_pressed = false; | |
147 | vx = vy = -1; | |
148 | return rc; | |
149 | } | |
150 | ||
151 | return -1; | |
152 | } | |
153 | ||
154 | ||
155 | ||
156 | static const uint8_t alphalow_tab[] = { 'q','w','e','r','t','y','u','i','o','p', | |
157 | 'a','s','d','f','g','h','j','k','l', | |
158 | 'z','x','c','v','b','n','m' }; | |
159 | ||
160 | /* Level 1 keys */ | |
161 | void B_AlphaLow(void) | |
162 | { | |
163 | Buttons_Clear(); | |
164 | ||
165 | Buttons_Add( 2, 80,28,36,"q", 0); | |
166 | Buttons_Add( 34, 80,28,36,"w", 1); | |
167 | Buttons_Add( 66, 80,28,36,"e", 2); | |
168 | Buttons_Add( 98, 80,28,36,"r", 3); | |
169 | Buttons_Add(130, 80,28,36,"t", 4); | |
170 | Buttons_Add(162, 80,28,36,"y", 5); | |
171 | Buttons_Add(194, 80,28,36,"u", 6); | |
172 | Buttons_Add(226, 80,28,36,"i", 7); | |
173 | Buttons_Add(258, 80,28,36,"o", 8); | |
174 | Buttons_Add(290, 80,28,36,"p", 9); | |
175 | ||
176 | Buttons_Add( 18,120,28,36,"a",10); | |
177 | Buttons_Add( 50,120,28,36,"s",11); | |
178 | Buttons_Add( 82,120,28,36,"d",12); | |
179 | Buttons_Add(114,120,28,36,"f",13); | |
180 | Buttons_Add(146,120,28,36,"g",14); | |
181 | Buttons_Add(178,120,28,36,"h",15); | |
182 | Buttons_Add(210,120,28,36,"j",16); | |
183 | Buttons_Add(242,120,28,36,"k",17); | |
184 | Buttons_Add(274,120,28,36,"l",18); | |
185 | ||
186 | Buttons_Add( 50,160,28,36,"z",19); | |
187 | Buttons_Add( 82,160,28,36,"x",20); | |
188 | Buttons_Add(114,160,28,36,"c",21); | |
189 | Buttons_Add(146,160,28,36,"v",22); | |
190 | Buttons_Add(178,160,28,36,"b",23); | |
191 | Buttons_Add(210,160,28,36,"n",24); | |
192 | Buttons_Add(242,160,28,36,"m",25); | |
193 | ||
194 | Buttons_Add( 2,160,42,36,"caps",26); | |
195 | Buttons[26].dark = true; | |
196 | Buttons[26].small = true; | |
197 | Buttons[26].lock = false; | |
198 | Buttons_Add(276,160,42,36,"del",27); | |
199 | Buttons[27].dark = true; | |
200 | Buttons[27].small = true; | |
201 | ||
202 | Buttons_Add( 2,200,60,36,"123",28); | |
203 | Buttons[28].dark = true; | |
204 | Buttons_Add( 72,200,28,36,"/",29); | |
205 | Buttons_Add(108,200,104,36," ",30); | |
206 | Buttons_Add(220,200,28,36,".",31); | |
207 | Buttons_Add(258,200,60,36,"Ok",32); | |
208 | Buttons[32].dark = true; | |
209 | ||
210 | Buttons_Show(); | |
211 | } | |
212 | ||
213 | ||
214 | ||
215 | static const uint8_t alphacaps_tab[] = { 'Q','W','E','R','T','Y','U','I','O','P', | |
216 | 'A','S','D','F','G','H','J','K','L', | |
217 | 'Z','X','C','V','B','N','M' }; | |
218 | ||
219 | /* Level 2 and 3 keys */ | |
220 | void B_AlphaCaps(int level) | |
221 | { | |
222 | Buttons_Clear(); | |
223 | ||
224 | Buttons_Add( 2, 80,28,36,"Q", 0); | |
225 | Buttons_Add( 34, 80,28,36,"W", 1); | |
226 | Buttons_Add( 66, 80,28,36,"E", 2); | |
227 | Buttons_Add( 98, 80,28,36,"R", 3); | |
228 | Buttons_Add(130, 80,28,36,"T", 4); | |
229 | Buttons_Add(162, 80,28,36,"Y", 5); | |
230 | Buttons_Add(194, 80,28,36,"U", 6); | |
231 | Buttons_Add(226, 80,28,36,"I", 7); | |
232 | Buttons_Add(258, 80,28,36,"O", 8); | |
233 | Buttons_Add(290, 80,28,36,"P", 9); | |
234 | ||
235 | Buttons_Add( 18,120,28,36,"A",10); | |
236 | Buttons_Add( 50,120,28,36,"S",11); | |
237 | Buttons_Add( 82,120,28,36,"D",12); | |
238 | Buttons_Add(114,120,28,36,"F",13); | |
239 | Buttons_Add(146,120,28,36,"G",14); | |
240 | Buttons_Add(178,120,28,36,"H",15); | |
241 | Buttons_Add(210,120,28,36,"J",16); | |
242 | Buttons_Add(242,120,28,36,"K",17); | |
243 | Buttons_Add(274,120,28,36,"L",18); | |
244 | ||
245 | Buttons_Add( 50,160,28,36,"Z",19); | |
246 | Buttons_Add( 82,160,28,36,"X",20); | |
247 | Buttons_Add(114,160,28,36,"C",21); | |
248 | Buttons_Add(146,160,28,36,"V",22); | |
249 | Buttons_Add(178,160,28,36,"B",23); | |
250 | Buttons_Add(210,160,28,36,"N",24); | |
251 | Buttons_Add(242,160,28,36,"M",25); | |
252 | ||
253 | Buttons_Add( 2,160,42,36,"caps",26); | |
254 | Buttons[26].dark = true; | |
255 | Buttons[26].small = true; | |
256 | if (level == 3) | |
257 | Buttons[26].lock = true; | |
258 | else | |
259 | Buttons[26].lock = false; | |
260 | Buttons_Add(276,160,42,36,"del",27); | |
261 | Buttons[27].dark = true; | |
262 | Buttons[27].small = true; | |
263 | ||
264 | Buttons_Add( 2,200,60,36,"123",28); | |
265 | Buttons[28].dark = true; | |
266 | Buttons_Add( 72,200,28,36,"/",29); | |
267 | Buttons_Add(108,204,100,36," ",30); | |
268 | Buttons_Add(220,200,28,36,".",31); | |
269 | Buttons_Add(258,200,60,36,"Ok",32); | |
270 | Buttons[32].dark = true; | |
271 | ||
272 | Buttons_Show(); | |
273 | } | |
274 | ||
275 | ||
276 | ||
277 | static const uint8_t nums1_tab[] = { '1','2','3','4','5','6','7','8','9','0', | |
278 | '!','@','#','$','/','^','&','*','(',')', | |
279 | '-','\'','\"',':',';',',','?' }; | |
280 | ||
281 | /* Level 4 keys */ | |
282 | void B_Nums1(void) | |
283 | { | |
284 | Buttons_Clear(); | |
285 | ||
286 | Buttons_Add( 2, 80,28,36,"1", 0); | |
287 | Buttons_Add( 34, 80,28,36,"2", 1); | |
288 | Buttons_Add( 66, 80,28,36,"3", 2); | |
289 | Buttons_Add( 98, 80,28,36,"4", 3); | |
290 | Buttons_Add(130, 80,28,36,"5", 4); | |
291 | Buttons_Add(162, 80,28,36,"6", 5); | |
292 | Buttons_Add(194, 80,28,36,"7", 6); | |
293 | Buttons_Add(226, 80,28,36,"8", 7); | |
294 | Buttons_Add(258, 80,28,36,"9", 8); | |
295 | Buttons_Add(290, 80,28,36,"0", 9); | |
296 | ||
297 | Buttons_Add( 2,120,28,36,"!",10); | |
298 | Buttons_Add( 34,120,28,36,"@",11); | |
299 | Buttons_Add( 66,120,28,36,"#",12); | |
300 | Buttons_Add( 98,120,28,36,"$",13); | |
301 | Buttons_Add(130,120,28,36,"/",14); | |
302 | Buttons_Add(162,120,28,36,"^",15); | |
303 | Buttons_Add(194,120,28,36,"&",16); | |
304 | Buttons_Add(226,120,28,36,"*",17); | |
305 | Buttons_Add(258,120,28,36,"(",18); | |
306 | Buttons_Add(290,120,28,36,")",19); | |
307 | ||
308 | Buttons_Add( 50,160,28,36,"-",20); | |
309 | Buttons_Add( 82,160,28,36,"'",21); | |
310 | Buttons_Add(114,160,28,36,"\"",22); | |
311 | Buttons_Add(146,160,28,36,":",23); | |
312 | Buttons_Add(178,160,28,36,";",24); | |
313 | Buttons_Add(210,160,28,36,",",25); | |
314 | Buttons_Add(242,160,28,36,"?",26); | |
315 | ||
316 | Buttons_Add( 2,160,42,36,"1/2",27); | |
317 | Buttons[27].dark = true; | |
318 | Buttons_Add(276,160,42,36,"del",28); | |
319 | Buttons[28].dark = true; | |
320 | Buttons[28].small = true; | |
321 | ||
322 | Buttons_Add( 2,200,60,36,"ABC",29); | |
323 | Buttons[29].dark = true; | |
324 | Buttons_Add( 72,200,28,36,"/",30); | |
325 | Buttons_Add(108,204,100,36," ",31); | |
326 | Buttons_Add(220,200,28,36,".",32); | |
327 | Buttons_Add(258,200,60,36,"Ok",33); | |
328 | Buttons[33].dark = true; | |
329 | ||
330 | Buttons_Show(); | |
331 | } | |
332 | ||
333 | ||
334 | static const uint8_t nums2_tab[] = { '+','*','/','=','<','>','{','}','[',']', | |
335 | ' ',' ',' ',' ','%','~','`',' ',' ',' ', | |
336 | '_','\\','|',' ',' ',' ',' ' }; | |
337 | ||
338 | /* Level 5 */ | |
339 | void B_Nums2(void) | |
340 | { | |
341 | Buttons_Clear(); | |
342 | ||
343 | Buttons_Add( 2, 80,28,36,"+", 0); | |
344 | Buttons_Add( 34, 80,28,36,"*", 1); | |
345 | Buttons_Add( 66, 80,28,36,"/", 2); | |
346 | Buttons_Add( 98, 80,28,36,"=", 3); | |
347 | Buttons_Add(130, 80,28,36,"<", 4); | |
348 | Buttons_Add(162, 80,28,36,">", 5); | |
349 | Buttons_Add(194, 80,28,36,"{", 6); | |
350 | Buttons_Add(226, 80,28,36,"}", 7); | |
351 | Buttons_Add(258, 80,28,36,"[", 8); | |
352 | Buttons_Add(290, 80,28,36,"]", 9); | |
353 | ||
354 | Buttons_Add( 2,120,28,36," ",10); | |
355 | Buttons_Add( 34,120,28,36," ",11); | |
356 | Buttons_Add( 66,120,28,36," ",12); | |
357 | Buttons_Add( 98,120,28,36," ",13); | |
358 | Buttons_Add(130,120,28,36,"%",14); | |
359 | Buttons_Add(162,120,28,36,"~",15); | |
360 | Buttons_Add(194,120,28,36,"`",16); | |
361 | Buttons_Add(226,120,28,36," ",17); | |
362 | Buttons_Add(258,120,28,36," ",18); | |
363 | Buttons_Add(290,120,28,36," ",19); | |
364 | ||
365 | Buttons_Add( 50,160,28,36,"_",20); | |
366 | Buttons_Add( 82,160,28,36,"\\",21); | |
367 | Buttons_Add(114,160,28,36,"|",22); | |
368 | Buttons_Add(146,160,28,36," ",23); | |
369 | Buttons_Add(178,160,28,36," ",24); | |
370 | Buttons_Add(210,160,28,36," ",25); | |
371 | Buttons_Add(242,160,28,36," ",26); | |
372 | ||
373 | Buttons_Add( 2,160,42,36,"2/2",27); | |
374 | Buttons[27].dark = true; | |
375 | Buttons_Add(276,160,42,36,"del",28); | |
376 | Buttons[28].dark = true; | |
377 | Buttons[28].small = true; | |
378 | ||
379 | Buttons_Add( 2,200,60,36,"ABC",29); | |
380 | Buttons[29].dark = true; | |
381 | Buttons_Add( 72,200,28,36,"/",30); | |
382 | Buttons_Add(108,204,100,36," ",31); | |
383 | Buttons_Add(220,200,28,36,".",32); | |
384 | Buttons_Add(258,200,60,36,"Ok",33); | |
385 | Buttons[33].dark = true; | |
386 | ||
387 | Buttons_Show(); | |
388 | } | |
389 | ||
390 | ||
391 | static const uint8_t digits_tab[] = { '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '+', '-', '.' }; | |
392 | ||
393 | void B_Digits(void) | |
394 | { | |
395 | Buttons_Clear(); | |
396 | ||
397 | Buttons_Add( 61,200,147,36,"0", 9); | |
398 | ||
399 | Buttons_Add( 61,160,47,36,"1", 0); | |
400 | Buttons_Add(111,160,47,36,"2", 1); | |
401 | Buttons_Add(161,160,47,36,"3", 2); | |
402 | Buttons_Add(211,160,47,36,"+",10); | |
403 | Buttons[10].dark = true; | |
404 | ||
405 | Buttons_Add( 61,120,47,36,"4", 3); | |
406 | Buttons_Add(111,120,47,36,"5", 4); | |
407 | Buttons_Add(161,120,47,36,"6", 5); | |
408 | Buttons_Add(211,120,47,36,"-",11); | |
409 | Buttons[11].dark = true; | |
410 | ||
411 | Buttons_Add( 61, 80,47,36,"7", 6); | |
412 | Buttons_Add(111, 80,47,36,"8", 7); | |
413 | Buttons_Add(161, 80,47,36,"9", 8); | |
414 | Buttons_Add(211, 80,47,36,".",12); | |
415 | Buttons[12].dark = true; | |
416 | ||
417 | Buttons_Add(211,200,47,36,"del",13); | |
418 | Buttons[13].dark = true; | |
419 | Buttons[13].small = true; | |
420 | ||
421 | Buttons_Add(271,200,47,36,"Ok",14); | |
422 | Buttons[14].dark = true; | |
423 | ||
424 | Buttons_Show(); | |
425 | } | |
426 | ||
427 | ||
428 | ||
429 | int KeyBoardAll(void) | |
430 | { | |
431 | int key; | |
432 | ||
433 | key = Buttons_Scan(); | |
434 | if (key == -1) | |
435 | return -1; | |
436 | ||
437 | switch (level) { | |
438 | case 1: if (key >= 0 && key <= 25) { | |
439 | key = alphalow_tab[key]; | |
440 | } else if (key == 26) { | |
441 | level = 2; | |
442 | B_AlphaCaps(level); | |
443 | } else if (key == 27) { | |
444 | key = 127; | |
445 | } else if (key == 28) { | |
446 | level = 4; | |
447 | B_Nums1(); | |
448 | } else if (key == 29) { | |
449 | key = '/'; | |
450 | } else if (key == 30) { | |
451 | key = ' '; | |
452 | } else if (key == 31) { | |
453 | key = '.'; | |
454 | } else if (key == 32) { | |
455 | key = 0; | |
456 | } | |
457 | break; | |
458 | case 2: | |
459 | case 3: if (key >= 0 && key <= 25) { | |
460 | key = alphacaps_tab[key]; | |
461 | if (level == 2) { | |
462 | level = 1; | |
463 | B_AlphaLow(); | |
464 | } | |
465 | } else if (key == 26 && level == 3) { | |
466 | level = 1; | |
467 | B_AlphaLow(); | |
468 | } else if (key == 26 && level == 2) { | |
469 | level = 3; | |
470 | B_AlphaCaps(level); | |
471 | } else if (key == 27) { | |
472 | key = 127; | |
473 | } else if (key == 28) { | |
474 | level = 4; | |
475 | B_Nums1(); | |
476 | } else if (key == 29) { | |
477 | key = '/'; | |
478 | } else if (key == 30) { | |
479 | key = ' '; | |
480 | } else if (key == 31) { | |
481 | key = '.'; | |
482 | } else if (key == 32) { | |
483 | key = 0; | |
484 | } | |
485 | break; | |
486 | case 4: if (key >= 0 && key <= 26) { | |
487 | key = nums1_tab[key]; | |
488 | } else if (key == 27) { | |
489 | level = 5; | |
490 | B_Nums2(); | |
491 | } else if (key == 28) { | |
492 | key = 127; | |
493 | } else if (key == 29) { | |
494 | level = 1; | |
495 | B_AlphaLow(); | |
496 | } else if (key == 30) { | |
497 | key = '/'; | |
498 | } else if (key == 31) { | |
499 | key = ' '; | |
500 | } else if (key == 32) { | |
501 | key = '.'; | |
502 | } else if (key == 33) { | |
503 | key = 0; | |
504 | } | |
505 | break; | |
506 | case 5: if (key >= 0 && key <= 26) { | |
507 | key = nums2_tab[key]; | |
508 | } else if (key == 27) { | |
509 | level = 4; | |
510 | B_Nums1(); | |
511 | } else if (key == 28) { | |
512 | key = 127; | |
513 | } else if (key == 29) { | |
514 | level = 1; | |
515 | B_AlphaLow(); | |
516 | } else if (key == 30) { | |
517 | key = '/'; | |
518 | } else if (key == 31) { | |
519 | key = ' '; | |
520 | } else if (key == 32) { | |
521 | key = '.'; | |
522 | } else if (key == 33) { | |
523 | key = 0; | |
524 | } | |
525 | break; | |
526 | } | |
527 | ||
528 | return key; | |
529 | } | |
530 | ||
531 | ||
532 | int KeyBoardDigits(void) | |
533 | { | |
534 | int key; | |
535 | ||
536 | key = Buttons_Scan(); | |
537 | if (key == -1) | |
538 | return -1; | |
539 | ||
540 | if (key >= 0 && key <= 12) { | |
541 | key = digits_tab[key]; | |
542 | } else if (key == 13) { | |
543 | key = 127; | |
544 | } else if (key == 14) { | |
545 | key = 0; | |
546 | } | |
547 | ||
548 | return key; | |
549 | } | |
550 | ||
551 | ||
552 | ||
553 | /**************************************************************************/ | |
554 | /* | |
555 | * Data show and edit functions. | |
556 | */ | |
557 | ||
558 | void ShowText(uint16_t x, uint16_t y, char *label, char *txt) | |
559 | { | |
560 | _fg = TFT_LIGHTGREY; | |
561 | TFT_print(label, x, y); | |
562 | _fg = TFT_YELLOW; | |
563 | TFT_print(" ", LASTX, LASTY); | |
564 | TFT_print(txt, LASTX, LASTY); | |
565 | } | |
566 | ||
567 | ||
568 | ||
569 | void ShowInteger(uint16_t x, uint16_t y, char *label, char *suffix, int val) | |
570 | { | |
571 | char tmp[32]; | |
572 | ||
573 | _fg = TFT_LIGHTGREY; | |
574 | TFT_print(label, x, y); | |
575 | _fg = TFT_YELLOW; | |
576 | sprintf(tmp, " %d", val); | |
577 | TFT_print(tmp, LASTX, LASTY); | |
578 | if (suffix) { | |
579 | _fg = TFT_LIGHTGREY; | |
580 | TFT_print(suffix, LASTX, LASTY); | |
581 | } | |
582 | } | |
583 | ||
584 | ||
585 | ||
586 | void ShowBool(uint16_t x, uint16_t y, char *label, bool val) | |
587 | { | |
588 | _fg = TFT_LIGHTGREY; | |
589 | TFT_print(label, x, y); | |
590 | _fg = TFT_YELLOW; | |
591 | if (val) | |
592 | TFT_print(" J", LASTX, LASTY); | |
593 | else | |
594 | TFT_print(" N", LASTX, LASTY); | |
595 | } | |
596 | ||
597 | ||
598 | ||
599 | void ShowSSR2(uint16_t x, uint16_t y, int val) | |
600 | { | |
601 | _fg = TFT_LIGHTGREY; | |
602 | TFT_print("SSR2 ", x, y); | |
603 | _fg = TFT_YELLOW; | |
604 | TFT_clearStringRect(TFT_X, TFT_Y, "HLT en MLT"); | |
605 | ||
606 | switch (val) { | |
607 | case SSR2_OFF: TFT_print("Uit", LASTX, LASTY); | |
608 | break; | |
609 | case SSR2_HLT_SHARE: TFT_print("HLT of MLT", LASTX, LASTY); | |
610 | break; | |
611 | ||
612 | case SSR2_HLT_IND: TFT_print("HLT en MLT", LASTX, LASTY); | |
613 | break; | |
614 | ||
615 | case SSR2_ON_IDLE: TFT_print("Idle", LASTX, LASTY); | |
616 | break; | |
617 | ||
618 | default: TFT_print("N/A", LASTX, LASTY); | |
619 | } | |
620 | } | |
621 | ||
622 | ||
623 | ||
624 | void ShowFloat(uint16_t x, uint16_t y, char *label, char *suffix, float val, int decimals) | |
625 | { | |
626 | char tmp[32]; | |
627 | ||
628 | _fg = TFT_LIGHTGREY; | |
629 | TFT_print(label, x, y); | |
630 | _fg = TFT_YELLOW; | |
631 | sprintf(tmp, " %.*f", decimals, val); | |
632 | TFT_print(tmp, LASTX, LASTY); | |
633 | if (suffix) { | |
634 | _fg = TFT_LIGHTGREY; | |
635 | TFT_print(suffix, LASTX, LASTY); | |
636 | } | |
637 | } | |
638 | ||
639 | ||
640 | ||
641 | void ShowDouble(uint16_t x, uint16_t y, char *label, char *suffix, double val, int decimals) | |
642 | { | |
643 | char tmp[32]; | |
644 | ||
645 | _fg = TFT_LIGHTGREY; | |
646 | TFT_print(label, x, y); | |
647 | _fg = TFT_YELLOW; | |
648 | sprintf(tmp, " %.*f", decimals, val); | |
649 | TFT_print(tmp, LASTX, LASTY); | |
650 | if (suffix) { | |
651 | _fg = TFT_LIGHTGREY; | |
652 | TFT_print(suffix, LASTX, LASTY); | |
653 | } | |
654 | } | |
655 | ||
656 | ||
657 | ||
658 | void Editer(char *label, char *txt, char *errmsg, int len, int type) | |
659 | { | |
660 | int key; | |
661 | ||
662 | _bg = TFT_BLACK; | |
663 | TFT_fillScreen(_bg); | |
664 | TFT_resetclipwin(); | |
665 | TopMessage("Wijzigen"); | |
666 | _fg = TFT_LIGHTGREY; | |
667 | TFT_setFont(DEFAULT_FONT, NULL); | |
668 | TFT_print(label, 2, 28); | |
669 | if (strlen(errmsg)) { | |
670 | _fg = TFT_RED; | |
671 | TFT_print(errmsg, 2, 60); | |
672 | } | |
673 | TFT_fillRect(2, 40, 10 * len, 14, TFT_BLUE); | |
674 | _fg = TFT_YELLOW; | |
675 | _bg = TFT_BLUE; | |
676 | TFT_print(txt, 2, 41); | |
677 | TFT_fillRect(TFT_X, 50, 10, 4, TFT_GREEN); | |
678 | ||
679 | switch(type) { | |
680 | case EDIT_TYPE_INT: | |
681 | B_Digits(); | |
682 | break; | |
683 | ||
684 | default: level = 1; | |
685 | B_AlphaLow(); | |
686 | break; | |
687 | } | |
688 | ||
689 | while (1) { | |
690 | switch (type) { | |
691 | case EDIT_TYPE_INT: | |
692 | key = KeyBoardDigits(); | |
693 | break; | |
694 | ||
695 | default: key = KeyBoardAll(); | |
696 | break; | |
697 | } | |
698 | ||
699 | if (key != -1) { | |
700 | ||
701 | if (key >= 32 && key <= 126 && strlen(txt) < len) { | |
702 | // Append key | |
703 | txt[strlen(txt) + 1] = '\0'; | |
704 | txt[strlen(txt)] = key; | |
705 | } else if (key == 127 && strlen(txt)) { | |
706 | // Delete key | |
707 | txt[strlen(txt) - 1] = '\0'; | |
708 | } | |
709 | ||
710 | _fg = TFT_YELLOW; | |
711 | _bg = TFT_BLACK; | |
712 | TFT_setFont(DEFAULT_FONT, NULL); | |
713 | TFT_fillRect(2, 40, 10 * len, 14, TFT_BLUE); | |
714 | TFT_print(txt, 2, 41); | |
715 | TFT_fillRect(TFT_X, 50, 10, 4, TFT_GREEN); | |
716 | } | |
717 | ||
718 | if (key == 0) | |
719 | break; | |
720 | ||
721 | vTaskDelay(20 / portTICK_PERIOD_MS); | |
722 | } | |
723 | } | |
724 | ||
725 | ||
726 | ||
727 | void EditText(char *label, char *txt, int len) | |
728 | { | |
729 | char errmsg[40]; | |
730 | ||
731 | errmsg[0] = '\0'; | |
732 | while (1) { | |
733 | Editer(label, txt, errmsg, len, EDIT_TYPE_TEXT); | |
734 | if (strlen(txt)) | |
735 | break; | |
736 | sprintf(errmsg, "Tekst veld mag niet leeg zijn"); | |
737 | } | |
738 | } | |
739 | ||
740 | ||
741 | ||
742 | void EditTextMin(char *label, char *txt, int len, int min) | |
743 | { | |
744 | char errmsg[40]; | |
745 | ||
746 | errmsg[0] = '\0'; | |
747 | while (1) { | |
748 | Editer(label, txt, errmsg, len, EDIT_TYPE_TEXT); | |
749 | if (strlen(txt) >= min) | |
750 | break; | |
751 | sprintf(errmsg, "Tekst veld moet tussen %d en %d lang zijn", min, len); | |
752 | } | |
753 | } | |
754 | ||
755 | ||
756 | ||
757 | void EditInt(char *label, int *val, int min, int max) | |
758 | { | |
759 | char *valstr, errmsg[40]; | |
760 | int newval; | |
761 | ||
762 | errmsg[0] = '\0'; | |
763 | valstr = malloc(20); | |
764 | sprintf(valstr, "%d", *val); | |
765 | ||
766 | while (1) { | |
767 | Editer(label, valstr, errmsg, 8, EDIT_TYPE_INT); | |
768 | newval = atoi(valstr); | |
769 | if (newval < min || newval > max) { | |
770 | sprintf(errmsg, "De waarde moet tussen %d en %d zijn.", min, max); | |
771 | } else { | |
772 | break; | |
773 | } | |
774 | } | |
775 | ||
776 | *val = newval; | |
777 | free(valstr); | |
778 | } | |
779 | ||
780 | ||
781 | ||
782 | void EditUint8(char *label, uint8_t *val, uint8_t min, uint8_t max) | |
783 | { | |
784 | char *valstr, errmsg[40]; | |
785 | uint8_t newval; | |
786 | ||
787 | errmsg[0] = '\0'; | |
788 | valstr = malloc(20); | |
789 | sprintf(valstr, "%d", *val); | |
790 | ||
791 | while (1) { | |
792 | Editer(label, valstr, errmsg, 5, EDIT_TYPE_INT); | |
793 | newval = atoi(valstr); | |
794 | if (newval < min || newval > max) { | |
795 | sprintf(errmsg, "De waarde moet tussen %d en %d zijn.", min, max); | |
796 | } else { | |
797 | break; | |
798 | } | |
799 | } | |
800 | ||
801 | *val = newval; | |
802 | free(valstr); | |
803 | } | |
804 | ||
805 | ||
806 | ||
807 | void EditUint16(char *label, uint16_t *val, uint16_t min, uint16_t max) | |
808 | { | |
809 | char *valstr, errmsg[40]; | |
810 | uint16_t newval; | |
811 | ||
812 | errmsg[0] = '\0'; | |
813 | valstr = malloc(20); | |
814 | sprintf(valstr, "%d", *val); | |
815 | ||
816 | while (1) { | |
817 | Editer(label, valstr, errmsg, 5, EDIT_TYPE_INT); | |
818 | newval = atoi(valstr); | |
819 | if (newval < min || newval > max) { | |
820 | sprintf(errmsg, "De waarde moet tussen %d en %d zijn.", min, max); | |
821 | } else { | |
822 | break; | |
823 | } | |
824 | } | |
825 | ||
826 | *val = newval; | |
827 | free(valstr); | |
828 | } | |
829 | ||
830 | ||
831 | ||
832 | void EditFloat(char *label, float *val, float min, float max, int decimals) | |
833 | { | |
834 | char *valstr, errmsg[40]; | |
835 | float newval; | |
836 | ||
837 | errmsg[0] = '\0'; | |
838 | valstr = malloc(30); | |
839 | sprintf(valstr, " %.*f", decimals, *val); | |
840 | ||
841 | while (1) { | |
842 | Editer(label, valstr, errmsg, 25, EDIT_TYPE_INT); | |
843 | newval = atof(valstr); | |
844 | if (newval < min || newval > max) { | |
845 | sprintf(errmsg, "De waarde moet tussen %.2f en %.2f zijn.", min, max); | |
846 | } else { | |
847 | break; | |
848 | } | |
849 | } | |
850 | ||
851 | *val = newval; | |
852 | free(valstr); | |
853 | } | |
854 | ||
855 | ||
856 | ||
857 | void EditDouble(char *label, double *val, double min, double max, int decimals) | |
858 | { | |
859 | char *valstr, errmsg[40]; | |
860 | double newval; | |
861 | ||
862 | errmsg[0] = '\0'; | |
863 | valstr = malloc(30); | |
864 | sprintf(valstr, " %.*f", decimals, *val); | |
865 | ||
866 | while (1) { | |
867 | Editer(label, valstr, errmsg, 25, EDIT_TYPE_INT); | |
868 | newval = atof(valstr); | |
869 | if (newval < min || newval > max) { | |
870 | sprintf(errmsg, "De waarde moet tussen %.2f en %.2f zijn.", min, max); | |
871 | } else { | |
872 | break; | |
873 | } | |
874 | } | |
875 | ||
876 | *val = newval; | |
877 | free(valstr); | |
878 | } | |
879 | ||
880 | ||
881 | ||
882 | void EditBool(char *label, bool *val) | |
883 | { | |
884 | bool loop = true, value = *val; | |
885 | int curpos; | |
886 | ||
887 | _bg = TFT_BLACK; | |
888 | TFT_fillScreen(_bg); | |
889 | TFT_resetclipwin(); | |
890 | TopMessage("Wijzigen"); | |
891 | _fg = TFT_LIGHTGREY; | |
892 | TFT_setFont(DEFAULT_FONT, NULL); | |
893 | TFT_print(label, 2, 28); | |
894 | curpos = TFT_X; | |
895 | _fg = TFT_YELLOW; | |
896 | (value) ? TFT_print(" J ", curpos, 28) : TFT_print(" N ", curpos, 28); | |
897 | ||
898 | Buttons_Clear(); | |
899 | Buttons_Add( 40, 100, 80, 40, "J/N", 0); | |
900 | Buttons_Add(200, 100, 80, 40, "Ok", 1); | |
901 | Buttons_Show(); | |
902 | ||
903 | while (loop) { | |
904 | switch (Buttons_Scan()) { | |
905 | case 0: TFT_setFont(DEFAULT_FONT, NULL); | |
906 | _fg = TFT_YELLOW; | |
907 | if (value) { | |
908 | value = false; | |
909 | TFT_print(" N ", curpos, 28); | |
910 | } else { | |
911 | value = true; | |
912 | TFT_print(" J ", curpos, 28); | |
913 | } | |
914 | break; | |
915 | ||
916 | case 1: loop = false; | |
917 | break; | |
918 | ||
919 | default: break; | |
920 | } | |
921 | vTaskDelay(20 / portTICK_PERIOD_MS); | |
922 | } | |
923 | *val = value; | |
924 | } | |
925 | ||
926 | ||
927 | ||
928 | void EditSSR2(int *val) | |
929 | { | |
930 | bool loop = true; | |
931 | int value = *val; | |
932 | int key; | |
933 | ||
934 | _bg = TFT_BLACK; | |
935 | TFT_fillScreen(_bg); | |
936 | TFT_resetclipwin(); | |
937 | TopMessage("Wijzigen"); | |
938 | TFT_setFont(DEFAULT_FONT, NULL); | |
939 | ShowSSR2(2, 28, value); | |
940 | ||
941 | Buttons_Clear(); | |
942 | Buttons_Add( 20, 60,120, 40, "Uit", 0); | |
943 | Buttons_Add(180, 60,120, 40, "HLT of MLT", 1); | |
944 | Buttons_Add( 20, 130,120, 40, "HLT en MLT", 2); | |
945 | Buttons_Add(180, 130,120, 40, "Idle", 3); | |
946 | Buttons_Add(120, 200, 80, 40, "Ok", 4); | |
947 | Buttons_Show(); | |
948 | ||
949 | while (loop) { | |
950 | key = Buttons_Scan(); | |
951 | ||
952 | if (key >= 0 && key <= 3) { | |
953 | value = key; | |
954 | TFT_setFont(DEFAULT_FONT, NULL); | |
955 | ShowSSR2(2, 28, value); | |
956 | } else if (key == 4) { | |
957 | loop = false; | |
958 | } | |
959 | vTaskDelay(20 / portTICK_PERIOD_MS); | |
960 | } | |
961 | *val = value; | |
962 | } | |
963 | ||
964 | ||
965 | ||
966 | int Confirm(char *top, char *ack, char *nak) | |
967 | { | |
968 | int rc = false; | |
969 | bool loop = true; | |
970 | ||
971 | TFT_fillScreen(TFT_BLACK); | |
972 | TopMessage(top); | |
973 | Buttons_Clear(); | |
974 | Buttons_Add( 40, 100, 80, 40, ack, 0); | |
975 | Buttons_Add(200, 100, 80, 40, nak, 1); | |
976 | Buttons_Show(); | |
977 | SoundPlay(SOUND_Prompt); | |
978 | ||
979 | while (loop) { | |
980 | switch (Buttons_Scan()) { | |
981 | case 0: loop = false; | |
982 | rc = true; | |
983 | break; | |
984 | ||
985 | case 1: loop = false; | |
986 | rc = false; | |
987 | break; | |
988 | ||
989 | default: | |
990 | break; | |
991 | } | |
992 | vTaskDelay(50 / portTICK_PERIOD_MS); | |
993 | } | |
994 | ||
995 | Buttons_Clear(); | |
996 | return rc; | |
997 | } | |
998 | ||
999 |