changeset 998:5a690195b6b7 GasConsumption

Added dual operation of scrubber timers: In the previous version only one scrubber timer could be selected for operation. In the new version the activation of both timers is possible. In that case both timers will be displayed as well. To enable this a new activation item has been added to the scrubber menu.
author Ideenmodellierer
date Wed, 23 Apr 2025 14:52:03 +0200 (4 months ago)
parents 2f7531a8e922
children ac25c35a3c97
files Discovery/Inc/tStructure.h Discovery/Src/base.c Discovery/Src/simulation.c Discovery/Src/t3.c Discovery/Src/t7.c Discovery/Src/tCCR.c Discovery/Src/tMenuEditXtra.c
diffstat 7 files changed, 163 insertions(+), 62 deletions(-) [+]
line wrap: on
line diff
--- a/Discovery/Inc/tStructure.h	Wed Apr 23 14:47:42 2025 +0200
+++ b/Discovery/Inc/tStructure.h	Wed Apr 23 14:52:03 2025 +0200
@@ -214,9 +214,10 @@
 #define StMXTRA_CCRmode					_MB(2,4,1,1,0)
 #define StMXTRA_O2_Fallback				_MB(2,4,2,1,0)
 #define StMXTRA_ScrubTimer				_MB(2,4,3,1,0)
-#define StMXTRA_ScrubTimer_Max			_MB(2,4,3,2,0)
-#define StMXTRA_ScrubTimer_Reset		_MB(2,4,3,3,0)
-#define StMXTRA_ScrubTimer_OP_Mode		_MB(2,4,3,5,0)
+#define StMXTRA_ScrubTimer_Active		_MB(2,4,3,2,0)
+#define StMXTRA_ScrubTimer_Max			_MB(2,4,3,3,0)
+#define StMXTRA_ScrubTimer_Reset		_MB(2,4,3,4,0)
+#define StMXTRA_ScrubTimer_OP_Mode		_MB(2,4,3,6,0)
 #define StMXTRA_PSCR_O2_Drop			_MB(2,4,4,1,0)
 #define StMXTRA_PSCR_LUNG_RATIO			_MB(2,4,4,2,0)
 #define StMXTRA_Predive_Check			_MB(2,4,5,1,0)
--- a/Discovery/Src/base.c	Wed Apr 23 14:47:42 2025 +0200
+++ b/Discovery/Src/base.c	Wed Apr 23 14:52:03 2025 +0200
@@ -384,7 +384,7 @@
     HAL_Delay( 100 );
 
     stateRealGetPointerWrite()->lastKnownBatteryPercentage = 0; // damit das nicht in settings kopiert wird.
-    set_settings_to_Standard();
+    set_settings_to_Standard();									/* initialize setting structure with default value => will be overwritten by flash read operation */
     mod_settings_for_first_start_with_empty_ext_flash();
     ext_flash_read_settings();
     if( newFirmwareVersionCheckViaSettings() ) // test for old firmware version in loaded settings
@@ -392,8 +392,7 @@
         wasFirmwareUpdateCheckBattery = 1;
         set_settings_button_to_factory_with_individual_buttonBalance(); // will adapt individual values
     }
-    //settingsGetPointer()->bluetoothActive = 0; 	/* MX_Bluetooth_PowerOff();  unnecessary as part of MX_GPIO_Init() */
-    //settingsGetPointer()->compassBearing = 0;
+
     set_new_settings_missing_in_ext_flash(); // includes update of firmware version  161121
 
     GFX_init( &pLayerInvisible );
--- a/Discovery/Src/simulation.c	Wed Apr 23 14:47:42 2025 +0200
+++ b/Discovery/Src/simulation.c	Wed Apr 23 14:52:03 2025 +0200
@@ -151,6 +151,7 @@
     SDiveState * pDiveState = &stateSim;
     const SDiveState * pRealState = stateRealGetPointer();
 	SSettings *pSettings;
+	uint8_t timerId = 0;
 
     static int last_second = -1;
     static _Bool two_second = 0;
