comparison Discovery/Src/timer.c @ 312:e84a2486933e

Merged in janlmulder/ostc4/cleanup-4 (pull request #25) Fix stopwatch and divetime not in sync
author heinrichsweikamp <bitbucket@heinrichsweikamp.com>
date Fri, 31 May 2019 06:22:50 +0000
parents ddbe8bed5096
children 2c49561c8062
comparison
equal deleted inserted replaced
299:b70c26be71a0 312:e84a2486933e
26 /// along with this program. If not, see <http://www.gnu.org/licenses/>. 26 /// along with this program. If not, see <http://www.gnu.org/licenses/>.
27 ////////////////////////////////////////////////////////////////////////////// 27 //////////////////////////////////////////////////////////////////////////////
28 28
29 #include "data_central.h" 29 #include "data_central.h"
30 30
31 static long stopWatchTime_Second = 0;
32 static _Bool bStopWatch = false; 31 static _Bool bStopWatch = false;
33 static float stopWatchAverageDepth_Meter = 0.0f; 32 static float stopWatchAverageDepth_Meter = 0.0f;
34 static long safetyStopCountDown_Second = 0; 33 static long safetyStopCountDown_Second = 0;
34 static long stopWatchOffset = 0;
35 35
36 void timer_init(void) 36 void timer_init(void)
37 { 37 {
38 stopWatchTime_Second = 0;
39 stopWatchAverageDepth_Meter = 0.0f; 38 stopWatchAverageDepth_Meter = 0.0f;
40 bStopWatch = true; 39 bStopWatch = true;
41 safetyStopCountDown_Second = 0; 40 safetyStopCountDown_Second = 0;
42 41 stopWatchOffset = 0;
43 } 42 }
44 43
45 void timer_UpdateSecond(_Bool checkOncePerSecond) 44 void timer_UpdateSecond(_Bool checkOncePerSecond)
46 { 45 {
47 static int last_second = -1; 46 static int last_second = -1;
48 static _Bool bSafetyStop = false; 47 static _Bool bSafetyStop = false;
49 static float last_depth_meter = 0; 48 static float last_depth_meter = 0;
49 long stopWatchTime_Second = 0;
50 50
51 if(checkOncePerSecond) 51 if(checkOncePerSecond)
52 { 52 {
53 int now = current_second(); 53 int now = current_second();
54 if( last_second == now) 54 if( last_second == now)
55 return; 55 return;
56 last_second = now; 56 last_second = now;
57 } 57 }
58 58
59 /** Stopwatch **/ 59 /** Stopwatch **/
60 if(bStopWatch && stateUsed->lifeData.depth_meter > 1) 60 stopWatchTime_Second = stateUsed->lifeData.dive_time_seconds_without_surface_time - stopWatchOffset;
61 if(bStopWatch && !is_ambient_pressure_close_to_surface(&stateUsedWrite->lifeData))
61 { 62 {
62 if((stopWatchTime_Second == 0) && (stateUsed->lifeData.dive_time_seconds >= 1)) 63 if(stopWatchTime_Second == 0)
63 { 64 stopWatchAverageDepth_Meter = stateUsed->lifeData.depth_meter;
64 stopWatchTime_Second = stateUsed->lifeData.dive_time_seconds - 1;
65 stopWatchAverageDepth_Meter = stateUsed->lifeData.average_depth_meter * (stopWatchTime_Second - 1) / stopWatchTime_Second;
66 }
67 else 65 else
68 {
69 stopWatchAverageDepth_Meter = (stopWatchAverageDepth_Meter * stopWatchTime_Second + stateUsed->lifeData.depth_meter)/ (stopWatchTime_Second + 1); 66 stopWatchAverageDepth_Meter = (stopWatchAverageDepth_Meter * stopWatchTime_Second + stateUsed->lifeData.depth_meter)/ (stopWatchTime_Second + 1);
70 stopWatchTime_Second++;
71 }
72 } 67 }
73 68
74 /** SafetyStop **/ 69 /** SafetyStop **/
75 float depthToStopSafetyStopCount; 70 float depthToStopSafetyStopCount;
76 if(settingsGetPointer()->safetystopDuration && (stateUsed->lifeData.max_depth_meter > 10.0f) && (stateUsed->lifeData.dive_time_seconds > 60)) 71 if(settingsGetPointer()->safetystopDuration && (stateUsed->lifeData.max_depth_meter > 10.0f) && (stateUsed->lifeData.dive_time_seconds > 60))
123 } 118 }
124 119
125 120
126 void timer_Stopwatch_Restart(void) 121 void timer_Stopwatch_Restart(void)
127 { 122 {
128 stopWatchTime_Second = 1;
129 stopWatchAverageDepth_Meter = stateUsed->lifeData.depth_meter; 123 stopWatchAverageDepth_Meter = stateUsed->lifeData.depth_meter;
130 bStopWatch = true; 124 bStopWatch = true;
125 stopWatchOffset = stateUsed->lifeData.dive_time_seconds_without_surface_time;
131 } 126 }
132 127
133 void timer_Stopwatch_Stop(void) 128 void timer_Stopwatch_Stop(void)
134 { 129 {
135 bStopWatch = false; 130 bStopWatch = false;
136 } 131 }
137 132
138 long timer_Stopwatch_GetTime(void) 133 long timer_Stopwatch_GetTime(void)
139 { 134 {
140 return stopWatchTime_Second; 135 return stateUsed->lifeData.dive_time_seconds_without_surface_time - stopWatchOffset;
141 } 136 }
142 137
143 float timer_Stopwatch_GetAvarageDepth_Meter(void) 138 float timer_Stopwatch_GetAvarageDepth_Meter(void)
144 { 139 {
145 return stopWatchAverageDepth_Meter; 140 return stopWatchAverageDepth_Meter;