Indicate a repetitive dive in the diveplan

Fixes #1095

Signed-off-by: Robert C. Helling <helling@atdotde.de>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Robert C. Helling 2016-12-15 23:22:54 +01:00 committed by Dirk Hohndel
parent fb2ba72e42
commit c1ef59c540
4 changed files with 19 additions and 11 deletions

View file

@ -860,6 +860,7 @@ struct diveplan {
short vpmb_conservatism; short vpmb_conservatism;
struct divedatapoint *dp; struct divedatapoint *dp;
int eff_gflow, eff_gfhigh; int eff_gflow, eff_gfhigh;
bool repetitive;
}; };
struct divedatapoint *plan_add_segment(struct diveplan *diveplan, int duration, int depth, int cylinderid, int po2, bool entered); struct divedatapoint *plan_add_segment(struct diveplan *diveplan, int duration, int depth, int cylinderid, int po2, bool entered);

View file

@ -360,7 +360,8 @@ int get_divesite_idx(struct dive_site *ds)
static struct gasmix air = { .o2.permille = O2_IN_AIR, .he.permille = 0 }; static struct gasmix air = { .o2.permille = O2_IN_AIR, .he.permille = 0 };
/* take into account previous dives until there is a 48h gap between dives */ /* take into account previous dives until there is a 48h gap between dives */
double init_decompression(struct dive *dive) /* return true if this is a repetitive dive */
bool init_decompression(struct dive *dive)
{ {
int i, divenr = -1; int i, divenr = -1;
unsigned int surface_time; unsigned int surface_time;
@ -369,7 +370,7 @@ double init_decompression(struct dive *dive)
double surface_pressure; double surface_pressure;
if (!dive) if (!dive)
return 0.0; return false;
surface_pressure = get_surface_pressure_in_mbar(dive, true) / 1000.0; surface_pressure = get_surface_pressure_in_mbar(dive, true) / 1000.0;
divenr = get_divenr(dive); divenr = get_divenr(dive);
@ -445,7 +446,9 @@ double init_decompression(struct dive *dive)
dump_tissues(); dump_tissues();
#endif #endif
} }
return tissue_tolerance_calc(dive, surface_pressure); // I do not dare to remove this call. We don't need the result but it might have side effects. Bummer.
tissue_tolerance_calc(dive, surface_pressure);
return deco_init;
} }
void update_cylinder_related_info(struct dive *dive) void update_cylinder_related_info(struct dive *dive)

View file

@ -14,7 +14,7 @@ extern void update_cylinder_related_info(struct dive *);
extern void mark_divelist_changed(int); extern void mark_divelist_changed(int);
extern int unsaved_changes(void); extern int unsaved_changes(void);
extern void remove_autogen_trips(void); extern void remove_autogen_trips(void);
extern double init_decompression(struct dive *dive); extern bool init_decompression(struct dive *dive);
/* divelist core logic functions */ /* divelist core logic functions */
extern void process_dives(bool imported, bool prefer_imported); extern void process_dives(bool imported, bool prefer_imported);

View file

@ -128,7 +128,7 @@ void interpolate_transition(struct dive *dive, duration_t t0, duration_t t1, dep
} }
/* returns the tissue tolerance at the end of this (partial) dive */ /* returns the tissue tolerance at the end of this (partial) dive */
void tissue_at_end(struct dive *dive, char **cached_datap) bool tissue_at_end(struct dive *dive, char **cached_datap)
{ {
struct divecomputer *dc; struct divecomputer *dc;
struct sample *sample, *psample; struct sample *sample, *psample;
@ -136,18 +136,19 @@ void tissue_at_end(struct dive *dive, char **cached_datap)
depth_t lastdepth = {}; depth_t lastdepth = {};
duration_t t0 = {}, t1 = {}; duration_t t0 = {}, t1 = {};
struct gasmix gas; struct gasmix gas;
bool repetitive = false;
if (!dive) if (!dive)
return; return false;
if (*cached_datap) { if (*cached_datap) {
restore_deco_state(*cached_datap); restore_deco_state(*cached_datap);
} else { } else {
init_decompression(dive); repetitive = init_decompression(dive);
cache_deco_state(cached_datap); cache_deco_state(cached_datap);
} }
dc = &dive->dc; dc = &dive->dc;
if (!dc->samples) if (!dc->samples)
return; return false;
psample = sample = dc->sample; psample = sample = dc->sample;
for (i = 0; i < dc->samples; i++, sample++) { for (i = 0; i < dc->samples; i++, sample++) {
@ -190,6 +191,7 @@ void tissue_at_end(struct dive *dive, char **cached_datap)
psample = sample; psample = sample;
t0 = t1; t0 = t1;
} }
return repetitive;
} }
@ -594,8 +596,10 @@ static void add_plan_to_notes(struct diveplan *diveplan, struct dive *dive, bool
snprintf(temp, sz_temp, translate("gettextFromC", "recreational mode based on Bühlmann ZHL-16B with GFlow = %d and GFhigh = %d"), snprintf(temp, sz_temp, translate("gettextFromC", "recreational mode based on Bühlmann ZHL-16B with GFlow = %d and GFhigh = %d"),
diveplan->gflow, diveplan->gfhigh); diveplan->gflow, diveplan->gfhigh);
} }
len += snprintf(buffer + len, sz_buffer - len, "<div><b>%s</b><br>%s</div>", len += snprintf(buffer + len, sz_buffer - len, "<div><b>%s%s</b><br>%s</div>",
translate("gettextFromC", "Subsurface dive plan"), temp); translate("gettextFromC", "Subsurface dive plan"),
diveplan->repetitive ? translate("gettextFromC", " (repetitive)") : "",
temp);
len += snprintf(buffer + len, sz_buffer - len, translate("gettextFromC", "<div>Runtime: %dmin</div><br>"), len += snprintf(buffer + len, sz_buffer - len, translate("gettextFromC", "<div>Runtime: %dmin</div><br>"),
diveplan_duration(diveplan)); diveplan_duration(diveplan));
@ -1082,7 +1086,7 @@ bool plan(struct diveplan *diveplan, char **cached_datap, bool is_planner, bool
gi = gaschangenr - 1; gi = gaschangenr - 1;
/* Set tissue tolerance and initial vpmb gradient at start of ascent phase */ /* Set tissue tolerance and initial vpmb gradient at start of ascent phase */
tissue_at_end(&displayed_dive, cached_datap); diveplan->repetitive = tissue_at_end(&displayed_dive, cached_datap);
nuclear_regeneration(clock); nuclear_regeneration(clock);
vpmb_start_gradient(); vpmb_start_gradient();