@@ -250,11 +251,17 @@
     	if(simScrubberTimeoutCount >= 60)		/* resolution is minutes */
     	{
     		simScrubberTimeoutCount = 0;
-    		if(pDiveState->scrubberDataDive[pSettings->scubberActiveId].TimerCur > MIN_SCRUBBER_TIME)
+    		for(timerId = 0; timerId < 2; timerId++)
     		{
-    			pDiveState->scrubberDataDive[pSettings->scubberActiveId].TimerCur--;
+    		   	if(pSettings->scubberActiveId & (1 << timerId))
+    		   	{
+					if(pDiveState->scrubberDataDive[timerId].TimerCur > MIN_SCRUBBER_TIME)
+					{
+						pDiveState->scrubberDataDive[timerId].TimerCur--;
+					}
+					translateDate(stateUsed->lifeData.dateBinaryFormat, &pDiveState->scrubberDataDive[timerId].lastDive);
+    		   	}
     		}
-            translateDate(stateUsed->lifeData.dateBinaryFormat, &pDiveState->scrubberDataDive[pSettings->scubberActiveId].lastDive);
     	}
     }
 
--- a/Discovery/Src/t3.c	Wed Apr 23 14:47:42 2025 +0200
+++ b/Discovery/Src/t3.c	Wed Apr 23 14:52:03 2025 +0200
@@ -1998,19 +1998,40 @@
 
 int printScrubberText(char *text, size_t size, const SScrubberData *scrubberData, SSettings *settings)
 {
-    int16_t currentTimerMinutes = scrubberData[settings->scubberActiveId].TimerCur;
-    char colour = '\020';
-    if (currentTimerMinutes <= 0) {
-        colour = '\025';
-    } else if (currentTimerMinutes <= 30) {
-        colour = '\024';
-    }
+	uint8_t timerId = 0;
+	int16_t currentTimerMinutes = 0;
+	char colour = 0;
+	uint8_t textIndex = 0;
 
-    if (settings->scrubTimerMode == SCRUB_TIMER_MINUTES || currentTimerMinutes < 0) {
-        return snprintf(text, size, "%c%3i'", colour, currentTimerMinutes);
-    } else {
-        return snprintf(text, size, "%c%u\016\016%%\017", colour, currentTimerMinutes * 100 / settingsGetPointer()->scrubberData[settings->scubberActiveId].TimerMax);
-    }
+	for(timerId = 0; timerId < 2; timerId++)
+	{
+		if(settings->scubberActiveId & (1 << timerId))
+		{
+			currentTimerMinutes = scrubberData[timerId].TimerCur;
+			colour = '\020';
+			if (currentTimerMinutes <= 0)
+			{
+				colour = '\025';
+			}
+			else if (currentTimerMinutes <= 30)
+			{
+				colour = '\024';
+			}
+			if (settings->scrubTimerMode == SCRUB_TIMER_MINUTES || currentTimerMinutes < 0)
+			{
+				textIndex += snprintf(&text[textIndex], size, "%c%3i'", colour, currentTimerMinutes);
+			}
+			else
+			{
+				textIndex += snprintf(&text[textIndex], size, "%c%u\016\016%%\017", colour, currentTimerMinutes * 100 / settingsGetPointer()->scrubberData[timerId].TimerMax);
+			}
+			if((settings->scubberActiveId == 3) && (timerId == 0))	/* both timers are active => print separator */
+			{
+				textIndex += snprintf(&text[textIndex], size, " | ");
+			}
+		}
+	}
+	return textIndex;
 }
 
 void t3_AF_updateBorderConditions()
--- a/Discovery/Src/t7.c	Wed Apr 23 14:47:42 2025 +0200
+++ b/Discovery/Src/t7.c	Wed Apr 23 14:52:03 2025 +0200
@@ -3286,7 +3286,9 @@
 
     char  headerText[10];
     char  text[TEXTSIZE];
+    char  tmpString[TEXTSIZE];
     uint8_t textpointer = 0;
+    uint8_t index = 0;
     _Bool tinyHeaderFont = 0;
     uint8_t line = 0;
 #ifdef ENABLE_BOTTLE_SENSOR
@@ -3402,7 +3404,26 @@
     	tinyHeaderFont = 1;
         headerText[2] = TXT_ScrubTime;
 
