mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-30 22:20:21 +00:00
Planner: Implement ascend rate according to GUE standard procedures
Signed-off-by: Robert C. Helling <helling@atdotde.de> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
00e7ef2cf8
commit
c3a3c1a1e7
3 changed files with 38 additions and 5 deletions
20
dive.c
20
dive.c
|
@ -2218,3 +2218,23 @@ void set_userid(char *rUserId)
|
||||||
strcpy(prefs.userid, rUserId);
|
strcpy(prefs.userid, rUserId);
|
||||||
}
|
}
|
||||||
#undef MAX_USERID_SIZE
|
#undef MAX_USERID_SIZE
|
||||||
|
|
||||||
|
int average_depth(struct diveplan *dive)
|
||||||
|
{
|
||||||
|
int integral = 0;
|
||||||
|
int last_time = 0;
|
||||||
|
int last_depth = 0;
|
||||||
|
struct divedatapoint *dp = dive->dp;
|
||||||
|
|
||||||
|
while (dp) {
|
||||||
|
if (dp->time) {
|
||||||
|
/* Ignore gas indication samples */
|
||||||
|
integral += (dp->depth + last_depth) * (dp->time - last_time) / 2;
|
||||||
|
last_time = dp->time;
|
||||||
|
last_depth = dp->depth;
|
||||||
|
}
|
||||||
|
dp = dp->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return integral / last_time;
|
||||||
|
}
|
||||||
|
|
1
dive.h
1
dive.h
|
@ -915,6 +915,7 @@ extern depth_t string_to_depth(const char *str);
|
||||||
extern pressure_t string_to_pressure(const char *str);
|
extern pressure_t string_to_pressure(const char *str);
|
||||||
extern volume_t string_to_volume(const char *str, pressure_t workp);
|
extern volume_t string_to_volume(const char *str, pressure_t workp);
|
||||||
extern fraction_t string_to_fraction(const char *str);
|
extern fraction_t string_to_fraction(const char *str);
|
||||||
|
extern int average_depth(struct diveplan *dive);
|
||||||
|
|
||||||
#include "pref.h"
|
#include "pref.h"
|
||||||
|
|
||||||
|
|
22
planner.c
22
planner.c
|
@ -576,10 +576,20 @@ static void add_plan_to_notes(struct diveplan *diveplan, struct dive *dive)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int ascend_velocity(int depth)
|
int ascend_velocity(int depth, int avg_depth, int bottom_time)
|
||||||
{
|
{
|
||||||
/* We need to make this configurable */
|
/* We need to make this configurable */
|
||||||
return 10000/60;
|
|
||||||
|
/* As an example (and possibly reasonable default) this is the Tech 1 provedure according
|
||||||
|
* to http://www.globalunderwaterexplorers.org/files/Standards_and_Procedures/SOP_Manual_Ver2.0.2.pdf */
|
||||||
|
|
||||||
|
if (depth <= 6000)
|
||||||
|
return 1000 / 60;
|
||||||
|
|
||||||
|
if (depth * 4 > avg_depth *3)
|
||||||
|
return 9000 / 60;
|
||||||
|
else
|
||||||
|
return 6000 / 60;
|
||||||
}
|
}
|
||||||
|
|
||||||
void plan(struct diveplan *diveplan, char **cached_datap, struct dive **divep, bool add_deco)
|
void plan(struct diveplan *diveplan, char **cached_datap, struct dive **divep, bool add_deco)
|
||||||
|
@ -599,6 +609,7 @@ void plan(struct diveplan *diveplan, char **cached_datap, struct dive **divep, b
|
||||||
bool stopping = false;
|
bool stopping = false;
|
||||||
bool clear_to_ascend;
|
bool clear_to_ascend;
|
||||||
int clock, previous_point_time;
|
int clock, previous_point_time;
|
||||||
|
int avg_depth, bottom_time;
|
||||||
|
|
||||||
set_gf(diveplan->gflow, diveplan->gfhigh, default_prefs.gf_low_at_maxdepth);
|
set_gf(diveplan->gflow, diveplan->gfhigh, default_prefs.gf_low_at_maxdepth);
|
||||||
if (!diveplan->surface_pressure)
|
if (!diveplan->surface_pressure)
|
||||||
|
@ -622,6 +633,7 @@ void plan(struct diveplan *diveplan, char **cached_datap, struct dive **divep, b
|
||||||
current_cylinder = 0;
|
current_cylinder = 0;
|
||||||
}
|
}
|
||||||
depth = dive->dc.sample[dive->dc.samples - 1].depth.mm;
|
depth = dive->dc.sample[dive->dc.samples - 1].depth.mm;
|
||||||
|
avg_depth = average_depth(diveplan);
|
||||||
|
|
||||||
/* if all we wanted was the dive just get us back to the surface */
|
/* if all we wanted was the dive just get us back to the surface */
|
||||||
if (!add_deco) {
|
if (!add_deco) {
|
||||||
|
@ -655,7 +667,7 @@ void plan(struct diveplan *diveplan, char **cached_datap, struct dive **divep, b
|
||||||
stopidx += gaschangenr;
|
stopidx += gaschangenr;
|
||||||
|
|
||||||
/* Keep time during the ascend */
|
/* Keep time during the ascend */
|
||||||
clock = previous_point_time = dive->dc.sample[dive->dc.samples - 1].time.seconds;
|
bottom_time = clock = previous_point_time = dive->dc.sample[dive->dc.samples - 1].time.seconds;
|
||||||
gi = gaschangenr - 1;
|
gi = gaschangenr - 1;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
@ -663,7 +675,7 @@ void plan(struct diveplan *diveplan, char **cached_datap, struct dive **divep, b
|
||||||
do {
|
do {
|
||||||
/* Ascend to next stop depth */
|
/* Ascend to next stop depth */
|
||||||
assert(deco_allowed_depth(tissue_tolerance, diveplan->surface_pressure / 1000.0, dive, 1) < depth);
|
assert(deco_allowed_depth(tissue_tolerance, diveplan->surface_pressure / 1000.0, dive, 1) < depth);
|
||||||
int deltad = ascend_velocity(depth) * TIMESTEP;
|
int deltad = ascend_velocity(depth, avg_depth, bottom_time) * TIMESTEP;
|
||||||
if (depth - deltad < stoplevels[stopidx])
|
if (depth - deltad < stoplevels[stopidx])
|
||||||
deltad = depth - stoplevels[stopidx];
|
deltad = depth - stoplevels[stopidx];
|
||||||
|
|
||||||
|
@ -702,7 +714,7 @@ void plan(struct diveplan *diveplan, char **cached_datap, struct dive **divep, b
|
||||||
/* Check if ascending to next stop is clear, go back and wait if we hit the ceiling on the way */
|
/* Check if ascending to next stop is clear, go back and wait if we hit the ceiling on the way */
|
||||||
clear_to_ascend = true;
|
clear_to_ascend = true;
|
||||||
while (trial_depth > stoplevels[stopidx]) {
|
while (trial_depth > stoplevels[stopidx]) {
|
||||||
int deltad = ascend_velocity(trial_depth) * TIMESTEP;
|
int deltad = ascend_velocity(trial_depth, avg_depth, bottom_time) * TIMESTEP;
|
||||||
tissue_tolerance = add_segment(depth_to_mbar(trial_depth, dive) / 1000.0, &dive->cylinder[current_cylinder].gasmix, TIMESTEP, po2, dive);
|
tissue_tolerance = add_segment(depth_to_mbar(trial_depth, dive) / 1000.0, &dive->cylinder[current_cylinder].gasmix, TIMESTEP, po2, dive);
|
||||||
if (deco_allowed_depth(tissue_tolerance, diveplan->surface_pressure / 1000.0, dive, 1) > trial_depth - deltad){
|
if (deco_allowed_depth(tissue_tolerance, diveplan->surface_pressure / 1000.0, dive, 1) > trial_depth - deltad){
|
||||||
/* We should have stopped */
|
/* We should have stopped */
|
||||||
|
|
Loading…
Reference in a new issue