Mercurial > public > ostc4
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; } }