-        printScrubberText(text, TEXTSIZE, stateUsed->scrubberDataDive, pSettings);
+        textpointer = printScrubberText(text, TEXTSIZE, stateUsed->scrubberDataDive, pSettings);
+        if (pSettings->scubberActiveId == 3)	/* both timer active */
+        {
+        	snprintf(tmpString,TEXTSIZE,"\016\016%s",text);
+        	for(index = 0; index < textpointer; index++)
+        	{
+        		if(tmpString[index] == '\017')	/* remove switch to normal font */
+        		{
+        			tmpString[index] = ' ';
+        		}
+        		if(tmpString[index] == '|')	/* replace separator with new line */
+        		{
+        			tmpString[index] = '\n';
+        			tmpString[index+1] = '\r';
+        			break;
+        		}
+        	}
+        	line = 1;
+        	strcpy(text,tmpString);
+        }
 
 		break;
 #ifdef ENABLE_PSCR_MODE
@@ -3537,7 +3558,7 @@
     }
     else
     {
-        	GFX_write_string(&FontT48,&t7l3,text,line);
+        GFX_write_string(&FontT48,&t7l3,text,line);
     }
 #else
     GFX_write_string(&FontT105,&t7l3,text,line);
--- a/Discovery/Src/tCCR.c	Wed Apr 23 14:47:42 2025 +0200
+++ b/Discovery/Src/tCCR.c	Wed Apr 23 14:52:03 2025 +0200
@@ -322,6 +322,7 @@
 void tCCR_tick(void)
 {
 	SSettings* pSettings = settingsGetPointer();
+	uint8_t timerId = 0;
 
 	if(pSettings->ppo2sensors_source == O2_SENSOR_SOURCE_OPTIC)
 	{
@@ -346,11 +347,17 @@
             if(ScrubberTimeoutCount >= 600)		/* resolution is minutes */
             {
                 ScrubberTimeoutCount = 0;
-                if(stateUsed->scrubberDataDive[pSettings->scubberActiveId].TimerCur > MIN_SCRUBBER_TIME)
+                for(timerId = 0; timerId < 2; timerId++)
                 {
-                    stateUsedWrite->scrubberDataDive[pSettings->scubberActiveId].TimerCur--;
+                	if(pSettings->scubberActiveId & (1 << timerId))
+                	{
+						if(stateUsed->scrubberDataDive[timerId].TimerCur > MIN_SCRUBBER_TIME)
+						{
+							stateUsedWrite->scrubberDataDive[timerId].TimerCur--;
+						}
+						translateDate(stateUsed->lifeData.dateBinaryFormat, &stateUsedWrite->scrubberDataDive[timerId].lastDive);
+                	}
                 }
-                translateDate(stateUsed->lifeData.dateBinaryFormat, &stateUsedWrite->scrubberDataDive[pSettings->scubberActiveId].lastDive);
             }
         }
     }
