comparison Discovery/Src/tMenuEditXtra.c @ 1018:808153ba3fec GasConsumption

Disable the menu items for editing scrubber timer parameters if an inactive scrubber timer is selected. This removes the confusion when users edit a scrubber that is not active, and are then surprised when the scrubber timer does not work during the dive. (mikeller)
author heinrichsweikamp
date Mon, 09 Jun 2025 09:42:16 +0200
parents 8c0134a287da
children 52fd91414b6c
comparison
equal deleted inserted replaced
1017:5924a2d1d3ba 1018:808153ba3fec
39 #include "motion.h" 39 #include "motion.h"
40 #include "configuration.h" 40 #include "configuration.h"
41 #include "tInfoPreDive.h" 41 #include "tInfoPreDive.h"
42 42
43 43
44 #define SCRUBBER_COUNT 2
45
46
44 /* Private function prototypes -----------------------------------------------*/ 47 /* Private function prototypes -----------------------------------------------*/
45 void openEdit_CompassHeading(void); 48 void openEdit_CompassHeading(void);
46 void openEdit_ResetStopwatch(void); 49 void openEdit_ResetStopwatch(void);
47 void openEdit_SimFollowDecostops(void); 50 void openEdit_SimFollowDecostops(void);
48 void openEdit_SetManualMarker(void); 51 void openEdit_SetManualMarker(void);
194 197
195 exitMenuEdit_to_Menu_with_Menu_Update_do_not_write_settings_for_this_only(); 198 exitMenuEdit_to_Menu_with_Menu_Update_do_not_write_settings_for_this_only();
196 } 199 }
197 200
198 201
199 static void printScrubberResetText(char *text, SSettings *settings, uint8_t scrubberId) 202 static void printScrubberResetText(char *text, SSettings *settings, uint8_t scrubberId, bool isActive)
200 { 203 {
201 int16_t currentTimerMinutes = settings->scrubberData[scrubberId].TimerCur; 204 int16_t currentTimerMinutes = settings->scrubberData[scrubberId].TimerCur;
202 char colour = '\020'; 205
203 if (currentTimerMinutes <= 0) { 206 char *colour = "";
204 colour = '\025'; 207 if (isActive) {
205 } else if (currentTimerMinutes <= 30) { 208 if (currentTimerMinutes <= 0) {
206 colour = '\024'; 209 colour = "\025";
207 } 210 } else if (currentTimerMinutes <= 30) {
208 snprintf(text, 32, "%c\002%c%03i\016\016 %c\017", TXT_ScrubTimeReset, colour, currentTimerMinutes, TXT_Minutes); 211 colour = "\024";
209 } 212 }
210 213 }
211 214 snprintf(text, 32, "%s%c\002%s%03i\016\016 %c\017", makeGrey(!isActive), TXT_ScrubTimeReset, colour, currentTimerMinutes, TXT_Minutes);
212 static void openEdit_Scrubber(void) 215 }
213 { 216
217
218 static void drawScrubberMenu(bool isRefresh)
219 {
220 SSettings *settings = settingsGetPointer();
221
222 resetMenuContentStructure();
223
214 char text[32]; 224 char text[32];
215 uint8_t textIndex = 0; 225 snprintf(text, 32, "%c \002#%d", TXT_ScrubTime, scrubberMenuId);
216 uint16_t localScrubTimer; 226 if (isRefresh) {
217 227 clean_content(20, 780, ME_Y_LINE1, &FontT48);
218 SSettings *pSettings = settingsGetPointer(); 228 }
219 229 write_field_button(StMXTRA_ScrubTimer, 20, 780, ME_Y_LINE1, &FontT48, text);
220 localScrubTimer = pSettings->scrubberData[scrubberMenuId].TimerMax; 230
221 231 bool currentScrubberIsActive = settings->scrubberActiveId & (1 << scrubberMenuId);
222 resetMenuEdit(CLUT_MenuPageXtra); 232
223 233 snprintf(text, 32, "%c %c \002%c", TXT_ScrubTime, TXT_Active, printCheckbox(currentScrubberIsActive));
224 234 if (isRefresh) {
225 snprintf(&text[0], 32,"\001%c",TXT_ScrubTime); 235 clean_content(20, 780, ME_Y_LINE2, &FontT48);
226 write_topline(text); 236 }
227 237 write_field_button(StMXTRA_ScrubTimer_Active, 20, 780, ME_Y_LINE2, &FontT48, text);
228 238
229 snprintf(&text[0], 32,"%c \002#%d",TXT_ScrubTime,scrubberMenuId); 239 snprintf(text, 32, "%s%c\016\016(%c)\017", makeGrey(!currentScrubberIsActive), TXT_ScrubTime, TXT_Maximum);
230 write_field_button(StMXTRA_ScrubTimer, 20, 780, ME_Y_LINE1, &FontT48, text); 240 if (isRefresh) {
231 241 clean_content(20, 340, ME_Y_LINE3, &FontT48);
232 if(pSettings->scrubberActiveId & (1 << scrubberMenuId)) 242 }
233 { 243 write_label_var(20, 340, ME_Y_LINE3, &FontT48, text);
234 snprintf(&text[0], 32,"%c %c \002\005", TXT_ScrubTime, TXT_Active); 244
235 } 245 uint16_t timerMax = settings->scrubberData[scrubberMenuId].TimerMax;
236 else 246 if (isRefresh) {
237 { 247 clean_content(610, 780, ME_Y_LINE3, &FontT48);
238 snprintf(&text[0], 32,"%c %c \002\006", TXT_ScrubTime, TXT_Active); 248 }
239 } 249 if (currentScrubberIsActive) {
240 write_field_button(StMXTRA_ScrubTimer_Active, 20, 780, ME_Y_LINE2, &FontT48, text); 250 snprintf(text, 32, "%s\002###\016\016 %c\017", makeGrey(!currentScrubberIsActive), TXT_Minutes);
241 251 write_field_udigit(StMXTRA_ScrubTimer_Max, 610, 780, ME_Y_LINE3, &FontT48, text, timerMax, 0, 0, 0);
242 snprintf(&text[textIndex], 32,\ 252 } else {
243 "%c" 253 snprintf(text, 32, "%s\002%03i\016\016 %c\017", makeGrey(!currentScrubberIsActive), timerMax, TXT_Minutes);
244 "\016\016(%c)\017" 254 write_label_var(610, 780, ME_Y_LINE3, &FontT48, text);
245 ,TXT_ScrubTime 255 }
246 ,TXT_Maximum); 256
247 257 printScrubberResetText(text, settings, scrubberMenuId, currentScrubberIsActive);
248 write_label_var( 20, 340, ME_Y_LINE3, &FontT48, text); 258 if (isRefresh) {
249 snprintf(&text[textIndex], 32, "\002###\016\016 %c\017",TXT_Minutes); 259 clean_content(20, 780, ME_Y_LINE4, &FontT48);
250 260 }
251 write_field_udigit(StMXTRA_ScrubTimer_Max, 610, 780, ME_Y_LINE3, &FontT48, text,localScrubTimer, 0, 0, 0); 261 if (currentScrubberIsActive) {
252 262 write_field_button(StMXTRA_ScrubTimer_Reset, 20, 780, ME_Y_LINE4, &FontT48, text);
253 printScrubberResetText(text, pSettings, scrubberMenuId); 263 } else {
254 write_field_button(StMXTRA_ScrubTimer_Reset, 20, 780, ME_Y_LINE4, &FontT48, text); 264 write_label_var(20, 780, ME_Y_LINE4, &FontT48, text);
255 265 }
256 if(pSettings->scrubberData[scrubberMenuId].lastDive.WeekDay != 0) 266
257 { 267 if (settings->scrubberData[scrubberMenuId].lastDive.WeekDay != 0) {
258 snprintf(&text[0], 32, "%c%c\002 %02d.%02d.%02d", TXT_2BYTE, TXT2BYTE_SimDiveTime, pSettings->scrubberData[scrubberMenuId].lastDive.Date, pSettings->scrubberData[scrubberMenuId].lastDive.Month, pSettings->scrubberData[scrubberMenuId].lastDive.Year); 268 snprintf(text, 32, "%s%c%c\002 %02d.%02d.%02d", makeGrey(!currentScrubberIsActive), TXT_2BYTE, TXT2BYTE_SimDiveTime, settings->scrubberData[scrubberMenuId].lastDive.Date, settings->scrubberData[scrubberMenuId].lastDive.Month, settings->scrubberData[scrubberMenuId].lastDive.Year);
259 } 269 } else {
260 else 270 snprintf(&text[0], 32, "%s%c%c\002 --.--.--", makeGrey(!currentScrubberIsActive), TXT_2BYTE, TXT2BYTE_SimDiveTime);
261 { 271 }
262 snprintf(&text[0], 32,"%c%c\002 --.--.--", TXT_2BYTE, TXT2BYTE_SimDiveTime); 272 if (isRefresh) {
263 } 273 clean_content(20, 780, ME_Y_LINE5, &FontT48);
264 write_label_var( 20, 780, ME_Y_LINE5, &FontT48, text); 274 }
265 275 write_label_var(20, 780, ME_Y_LINE5, &FontT48, text);
266 switch (pSettings->scrubTimerMode) { 276
267 case SCRUB_TIMER_MINUTES: 277 if (isRefresh) {
268 default: 278 switch (settings->scrubTimerMode) {
269 snprintf(&text[0], 32,"%c\002%c",TXT_ScrubTimeMode, TXT_Minutes ); 279 case SCRUB_TIMER_MINUTES:
270 280 default:
271 break; 281 snprintf(text, 32, "%c\002%c", TXT_ScrubTimeMode, TXT_Minutes);
272 case SCRUB_TIMER_PERCENT: 282
273 snprintf(&text[0], 32,"%c\002%c",TXT_ScrubTimeMode, TXT_Percent ); 283 break;
274 284 case SCRUB_TIMER_PERCENT:
275 break; 285 snprintf(text, 32, "%c\002%c", TXT_ScrubTimeMode, TXT_Percent);
276 } 286
277 write_field_button(StMXTRA_ScrubTimer_OP_Mode, 20, 780, ME_Y_LINE6, &FontT48, text); 287 break;
288 }
289 write_field_button(StMXTRA_ScrubTimer_OP_Mode, 20, 780, ME_Y_LINE6, &FontT48, text);
290 }
278 291
279 setEvent(StMXTRA_ScrubTimer, (uint32_t)OnAction_ScrubberTimerId); 292 setEvent(StMXTRA_ScrubTimer, (uint32_t)OnAction_ScrubberTimerId);
280 setEvent(StMXTRA_ScrubTimer_Active, (uint32_t)OnAction_ScrubberActive); 293 setEvent(StMXTRA_ScrubTimer_Active, (uint32_t)OnAction_ScrubberActive);
281 setEvent(StMXTRA_ScrubTimer_Max, (uint32_t)OnAction_ScrubberTimerMax); 294 setEvent(StMXTRA_ScrubTimer_Max, (uint32_t)OnAction_ScrubberTimerMax);
282 setEvent(StMXTRA_ScrubTimer_Reset, (uint32_t)OnAction_ScrubberReset); 295 setEvent(StMXTRA_ScrubTimer_Reset, (uint32_t)OnAction_ScrubberReset);
283 setEvent(StMXTRA_ScrubTimer_OP_Mode, (uint32_t)OnAction_ScrubberMode); 296 setEvent(StMXTRA_ScrubTimer_OP_Mode, (uint32_t)OnAction_ScrubberMode);
284 297 }
285 298
286 write_buttonTextline(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext); 299 static void openEdit_Scrubber(void)
287 300 {
301 char text[32];
302
303 resetMenuEdit(CLUT_MenuPageXtra);
304
305 snprintf(text, 32, "\001%c", TXT_ScrubTime);
306 write_topline(text);
307
308 drawScrubberMenu(false);
309
310 write_buttonTextline(TXT2BYTE_ButtonBack, TXT2BYTE_ButtonEnter, TXT2BYTE_ButtonNext);
288 } 311 }
289 312
290 static void openEdit_PSCR(void) 313 static void openEdit_PSCR(void)
291 { 314 {
292 uint8_t localO2Drop,localLungRatio; 315 uint8_t localO2Drop,localLungRatio;
471 } 494 }
472 495
473 496
474 uint8_t OnAction_ScrubberTimerId(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) 497 uint8_t OnAction_ScrubberTimerId(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
475 { 498 {
476 char text[32]; 499 scrubberMenuId = (scrubberMenuId + 1) % SCRUBBER_COUNT;
477 SSettings *pSettings; 500
478 pSettings = settingsGetPointer(); 501 drawScrubberMenu(true);
479
480 if(scrubberMenuId == 0)
481 {
482 scrubberMenuId = 1;
483 }
484 else
485 {
486 scrubberMenuId = 0;
487 }
488
489 snprintf(&text[0], 32,"%c \002#%d",TXT_ScrubTime,scrubberMenuId);
490 tMenuEdit_newButtonText(StMXTRA_ScrubTimer, text);
491
492 printScrubberResetText(text, pSettings, scrubberMenuId);
493 tMenuEdit_newButtonText(StMXTRA_ScrubTimer_Reset, text);
494
495 tMenuEdit_newInput(StMXTRA_ScrubTimer_Max, pSettings->scrubberData[scrubberMenuId].TimerMax, 0, 0, 0);
496
497 if(pSettings->scrubberData[scrubberMenuId].lastDive.WeekDay != 0)
498 {
499 snprintf(&text[0], 32, "%c%c\002 %02d.%02d.%02d", TXT_2BYTE, TXT2BYTE_SimDiveTime, pSettings->scrubberData[scrubberMenuId].lastDive.Date, pSettings->scrubberData[scrubberMenuId].lastDive.Month, pSettings->scrubberData[scrubberMenuId].lastDive.Year);
500 }
501 else
502 {
503 snprintf(&text[0], 32,"%c%c\002 --.--.--", TXT_2BYTE, TXT2BYTE_SimDiveTime);
504 }
505 clean_content( 20, 780, ME_Y_LINE5, &FontT48);
506 write_label_var( 20, 780, ME_Y_LINE5, &FontT48, text);
507
508 if(pSettings->scrubberActiveId & (1 << scrubberMenuId))
509 {
510 snprintf(&text[0], 32,"%c %c \002\005", TXT_ScrubTime, TXT_Active);
511 }
512 else
513 {
514 snprintf(&text[0], 32,"%c %c \002\006", TXT_ScrubTime, TXT_Active);
515 }
516 tMenuEdit_newButtonText(StMXTRA_ScrubTimer_Active, text);
517 502
518 return UNSPECIFIC_RETURN; 503 return UNSPECIFIC_RETURN;
519 } 504 }
520 505
521 static uint8_t OnAction_ScrubberTimerMax(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) 506 static uint8_t OnAction_ScrubberTimerMax(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
560 return digitContentNew; 545 return digitContentNew;
561 } 546 }
562 547
563 uint8_t OnAction_ScrubberReset(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) 548 uint8_t OnAction_ScrubberReset(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
564 { 549 {
565 char text[32]; 550 SSettings *pSettings = settingsGetPointer();
566 SSettings *pSettings;
567 pSettings = settingsGetPointer();
568 pSettings->scrubberData[scrubberMenuId].TimerCur = pSettings->scrubberData[scrubberMenuId].TimerMax; 551 pSettings->scrubberData[scrubberMenuId].TimerCur = pSettings->scrubberData[scrubberMenuId].TimerMax;
569 pSettings->scrubberData[scrubberMenuId].lastDive.WeekDay = 0; /* invalidate date */ 552 pSettings->scrubberData[scrubberMenuId].lastDive.WeekDay = 0; /* invalidate date */
570 553
571 printScrubberResetText(text, pSettings, scrubberMenuId); 554 drawScrubberMenu(true);
572 tMenuEdit_newButtonText(StMXTRA_ScrubTimer_Reset, text);
573
574 snprintf(&text[0], 32,"%c%c\002 --.--.--", TXT_2BYTE, TXT2BYTE_SimDiveTime);
575 clean_content( 20, 780, ME_Y_LINE5, &FontT48);
576 write_label_var( 20, 780, ME_Y_LINE5, &FontT48, text);
577 555
578 return UNSPECIFIC_RETURN; 556 return UNSPECIFIC_RETURN;
579 } 557 }
580 558
581 uint8_t OnAction_ScrubberMode(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) 559 uint8_t OnAction_ScrubberMode(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
606 return UNSPECIFIC_RETURN; 584 return UNSPECIFIC_RETURN;
607 } 585 }
608 586
609 uint8_t OnAction_ScrubberActive(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action) 587 uint8_t OnAction_ScrubberActive(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
610 { 588 {
611 char text[32]; 589 SSettings *pSettings = settingsGetPointer();
612 SSettings *pSettings; 590
613 pSettings = settingsGetPointer(); 591 if (pSettings->scrubberActiveId & (1 << scrubberMenuId)) {
614 592 pSettings->scrubberActiveId &= ~(1 << scrubberMenuId);
615 if(pSettings->scrubberActiveId & (1 << scrubberMenuId)) 593 } else {
616 { 594 pSettings->scrubberActiveId |= (1 << scrubberMenuId);
617 pSettings->scrubberActiveId &= ~(1 << scrubberMenuId); 595 }
618 snprintf(&text[0], 32,"%c %c \002\006", TXT_ScrubTime, TXT_Active); 596
619 } 597 drawScrubberMenu(true);
620 else
621 {
622 pSettings->scrubberActiveId |= (1 << scrubberMenuId);
623 snprintf(&text[0], 32,"%c %c \002\005", TXT_ScrubTime, TXT_Active);
624 }
625
626 tMenuEdit_newButtonText(StMXTRA_ScrubTimer_Active, text);
627 598
628 return UNSPECIFIC_RETURN; 599 return UNSPECIFIC_RETURN;
629 } 600 }
630 601
631 #ifdef ENABLE_PSCR_MODE 602 #ifdef ENABLE_PSCR_MODE