changeset 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 (3 months ago)
parents 5924a2d1d3ba
children 67e3dbc4d212
files Discovery/Inc/tMenu.h Discovery/Src/tMenu.c Discovery/Src/tMenuEditXtra.c
diffstat 3 files changed, 100 insertions(+), 122 deletions(-) [+]
line wrap: on
line diff
--- a/Discovery/Inc/tMenu.h	Thu May 29 22:04:46 2025 +0200
+++ b/Discovery/Inc/tMenu.h	Mon Jun 09 09:42:16 2025 +0200
@@ -95,4 +95,5 @@
 void clearDisabledMenuLines(void);
 
 char *makeGrey(bool isGrey);
+char printCheckbox(bool isChecked);
 #endif /* TMENU_H */
--- a/Discovery/Src/tMenu.c	Thu May 29 22:04:46 2025 +0200
+++ b/Discovery/Src/tMenu.c	Mon Jun 09 09:42:16 2025 +0200
@@ -1516,3 +1516,9 @@
 {
     return isGrey ? "\031" : "";
 }
+
+
+char printCheckbox(bool isChecked)
+{
+    return isChecked ? '\005' : '\006';
+}
--- a/Discovery/Src/tMenuEditXtra.c	Thu May 29 22:04:46 2025 +0200
+++ b/Discovery/Src/tMenuEditXtra.c	Mon Jun 09 09:42:16 2025 +0200
@@ -41,6 +41,9 @@
 #include "tInfoPreDive.h"
 
 
+#define SCRUBBER_COUNT 2
+
+
 /* Private function prototypes -----------------------------------------------*/
 void openEdit_CompassHeading(void);
 void openEdit_ResetStopwatch(void);
@@ -196,95 +199,115 @@
 }
 
 
