diff Discovery/Src/simulation.c @ 1014:8c0134a287da GasConsumption

Add a log data event to the scrubber timer at the start of the dive and every time the timer (in minutes) is decremented. The event contains a 12 bit signed integer for the remaining scrubber duration, and two flags for scrubber warning (0x2000, <= 30 minutes remaining) and scrubber error (0x4000, <= 0 minutes remaining). (mikeller)
author heinrichsweikamp
date Sun, 11 May 2025 16:18:20 +0200
parents 5a690195b6b7
children
line wrap: on
line diff
--- a/Discovery/Src/simulation.c	Sat May 10 21:27:06 2025 +0200
+++ b/Discovery/Src/simulation.c	Sun May 11 16:18:20 2025 +0200
@@ -43,6 +43,7 @@
 #include "vpm.h"
 #include "buehlmann.h"
 #include "logbook_miniLive.h"
+#include "logbook.h"
 
 #include "configuration.h"
 
@@ -111,7 +112,8 @@
 
     stateSim.lifeData.apnea_total_max_depth_meter = 0;
 
-    memcpy(stateSim.scrubberDataDive, settingsGetPointer()->scrubberData, sizeof(stateSim.scrubberDataDive));
+    SSettings *settings = settingsGetPointer();
+    memcpy(stateSim.scrubberDataDive, settings->scrubberData, sizeof(stateSim.scrubberDataDive));
     memset(simSensmVOffset,0,sizeof(simSensmVOffset));
    	if(getReplayOffset() != 0xFFFF)
    	{
@@ -151,7 +153,6 @@
     SDiveState * pDiveState = &stateSim;
     const SDiveState * pRealState = stateRealGetPointer();
 	SSettings *pSettings;
-	uint8_t timerId = 0;
 
     static int last_second = -1;
     static _Bool two_second = 0;
@@ -245,27 +246,35 @@
     	pDiveState->lifeData.ascent_rate_meter_per_min = 0;
     }
 
-    if((pSettings->scrubTimerMode != SCRUB_TIMER_OFF) && (isLoopMode(pSettings->dive_mode)) && (pDiveState->mode == MODE_DIVE) && isLoopMode(pDiveState->diveSettings.diveMode))
-    {
-    	simScrubberTimeoutCount++;
-    	if(simScrubberTimeoutCount >= 60)		/* resolution is minutes */
-    	{
-    		simScrubberTimeoutCount = 0;
-    		for(timerId = 0; timerId < 2; timerId++)
-    		{
-    		   	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);
-    		   	}
-    		}
-    	}
+    if (isScrubberTimerRunning(pDiveState, pSettings)) {
+        simScrubberTimeoutCount++;
+
+        if (simScrubberTimeoutCount >= 60) {
+            /* resolution is minutes */
+            simScrubberTimeoutCount = 0;
+
+            int16_t maxScrubberTime = INT16_MIN;
+            SScrubberData *longestScrubberData = NULL;
+            for (unsigned timerId = 0; timerId < 2; timerId++) {
+                if (pSettings->scrubberActiveId & (1 << timerId)) {
+                    SScrubberData *scrubberData = &pDiveState->scrubberDataDive[timerId];
+                    if (scrubberData->TimerCur > MIN_SCRUBBER_TIME) {
+                        scrubberData->TimerCur--;
+                    }
+
+                    if (scrubberData->TimerCur > maxScrubberTime) {
+                        maxScrubberTime = scrubberData->TimerCur;
+                        longestScrubberData = scrubberData;
+                    }
+
+                    translateDate(stateUsed->lifeData.dateBinaryFormat, &scrubberData->lastDive);
+                }
+            }
+
+            logScrubberState(longestScrubberData);
+        }
     }
 
-
     if(lastPressure_bar > 0)
      {
          //1 second * 60 == 1 minute, bar * 10 = meter