diff Discovery/Src/timer.c @ 311:ddbe8bed5096 cleanup-4

bugfix: make stopwatch and divetime run in sync And this shows the fundamental issue in the difference between dive time and stopwatch time. The dive time is constructed on the RTE, and rather independently, the stopwatch time is constructed on CPU1. This works rather well, but not perfect. This commit fixes things in a relatively straightforward way. Instead of incrementing the stopwatch locally on CPU1, simply use the same time data that is coming from the RTE. Some logic was added to make this stopwatch resettable again. Signed-off-by: Jan Mulder <jlmulder@xs4all.nl>
author Jan Mulder <jlmulder@xs4all.nl>
date Wed, 29 May 2019 14:02:27 +0200
parents 90e65971f15d
children 2c49561c8062
line wrap: on
line diff
--- a/Discovery/Src/timer.c	Sun May 26 10:09:22 2019 +0200
+++ b/Discovery/Src/timer.c	Wed May 29 14:02:27 2019 +0200
@@ -28,18 +28,17 @@
 
 #include "data_central.h"
 
-static long stopWatchTime_Second = 0;
 static _Bool bStopWatch = false;
 static float stopWatchAverageDepth_Meter = 0.0f;
 static long safetyStopCountDown_Second = 0;
+static long stopWatchOffset = 0;
 
 void timer_init(void)
 {
-  stopWatchTime_Second = 0;
   stopWatchAverageDepth_Meter = 0.0f;
   bStopWatch = true;
   safetyStopCountDown_Second = 0;
-
+  stopWatchOffset = 0;
 }
 
 void timer_UpdateSecond(_Bool checkOncePerSecond)
@@ -47,6 +46,7 @@
     static int last_second = -1;
     static _Bool bSafetyStop = false;
     static float last_depth_meter = 0;
+    long stopWatchTime_Second = 0;
 
     if(checkOncePerSecond)
     {
@@ -57,14 +57,13 @@
     }
 
     /** Stopwatch **/
+    stopWatchTime_Second = stateUsed->lifeData.dive_time_seconds_without_surface_time - stopWatchOffset;
     if(bStopWatch && !is_ambient_pressure_close_to_surface(&stateUsedWrite->lifeData))
     {
         if(stopWatchTime_Second == 0)
             stopWatchAverageDepth_Meter = stateUsed->lifeData.depth_meter;
         else
             stopWatchAverageDepth_Meter = (stopWatchAverageDepth_Meter * stopWatchTime_Second + stateUsed->lifeData.depth_meter)/ (stopWatchTime_Second + 1);
-
-        stopWatchTime_Second++;
     }
 
     /** SafetyStop **/
@@ -121,9 +120,9 @@
 
 void timer_Stopwatch_Restart(void)
 {
-  stopWatchTime_Second = 0;
   stopWatchAverageDepth_Meter = stateUsed->lifeData.depth_meter;
   bStopWatch = true;
+  stopWatchOffset = stateUsed->lifeData.dive_time_seconds_without_surface_time;
 }
 
 void timer_Stopwatch_Stop(void)
@@ -133,7 +132,7 @@
 
 long timer_Stopwatch_GetTime(void)
 {
-  return stopWatchTime_Second;
+  return stateUsed->lifeData.dive_time_seconds_without_surface_time - stopWatchOffset;
 }
 
 float timer_Stopwatch_GetAvarageDepth_Meter(void)