Mercurial > public > ostc4
comparison Discovery/Src/simulation.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 | 1203255481e4 |
children | f1257a32f2d4 |
comparison
equal
deleted
inserted
replaced
299:b70c26be71a0 | 312:e84a2486933e |
---|---|
35 #include "simulation.h" | 35 #include "simulation.h" |
36 | 36 |
37 #include "decom.h" | 37 #include "decom.h" |
38 #include "calc_crush.h" | 38 #include "calc_crush.h" |
39 #include "data_exchange.h" | 39 #include "data_exchange.h" |
40 #include "data_exchange_main.h" | |
40 #include "timer.h" | 41 #include "timer.h" |
41 #include "check_warning.h" | 42 #include "check_warning.h" |
42 #include "vpm.h" | 43 #include "vpm.h" |
43 #include "buehlmann.h" | 44 #include "buehlmann.h" |
44 #include "logbook_miniLive.h" | 45 #include "logbook_miniLive.h" |
49 | 50 |
50 static const float sim_descent_rate_meter_per_min = 20; | 51 static const float sim_descent_rate_meter_per_min = 20; |
51 | 52 |
52 | 53 |
53 //Private functions | 54 //Private functions |
54 static float sim_get_ambiant_pressure(SDiveState * pDiveState); | 55 static float sim_get_ambient_pressure(SDiveState * pDiveState); |
55 static void sim_reduce_deco_time_one_second(SDiveState* pDiveState); | 56 static void sim_reduce_deco_time_one_second(SDiveState* pDiveState); |
56 static void simulation_set_aim_depth(int depth_meter); | 57 static void simulation_set_aim_depth(int depth_meter); |
57 | 58 |
58 /** | 59 /** |
59 ****************************************************************************** | 60 ****************************************************************************** |
155 pDiveState->lifeData.sensorVoltage_mV[0] = stateRealGetPointer()->lifeData.sensorVoltage_mV[0]; | 156 pDiveState->lifeData.sensorVoltage_mV[0] = stateRealGetPointer()->lifeData.sensorVoltage_mV[0]; |
156 pDiveState->lifeData.sensorVoltage_mV[1] = stateRealGetPointer()->lifeData.sensorVoltage_mV[1]; | 157 pDiveState->lifeData.sensorVoltage_mV[1] = stateRealGetPointer()->lifeData.sensorVoltage_mV[1]; |
157 pDiveState->lifeData.sensorVoltage_mV[2] = stateRealGetPointer()->lifeData.sensorVoltage_mV[2]; | 158 pDiveState->lifeData.sensorVoltage_mV[2] = stateRealGetPointer()->lifeData.sensorVoltage_mV[2]; |
158 | 159 |
159 pDiveState->lifeData.dive_time_seconds += 1; | 160 pDiveState->lifeData.dive_time_seconds += 1; |
160 pDiveState->lifeData.pressure_ambient_bar = sim_get_ambiant_pressure(pDiveState); | 161 pDiveState->lifeData.pressure_ambient_bar = sim_get_ambient_pressure(pDiveState); |
161 | |
162 if(!is_ambient_pressure_close_to_surface(&pDiveState->lifeData) && !(stateSimGetPointer()->lifeData.counterSecondsShallowDepth) ) | |
163 { | |
164 pDiveState->lifeData.dive_time_seconds_without_surface_time += 1; | |
165 } | |
166 | 162 |
167 if(is_ambient_pressure_close_to_surface(&pDiveState->lifeData)) // new hw 170214 | 163 if(is_ambient_pressure_close_to_surface(&pDiveState->lifeData)) // new hw 170214 |
168 { | 164 { |
169 if(!(stateSimGetPointer()->lifeData.counterSecondsShallowDepth)) | 165 if(!(stateSimGetPointer()->lifeData.counterSecondsShallowDepth)) |
170 { | 166 { |
183 else | 179 else |
184 { | 180 { |
185 pDiveState->lifeData.counterSecondsShallowDepth = 0; | 181 pDiveState->lifeData.counterSecondsShallowDepth = 0; |
186 } | 182 } |
187 | 183 |
184 if(!is_ambient_pressure_close_to_surface(&pDiveState->lifeData) && !(stateSimGetPointer()->lifeData.counterSecondsShallowDepth) ) | |
185 { | |
186 pDiveState->lifeData.dive_time_seconds_without_surface_time += 1; | |
187 } | |
188 | |
188 pDiveState->lifeData.depth_meter = (pDiveState->lifeData.pressure_ambient_bar - pDiveState->lifeData.pressure_surface_bar) * 10.0f; | 189 pDiveState->lifeData.depth_meter = (pDiveState->lifeData.pressure_ambient_bar - pDiveState->lifeData.pressure_surface_bar) * 10.0f; |
189 if(pDiveState->lifeData.max_depth_meter < pDiveState->lifeData.depth_meter) | 190 if(pDiveState->lifeData.max_depth_meter < pDiveState->lifeData.depth_meter) |
190 pDiveState->lifeData.max_depth_meter = pDiveState->lifeData.depth_meter; | 191 pDiveState->lifeData.max_depth_meter = pDiveState->lifeData.depth_meter; |
191 | 192 |
192 /* apnoe specials | 193 /* apnoe specials |
199 if(pDiveState->lifeData.counterSecondsShallowDepth) | 200 if(pDiveState->lifeData.counterSecondsShallowDepth) |
200 { | 201 { |
201 pDiveState->lifeData.dive_time_seconds = 0; | 202 pDiveState->lifeData.dive_time_seconds = 0; |
202 pDiveState->lifeData.max_depth_meter = 0; | 203 pDiveState->lifeData.max_depth_meter = 0; |
203 pDiveState->lifeData.boolResetAverageDepth = 1; | 204 pDiveState->lifeData.boolResetAverageDepth = 1; |
204 pDiveState->lifeData.boolResetStopwatch = 1; | 205 } |
205 } | 206 } |
206 } | 207 |
207 | 208 setAvgDepth(pDiveState); |
208 /* average depth | |
209 */ | |
210 float *AvgDepthValue = &pDiveState->lifeData.average_depth_meter; | |
211 float DepthNow = pDiveState->lifeData.depth_meter; | |
212 uint32_t *AvgDepthCount = &pDiveState->lifeData.internal.average_depth_meter_Count; | |
213 uint32_t *AvgDepthTimer = &pDiveState->lifeData.internal.average_depth_last_update_dive_time_seconds_without_surface_time; | |
214 uint32_t AvgSecondsSinceLast; | |
215 uint32_t DiveTime = pDiveState->lifeData.dive_time_seconds_without_surface_time; | |
216 | |
217 if(pDiveState->lifeData.boolResetAverageDepth) | |
218 { | |
219 *AvgDepthValue = DepthNow; | |
220 *AvgDepthCount = 1; | |
221 *AvgDepthTimer = DiveTime; | |
222 pDiveState->lifeData.boolResetAverageDepth = 0; | |
223 } | |
224 else if (DiveTime > *AvgDepthTimer) | |
225 { | |
226 AvgSecondsSinceLast = DiveTime - *AvgDepthTimer; | |
227 for(int i=0;i<AvgSecondsSinceLast;i++) | |
228 { | |
229 *AvgDepthValue = (*AvgDepthValue * *AvgDepthCount + DepthNow) / (*AvgDepthCount + 1); | |
230 *AvgDepthCount += 1; | |
231 } | |
232 *AvgDepthTimer = DiveTime; | |
233 } | |
234 if(*AvgDepthCount == 0) | |
235 *AvgDepthValue = 0; | |
236 | 209 |
237 /* Exposure Tissues | 210 /* Exposure Tissues |
238 */ | 211 */ |
239 decom_tissues_exposure(1, &pDiveState->lifeData); | 212 decom_tissues_exposure(1, &pDiveState->lifeData); |
240 decom_oxygen_calculate_cns_exposure(1, &pDiveState->lifeData.actualGas, pDiveState->lifeData.pressure_ambient_bar, &pDiveState->lifeData.cns); | 213 decom_oxygen_calculate_cns_exposure(1, &pDiveState->lifeData.actualGas, pDiveState->lifeData.pressure_ambient_bar, &pDiveState->lifeData.cns); |
301 sim_aim_depth_meter = depth_meter; | 274 sim_aim_depth_meter = depth_meter; |
302 } | 275 } |
303 | 276 |
304 /** | 277 /** |
305 ****************************************************************************** | 278 ****************************************************************************** |
306 * @brief simulates ambiant pressure depending on aim depth | 279 * @brief simulates ambient pressure depending on aim depth |
307 ****************************************************************************** | 280 ****************************************************************************** |
308 * @note if aim_depth != actual depth, the depth change within one second | 281 * @note if aim_depth != actual depth, the depth change within one second |
309 * (depending on descent or ascent) rate is calculated | 282 * (depending on descent or ascent) rate is calculated |
310 * @param SDiveState* pDiveState: | 283 * @param SDiveState* pDiveState: |
311 * @return float : new ambiant pressure | 284 * @return float : new ambient pressure |
312 */ | 285 */ |
313 static float sim_get_ambiant_pressure(SDiveState * pDiveState) | 286 static float sim_get_ambient_pressure(SDiveState * pDiveState) |
314 { | 287 { |
315 //Calc next depth | 288 //Calc next depth |
316 uint8_t actual_deco_stop = decom_get_actual_deco_stop(pDiveState); | 289 uint8_t actual_deco_stop = decom_get_actual_deco_stop(pDiveState); |
317 float depth_meter = pDiveState->lifeData.depth_meter; | 290 float depth_meter = pDiveState->lifeData.depth_meter; |
318 float surface_pressure_bar = pDiveState->lifeData.pressure_surface_bar; | 291 float surface_pressure_bar = pDiveState->lifeData.pressure_surface_bar; |
349 ****************************************************************************** | 322 ****************************************************************************** |
350 * @note called during fast simulation | 323 * @note called during fast simulation |
351 * @param SDiveState* pDiveState: | 324 * @param SDiveState* pDiveState: |
352 * @return void | 325 * @return void |
353 */ | 326 */ |
354 void sim_reduce_deco_time_one_second(SDiveState* pDiveState) | 327 static void sim_reduce_deco_time_one_second(SDiveState* pDiveState) |
355 { | 328 { |
356 SDecoinfo* pDecoinfo; | 329 SDecoinfo* pDecoinfo; |
357 if(pDiveState->diveSettings.deco_type.ub.standard == GF_MODE) | 330 if(pDiveState->diveSettings.deco_type.ub.standard == GF_MODE) |
358 pDecoinfo = &pDiveState->decolistBuehlmann; | 331 pDecoinfo = &pDiveState->decolistBuehlmann; |
359 else | 332 else |