changeset 910:7bd347bdaa81 Evo_2_23

Devbugfix Sample time resolution for longer dives: If a dive is longer than the provided replay buffer then the sample data is compressed. This compression was not considered in the previous version. As result the dive was replayed with double speed because a single sample were interpretated as 2 seconds instead of e.g. 4 seconds for a compressed sample. The comprassion rate is now considered in the simulator replay function
author Ideenmodellierer
date Tue, 15 Oct 2024 19:12:05 +0200
parents 6902bb4b6b2e
children a2523e19f59a
files Discovery/Src/logbook_miniLive.c Discovery/Src/simulation.c
diffstat 2 files changed, 26 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/Discovery/Src/logbook_miniLive.c	Tue Oct 15 19:07:19 2024 +0200
+++ b/Discovery/Src/logbook_miniLive.c	Tue Oct 15 19:12:05 2024 +0200
@@ -383,14 +383,7 @@
 			ReplayMarkerData[0] = 0xFF;
 		}
 
-		if( dataLength == DEPTH_DATA_LENGTH)		/* log data has been compressed to fit into buffer */
-		{
-			ReplayDataResolution = (logbookHeader.diveTimeMinutes * 60 + logbookHeader.diveTimeSeconds) / dataLength;
-		}
-		else
-		{
-			ReplayDataResolution = logbookHeader.samplingRate;
-		}
+		ReplayDataResolution = logbookHeader.total_diveTime_seconds / dataLength;
 		ReplayDataLength = dataLength;
 		ReplayDataMaxDepth = logbookHeader.maxDepth;
 		ReplayDataMinutes =  logbookHeader.diveTimeMinutes;
--- a/Discovery/Src/simulation.c	Tue Oct 15 19:07:19 2024 +0200
+++ b/Discovery/Src/simulation.c	Tue Oct 15 19:12:05 2024 +0200
@@ -380,20 +380,33 @@
     float depth_meter = pDiveState->lifeData.depth_meter;
     float surface_pressure_bar = pDiveState->lifeData.pressure_surface_bar;
     static uint8_t sampleToggle = 0;
+	static float sim_ascent_rate_meter_per_min_local = 0;
+	uint8_t sampleTime = getReplayDataResolution();
 
-    if(simReplayActive) /* precondition: function is called once per second, sample rate is 2 seconds */
+    if(simReplayActive) /* precondition: function is called once per second, sample rate is a multiple of second */
     {
     	if(sampleToggle == 0)
     	{
-    		sampleToggle = 1;
+    		sampleToggle = sampleTime - 1;
     		sim_aim_depth_meter = (float)(*pReplayData++/100.0);
-    		sim_descent_rate_meter_per_min = (sim_aim_depth_meter - depth_meter) * 30;
+    		if(sim_aim_depth_meter > depth_meter)
+    		{
+    			sim_descent_rate_meter_per_min = (sim_aim_depth_meter - depth_meter) * (60 / sampleTime);
+    		}
+    		else
+    		{
+    			sim_ascent_rate_meter_per_min_local = (depth_meter - sim_aim_depth_meter) * (60 / sampleTime);
+    		}
     	}
     	else
     	{
-    		sampleToggle = 0;
+    		sampleToggle--;
     	}
     }
+    else
+    {
+    	sim_ascent_rate_meter_per_min_local = pDiveState->diveSettings.ascentRate_meterperminute;
+    }
 
     if(depth_meter < sim_aim_depth_meter)
     {
@@ -404,16 +417,16 @@
     else if(depth_meter > sim_aim_depth_meter)
     {
 
-        depth_meter -=  pDiveState->diveSettings.ascentRate_meterperminute / 60;
+        depth_meter -=  sim_ascent_rate_meter_per_min_local / 60;
         if(depth_meter < sim_aim_depth_meter)
             depth_meter = sim_aim_depth_meter;
 
         if(sim_heed_decostops && depth_meter < actual_deco_stop)
         {
-            if(actual_deco_stop < (depth_meter +  pDiveState->diveSettings.ascentRate_meterperminute / 60))
+            if(actual_deco_stop < (depth_meter +  sim_ascent_rate_meter_per_min_local / 60))
                  depth_meter = actual_deco_stop;
             else
-                depth_meter +=  pDiveState->diveSettings.ascentRate_meterperminute / 60;
+                depth_meter += sim_ascent_rate_meter_per_min_local / 60;
         }
 
    }
@@ -552,6 +565,11 @@
         /* this does modify the cns now 11.06.2015 */
         vpm_calc(&pDiveState->lifeData,&pDiveState->diveSettings,&pDiveState->vpm,&pDiveState->decolistVPM, DECOSTOPS);
         pDiveState->lifeData.cns += vpm_get_CNS();
+
+        while(decoLock == DECO_CALC_FINSHED_vpm)
+        {
+        	HAL_Delay(2);	/* The deco data is copied during the timer ISR => wait till this has happened */
+        }
         return &pDiveState->decolistVPM;
     }
 }