-static void printScrubberResetText(char *text, SSettings *settings, uint8_t scrubberId)
+static void printScrubberResetText(char *text, SSettings *settings, uint8_t scrubberId, bool isActive)
 {
     int16_t currentTimerMinutes = settings->scrubberData[scrubberId].TimerCur;
-    char colour = '\020';
-    if (currentTimerMinutes <= 0) {
-        colour = '\025';
-    } else if (currentTimerMinutes <= 30) {
-        colour = '\024';
+
+    char *colour = "";
+    if (isActive) {
+        if (currentTimerMinutes <= 0) {
+            colour = "\025";
+        } else if (currentTimerMinutes <= 30) {
+            colour = "\024";
+        }
     }
-    snprintf(text, 32, "%c\002%c%03i\016\016 %c\017", TXT_ScrubTimeReset, colour, currentTimerMinutes, TXT_Minutes);
+    snprintf(text, 32, "%s%c\002%s%03i\016\016 %c\017", makeGrey(!isActive), TXT_ScrubTimeReset, colour, currentTimerMinutes, TXT_Minutes);
 }
 
 
-static void openEdit_Scrubber(void)
+static void drawScrubberMenu(bool isRefresh)
 {
-	char text[32];
-	uint8_t textIndex = 0;
-    uint16_t localScrubTimer;
+    SSettings *settings = settingsGetPointer();
+
+    resetMenuContentStructure();
 
-    SSettings *pSettings = settingsGetPointer();
-
-    localScrubTimer =  pSettings->scrubberData[scrubberMenuId].TimerMax;
-
-	resetMenuEdit(CLUT_MenuPageXtra);
-
+	char text[32];
+    snprintf(text, 32, "%c \002#%d", TXT_ScrubTime, scrubberMenuId);
+    if (isRefresh) {
+        clean_content(20, 780, ME_Y_LINE1, &FontT48);
+    }
+    write_field_button(StMXTRA_ScrubTimer, 20, 780, ME_Y_LINE1, &FontT48, text);
 
-	snprintf(&text[0], 32,"\001%c",TXT_ScrubTime);
-    write_topline(text);
-
-
-    snprintf(&text[0], 32,"%c \002#%d",TXT_ScrubTime,scrubberMenuId);
-    write_field_button(StMXTRA_ScrubTimer, 20, 780, ME_Y_LINE1,  &FontT48, text);
+    bool currentScrubberIsActive = settings->scrubberActiveId & (1 << scrubberMenuId);
 
-    if(pSettings->scrubberActiveId & (1 << scrubberMenuId))
-    {
-    	snprintf(&text[0], 32,"%c %c \002\005", TXT_ScrubTime, TXT_Active);
+    snprintf(text, 32, "%c %c \002%c", TXT_ScrubTime, TXT_Active, printCheckbox(currentScrubberIsActive));
+    if (isRefresh) {
+        clean_content(20, 780, ME_Y_LINE2, &FontT48);
     }
-    else
-    {
-      	snprintf(&text[0], 32,"%c %c \002\006", TXT_ScrubTime, TXT_Active);
+    write_field_button(StMXTRA_ScrubTimer_Active, 20, 780, ME_Y_LINE2, &FontT48, text);
+
+    snprintf(text, 32, "%s%c\016\016(%c)\017", makeGrey(!currentScrubberIsActive), TXT_ScrubTime, TXT_Maximum);
+    if (isRefresh) {
+        clean_content(20, 340, ME_Y_LINE3, &FontT48);
     }
-    write_field_button(StMXTRA_ScrubTimer_Active, 20, 780, ME_Y_LINE2,  &FontT48, text);
+    write_label_var(20, 340, ME_Y_LINE3, &FontT48, text);
 
-    snprintf(&text[textIndex], 32,\
-        "%c"
-    	"\016\016(%c)\017"
-        ,TXT_ScrubTime
-		,TXT_Maximum);
-
-    write_label_var(  20, 340, ME_Y_LINE3, &FontT48, text);
-    snprintf(&text[textIndex], 32, "\002###\016\016 %c\017",TXT_Minutes);
+    uint16_t timerMax =  settings->scrubberData[scrubberMenuId].TimerMax;
+    if (isRefresh) {
+        clean_content(610, 780, ME_Y_LINE3, &FontT48);
+    }
+    if (currentScrubberIsActive) {
+        snprintf(text, 32, "%s\002###\016\016 %c\017", makeGrey(!currentScrubberIsActive), TXT_Minutes);
+        write_field_udigit(StMXTRA_ScrubTimer_Max, 610, 780, ME_Y_LINE3, &FontT48, text, timerMax, 0, 0, 0);
+    } else {
+        snprintf(text, 32, "%s\002%03i\016\016 %c\017", makeGrey(!currentScrubberIsActive), timerMax, TXT_Minutes);
+        write_label_var(610, 780, ME_Y_LINE3, &FontT48, text);
+    }
 
-    write_field_udigit(StMXTRA_ScrubTimer_Max,	 610, 780, ME_Y_LINE3,  &FontT48, text,localScrubTimer, 0, 0, 0);
-
-    printScrubberResetText(text, pSettings, scrubberMenuId);
-    write_field_button(StMXTRA_ScrubTimer_Reset, 20, 780, ME_Y_LINE4,  &FontT48, text);
-
-    if(pSettings->scrubberData[scrubberMenuId].lastDive.WeekDay != 0)
-    {
-        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);
+    printScrubberResetText(text, settings, scrubberMenuId, currentScrubberIsActive);
+    if (isRefresh) {
+        clean_content(20, 780, ME_Y_LINE4, &FontT48);
+    }
+    if (currentScrubberIsActive) {
+        write_field_button(StMXTRA_ScrubTimer_Reset, 20, 780, ME_Y_LINE4, &FontT48, text);
+    } else {
+        write_label_var(20, 780, ME_Y_LINE4, &FontT48, text);
     }
-    else
-    {
-       	snprintf(&text[0], 32,"%c%c\002       --.--.--", TXT_2BYTE, TXT2BYTE_SimDiveTime);
+
+    if (settings->scrubberData[scrubberMenuId].lastDive.WeekDay != 0) {
+        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);
+    } else {
+        snprintf(&text[0], 32, "%s%c%c\002       --.--.--", makeGrey(!currentScrubberIsActive), TXT_2BYTE, TXT2BYTE_SimDiveTime);
     }
-	write_label_var(  20, 780, ME_Y_LINE5, &FontT48, text);
+    if (isRefresh) {
+        clean_content(20, 780, ME_Y_LINE5, &FontT48);
+    }
+	write_label_var(20, 780, ME_Y_LINE5, &FontT48, text);
 
-    switch (pSettings->scrubTimerMode) {
-        case SCRUB_TIMER_MINUTES:
-        default:
-            snprintf(&text[0], 32,"%c\002%c",TXT_ScrubTimeMode, TXT_Minutes );
+    if (isRefresh) {
+        switch (settings->scrubTimerMode) {
+            case SCRUB_TIMER_MINUTES:
+            default:
+                snprintf(text, 32, "%c\002%c", TXT_ScrubTimeMode, TXT_Minutes);
 
-            break;
-        case SCRUB_TIMER_PERCENT:
-            snprintf(&text[0], 32,"%c\002%c",TXT_ScrubTimeMode, TXT_Percent );
+                break;
+            case SCRUB_TIMER_PERCENT:
+                snprintf(text, 32, "%c\002%c", TXT_ScrubTimeMode, TXT_Percent);
 
-            break;
+                break;
+        }
+        write_field_button(StMXTRA_ScrubTimer_OP_Mode, 20, 780, ME_Y_LINE6, &FontT48, text);
     }
-    write_field_button(StMXTRA_ScrubTimer_OP_Mode,	 20, 780, ME_Y_LINE6,  &FontT48, text);
 
     setEvent(StMXTRA_ScrubTimer, (uint32_t)OnAction_ScrubberTimerId);
     setEvent(StMXTRA_ScrubTimer_Active, (uint32_t)OnAction_ScrubberActive);
     setEvent(StMXTRA_ScrubTimer_Max, (uint32_t)OnAction_ScrubberTimerMax);
     setEvent(StMXTRA_ScrubTimer_Reset, (uint32_t)OnAction_ScrubberReset);
     setEvent(StMXTRA_ScrubTimer_OP_Mode, (uint32_t)OnAction_ScrubberMode);
+}
 
+static void openEdit_Scrubber(void)
+{
+	char text[32];
 
-    write_buttonTextline(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext);
+	resetMenuEdit(CLUT_MenuPageXtra);
 
+	snprintf(text, 32, "\001%c", TXT_ScrubTime);
+    write_topline(text);
+
+    drawScrubberMenu(false);
+
+    write_buttonTextline(TXT2BYTE_ButtonBack, TXT2BYTE_ButtonEnter, TXT2BYTE_ButtonNext);
 }
 
 static void openEdit_PSCR(void)
@@ -473,47 +496,9 @@
 
 uint8_t OnAction_ScrubberTimerId(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
 {
-	char text[32];
-	SSettings *pSettings;
-    pSettings = settingsGetPointer();
-
-    if(scrubberMenuId == 0)
-    {
-    	scrubberMenuId = 1;
-    }
-    else
-    {
-    	scrubberMenuId = 0;
-    }
-
-    snprintf(&text[0], 32,"%c \002#%d",TXT_ScrubTime,scrubberMenuId);
-    tMenuEdit_newButtonText(StMXTRA_ScrubTimer, text);
-
-    printScrubberResetText(text, pSettings, scrubberMenuId);
-    tMenuEdit_newButtonText(StMXTRA_ScrubTimer_Reset, text);
-
-    tMenuEdit_newInput(StMXTRA_ScrubTimer_Max, pSettings->scrubberData[scrubberMenuId].TimerMax,  0,  0, 0);
+    scrubberMenuId = (scrubberMenuId + 1) % SCRUBBER_COUNT;
 
-    if(pSettings->scrubberData[scrubberMenuId].lastDive.WeekDay != 0)
-    {
-        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);
-    }
-    else
-    {
-       	snprintf(&text[0], 32,"%c%c\002   --.--.--", TXT_2BYTE, TXT2BYTE_SimDiveTime);
-    }
-    clean_content(  20, 780, ME_Y_LINE5, &FontT48);
-	write_label_var(  20, 780, ME_Y_LINE5, &FontT48, text);
-
-    if(pSettings->scrubberActiveId & (1 << scrubberMenuId))
-    {
-    	snprintf(&text[0], 32,"%c %c \002\005", TXT_ScrubTime, TXT_Active);
-    }
-    else
-    {
-      	snprintf(&text[0], 32,"%c %c \002\006", TXT_ScrubTime, TXT_Active);
-    }
-    tMenuEdit_newButtonText(StMXTRA_ScrubTimer_Active, text);
+    drawScrubberMenu(true);
 
     return UNSPECIFIC_RETURN;
 }
@@ -562,18 +547,11 @@
 
 uint8_t OnAction_ScrubberReset(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
 {
-	char text[32];
-	SSettings *pSettings;
-    pSettings = settingsGetPointer();
+    SSettings *pSettings = settingsGetPointer();
     pSettings->scrubberData[scrubberMenuId].TimerCur = pSettings->scrubberData[scrubberMenuId].TimerMax;
     pSettings->scrubberData[scrubberMenuId].lastDive.WeekDay = 0;	/* invalidate date */
 
-    printScrubberResetText(text, pSettings, scrubberMenuId);
-    tMenuEdit_newButtonText(StMXTRA_ScrubTimer_Reset, text);
-
-   	snprintf(&text[0], 32,"%c%c\002   --.--.--", TXT_2BYTE, TXT2BYTE_SimDiveTime);
-   	clean_content(  20, 780, ME_Y_LINE5, &FontT48);
-	write_label_var(  20, 780, ME_Y_LINE5, &FontT48, text);
+    drawScrubberMenu(true);
 
     return UNSPECIFIC_RETURN;
 }
@@ -608,22 +586,15 @@
 
 uint8_t OnAction_ScrubberActive(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
 {
-	char text[32];
-	SSettings *pSettings;
-    pSettings = settingsGetPointer();
+    SSettings *pSettings = settingsGetPointer();
 
-    if(pSettings->scrubberActiveId & (1 << scrubberMenuId))
-    {
-    	pSettings->scrubberActiveId &= ~(1 << scrubberMenuId);
-    	snprintf(&text[0], 32,"%c %c \002\006", TXT_ScrubTime, TXT_Active);
-    }
-    else
-    {
-       	pSettings->scrubberActiveId |= (1 << scrubberMenuId);
-       	snprintf(&text[0], 32,"%c %c \002\005", TXT_ScrubTime, TXT_Active);
+    if (pSettings->scrubberActiveId & (1 << scrubberMenuId)) {
+        pSettings->scrubberActiveId &= ~(1 << scrubberMenuId);
+    } else {
+        pSettings->scrubberActiveId |= (1 << scrubberMenuId);
     }
 
-    tMenuEdit_newButtonText(StMXTRA_ScrubTimer_Active, text);
+    drawScrubberMenu(true);
 
     return UNSPECIFIC_RETURN;
 }