--- a/Discovery/Src/tMenuEditXtra.c	Wed Apr 23 14:47:42 2025 +0200
+++ b/Discovery/Src/tMenuEditXtra.c	Wed Apr 23 14:52:03 2025 +0200
@@ -62,6 +62,7 @@
 static uint8_t OnAction_ScrubberTimerMax(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
 static uint8_t OnAction_ScrubberReset(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
 static uint8_t OnAction_ScrubberMode(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
+static uint8_t OnAction_ScrubberActive(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
 #ifdef ENABLE_PSCR_MODE
 static uint8_t OnAction_PSCRO2Drop(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
 static uint8_t OnAction_PSCRLungRation(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action);
@@ -69,6 +70,7 @@
 
 /* Exported functions --------------------------------------------------------*/
 
+static uint8_t scrubberMenuId = 0;
 
 void openEdit_Xtra(uint8_t line)
 {
@@ -194,9 +196,9 @@
 }
 
 
-static void printScrubberResetText(char *text, SSettings *settings)
+static void printScrubberResetText(char *text, SSettings *settings, uint8_t scrubberId)
 {
-    int16_t currentTimerMinutes = settings->scrubberData[settings->scubberActiveId].TimerCur;
+    int16_t currentTimerMinutes = settings->scrubberData[scrubberId].TimerCur;
     char colour = '\020';
     if (currentTimerMinutes <= 0) {
         colour = '\025';
@@ -215,7 +217,7 @@
 
     SSettings *pSettings = settingsGetPointer();
 
-    localScrubTimer =  pSettings->scrubberData[pSettings->scubberActiveId].TimerMax;
+    localScrubTimer =  pSettings->scrubberData[scrubberMenuId].TimerMax;
 
 	resetMenuEdit(CLUT_MenuPageXtra);
 
@@ -224,34 +226,44 @@
     write_topline(text);
 
 
-    snprintf(&text[0], 32,"%c \002#%d",TXT_ScrubTime,pSettings->scubberActiveId);
+    snprintf(&text[0], 32,"%c \002#%d",TXT_ScrubTime,scrubberMenuId);
     write_field_button(StMXTRA_ScrubTimer, 20, 780, ME_Y_LINE1,  &FontT48, text);
 
+    if(pSettings->scubberActiveId & (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);
+    }
+    write_field_button(StMXTRA_ScrubTimer_Active, 20, 780, ME_Y_LINE2,  &FontT48, text);
+
     snprintf(&text[textIndex], 32,\
         "%c"
     	"\016\016(%c)\017"
         ,TXT_ScrubTime
 		,TXT_Maximum);
 
-    write_label_var(  20, 340, ME_Y_LINE2, &FontT48, text);
+    write_label_var(  20, 340, ME_Y_LINE3, &FontT48, text);
     snprintf(&text[textIndex], 32, "\002###\016\016 %c\017",TXT_Minutes);
 
-    write_field_udigit(StMXTRA_ScrubTimer_Max,	 610, 780, ME_Y_LINE2,  &FontT48, text,localScrubTimer, 0, 0, 0);
+    write_field_udigit(StMXTRA_ScrubTimer_Max,	 610, 780, ME_Y_LINE3,  &FontT48, text,localScrubTimer, 0, 0, 0);
 
-    printScrubberResetText(text, pSettings);
-    write_field_button(StMXTRA_ScrubTimer_Reset, 20, 780, ME_Y_LINE3,  &FontT48, text);
+    printScrubberResetText(text, pSettings, scrubberMenuId);
+    write_field_button(StMXTRA_ScrubTimer_Reset, 20, 780, ME_Y_LINE4,  &FontT48, text);
 
-    if(pSettings->scrubberData[pSettings->scubberActiveId].lastDive.WeekDay != 0)
+    if(pSettings->scrubberData[scrubberMenuId].lastDive.WeekDay != 0)
     {
-    	snprintf(&text[0], 32,"%c%c\002       %02d.%02d.%02d", TXT_2BYTE, TXT2BYTE_SimDiveTime, 	pSettings->scrubberData[pSettings->scubberActiveId].lastDive.Date,
-																				pSettings->scrubberData[pSettings->scubberActiveId].lastDive.Month,
-																				pSettings->scrubberData[pSettings->scubberActiveId].lastDive.Year);
+    	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);
     }
-	write_label_var(  20, 780, ME_Y_LINE4, &FontT48, text);
+	write_label_var(  20, 780, ME_Y_LINE5, &FontT48, text);
 
    	switch(pSettings->scrubTimerMode)
     	{
@@ -263,13 +275,15 @@
     		case SCRUB_TIMER_PERCENT: snprintf(&text[0], 32,"%c\002%c",TXT_ScrubTimeMode, TXT_Percent );
     			break;
     	}
-    write_field_button(StMXTRA_ScrubTimer_OP_Mode,	 20, 780, ME_Y_LINE5,  &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);
 
+
     write_buttonTextline(TXT2BYTE_ButtonBack,TXT2BYTE_ButtonEnter,TXT2BYTE_ButtonNext);
 
 }
@@ -464,36 +478,46 @@
 	SSettings *pSettings;
     pSettings = settingsGetPointer();
 
-    if(pSettings->scubberActiveId == 0)
+
+    if(scrubberMenuId == 0)
     {
-    	pSettings->scubberActiveId = 1;
+    	scrubberMenuId = 1;
     }
     else
     {
-       	pSettings->scubberActiveId = 0;
+    	scrubberMenuId = 0;
     }
 
-
-    snprintf(&text[0], 32,"%c \002#%d",TXT_ScrubTime,pSettings->scubberActiveId);
+    snprintf(&text[0], 32,"%c \002#%d",TXT_ScrubTime,scrubberMenuId);
     tMenuEdit_newButtonText(StMXTRA_ScrubTimer, text);
 
-    printScrubberResetText(text, pSettings);
+    printScrubberResetText(text, pSettings, scrubberMenuId);
     tMenuEdit_newButtonText(StMXTRA_ScrubTimer_Reset, text);
 
-    tMenuEdit_newInput(StMXTRA_ScrubTimer_Max, pSettings->scrubberData[pSettings->scubberActiveId].TimerMax,  0,  0, 0);
+    tMenuEdit_newInput(StMXTRA_ScrubTimer_Max, pSettings->scrubberData[scrubberMenuId].TimerMax,  0,  0, 0);
 
-    if(pSettings->scrubberData[pSettings->scubberActiveId].lastDive.WeekDay != 0)
+    if(pSettings->scrubberData[scrubberMenuId].lastDive.WeekDay != 0)
     {
-    	snprintf(&text[0], 32,"%c%c\002   %02d.%02d.%02d", TXT_2BYTE, TXT2BYTE_SimDiveTime, 	pSettings->scrubberData[pSettings->scubberActiveId].lastDive.Date,
-																				pSettings->scrubberData[pSettings->scubberActiveId].lastDive.Month,
-																				pSettings->scrubberData[pSettings->scubberActiveId].lastDive.Year);
+    	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_LINE4, &FontT48);
-	write_label_var(  20, 780, ME_Y_LINE4, &FontT48, text);
+    clean_content(  20, 780, ME_Y_LINE5, &FontT48);
+	write_label_var(  20, 780, ME_Y_LINE5, &FontT48, text);
+
+    if(pSettings->scubberActiveId & (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);
 
     return UNSPECIFIC_RETURN;
 }
@@ -516,10 +540,10 @@
         	newScrubberTime = MAX_SCRUBBER_TIME;
 
         pSettings = settingsGetPointer();
-        pSettings->scrubberData[pSettings->scubberActiveId].TimerMax = newScrubberTime;
-        if(pSettings->scrubberData[pSettings->scubberActiveId].TimerCur > newScrubberTime)
+        pSettings->scrubberData[scrubberMenuId].TimerMax = newScrubberTime;
+        if(pSettings->scrubberData[scrubberMenuId].TimerCur > newScrubberTime)
         {
-        	pSettings->scrubberData[pSettings->scubberActiveId].TimerCur = newScrubberTime;
+        	pSettings->scrubberData[scrubberMenuId].TimerCur = newScrubberTime;
         }
 
         tMenuEdit_newInput(editId, newScrubberTime, 0, 0, 0);
@@ -545,16 +569,15 @@
 	char text[32];
 	SSettings *pSettings;
     pSettings = settingsGetPointer();
-    pSettings->scrubberData[pSettings->scubberActiveId].TimerCur = pSettings->scrubberData[pSettings->scubberActiveId].TimerMax;
-    pSettings->scrubberData[pSettings->scubberActiveId].lastDive.WeekDay = 0;	/* invalidate date */
+    pSettings->scrubberData[scrubberMenuId].TimerCur = pSettings->scrubberData[scrubberMenuId].TimerMax;
+    pSettings->scrubberData[scrubberMenuId].lastDive.WeekDay = 0;	/* invalidate date */
 
-    printScrubberResetText(text, pSettings);
+    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_LINE4, &FontT48);
-	write_label_var(  20, 780, ME_Y_LINE4, &FontT48, text);
-
+   	clean_content(  20, 780, ME_Y_LINE5, &FontT48);
+	write_label_var(  20, 780, ME_Y_LINE5, &FontT48, text);
 
     return UNSPECIFIC_RETURN;
 }
@@ -587,6 +610,28 @@
     return UNSPECIFIC_RETURN;
 }
 
+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();
+
+    if(pSettings->scubberActiveId & (1 << scrubberMenuId))
+    {
+    	pSettings->scubberActiveId &= ~(1 << scrubberMenuId);
+    	snprintf(&text[0], 32,"%c %c \002\006", TXT_ScrubTime, TXT_Active);
+    }
+    else
+    {
+       	pSettings->scubberActiveId |= (1 << scrubberMenuId);
+       	snprintf(&text[0], 32,"%c %c \002\005", TXT_ScrubTime, TXT_Active);
+    }
+
+    tMenuEdit_newButtonText(StMXTRA_ScrubTimer_Active, text);
+
+    return UNSPECIFIC_RETURN;
+}
+
 #ifdef ENABLE_PSCR_MODE
 static uint8_t OnAction_PSCRO2Drop(uint32_t editId, uint8_t blockNumber, uint8_t digitNumber, uint8_t digitContent, uint8_t action)
 {