Mercurial > public > ostc4
comparison Discovery/Src/tMenu.c @ 38:5f11787b4f42
include in ostc4 repository
author | heinrichsweikamp |
---|---|
date | Sat, 28 Apr 2018 11:52:34 +0200 |
parents | |
children | 8f8ea3a32e82 |
comparison
equal
deleted
inserted
replaced
37:ccc45c0e1ea2 | 38:5f11787b4f42 |
---|---|
1 /////////////////////////////////////////////////////////////////////////////// | |
2 /// -*- coding: UTF-8 -*- | |
3 /// | |
4 /// \file Discovery/Src/tMenu.c | |
5 /// \brief Major menu with extra page 0 for edit functionality since V0.0.2 | |
6 /// \author heinrichs weikamp gmbh | |
7 /// \date 30-April-2014 | |
8 /// | |
9 /// \details | |
10 /// | |
11 /// $Id$ | |
12 /////////////////////////////////////////////////////////////////////////////// | |
13 /// \par Copyright (c) 2014-2018 Heinrichs Weikamp gmbh | |
14 /// | |
15 /// This program is free software: you can redistribute it and/or modify | |
16 /// it under the terms of the GNU General Public License as published by | |
17 /// the Free Software Foundation, either version 3 of the License, or | |
18 /// (at your option) any later version. | |
19 /// | |
20 /// This program is distributed in the hope that it will be useful, | |
21 /// but WITHOUT ANY WARRANTY; without even the implied warranty of | |
22 /// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
23 /// GNU General Public License for more details. | |
24 /// | |
25 /// You should have received a copy of the GNU General Public License | |
26 /// along with this program. If not, see <http://www.gnu.org/licenses/>. | |
27 ////////////////////////////////////////////////////////////////////////////// | |
28 | |
29 /* Includes ------------------------------------------------------------------*/ | |
30 #include "tMenu.h" | |
31 | |
32 #include "gfx_fonts.h" | |
33 #include "tHome.h" | |
34 #include "tMenuDeco.h" | |
35 #include "tMenuDecoParameter.h" | |
36 #include "tMenuEditDeco.h" | |
37 #include "tMenuEditDecoParameter.h" | |
38 #include "tMenuEditGasOC.h" | |
39 #include "tMenuEditHardware.h" | |
40 #include "tMenuEditPlanner.h" | |
41 #include "tMenuEditSetpoint.h" | |
42 #include "tMenuEditSystem.h" | |
43 #include "tMenuEditXtra.h" | |
44 #include "tMenuGas.h" | |
45 #include "tMenuHardware.h" | |
46 #include "tMenuPlanner.h" | |
47 #include "tMenuSetpoint.h" | |
48 #include "tMenuSystem.h" | |
49 #include "tMenuXtra.h" | |
50 | |
51 /* Private types -------------------------------------------------------------*/ | |
52 #define MAXPAGES 10 | |
53 | |
54 typedef struct | |
55 { | |
56 uint32_t StartAddressForPage[MAXPAGES+1]; | |
57 uint8_t lineMemoryForNavigationForPage[MAXPAGES+1]; | |
58 uint8_t pageMemoryForNavigation; | |
59 uint8_t linesAvailableForPage[MAXPAGES+1]; | |
60 uint8_t pagesAvailable; | |
61 uint8_t pageCountNumber[MAXPAGES+1]; | |
62 uint8_t pageCountTotal; | |
63 uint8_t modeFlipPages; | |
64 } SMenuMemory; | |
65 | |
66 /* Exported variables --------------------------------------------------------*/ | |
67 | |
68 /* Announced Private variables -----------------------------------------------*/ | |
69 GFX_DrawCfgScreen tMdesignSolo; | |
70 GFX_DrawCfgScreen tMdesignCursor; | |
71 | |
72 /* Private variables ---------------------------------------------------------*/ | |
73 GFX_DrawCfgWindow tMwindow; | |
74 GFX_DrawCfgScreen tMscreen; | |
75 | |
76 uint32_t FramebufferStartAddressForPage[10]; | |
77 | |
78 SMenuMemory menu; | |
79 | |
80 uint32_t callerID; | |
81 | |
82 uint8_t actual_menu_content = MENU_UNDEFINED; | |
83 | |
84 /* TEM HAS TO MOVE TO GLOBAL--------------------------------------------------*/ | |
85 | |
86 /* Private function prototypes -----------------------------------------------*/ | |
87 void draw_tMheader(uint8_t page); | |
88 void draw_tMcursorDesign(void); | |
89 | |
90 void draw_tMdesignSubUnselected(uint32_t *ppDestination); | |
91 void draw_tMdesignSubSelected(uint32_t *ppDestination); | |
92 void draw_tMdesignSubSelectedBorder(uint32_t *ppDestination); | |
93 void tMenu_write(uint8_t page, char *text, char *subtext); | |
94 | |
95 void clean_line_actual_page(void); | |
96 void tM_build_pages(void); | |
97 | |
98 void gotoMenuEdit(void); | |
99 | |
100 /* Exported functions --------------------------------------------------------*/ | |
101 | |
102 GFX_DrawCfgScreen * get_PointerMenuCursorScreen(void) | |
103 { | |
104 return &tMdesignCursor; | |
105 } | |
106 | |
107 | |
108 GFX_DrawCfgScreen * get_PointerMenuCursorDesignSoloScreen(void) | |
109 { | |
110 return &tMdesignSolo; | |
111 } | |
112 | |
113 | |
114 void nextline(char * text, uint8_t *textPointer) | |
115 { | |
116 text[(*textPointer)++] = '\n'; | |
117 text[(*textPointer)++] = '\r'; | |
118 text[*textPointer] = 0; | |
119 } | |
120 | |
121 | |
122 void tM_init(void) | |
123 { | |
124 uint8_t i; | |
125 | |
126 tMdesignCursor.FBStartAdress = getFrame(3); | |
127 tMdesignCursor.ImageHeight = 390; | |
128 tMdesignCursor.ImageWidth = 800; | |
129 tMdesignCursor.LayerIndex = 0; | |
130 | |
131 tMdesignSolo.FBStartAdress = getFrame(4); | |
132 tMdesignSolo.ImageHeight = 390; | |
133 tMdesignSolo.ImageWidth = 800; | |
134 tMdesignSolo.LayerIndex = 0; | |
135 | |
136 menu.pagesAvailable = 0; | |
137 menu.pageMemoryForNavigation = 0; | |
138 for(i=0;i<=MAXPAGES;i++) | |
139 { | |
140 menu.lineMemoryForNavigationForPage[i] = 0; | |
141 menu.StartAddressForPage[i] = 0; | |
142 menu.linesAvailableForPage[i] = 0; | |
143 } | |
144 | |
145 tMscreen.FBStartAdress = 0; | |
146 tMscreen.ImageHeight = 480; | |
147 tMscreen.ImageWidth = 800; | |
148 tMscreen.LayerIndex = 1; | |
149 | |
150 draw_tMcursorDesign(); | |
151 | |
152 tMwindow.Image = &tMscreen; | |
153 tMwindow.WindowNumberOfTextLines = 6; | |
154 tMwindow.WindowLineSpacing = 65; | |
155 tMwindow.WindowTab = 400; | |
156 tMwindow.WindowX0 = 20; | |
157 tMwindow.WindowX1 = 779; | |
158 tMwindow.WindowY0 = 4 + 25; | |
159 tMwindow.WindowY1 = 390 + 25; | |
160 | |
161 actual_menu_content = MENU_UNDEFINED; | |
162 } | |
163 | |
164 void tM_refresh(char *text, uint8_t *textPointer, uint8_t line, const char content[6]) | |
165 { | |
166 for(uint8_t i=0; i<6; i++) | |
167 { | |
168 if(((line == 0) || (line == i)) && content[i]) | |
169 { | |
170 text[(*textPointer)++] = content[i]; | |
171 } | |
172 text[(*textPointer)++] = '\n'; | |
173 text[(*textPointer)++] = '\r'; | |
174 text[*textPointer] = 0; | |
175 } | |
176 } | |
177 | |
178 | |
179 void tM_rebuild_pages(void) | |
180 { | |
181 menu.pagesAvailable = 0; | |
182 // menu.pageMemoryForNavigation = 0; | |
183 for(int i=0;i<=MAXPAGES;i++) | |
184 { | |
185 menu.lineMemoryForNavigationForPage[i] = 0; | |
186 menu.linesAvailableForPage[i] = 0; | |
187 menu.StartAddressForPage[i] = 0; // only with GFX_forceReleaseFramesWithId(5); !!!!! | |
188 } | |
189 GFX_forceReleaseFramesWithId(5); | |
190 tM_build_pages(); | |
191 } | |
192 | |
193 | |
194 void tM_rebuild_menu_after_tComm(void) | |
195 { | |
196 tM_rebuild_pages(); | |
197 } | |
198 | |
199 # | |
200 void tM_check_content(void) | |
201 { | |
202 uint8_t mode = 0; | |
203 | |
204 if(stateUsed->mode == MODE_DIVE) | |
205 { | |
206 if(stateUsed == stateRealGetPointer()) | |
207 mode = MENU_DIVE_REAL; | |
208 else | |
209 mode = MENU_DIVE_SIM; | |
210 } | |
211 else | |
212 mode = MENU_SURFACE; | |
213 | |
214 if(actual_menu_content != mode) | |
215 { | |
216 actual_menu_content = mode; | |
217 tM_rebuild_pages(); | |
218 } | |
219 } | |
220 | |
221 | |
222 void clean_line_actual_page(void) | |
223 { | |
224 uint8_t line, page; | |
225 | |
226 page = menu.pageMemoryForNavigation; | |
227 line = menu.lineMemoryForNavigationForPage[page]; | |
228 | |
229 tMscreen.FBStartAdress = menu.StartAddressForPage[page]; | |
230 GFX_clean_line(&tMwindow, line); | |
231 } | |
232 | |
233 | |
234 void update_content_actual_page(char *text, uint16_t tab, char *subtext) | |
235 { | |
236 uint8_t page; | |
237 | |
238 page = menu.pageMemoryForNavigation; | |
239 | |
240 tMscreen.FBStartAdress = menu.StartAddressForPage[page]; | |
241 if(tab == 0) | |
242 tMwindow.WindowTab = 400; | |
243 else | |
244 tMwindow.WindowTab = tab; | |
245 | |
246 tMenu_write(page, text, subtext); | |
247 } | |
248 | |
249 | |
250 void clean_line(uint8_t page, uint8_t line) | |
251 { | |
252 tMscreen.FBStartAdress = menu.StartAddressForPage[page]; | |
253 GFX_clean_line(&tMwindow, line); | |
254 } | |
255 | |
256 void update_content_with_new_frame(uint8_t page, char *text, uint16_t tab, char *subtext) | |
257 { | |
258 char localtext[32]; | |
259 | |
260 uint32_t rememberPage = menu.StartAddressForPage[page]; | |
261 menu.StartAddressForPage[page] = getFrame(5); | |
262 tMscreen.FBStartAdress = menu.StartAddressForPage[page]; | |
263 | |
264 if(tab == 0) | |
265 tMwindow.WindowTab = 400; | |
266 else | |
267 tMwindow.WindowTab = tab; | |
268 | |
269 draw_tMheader(page); | |
270 tMenu_write(page, text, subtext); | |
271 | |
272 localtext[0] = TXT_2BYTE; | |
273 localtext[1] = TXT2BYTE_ButtonBack; | |
274 localtext[2] = 0; | |
275 write_content_simple(&tMscreen, 0, 800, 480-24, &FontT24,localtext,CLUT_ButtonSurfaceScreen); | |
276 | |
277 localtext[0] = '\001'; | |
278 localtext[1] = TXT_2BYTE; | |
279 localtext[2] = TXT2BYTE_ButtonEnter; | |
280 localtext[3] = 0; | |
281 write_content_simple(&tMscreen, 0, 800, 480-24, &FontT24,localtext,CLUT_ButtonSurfaceScreen); | |
282 | |
283 localtext[0] = '\002'; | |
284 localtext[1] = TXT_2BYTE; | |
285 localtext[2] = TXT2BYTE_ButtonNext; | |
286 localtext[3] = 0; | |
287 write_content_simple(&tMscreen, 0, 800, 480-24, &FontT24,localtext,CLUT_ButtonSurfaceScreen); | |
288 | |
289 // gfx_write_page_number(&tMscreen ,menu.pageCountNumber[page],menu.pageCountTotal,0); | |
290 | |
291 if(page == menu.pageMemoryForNavigation) | |
292 GFX_SetFrameTop(tMscreen.FBStartAdress); | |
293 releaseFrame(5,rememberPage); | |
294 } | |
295 | |
296 void update_content(uint8_t page, char *text, uint16_t tab, char *subtext) | |
297 { | |
298 tMscreen.FBStartAdress = menu.StartAddressForPage[page]; | |
299 if(tab == 0) | |
300 tMwindow.WindowTab = 400; | |
301 else | |
302 tMwindow.WindowTab = tab; | |
303 | |
304 tMenu_write(page, text, subtext); | |
305 } | |
306 | |
307 | |
308 void tM_create_pagenumbering(void) | |
309 { | |
310 menu.pageCountTotal = 0; | |
311 | |
312 for(int i=0;i<=MAXPAGES;i++) | |
313 { | |
314 if(menu.pageCountNumber[i]) | |
315 { | |
316 menu.pageCountTotal++; | |
317 menu.pageCountNumber[i] = menu.pageCountTotal; | |
318 } | |
319 } | |
320 } | |
321 | |
322 | |
323 void tM_build_page(uint32_t id, char *text, uint16_t tab, char *subtext) | |
324 { | |
325 uint8_t linesFound; | |
326 uint16_t i; | |
327 SStateList idList; | |
328 uint8_t page; | |
329 | |
330 char localtext[32]; | |
331 | |
332 if(menu.pagesAvailable > MAXPAGES) | |
333 return; | |
334 | |
335 get_idSpecificStateList(id, &idList); | |
336 | |
337 if(idList.base != BaseMenu) | |
338 return; | |
339 | |
340 if(idList.page == 0) | |
341 return; | |
342 | |
343 if(idList.page > MAXPAGES) | |
344 return; | |
345 | |
346 page = idList.page; | |
347 | |
348 if(!menu.pageCountNumber[page]) | |
349 return; | |
350 | |
351 if(menu.pagesAvailable == 0) | |
352 tM_create_pagenumbering(); | |
353 | |
354 if(*text == 0) | |
355 return; | |
356 | |
357 linesFound = 1; | |
358 | |
359 if(menu.StartAddressForPage[page]) | |
360 releaseFrame(5,menu.StartAddressForPage[page]); | |
361 | |
362 menu.StartAddressForPage[page] = getFrame(5); | |
363 | |
364 if(menu.StartAddressForPage[page] == 0) | |
365 return; | |
366 | |
367 i = 0; | |
368 while((i < MAX_PAGE_TEXTSIZE) && text[i]) | |
369 { | |
370 if((text[i] == '\n') && ((i + 2) < MAX_PAGE_TEXTSIZE) && text[i+1] && text[i+2]) | |
371 linesFound += 1; | |
372 i++; | |
373 } | |
374 | |
375 menu.linesAvailableForPage[page] = linesFound; | |
376 menu.pagesAvailable++; /* even if it was used before */ | |
377 | |
378 tMscreen.FBStartAdress = menu.StartAddressForPage[page]; | |
379 if(tab == 0) | |
380 tMwindow.WindowTab = 400; | |
381 else | |
382 tMwindow.WindowTab = tab; | |
383 | |
384 draw_tMheader(page); | |
385 | |
386 tMenu_write(page, text, subtext); | |
387 | |
388 localtext[0] = TXT_2BYTE; | |
389 localtext[1] = TXT2BYTE_ButtonBack; | |
390 localtext[2] = 0; | |
391 write_content_simple(&tMscreen, 0, 800, 480-24, &FontT24,localtext,CLUT_ButtonSurfaceScreen); | |
392 | |
393 localtext[0] = '\001'; | |
394 localtext[1] = TXT_2BYTE; | |
395 localtext[2] = TXT2BYTE_ButtonEnter; | |
396 localtext[3] = 0; | |
397 write_content_simple(&tMscreen, 0, 800, 480-24, &FontT24,localtext,CLUT_ButtonSurfaceScreen); | |
398 | |
399 localtext[0] = '\002'; | |
400 localtext[1] = TXT_2BYTE; | |
401 localtext[2] = TXT2BYTE_ButtonNext; | |
402 localtext[3] = 0; | |
403 write_content_simple(&tMscreen, 0, 800, 480-24, &FontT24,localtext,CLUT_ButtonSurfaceScreen); | |
404 } | |
405 | |
406 /* | |
407 _Bool skipCCRpage(uint8_t page) | |
408 { | |
409 if(menu.ccrOnlyContentForPage[page]) | |
410 { | |
411 if(actual_menu_content == MENU_SURFACE) | |
412 { | |
413 SSettings *data = settingsGetPointer(); | |
414 if((data->dive_mode != DIVEMODE_CCR) && data->hideCCRinOCmode) | |
415 return 1; | |
416 } | |
417 } | |
418 return 0; | |
419 } | |
420 */ | |
421 | |
422 void findValidPosition(uint8_t *pageOuput, uint8_t *lineOutput) | |
423 { | |
424 uint8_t page, line, first; | |
425 | |
426 *pageOuput = 0; | |
427 *lineOutput = 0; | |
428 | |
429 /* test */ | |
430 if(menu.pagesAvailable == 0) | |
431 return; | |
432 | |
433 for(int i=1;i<=MAXPAGES;i++) | |
434 { | |
435 if((menu.pageCountNumber[i] != 0) | |
436 && (menu.linesAvailableForPage[i] != 0) | |
437 && (menu.StartAddressForPage[i] != 0)) | |
438 { | |
439 first = i; | |
440 break; | |
441 } | |
442 } | |
443 | |
444 /* select */ | |
445 if(menu.pageMemoryForNavigation > MAXPAGES) | |
446 menu.pageMemoryForNavigation = first; | |
447 | |
448 page = menu.pageMemoryForNavigation; | |
449 | |
450 if(page == 0) | |
451 page = first; | |
452 | |
453 while((page <= MAXPAGES) && ((menu.linesAvailableForPage[page] == 0) || (menu.StartAddressForPage[page] == 0) || (menu.pageCountNumber[page] == 0))) | |
454 page += 1; | |
455 | |
456 if(page > MAXPAGES) | |
457 page = first; | |
458 | |
459 line = menu.lineMemoryForNavigationForPage[page]; | |
460 | |
461 if(line == 0) | |
462 line = 1; | |
463 | |
464 if(line > menu.linesAvailableForPage[page]) | |
465 line = 1; | |
466 | |
467 *pageOuput = page; | |
468 *lineOutput = line; | |
469 } | |
470 | |
471 /* | |
472 void tM_insert_page_numbers(void) | |
473 { | |
474 uint8_t page, line, pageMemoryBackup, pageFirst, total; | |
475 GFX_DrawCfgScreen tTscreen; | |
476 | |
477 tTscreen.FBStartAdress = 0; | |
478 tTscreen.ImageHeight = 480; | |
479 tTscreen.ImageWidth = 800; | |
480 tTscreen.LayerIndex = 1; | |
481 | |
482 pageMemoryBackup = menu.pageMemoryForNavigation; | |
483 | |
484 menu.pageMemoryForNavigation = 1; | |
485 findValidPosition(&page, &line); | |
486 pageFirst = page; | |
487 total = 0; | |
488 | |
489 do | |
490 { | |
491 total++; | |
492 menu.pageMemoryForNavigation += 1; | |
493 findValidPosition(&page, &line); | |
494 } | |
495 while((pageFirst != page) && (total < MAXPAGES)); | |
496 | |
497 menu.pageCountTotal = total; | |
498 menu.pageMemoryForNavigation = 0; | |
499 for(int i = 1; i<= total; i++) | |
500 { | |
501 menu.pageMemoryForNavigation += 1; | |
502 findValidPosition(&page, &line); | |
503 tTscreen.FBStartAdress = menu.StartAddressForPage[page]; | |
504 menu.pageCountNumber[page] = i; | |
505 gfx_write_page_number(&tTscreen ,i,total,0); | |
506 } | |
507 | |
508 menu.pageMemoryForNavigation = pageMemoryBackup; | |
509 } | |
510 */ | |
511 | |
512 void tM_add(uint32_t id) | |
513 { | |
514 SStateList idList; | |
515 uint8_t page; | |
516 | |
517 get_idSpecificStateList(id, &idList); | |
518 | |
519 page = idList.page; | |
520 | |
521 if(page > MAXPAGES) | |
522 return; | |
523 | |
524 menu.pageCountNumber[page] = 1; | |
525 } | |
526 | |
527 | |
528 void tM_build_pages(void) | |
529 { | |
530 char text[MAX_PAGE_TEXTSIZE]; | |
531 char subtext[MAX_PAGE_TEXTSIZE]; | |
532 uint32_t id; | |
533 uint16_t tabPosition; | |
534 SSettings *pSettings = settingsGetPointer(); | |
535 | |
536 menu.pagesAvailable = 0; | |
537 for(int i=0;i<=MAXPAGES;i++) | |
538 menu.pageCountNumber[i] = 0; | |
539 | |
540 tabPosition = 400; | |
541 *text = 0; | |
542 *subtext = 0; | |
543 | |
544 /* 2015 Feb 02, hw | |
545 * max 8 Menu Pages | |
546 */ | |
547 | |
548 | |
549 tM_add(StMSYS); //now in both modes | |
550 if(actual_menu_content == MENU_SURFACE) | |
551 { | |
552 tM_add(StMDECO); | |
553 tM_add(StMHARD); | |
554 // tM_add(StMSYS); now in both modes | |
555 } | |
556 else | |
557 { | |
558 tM_add(StMXTRA); | |
559 } | |
560 if(actual_menu_content == MENU_SURFACE) | |
561 { | |
562 tM_add(StMPLAN); | |
563 } | |
564 // if((pSettings->dive_mode != DIVEMODE_Gauge) && (pSettings->dive_mode != DIVEMODE_Apnea)) | |
565 // { | |
566 tM_add(StMOG); | |
567 tM_add(StMDECOP); | |
568 // } | |
569 if((pSettings->dive_mode == DIVEMODE_CCR) || (stateUsed->diveSettings.ccrOption == 1)) | |
570 { | |
571 tM_add(StMCG); | |
572 tM_add(StMSP); | |
573 } | |
574 | |
575 id = tMOG_refresh(0, text, &tabPosition, subtext); | |
576 tM_build_page(id, text, tabPosition, subtext); | |
577 | |
578 id = tMCG_refresh(0, text, &tabPosition, subtext); | |
579 tM_build_page(id, text, tabPosition, subtext); | |
580 | |
581 id = tMSP_refresh(0, text, &tabPosition, subtext); | |
582 tM_build_page(id, text, tabPosition, subtext); | |
583 | |
584 id = tMXtra_refresh(0, text, &tabPosition, subtext); | |
585 tM_build_page(id, text, tabPosition, subtext); | |
586 | |
587 id = tMPlanner_refresh(0, text, &tabPosition, subtext); | |
588 tM_build_page(id, text, tabPosition, subtext); | |
589 | |
590 id = tMDeco_refresh(0, text, &tabPosition, subtext); | |
591 tM_build_page(id, text, tabPosition, subtext); | |
592 | |
593 id = tMDecoParameters_refresh(0, text, &tabPosition, subtext); | |
594 tM_build_page(id, text, tabPosition, subtext); | |
595 | |
596 id = tMPlanner_refresh(0, text, &tabPosition, subtext); | |
597 tM_build_page(id, text, tabPosition, subtext); | |
598 | |
599 id = tMHardware_refresh(0, text, &tabPosition, subtext); | |
600 tM_build_page(id, text, tabPosition, subtext); | |
601 | |
602 id = tMSystem_refresh(0, text, &tabPosition, subtext); | |
603 tM_build_page(id, text, tabPosition, subtext); | |
604 } | |
605 | |
606 | |
607 void tM_refresh_live_content(void) | |
608 { | |
609 uint8_t page; | |
610 char text[MAX_PAGE_TEXTSIZE]; | |
611 char subtext[MAX_PAGE_TEXTSIZE]; | |
612 uint16_t tabPosition; | |
613 | |
614 // if(menu.modeFlipPages == 0) | |
615 // return; | |
616 | |
617 if((get_globalState() == StMSYS) && (actual_menu_content == MENU_SURFACE)) | |
618 { | |
619 page = menu.pageMemoryForNavigation; | |
620 tMSystem_refresh(0, text, &tabPosition, subtext); | |
621 update_content_with_new_frame(page, text, tabPosition, subtext); | |
622 } | |
623 else | |
624 if(get_globalState() == StMHARD) | |
625 { | |
626 page = menu.pageMemoryForNavigation; | |
627 tMHardware_refresh(0, text, &tabPosition, subtext); | |
628 update_content_with_new_frame(page, text, tabPosition, subtext); | |
629 } | |
630 | |
631 tMscreen.FBStartAdress = menu.StartAddressForPage[page]; | |
632 tHome_show_lost_connection_count(&tMscreen); | |
633 /* | |
634 SStateList idList; | |
635 if(actual_menu_content == MENU_SURFACE) | |
636 { | |
637 page = menu.pageMemoryForNavigation; | |
638 get_idSpecificStateList(StMSYS, &idList); | |
639 if(page == idList.page) | |
640 { | |
641 tMSystem_refresh(0, text, &tabPosition, subtext); | |
642 update_content_with_new_frame(page, text, tabPosition, subtext); | |
643 } | |
644 } | |
645 */ | |
646 } | |
647 | |
648 | |
649 /* new frame only! */ | |
650 void updateSpecificMenu(uint32_t id) | |
651 { | |
652 uint8_t page; | |
653 SStateList idList; | |
654 | |
655 char text[MAX_PAGE_TEXTSIZE]; | |
656 char subtext[MAX_PAGE_TEXTSIZE]; | |
657 uint16_t tabPosition; | |
658 | |
659 *subtext = 0; | |
660 *text = 0; | |
661 tabPosition = 400; | |
662 | |
663 get_idSpecificStateList(id, &idList); | |
664 page = idList.page; | |
665 | |
666 switch(id) | |
667 { | |
668 case StMOG: | |
669 tMOG_refresh(0, text, &tabPosition, subtext); | |
670 update_content_with_new_frame(page, text, tabPosition, subtext); | |
671 break; | |
672 case StMCG: | |
673 tMCG_refresh(0, text, &tabPosition, subtext); | |
674 update_content_with_new_frame(page, text, tabPosition, subtext); | |
675 break; | |
676 case StMSP: | |
677 tMSP_refresh(0, text, &tabPosition, subtext); | |
678 update_content_with_new_frame(page, text, tabPosition, subtext); | |
679 break; | |
680 default: | |
681 break; | |
682 } | |
683 } | |
684 | |
685 | |
686 void updateMenu(void) | |
687 { | |
688 uint8_t page, line; | |
689 | |
690 char text[MAX_PAGE_TEXTSIZE]; | |
691 char subtext[MAX_PAGE_TEXTSIZE]; | |
692 uint16_t tabPosition; | |
693 | |
694 *subtext = 0; | |
695 *text = 0; | |
696 tabPosition = 400; | |
697 | |
698 page = menu.pageMemoryForNavigation; | |
699 line = menu.lineMemoryForNavigationForPage[page]; | |
700 | |
701 switch(get_globalState()) | |
702 { | |
703 case StMOG: | |
704 tMOG_refresh(0, text, &tabPosition, subtext); | |
705 update_content_with_new_frame(page, text, tabPosition, subtext); | |
706 break; | |
707 case StMCG: | |
708 tMCG_refresh(0, text, &tabPosition, subtext); | |
709 update_content_with_new_frame(page, text, tabPosition, subtext); | |
710 break; | |
711 case StMSP: | |
712 tMSP_refresh(0, text, &tabPosition, subtext); | |
713 update_content_with_new_frame(page, text, tabPosition, subtext); | |
714 break; | |
715 case StMXTRA: | |
716 tMXtra_refresh(0, text, &tabPosition, subtext); | |
717 update_content_with_new_frame(page, text, tabPosition, subtext); | |
718 break; | |
719 case StMDECO: | |
720 if((line == 1) || (line == 3)) // dive mode or ppO2 limits (the later for correct MOD in gaslists) | |
721 { | |
722 tM_rebuild_pages(); | |
723 menu.lineMemoryForNavigationForPage[page] = line; // fix 160623 | |
724 GFX_SetFrameTop(menu.StartAddressForPage[page]); | |
725 } | |
726 else | |
727 { | |
728 tMDeco_refresh(line, text, &tabPosition, subtext); | |
729 clean_line_actual_page(); | |
730 update_content_actual_page(text, tabPosition, subtext); | |
731 } | |
732 break; | |
733 case StMDECOP: | |
734 tMDecoParameters_refresh(line, text, &tabPosition, subtext); | |
735 clean_line_actual_page(); | |
736 update_content_actual_page(text, tabPosition, subtext); | |
737 break; | |
738 case StMPLAN: | |
739 tMPlanner_refresh(line, text, &tabPosition, subtext); | |
740 clean_line_actual_page(); | |
741 update_content_actual_page(text, tabPosition, subtext); | |
742 break; | |
743 case StMHARD: | |
744 tMHardware_refresh(line, text, &tabPosition, subtext); | |
745 clean_line_actual_page(); | |
746 update_content_actual_page(text, tabPosition, subtext); | |
747 break; | |
748 case StMSYS: | |
749 if((line == 2) || (line == 3) || (line == 6)) | |
750 { | |
751 tM_rebuild_pages(); | |
752 menu.lineMemoryForNavigationForPage[page] = line; // fix 160623 | |
753 GFX_SetFrameTop(menu.StartAddressForPage[page]); | |
754 menu.lineMemoryForNavigationForPage[page] = line; | |
755 } | |
756 else | |
757 { | |
758 tMSystem_refresh(line, text, &tabPosition, subtext); | |
759 clean_line_actual_page(); | |
760 update_content_actual_page(text, tabPosition, subtext); | |
761 } | |
762 break; | |
763 default: | |
764 break; | |
765 } | |
766 } | |
767 | |
768 void openMenu_first_page_with_OC_gas_update(void) | |
769 { | |
770 menu.pageMemoryForNavigation = 1; | |
771 for(int i=0;i<=MAXPAGES;i++) | |
772 menu.lineMemoryForNavigationForPage[i] = 0; | |
773 | |
774 set_globalState(StMOG); | |
775 updateMenu(); | |
776 openMenu(1); | |
777 } | |
778 | |
779 | |
780 void openMenu(uint8_t freshWithFlipPages) | |
781 { | |
782 uint8_t page, line; | |
783 | |
784 callerID = get_globalState(); | |
785 | |
786 findValidPosition(&page, &line); | |
787 if((page == 0) || (line == 0)) | |
788 return; | |
789 | |
790 menu.pageMemoryForNavigation = page; | |
791 /* new test for 3button design */ | |
792 if(freshWithFlipPages) | |
793 { | |
794 menu.lineMemoryForNavigationForPage[page] = 0; | |
795 menu.modeFlipPages = 1; | |
796 } | |
797 else | |
798 { | |
799 menu.lineMemoryForNavigationForPage[page] = line; | |
800 menu.modeFlipPages = 0; | |
801 } | |
802 | |
803 set_globalState_Menu_Page(page); | |
804 | |
805 | |
806 change_CLUT_entry(CLUT_MenuLineSelectedSides, (CLUT_MenuPageGasOC + page - 1)); | |
807 change_CLUT_entry(CLUT_MenuLineSelectedSeperator, (CLUT_MenuPageGasOC + page - 1)); | |
808 | |
809 | |
810 if(((page == 6) || (page == 8)) && (menu.pageCountNumber[page-1] == 0)) | |
811 { | |
812 change_CLUT_entry(CLUT_MenuLineSelectedSides, (CLUT_MenuPageGasOC + page - 2)); | |
813 change_CLUT_entry(CLUT_MenuLineSelectedSeperator, (CLUT_MenuPageGasOC + page - 2)); | |
814 | |
815 } | |
816 | |
817 GFX_SetFrameTop(menu.StartAddressForPage[page]); | |
818 /* new test for 3button design */ | |
819 if(freshWithFlipPages) | |
820 GFX_SetFrameBottom(tMdesignSolo.FBStartAdress, 0, 25, 800, 390); | |
821 else | |
822 GFX_SetFrameBottom((tMdesignCursor.FBStartAdress) + 65*2*(line - 1), 0, 25, 800, 390); | |
823 } | |
824 | |
825 void block_diluent_handler(_Bool Unblock) | |
826 { | |
827 SStateList list; | |
828 static uint8_t linesAvailableForPageDiluent = 0; | |
829 get_idSpecificStateList(StMCG, &list); | |
830 | |
831 if(Unblock && linesAvailableForPageDiluent) | |
832 { | |
833 menu.linesAvailableForPage[list.page] = linesAvailableForPageDiluent; | |
834 } | |
835 else | |
836 { | |
837 linesAvailableForPageDiluent = menu.linesAvailableForPage[list.page]; | |
838 menu.linesAvailableForPage[list.page] = 0; | |
839 } | |
840 } | |
841 | |
842 void block_diluent_page(void) | |
843 { | |
844 block_diluent_handler(0); | |
845 } | |
846 | |
847 | |
848 void unblock_diluent_page(void) | |
849 { | |
850 block_diluent_handler(1); | |
851 } | |
852 | |
853 | |
854 void nextPage(void) | |
855 { | |
856 uint8_t page, line; | |
857 | |
858 menu.pageMemoryForNavigation += 1; | |
859 | |
860 findValidPosition(&page, &line); | |
861 menu.pageMemoryForNavigation = page; | |
862 /* new test for 3button design */ | |
863 //menu.lineMemoryForNavigationForPage[page] = line; | |
864 menu.lineMemoryForNavigationForPage[page] = 0; | |
865 menu.modeFlipPages = 1; | |
866 | |
867 set_globalState_Menu_Page(page); | |
868 | |
869 change_CLUT_entry(CLUT_MenuLineSelectedSides, (CLUT_MenuPageGasOC + page - 1)); | |
870 change_CLUT_entry(CLUT_MenuLineSelectedSeperator, (CLUT_MenuPageGasOC + page - 1)); | |
871 | |
872 GFX_SetFrameTop(menu.StartAddressForPage[page]); | |
873 /* new test for 3button design */ | |
874 //GFX_SetFrameBottom((tMdesignCursor.FBStartAdress) + 65*2*(line - 1), 0, 25, 800, 390); | |
875 GFX_SetFrameBottom(tMdesignSolo.FBStartAdress, 0, 25, 800, 390); | |
876 } | |
877 | |
878 | |
879 void nextLine(void) | |
880 { | |
881 uint8_t page, line; | |
882 | |
883 page = menu.pageMemoryForNavigation; | |
884 menu.lineMemoryForNavigationForPage[page] += 1; | |
885 | |
886 findValidPosition(&page, &line); | |
887 menu.lineMemoryForNavigationForPage[page] = line; | |
888 | |
889 /* new test for 3button design */ | |
890 menu.modeFlipPages = 0; | |
891 | |
892 GFX_SetFrameBottom((tMdesignCursor.FBStartAdress) + 65*2*(line - 1), 0, 25, 800, 390); | |
893 } | |
894 | |
895 | |
896 void stepBackMenu(void) | |
897 { | |
898 if(menu.modeFlipPages == 0) | |
899 { | |
900 menu.lineMemoryForNavigationForPage[menu.pageMemoryForNavigation] = 0; | |
901 menu.modeFlipPages = 1; | |
902 GFX_SetFrameBottom(tMdesignSolo.FBStartAdress, 0, 25, 800, 390); | |
903 } | |
904 else | |
905 exitMenu(); | |
906 } | |
907 | |
908 | |
909 void exitMenu(void) | |
910 { | |
911 set_globalState_tHome(); | |
912 } | |
913 | |
914 | |
915 void stepForwardMenu(void) | |
916 { | |
917 if(menu.modeFlipPages == 1) | |
918 { | |
919 nextLine(); | |
920 } | |
921 else | |
922 gotoMenuEdit(); | |
923 } | |
924 | |
925 void gotoMenuEdit(void) | |
926 { | |
927 uint8_t line; | |
928 | |
929 line = menu.lineMemoryForNavigationForPage[menu.pageMemoryForNavigation]; | |
930 | |
931 switch(get_globalState()) | |
932 { | |
933 case StMOG: | |
934 openEdit_GasOC(line); | |
935 break; | |
936 case StMCG: | |
937 openEdit_GasCC(line); | |
938 break; | |
939 case StMSP: | |
940 openEdit_Setpoint(line); | |
941 break; | |
942 case StMXTRA: | |
943 openEdit_Xtra(line); | |
944 break; | |
945 case StMDECO: | |
946 openEdit_Deco(line); | |
947 break; | |
948 case StMDECOP: | |
949 openEdit_DecoParameter(line); | |
950 break; | |
951 case StMPLAN: | |
952 openEdit_Planner(line); | |
953 break; | |
954 case StMHARD: | |
955 openEdit_Hardware(line); | |
956 break; | |
957 case StMSYS: | |
958 openEdit_System(line); | |
959 break; | |
960 default: | |
961 break; | |
962 } | |
963 } | |
964 | |
965 | |
966 void sendActionToMenu(uint8_t sendAction) | |
967 { | |
968 switch(sendAction) | |
969 { | |
970 case ACTION_BUTTON_ENTER: | |
971 stepForwardMenu(); | |
972 break; | |
973 case ACTION_BUTTON_NEXT: | |
974 if(menu.modeFlipPages) | |
975 nextPage(); | |
976 else | |
977 nextLine(); | |
978 break; | |
979 case ACTION_TIMEOUT: | |
980 case ACTION_MODE_CHANGE: | |
981 case ACTION_BUTTON_BACK: | |
982 /* new test for 3button design */ | |
983 stepBackMenu(); | |
984 break; | |
985 default: | |
986 break; | |
987 case ACTION_IDLE_TICK: | |
988 case ACTION_IDLE_SECOND: | |
989 break; | |
990 } | |
991 /* tMC_OC_Gas(StMOG1, pSettings); */ | |
992 } | |
993 | |
994 void timeoutTestMenu(uint32_t seconds_since_last_button_press) | |
995 { | |
996 } | |
997 | |
998 void tMenu_write(uint8_t page, char *text, char *subtext) | |
999 { | |
1000 if(page > MAXPAGES) | |
1001 return; | |
1002 if(menu.linesAvailableForPage[page] == 0) | |
1003 return; | |
1004 | |
1005 tMscreen.FBStartAdress = menu.StartAddressForPage[page]; | |
1006 GFX_write_string(&FontT48, &tMwindow, text,1); | |
1007 if((*subtext) && (menu.linesAvailableForPage[page] < 6)) | |
1008 { | |
1009 GFX_write_string(&FontT42, &tMwindow, subtext, (menu.linesAvailableForPage[page] + 1)); | |
1010 } | |
1011 } | |
1012 | |
1013 | |
1014 /* Private functions ---------------------------------------------------------*/ | |
1015 | |
1016 void draw_tMdesignSubUnselected(uint32_t *ppDestination) | |
1017 { | |
1018 union al88_u | |
1019 { | |
1020 uint8_t al8[2]; | |
1021 uint16_t al88; | |
1022 }; | |
1023 | |
1024 union al88_u color_seperator; | |
1025 union al88_u color_unselected; | |
1026 int i; | |
1027 | |
1028 color_seperator.al8[0] = CLUT_MenuLineUnselectedSeperator; | |
1029 color_unselected.al8[0] = CLUT_MenuLineUnselected; | |
1030 | |
1031 color_seperator.al8[1] = 0xFF; | |
1032 color_unselected.al8[1] = 0xFF; | |
1033 | |
1034 *(__IO uint16_t*)*ppDestination = color_seperator.al88; | |
1035 *ppDestination += 2; | |
1036 *(__IO uint16_t*)*ppDestination = color_seperator.al88; | |
1037 *ppDestination += 2; | |
1038 | |
1039 for(i = 61; i > 0; i--) | |
1040 { | |
1041 *(__IO uint16_t*)*ppDestination = color_unselected.al88; | |
1042 *ppDestination += 2; | |
1043 } | |
1044 | |
1045 *(__IO uint16_t*)*ppDestination = color_seperator.al88; | |
1046 *ppDestination += 2; | |
1047 *(__IO uint16_t*)*ppDestination = color_seperator.al88; | |
1048 *ppDestination += 2; | |
1049 } | |
1050 | |
1051 | |
1052 void draw_tMdesignSubSelected(uint32_t *ppDestination) | |
1053 { | |
1054 union al88_u | |
1055 { | |
1056 uint8_t al8[2]; | |
1057 uint16_t al88; | |
1058 }; | |
1059 | |
1060 union al88_u color_selected; | |
1061 union al88_u color_seperator; | |
1062 int i; | |
1063 | |
1064 color_selected.al8[0] = CLUT_MenuLineSelected; | |
1065 color_selected.al8[1] = 0xFF; | |
1066 | |
1067 color_seperator.al8[0] = CLUT_MenuLineSelectedSeperator; | |
1068 color_seperator.al8[1] = 0xFF; | |
1069 | |
1070 *(__IO uint16_t*)*ppDestination = color_seperator.al88; | |
1071 *ppDestination += 2; | |
1072 *(__IO uint16_t*)*ppDestination = color_seperator.al88; | |
1073 *ppDestination += 2; | |
1074 | |
1075 for(i = 61; i > 0; i--) | |
1076 { | |
1077 *(__IO uint16_t*)*ppDestination = color_selected.al88; | |
1078 *ppDestination += 2; | |
1079 } | |
1080 | |
1081 *(__IO uint16_t*)*ppDestination = color_seperator.al88; | |
1082 *ppDestination += 2; | |
1083 *(__IO uint16_t*)*ppDestination = color_seperator.al88; | |
1084 *ppDestination += 2; | |
1085 } | |
1086 | |
1087 | |
1088 void draw_tMdesignSubSelectedBorder(uint32_t *ppDestination) | |
1089 { | |
1090 union al88_u | |
1091 { | |
1092 uint8_t al8[2]; | |
1093 uint16_t al88; | |
1094 }; | |
1095 | |
1096 union al88_u color_selected_sides; | |
1097 | |
1098 int i; | |
1099 | |
1100 color_selected_sides.al8[0] = CLUT_MenuLineSelectedSides; | |
1101 color_selected_sides.al8[1] = 0xFF; | |
1102 | |
1103 for(i = 65; i > 0; i--) | |
1104 { | |
1105 *(__IO uint16_t*)*ppDestination = color_selected_sides.al88; | |
1106 *ppDestination += 2; | |
1107 } | |
1108 } | |
1109 | |
1110 | |
1111 void draw_tMcursorDesign(void) | |
1112 { | |
1113 int i,j; | |
1114 uint32_t pDestination; | |
1115 | |
1116 pDestination = tMdesignCursor.FBStartAdress; | |
1117 | |
1118 for(j = 801; j > 0; j--) | |
1119 { | |
1120 for(i = 5; i > 0; i--) | |
1121 { | |
1122 draw_tMdesignSubUnselected(&pDestination); | |
1123 } | |
1124 if((j > 787) || (j < 17)) | |
1125 draw_tMdesignSubSelectedBorder(&pDestination); | |
1126 else | |
1127 draw_tMdesignSubSelected(&pDestination); | |
1128 } | |
1129 | |
1130 pDestination = tMdesignSolo.FBStartAdress; | |
1131 | |
1132 for(j = 801; j > 0; j--) | |
1133 { | |
1134 for(i = 6; i > 0; i--) | |
1135 { | |
1136 draw_tMdesignSubUnselected(&pDestination); | |
1137 } | |
1138 } | |
1139 } | |
1140 | |
1141 | |
1142 void draw_tMheader(uint8_t page) | |
1143 { | |
1144 union al88_u | |
1145 { | |
1146 uint8_t al8[2]; | |
1147 uint16_t al88; | |
1148 }; | |
1149 union al88_u color_top; | |
1150 int i,j, k, k4text; | |
1151 uint32_t pBackup; | |
1152 uint32_t pDestination; | |
1153 uint8_t colorText; | |
1154 uint16_t positionText; | |
1155 uint8_t pageText; | |
1156 | |
1157 const char text8max[MAXPAGES+1][8] = | |
1158 { "", | |
1159 "OC", | |
1160 "CC", | |
1161 "SP", | |
1162 "DATA", | |
1163 "DECO", | |
1164 "", | |
1165 "SYS", | |
1166 "", | |
1167 "SIM", | |
1168 "" | |
1169 }; | |
1170 | |
1171 const _Bool spacing[MAXPAGES+1] = | |
1172 { 0, | |
1173 0, // behind OC | |
1174 0, // behind CC | |
1175 1, // behind SP | |
1176 1, // behind DATA | |
1177 0, // behind DECO1 | |
1178 1, // behind DECO2 | |
1179 0, // behind SYS1 | |
1180 1, // behind SYS2 | |
1181 1, // behind SIM | |
1182 0 | |
1183 }; | |
1184 | |
1185 pBackup = tMscreen.FBStartAdress; | |
1186 tMscreen.FBStartAdress = menu.StartAddressForPage[page]; | |
1187 pDestination = menu.StartAddressForPage[page]; | |
1188 positionText = 10; | |
1189 pageText = page; | |
1190 | |
1191 gfx_write_page_number(&tMscreen ,menu.pageCountNumber[page],menu.pageCountTotal,0); | |
1192 | |
1193 while((text8max[pageText][0] == 0) && (pageText > 1)) | |
1194 { | |
1195 pageText--; | |
1196 } | |
1197 | |
1198 for(k = 1; k <= MAXPAGES; k++) | |
1199 { | |
1200 if(menu.pageCountNumber[k] != 0) | |
1201 { | |
1202 k4text = k; // new hw 170522 | |
1203 if((text8max[k][0] == 0) && (menu.pageCountNumber[k-1] == 0)) | |
1204 k4text = k-1; | |
1205 | |
1206 color_top.al8[0] = CLUT_MenuPageGasOC + k - 1; | |
1207 if(k4text == page) | |
1208 { | |
1209 color_top.al8[1] = 0xFF; | |
1210 } | |
1211 else | |
1212 { | |
1213 color_top.al8[1] = 0x50; | |
1214 } | |
1215 | |
1216 if(k4text == pageText) | |
1217 { | |
1218 colorText = CLUT_Font020; | |
1219 } | |
1220 else | |
1221 { | |
1222 colorText = CLUT_Font021; | |
1223 } | |
1224 | |
1225 write_content_simple(&tMscreen,positionText,775,0,&FontT42,text8max[k4text],colorText); | |
1226 /* | |
1227 write_content_simple(&tMscreen,positionText,775,0,&FontT42,text8max[k],colorText); | |
1228 if((text8max[k][0] == 0) && (menu.pageCountNumber[k-1] == 0)) | |
1229 write_content_simple(&tMscreen,positionText,775,0,&FontT42,text8max[k-1],colorText); | |
1230 */ | |
1231 pDestination += 2 * 5 * 480; | |
1232 | |
1233 for(j = 60; j > 0; j--) | |
1234 { | |
1235 pDestination += (390 + 26)* 2; | |
1236 | |
1237 // for(i = 64; i > 0; i--) | |
1238 for(i = 16; i > 0; i--) | |
1239 { | |
1240 *(__IO uint16_t*)pDestination = color_top.al88; | |
1241 pDestination += 2; | |
1242 } | |
1243 pDestination += 2 * 48; | |
1244 } | |
1245 | |
1246 pDestination += 2 * 5 * 480; | |
1247 positionText += 70; | |
1248 | |
1249 if((k == 4) || ((k == 6) && (menu.pageCountNumber[5] == 0))) | |
1250 { | |
1251 pDestination += 2 * 70 * 480; | |
1252 positionText += 70; | |
1253 } | |
1254 | |
1255 if(spacing[k]) | |
1256 { | |
1257 pDestination += 35 * 2 * 480; | |
1258 positionText += 35; | |
1259 } | |
1260 } | |
1261 } | |
1262 tMscreen.FBStartAdress = pBackup; | |
1263 } |