comparison Discovery/Src/simulation.c @ 226:2ae6440cb8d6

Merged in janlmulder/ostc4/div-fixes-3 (pull request #13) 3 bug fixes and some cleanup.
author heinrichsweikamp <bitbucket@heinrichsweikamp.com>
date Mon, 01 Apr 2019 19:19:04 +0000
parents 2bb1db22b5f5
children 9f0efc4df01e
comparison
equal deleted inserted replaced
221:486dddfba7ce 226:2ae6440cb8d6
42 #include "vpm.h" 42 #include "vpm.h"
43 #include "buehlmann.h" 43 #include "buehlmann.h"
44 #include "logbook_miniLive.h" 44 #include "logbook_miniLive.h"
45 45
46 //Private state variables 46 //Private state variables
47 float sim_aim_depth_meter; 47 static float sim_aim_depth_meter;
48 _Bool sim_head_decostops = 1; 48 static _Bool sim_heed_decostops = 1;
49 49
50 const float sim_descent_rate_meter_per_min = 20; 50 static const float sim_descent_rate_meter_per_min = 20;
51 51
52 52
53 //Private functions 53 //Private functions
54 float sim_get_ambiant_pressure(SDiveState * pDiveState); 54 static float sim_get_ambiant_pressure(SDiveState * pDiveState);
55 void sim_reduce_deco_time_one_second(SDiveState* pDiveState); 55 static void sim_reduce_deco_time_one_second(SDiveState* pDiveState);
56 static void simulation_set_aim_depth(int depth_meter);
56 57
57 /** 58 /**
58 ****************************************************************************** 59 ******************************************************************************
59 * @brief sets heed_decostops_while_ascending 60 * @brief sets heed_decostops_while_ascending
60 ****************************************************************************** 61 ******************************************************************************
61 * @param heed_decostops_while_ascending : true -> deco_stops are considered while ascending 62 * @param heed_decostops_while_ascending : true -> deco_stops are considered while ascending
62 * @return void 63 * @return void
63 */ 64 */
64 void simulation_set_heed_decostops(_Bool heed_decostops_while_ascending) 65 void simulation_set_heed_decostops(_Bool heed_decostops_while_ascending)
65 { 66 {
66 sim_head_decostops = heed_decostops_while_ascending; 67 sim_heed_decostops = heed_decostops_while_ascending;
67 } 68 }
68 69
69 /** 70 /**
70 ****************************************************************************** 71 ******************************************************************************
71 * @brief start of simulation 72 * @brief start of simulation
81 stateSimGetPointerWrite()->mode = MODE_DIVE; 82 stateSimGetPointerWrite()->mode = MODE_DIVE;
82 if(aim_depth <= 0) 83 if(aim_depth <= 0)
83 aim_depth = 20; 84 aim_depth = 20;
84 simulation_set_aim_depth(aim_depth); 85 simulation_set_aim_depth(aim_depth);
85 timer_init(); 86 timer_init();
86 stateUsed = &stateSim; 87 set_stateUsedToSim();
87 stateSim.lifeData.boolResetAverageDepth = 1; 88 stateSim.lifeData.boolResetAverageDepth = 1;
88 decoLock = DECO_CALC_init_as_is_start_of_dive; 89 decoLock = DECO_CALC_init_as_is_start_of_dive;
89 90
90 stateSim.lifeData.apnea_total_max_depth_meter = 0; 91 stateSim.lifeData.apnea_total_max_depth_meter = 0;
91 } 92 }
260 * @brief adds extra time for fast simulation 261 * @brief adds extra time for fast simulation
261 ****************************************************************************** 262 ******************************************************************************
262 *@param minutes 263 *@param minutes
263 * @return float : new pressure 264 * @return float : new pressure
264 */ 265 */
265 void simulation_add_time(int minutes) 266 static void simulation_add_time(int minutes)
266 { 267 {
267 for(int i = 0; i < 60 * minutes; i++) 268 for(int i = 0; i < 60 * minutes; i++)
268 { 269 {
269 simulation_UpdateLifeData(0); 270 simulation_UpdateLifeData(0);
270 updateMiniLiveLogbook(0); 271 updateMiniLiveLogbook(0);
291 * @return true if ascend follows decostops; 292 * @return true if ascend follows decostops;
292 */ 293 */
293 294
294 _Bool simulation_get_heed_decostops(void) 295 _Bool simulation_get_heed_decostops(void)
295 { 296 {
296 return sim_head_decostops; 297 return sim_heed_decostops;
297 } 298 }
298 299
299 /** 300 /**
300 ****************************************************************************** 301 ******************************************************************************
301 * @brief sets aim_depth 302 * @brief sets aim_depth
302 ****************************************************************************** 303 ******************************************************************************
303 *@param depth_meter 304 *@param depth_meter
304 * @return float : new pressure 305 * @return float : new pressure
305 */ 306 */
306 void simulation_set_aim_depth(int depth_meter) 307 static void simulation_set_aim_depth(int depth_meter)
307 { 308 {
308 sim_aim_depth_meter = depth_meter; 309 sim_aim_depth_meter = depth_meter;
309 } 310 }
310 311
311 /** 312 /**
315 * @note if aim_depth != actual depth, the depth change within one second 316 * @note if aim_depth != actual depth, the depth change within one second
316 * (depending on descent or ascent) rate is calculated 317 * (depending on descent or ascent) rate is calculated
317 * @param SDiveState* pDiveState: 318 * @param SDiveState* pDiveState:
318 * @return float : new ambiant pressure 319 * @return float : new ambiant pressure
319 */ 320 */
320 float sim_get_ambiant_pressure(SDiveState * pDiveState) 321 static float sim_get_ambiant_pressure(SDiveState * pDiveState)
321 { 322 {
322 //Calc next depth 323 //Calc next depth
323 uint8_t actual_deco_stop = decom_get_actual_deco_stop(pDiveState); 324 uint8_t actual_deco_stop = decom_get_actual_deco_stop(pDiveState);
324 float depth_meter = pDiveState->lifeData.depth_meter; 325 float depth_meter = pDiveState->lifeData.depth_meter;
325 float surface_pressure_bar = pDiveState->lifeData.pressure_surface_bar; 326 float surface_pressure_bar = pDiveState->lifeData.pressure_surface_bar;
334 335
335 depth_meter -= pDiveState->diveSettings.ascentRate_meterperminute / 60; 336 depth_meter -= pDiveState->diveSettings.ascentRate_meterperminute / 60;
336 if(depth_meter < sim_aim_depth_meter) 337 if(depth_meter < sim_aim_depth_meter)
337 depth_meter = sim_aim_depth_meter; 338 depth_meter = sim_aim_depth_meter;
338 339
339 if(sim_head_decostops && depth_meter < actual_deco_stop) 340 if(sim_heed_decostops && depth_meter < actual_deco_stop)
340 { 341 {
341 if(actual_deco_stop < (depth_meter + pDiveState->diveSettings.ascentRate_meterperminute / 60)) 342 if(actual_deco_stop < (depth_meter + pDiveState->diveSettings.ascentRate_meterperminute / 60))
342 depth_meter = actual_deco_stop; 343 depth_meter = actual_deco_stop;
343 else 344 else
344 depth_meter += pDiveState->diveSettings.ascentRate_meterperminute / 60; 345 depth_meter += pDiveState->diveSettings.ascentRate_meterperminute / 60;
459 pDiveState->lifeData.cns += vpm_get_CNS(); 460 pDiveState->lifeData.cns += vpm_get_CNS();
460 return &pDiveState->decolistVPM; 461 return &pDiveState->decolistVPM;
461 } 462 }
462 } 463 }
463 464
464 float sGChelper_bar(uint16_t depth_meter) 465 static float sGChelper_bar(uint16_t depth_meter)
465 { 466 {
466 SDiveState * pDiveState = &stateSim; 467 SDiveState * pDiveState = &stateSim;
467 float ambient, surface, density, meter; 468 float ambient, surface, density, meter;
468 469
469 surface = pDiveState->lifeData.pressure_surface_bar; 470 surface = pDiveState->lifeData.pressure_surface_bar;