mirror of
https://github.com/subsurface/subsurface.git
synced 2025-01-31 19:33:23 +00:00
planner: encapsulate deco state cache in a struct
Removes memory management pain: the struct cleans up when it goes out of scope. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
parent
77e8c3655e
commit
f69686d429
7 changed files with 90 additions and 91 deletions
|
@ -13,8 +13,6 @@
|
||||||
* set_gf() - set Buehlmann gradient factors
|
* set_gf() - set Buehlmann gradient factors
|
||||||
* set_vpmb_conservatism() - set VPM-B conservatism value
|
* set_vpmb_conservatism() - set VPM-B conservatism value
|
||||||
* clear_deco()
|
* clear_deco()
|
||||||
* cache_deco_state()
|
|
||||||
* restore_deco_state()
|
|
||||||
* dump_tissues()
|
* dump_tissues()
|
||||||
*/
|
*/
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -522,19 +520,17 @@ extern "C" void clear_deco(struct deco_state *ds, double surface_pressure, bool
|
||||||
ds->ci_pointing_to_guiding_tissue = -1;
|
ds->ci_pointing_to_guiding_tissue = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" void cache_deco_state(struct deco_state *src, struct deco_state **cached_datap)
|
void deco_state_cache::cache(const struct deco_state *src)
|
||||||
{
|
{
|
||||||
struct deco_state *data = *cached_datap;
|
if (!data)
|
||||||
|
data = std::make_unique<deco_state>();
|
||||||
if (!data) {
|
|
||||||
data = (deco_state *)malloc(sizeof(struct deco_state));
|
|
||||||
*cached_datap = data;
|
|
||||||
}
|
|
||||||
*data = *src;
|
*data = *src;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" void restore_deco_state(struct deco_state *data, struct deco_state *target, bool keep_vpmb_state)
|
void deco_state_cache::restore(struct deco_state *target, bool keep_vpmb_state) const
|
||||||
{
|
{
|
||||||
|
if (!data)
|
||||||
|
return;
|
||||||
if (keep_vpmb_state) {
|
if (keep_vpmb_state) {
|
||||||
int ci;
|
int ci;
|
||||||
for (ci = 0; ci < 16; ci++) {
|
for (ci = 0; ci < 16; ci++) {
|
||||||
|
@ -547,7 +543,6 @@ extern "C" void restore_deco_state(struct deco_state *data, struct deco_state *t
|
||||||
data->max_bottom_ceiling_pressure = target->max_bottom_ceiling_pressure;
|
data->max_bottom_ceiling_pressure = target->max_bottom_ceiling_pressure;
|
||||||
}
|
}
|
||||||
*target = *data;
|
*target = *data;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" int deco_allowed_depth(double tissues_tolerance, double surface_pressure, const struct dive *dive, bool smooth)
|
extern "C" int deco_allowed_depth(double tissues_tolerance, double surface_pressure, const struct dive *dive, bool smooth)
|
||||||
|
|
17
core/deco.h
17
core/deco.h
|
@ -56,8 +56,6 @@ extern void clear_deco(struct deco_state *ds, double surface_pressure, bool in_p
|
||||||
extern void dump_tissues(struct deco_state *ds);
|
extern void dump_tissues(struct deco_state *ds);
|
||||||
extern void set_gf(short gflow, short gfhigh);
|
extern void set_gf(short gflow, short gfhigh);
|
||||||
extern void set_vpmb_conservatism(short conservatism);
|
extern void set_vpmb_conservatism(short conservatism);
|
||||||
extern void cache_deco_state(struct deco_state *source, struct deco_state **datap);
|
|
||||||
extern void restore_deco_state(struct deco_state *data, struct deco_state *target, bool keep_vpmb_state);
|
|
||||||
extern void nuclear_regeneration(struct deco_state *ds, double time);
|
extern void nuclear_regeneration(struct deco_state *ds, double time);
|
||||||
extern void vpmb_start_gradient(struct deco_state *ds);
|
extern void vpmb_start_gradient(struct deco_state *ds);
|
||||||
extern void vpmb_next_gradient(struct deco_state *ds, double deco_time, double surface_pressure, bool in_planner);
|
extern void vpmb_next_gradient(struct deco_state *ds, double deco_time, double surface_pressure, bool in_planner);
|
||||||
|
@ -74,6 +72,21 @@ extern void update_regression(struct deco_state *ds, const struct dive *dive);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// C++ only functions
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
struct deco_state_cache {
|
||||||
|
// Test if there is cached data
|
||||||
|
operator bool () {
|
||||||
|
return !!data;
|
||||||
|
}
|
||||||
|
void cache(const struct deco_state *source);
|
||||||
|
void restore(struct deco_state *target, bool keep_vpmb_state) const;
|
||||||
|
private:
|
||||||
|
std::unique_ptr<deco_state> data;
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // DECO_H
|
#endif // DECO_H
|
||||||
|
|
|
@ -111,7 +111,7 @@ static void interpolate_transition(struct deco_state *ds, struct dive *dive, dur
|
||||||
}
|
}
|
||||||
|
|
||||||
/* returns the tissue tolerance at the end of this (partial) dive */
|
/* returns the tissue tolerance at the end of this (partial) dive */
|
||||||
static int tissue_at_end(struct deco_state *ds, struct dive *dive, struct deco_state **cached_datap)
|
static int tissue_at_end(struct deco_state *ds, struct dive *dive, deco_state_cache &cache)
|
||||||
{
|
{
|
||||||
struct divecomputer *dc;
|
struct divecomputer *dc;
|
||||||
struct sample *sample, *psample;
|
struct sample *sample, *psample;
|
||||||
|
@ -123,11 +123,11 @@ static int tissue_at_end(struct deco_state *ds, struct dive *dive, struct deco_s
|
||||||
|
|
||||||
if (!dive)
|
if (!dive)
|
||||||
return 0;
|
return 0;
|
||||||
if (*cached_datap) {
|
if (cache) {
|
||||||
restore_deco_state(*cached_datap, ds, true);
|
cache.restore(ds, true);
|
||||||
} else {
|
} else {
|
||||||
surface_interval = init_decompression(ds, dive, true);
|
surface_interval = init_decompression(ds, dive, true);
|
||||||
cache_deco_state(ds, cached_datap);
|
cache.cache(ds);
|
||||||
}
|
}
|
||||||
dc = &dive->dc;
|
dc = &dive->dc;
|
||||||
if (!dc->samples)
|
if (!dc->samples)
|
||||||
|
@ -544,12 +544,12 @@ static bool trial_ascent(struct deco_state *ds, int wait_time, int trial_depth,
|
||||||
{
|
{
|
||||||
|
|
||||||
bool clear_to_ascend = true;
|
bool clear_to_ascend = true;
|
||||||
struct deco_state *trial_cache = NULL;
|
deco_state_cache trial_cache;
|
||||||
|
|
||||||
// For consistency with other VPM-B implementations, we should not start the ascent while the ceiling is
|
// For consistency with other VPM-B implementations, we should not start the ascent while the ceiling is
|
||||||
// deeper than the next stop (thus the offgasing during the ascent is ignored).
|
// deeper than the next stop (thus the offgasing during the ascent is ignored).
|
||||||
// However, we still need to make sure we don't break the ceiling due to on-gassing during ascent.
|
// However, we still need to make sure we don't break the ceiling due to on-gassing during ascent.
|
||||||
cache_deco_state(ds, &trial_cache);
|
trial_cache.cache(ds);
|
||||||
if (wait_time)
|
if (wait_time)
|
||||||
add_segment(ds, depth_to_bar(trial_depth, dive),
|
add_segment(ds, depth_to_bar(trial_depth, dive),
|
||||||
gasmix,
|
gasmix,
|
||||||
|
@ -558,8 +558,7 @@ static bool trial_ascent(struct deco_state *ds, int wait_time, int trial_depth,
|
||||||
double tolerance_limit = tissue_tolerance_calc(ds, dive, depth_to_bar(stoplevel, dive), true);
|
double tolerance_limit = tissue_tolerance_calc(ds, dive, depth_to_bar(stoplevel, dive), true);
|
||||||
update_regression(ds, dive);
|
update_regression(ds, dive);
|
||||||
if (deco_allowed_depth(tolerance_limit, surface_pressure, dive, 1) > stoplevel) {
|
if (deco_allowed_depth(tolerance_limit, surface_pressure, dive, 1) > stoplevel) {
|
||||||
restore_deco_state(trial_cache, ds, false);
|
trial_cache.restore(ds, false);
|
||||||
free(trial_cache);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -582,8 +581,7 @@ static bool trial_ascent(struct deco_state *ds, int wait_time, int trial_depth,
|
||||||
}
|
}
|
||||||
trial_depth -= deltad;
|
trial_depth -= deltad;
|
||||||
}
|
}
|
||||||
restore_deco_state(trial_cache, ds, false);
|
trial_cache.restore(ds, false);
|
||||||
free(trial_cache);
|
|
||||||
return clear_to_ascend;
|
return clear_to_ascend;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -654,7 +652,7 @@ static void average_max_depth(struct diveplan *dive, int *avg_depth, int *max_de
|
||||||
*avg_depth = *max_depth = 0;
|
*avg_depth = *max_depth = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" bool plan(struct deco_state *ds, struct diveplan *diveplan, struct dive *dive, int timestep, struct decostop *decostoptable, struct deco_state **cached_datap, bool is_planner, bool show_disclaimer)
|
bool plan(struct deco_state *ds, struct diveplan *diveplan, struct dive *dive, int timestep, struct decostop *decostoptable, deco_state_cache &cache, bool is_planner, bool show_disclaimer)
|
||||||
{
|
{
|
||||||
|
|
||||||
int bottom_depth;
|
int bottom_depth;
|
||||||
|
@ -663,7 +661,7 @@ extern "C" bool plan(struct deco_state *ds, struct diveplan *diveplan, struct di
|
||||||
bool is_final_plan = true;
|
bool is_final_plan = true;
|
||||||
int bottom_time;
|
int bottom_time;
|
||||||
int previous_deco_time;
|
int previous_deco_time;
|
||||||
struct deco_state *bottom_cache = NULL;
|
deco_state_cache bottom_cache;
|
||||||
struct sample *sample;
|
struct sample *sample;
|
||||||
int po2;
|
int po2;
|
||||||
int transitiontime, gi;
|
int transitiontime, gi;
|
||||||
|
@ -782,7 +780,7 @@ extern "C" bool plan(struct deco_state *ds, struct diveplan *diveplan, struct di
|
||||||
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 */
|
||||||
diveplan->surface_interval = tissue_at_end(ds, dive, cached_datap);
|
diveplan->surface_interval = tissue_at_end(ds, dive, cache);
|
||||||
nuclear_regeneration(ds, clock);
|
nuclear_regeneration(ds, clock);
|
||||||
vpmb_start_gradient(ds);
|
vpmb_start_gradient(ds);
|
||||||
if (decoMode(true) == RECREATIONAL) {
|
if (decoMode(true) == RECREATIONAL) {
|
||||||
|
@ -850,7 +848,7 @@ extern "C" bool plan(struct deco_state *ds, struct diveplan *diveplan, struct di
|
||||||
}
|
}
|
||||||
|
|
||||||
// VPM-B or Buehlmann Deco
|
// VPM-B or Buehlmann Deco
|
||||||
tissue_at_end(ds, dive, cached_datap);
|
tissue_at_end(ds, dive, cache);
|
||||||
if ((divemode == CCR || divemode == PSCR) && prefs.dobailout) {
|
if ((divemode == CCR || divemode == PSCR) && prefs.dobailout) {
|
||||||
divemode = OC;
|
divemode = OC;
|
||||||
po2 = 0;
|
po2 = 0;
|
||||||
|
@ -864,7 +862,7 @@ extern "C" bool plan(struct deco_state *ds, struct diveplan *diveplan, struct di
|
||||||
}
|
}
|
||||||
previous_deco_time = 100000000;
|
previous_deco_time = 100000000;
|
||||||
ds->deco_time = 10000000;
|
ds->deco_time = 10000000;
|
||||||
cache_deco_state(ds, &bottom_cache); // Lets us make several iterations
|
bottom_cache.cache(ds); // Lets us make several iterations
|
||||||
bottom_depth = depth;
|
bottom_depth = depth;
|
||||||
bottom_gi = gi;
|
bottom_gi = gi;
|
||||||
bottom_gas = gas;
|
bottom_gas = gas;
|
||||||
|
@ -878,7 +876,7 @@ extern "C" bool plan(struct deco_state *ds, struct diveplan *diveplan, struct di
|
||||||
vpmb_next_gradient(ds, ds->deco_time, diveplan->surface_pressure / 1000.0, true);
|
vpmb_next_gradient(ds, ds->deco_time, diveplan->surface_pressure / 1000.0, true);
|
||||||
|
|
||||||
previous_deco_time = ds->deco_time;
|
previous_deco_time = ds->deco_time;
|
||||||
restore_deco_state(bottom_cache, ds, true);
|
bottom_cache.restore(ds, true);
|
||||||
|
|
||||||
depth = bottom_depth;
|
depth = bottom_depth;
|
||||||
gi = bottom_gi;
|
gi = bottom_gi;
|
||||||
|
@ -1124,7 +1122,6 @@ extern "C" bool plan(struct deco_state *ds, struct diveplan *diveplan, struct di
|
||||||
|
|
||||||
free(stoplevels);
|
free(stoplevels);
|
||||||
free(gaschanges);
|
free(gaschanges);
|
||||||
free(bottom_cache);
|
|
||||||
return decodive;
|
return decodive;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,8 @@ struct diveplan {
|
||||||
int surface_interval;
|
int surface_interval;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct deco_state_cache;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
@ -58,9 +60,10 @@ struct decostop {
|
||||||
int depth;
|
int depth;
|
||||||
int time;
|
int time;
|
||||||
};
|
};
|
||||||
extern bool plan(struct deco_state *ds, struct diveplan *diveplan, struct dive *dive, int timestep, struct decostop *decostoptable, struct deco_state **cached_datap, bool is_planner, bool show_disclaimer);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern bool plan(struct deco_state *ds, struct diveplan *diveplan, struct dive *dive, int timestep, struct decostop *decostoptable, deco_state_cache &cache, bool is_planner, bool show_disclaimer);
|
||||||
#endif
|
#endif
|
||||||
#endif // PLANNER_H
|
#endif // PLANNER_H
|
||||||
|
|
|
@ -943,11 +943,11 @@ static void calculate_deco_information(struct deco_state *ds, const struct deco_
|
||||||
ds->deco_time = planner_ds->deco_time;
|
ds->deco_time = planner_ds->deco_time;
|
||||||
ds->first_ceiling_pressure = planner_ds->first_ceiling_pressure;
|
ds->first_ceiling_pressure = planner_ds->first_ceiling_pressure;
|
||||||
}
|
}
|
||||||
struct deco_state *cache_data_initial = NULL;
|
deco_state_cache cache_data_initial;
|
||||||
lock_planner();
|
lock_planner();
|
||||||
/* For VPM-B outside the planner, cache the initial deco state for CVA iterations */
|
/* For VPM-B outside the planner, cache the initial deco state for CVA iterations */
|
||||||
if (decoMode(in_planner) == VPMB) {
|
if (decoMode(in_planner) == VPMB) {
|
||||||
cache_deco_state(ds, &cache_data_initial);
|
cache_data_initial.cache(ds);
|
||||||
}
|
}
|
||||||
/* For VPM-B outside the planner, iterate until deco time converges (usually one or two iterations after the initial)
|
/* For VPM-B outside the planner, iterate until deco time converges (usually one or two iterations after the initial)
|
||||||
* Set maximum number of iterations to 10 just in case */
|
* Set maximum number of iterations to 10 just in case */
|
||||||
|
@ -1078,14 +1078,13 @@ static void calculate_deco_information(struct deco_state *ds, const struct deco_
|
||||||
last_ndl_tts_calc_time = entry->sec;
|
last_ndl_tts_calc_time = entry->sec;
|
||||||
|
|
||||||
/* We are going to mess up deco state, so store it for later restore */
|
/* We are going to mess up deco state, so store it for later restore */
|
||||||
struct deco_state *cache_data = NULL;
|
deco_state_cache cache_data;
|
||||||
cache_deco_state(ds, &cache_data);
|
cache_data.cache(ds);
|
||||||
calculate_ndl_tts(ds, dive, entry, gasmix, surface_pressure, current_divemode, in_planner);
|
calculate_ndl_tts(ds, dive, entry, gasmix, surface_pressure, current_divemode, in_planner);
|
||||||
if (decoMode(in_planner) == VPMB && !in_planner && i == pi->nr - 1)
|
if (decoMode(in_planner) == VPMB && !in_planner && i == pi->nr - 1)
|
||||||
final_tts = entry->tts_calc;
|
final_tts = entry->tts_calc;
|
||||||
/* Restore "real" deco state for next real time step */
|
/* Restore "real" deco state for next real time step */
|
||||||
restore_deco_state(cache_data, ds, decoMode(in_planner) == VPMB);
|
cache_data.restore(ds, decoMode(in_planner) == VPMB);
|
||||||
free(cache_data);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (decoMode(in_planner) == VPMB && !in_planner) {
|
if (decoMode(in_planner) == VPMB && !in_planner) {
|
||||||
|
@ -1107,7 +1106,7 @@ static void calculate_deco_information(struct deco_state *ds, const struct deco_
|
||||||
first_iteration = false;
|
first_iteration = false;
|
||||||
count_iteration ++;
|
count_iteration ++;
|
||||||
this_deco_time = ds->deco_time;
|
this_deco_time = ds->deco_time;
|
||||||
restore_deco_state(cache_data_initial, ds, true);
|
cache_data_initial.restore(ds, true);
|
||||||
ds->deco_time = this_deco_time;
|
ds->deco_time = this_deco_time;
|
||||||
} else {
|
} else {
|
||||||
// With Buhlmann iterating isn't needed. This makes the while condition false.
|
// With Buhlmann iterating isn't needed. This makes the while condition false.
|
||||||
|
@ -1115,7 +1114,6 @@ static void calculate_deco_information(struct deco_state *ds, const struct deco_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
free(cache_data_initial);
|
|
||||||
#if DECO_CALC_DEBUG & 1
|
#if DECO_CALC_DEBUG & 1
|
||||||
dump_tissues(ds);
|
dump_tissues(ds);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1073,12 +1073,12 @@ void DivePlannerPointsModel::updateDiveProfile()
|
||||||
if (diveplan_empty(&diveplan))
|
if (diveplan_empty(&diveplan))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
struct deco_state *cache = NULL;
|
deco_state_cache cache;
|
||||||
struct decostop stoptable[60];
|
struct decostop stoptable[60];
|
||||||
struct deco_state plan_deco_state;
|
struct deco_state plan_deco_state;
|
||||||
|
|
||||||
memset(&plan_deco_state, 0, sizeof(struct deco_state));
|
memset(&plan_deco_state, 0, sizeof(struct deco_state));
|
||||||
plan(&plan_deco_state, &diveplan, d, DECOTIMESTEP, stoptable, &cache, isPlanner(), false);
|
plan(&plan_deco_state, &diveplan, d, DECOTIMESTEP, stoptable, cache, isPlanner(), false);
|
||||||
updateMaxDepth();
|
updateMaxDepth();
|
||||||
|
|
||||||
if (isPlanner() && shouldComputeVariations()) {
|
if (isPlanner() && shouldComputeVariations()) {
|
||||||
|
@ -1103,8 +1103,6 @@ void DivePlannerPointsModel::updateDiveProfile()
|
||||||
emit calculatedPlanNotes(QString(d->notes));
|
emit calculatedPlanNotes(QString(d->notes));
|
||||||
|
|
||||||
|
|
||||||
// throw away the cache
|
|
||||||
free(cache);
|
|
||||||
#if DEBUG_PLAN
|
#if DEBUG_PLAN
|
||||||
save_dive(stderr, d);
|
save_dive(stderr, d);
|
||||||
dump_plan(&diveplan);
|
dump_plan(&diveplan);
|
||||||
|
@ -1196,13 +1194,13 @@ void DivePlannerPointsModel::computeVariations(struct diveplan *original_plan, c
|
||||||
struct dive *dive = alloc_dive();
|
struct dive *dive = alloc_dive();
|
||||||
copy_dive(d, dive);
|
copy_dive(d, dive);
|
||||||
struct decostop original[60], deeper[60], shallower[60], shorter[60], longer[60];
|
struct decostop original[60], deeper[60], shallower[60], shorter[60], longer[60];
|
||||||
struct deco_state *cache = NULL, *save = NULL;
|
deco_state_cache cache, save;
|
||||||
struct diveplan plan_copy;
|
struct diveplan plan_copy;
|
||||||
struct divedatapoint *last_segment;
|
struct divedatapoint *last_segment;
|
||||||
struct deco_state ds = *previous_ds;
|
struct deco_state ds = *previous_ds;
|
||||||
|
|
||||||
int my_instance = ++instanceCounter;
|
int my_instance = ++instanceCounter;
|
||||||
cache_deco_state(&ds, &save);
|
save.cache(&ds);
|
||||||
|
|
||||||
duration_t delta_time = { .seconds = 60 };
|
duration_t delta_time = { .seconds = 60 };
|
||||||
QString time_units = tr("min");
|
QString time_units = tr("min");
|
||||||
|
@ -1222,43 +1220,43 @@ void DivePlannerPointsModel::computeVariations(struct diveplan *original_plan, c
|
||||||
goto finish;
|
goto finish;
|
||||||
if (my_instance != instanceCounter)
|
if (my_instance != instanceCounter)
|
||||||
goto finish;
|
goto finish;
|
||||||
plan(&ds, &plan_copy, dive, 1, original, &cache, true, false);
|
plan(&ds, &plan_copy, dive, 1, original, cache, true, false);
|
||||||
free_dps(&plan_copy);
|
free_dps(&plan_copy);
|
||||||
restore_deco_state(save, &ds, false);
|
save.restore(&ds, false);
|
||||||
|
|
||||||
last_segment = cloneDiveplan(original_plan, &plan_copy);
|
last_segment = cloneDiveplan(original_plan, &plan_copy);
|
||||||
last_segment->depth.mm += delta_depth.mm;
|
last_segment->depth.mm += delta_depth.mm;
|
||||||
last_segment->next->depth.mm += delta_depth.mm;
|
last_segment->next->depth.mm += delta_depth.mm;
|
||||||
if (my_instance != instanceCounter)
|
if (my_instance != instanceCounter)
|
||||||
goto finish;
|
goto finish;
|
||||||
plan(&ds, &plan_copy, dive, 1, deeper, &cache, true, false);
|
plan(&ds, &plan_copy, dive, 1, deeper, cache, true, false);
|
||||||
free_dps(&plan_copy);
|
free_dps(&plan_copy);
|
||||||
restore_deco_state(save, &ds, false);
|
save.restore(&ds, false);
|
||||||
|
|
||||||
last_segment = cloneDiveplan(original_plan, &plan_copy);
|
last_segment = cloneDiveplan(original_plan, &plan_copy);
|
||||||
last_segment->depth.mm -= delta_depth.mm;
|
last_segment->depth.mm -= delta_depth.mm;
|
||||||
last_segment->next->depth.mm -= delta_depth.mm;
|
last_segment->next->depth.mm -= delta_depth.mm;
|
||||||
if (my_instance != instanceCounter)
|
if (my_instance != instanceCounter)
|
||||||
goto finish;
|
goto finish;
|
||||||
plan(&ds, &plan_copy, dive, 1, shallower, &cache, true, false);
|
plan(&ds, &plan_copy, dive, 1, shallower, cache, true, false);
|
||||||
free_dps(&plan_copy);
|
free_dps(&plan_copy);
|
||||||
restore_deco_state(save, &ds, false);
|
save.restore(&ds, false);
|
||||||
|
|
||||||
last_segment = cloneDiveplan(original_plan, &plan_copy);
|
last_segment = cloneDiveplan(original_plan, &plan_copy);
|
||||||
last_segment->next->time += delta_time.seconds;
|
last_segment->next->time += delta_time.seconds;
|
||||||
if (my_instance != instanceCounter)
|
if (my_instance != instanceCounter)
|
||||||
goto finish;
|
goto finish;
|
||||||
plan(&ds, &plan_copy, dive, 1, longer, &cache, true, false);
|
plan(&ds, &plan_copy, dive, 1, longer, cache, true, false);
|
||||||
free_dps(&plan_copy);
|
free_dps(&plan_copy);
|
||||||
restore_deco_state(save, &ds, false);
|
save.restore(&ds, false);
|
||||||
|
|
||||||
last_segment = cloneDiveplan(original_plan, &plan_copy);
|
last_segment = cloneDiveplan(original_plan, &plan_copy);
|
||||||
last_segment->next->time -= delta_time.seconds;
|
last_segment->next->time -= delta_time.seconds;
|
||||||
if (my_instance != instanceCounter)
|
if (my_instance != instanceCounter)
|
||||||
goto finish;
|
goto finish;
|
||||||
plan(&ds, &plan_copy, dive, 1, shorter, &cache, true, false);
|
plan(&ds, &plan_copy, dive, 1, shorter, cache, true, false);
|
||||||
free_dps(&plan_copy);
|
free_dps(&plan_copy);
|
||||||
restore_deco_state(save, &ds, false);
|
save.restore(&ds, false);
|
||||||
|
|
||||||
char buf[200];
|
char buf[200];
|
||||||
sprintf(buf, ", %s: %c %d:%02d /%s %c %d:%02d /min", qPrintable(tr("Stop times")),
|
sprintf(buf, ", %s: %c %d:%02d /%s %c %d:%02d /min", qPrintable(tr("Stop times")),
|
||||||
|
@ -1273,8 +1271,6 @@ void DivePlannerPointsModel::computeVariations(struct diveplan *original_plan, c
|
||||||
finish:
|
finish:
|
||||||
free_dps(original_plan);
|
free_dps(original_plan);
|
||||||
free(original_plan);
|
free(original_plan);
|
||||||
free(save);
|
|
||||||
free(cache);
|
|
||||||
free_dive(dive);
|
free_dive(dive);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1289,13 +1285,12 @@ void DivePlannerPointsModel::computeVariationsDone(QString variations)
|
||||||
void DivePlannerPointsModel::createPlan(bool replanCopy)
|
void DivePlannerPointsModel::createPlan(bool replanCopy)
|
||||||
{
|
{
|
||||||
// Ok, so, here the diveplan creates a dive
|
// Ok, so, here the diveplan creates a dive
|
||||||
struct deco_state *cache = NULL;
|
deco_state_cache cache;
|
||||||
removeDeco();
|
removeDeco();
|
||||||
createTemporaryPlan();
|
createTemporaryPlan();
|
||||||
|
|
||||||
//TODO: C-based function here?
|
|
||||||
struct decostop stoptable[60];
|
struct decostop stoptable[60];
|
||||||
plan(&ds_after_previous_dives, &diveplan, d, DECOTIMESTEP, stoptable, &cache, isPlanner(), true);
|
plan(&ds_after_previous_dives, &diveplan, d, DECOTIMESTEP, stoptable, cache, isPlanner(), true);
|
||||||
|
|
||||||
if (shouldComputeVariations()) {
|
if (shouldComputeVariations()) {
|
||||||
struct diveplan *plan_copy;
|
struct diveplan *plan_copy;
|
||||||
|
@ -1306,8 +1301,6 @@ void DivePlannerPointsModel::createPlan(bool replanCopy)
|
||||||
computeVariations(plan_copy, &ds_after_previous_dives);
|
computeVariations(plan_copy, &ds_after_previous_dives);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(cache);
|
|
||||||
|
|
||||||
// Fixup planner notes.
|
// Fixup planner notes.
|
||||||
if (current_dive && d->id == current_dive->id) {
|
if (current_dive && d->id == current_dive->id) {
|
||||||
// Try to identify old planner output and remove only this part
|
// Try to identify old planner output and remove only this part
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
static struct dive dive = { 0 };
|
static struct dive dive = { 0 };
|
||||||
static struct decostop stoptable[60];
|
static struct decostop stoptable[60];
|
||||||
static struct deco_state test_deco_state;
|
static struct deco_state test_deco_state;
|
||||||
extern bool plan(struct deco_state *ds, struct diveplan *diveplan, struct dive *dive, int timestep, struct decostop *decostoptable, struct deco_state **cached_datap, bool is_planner, bool show_disclaimer);
|
extern bool plan(struct deco_state *ds, struct diveplan *diveplan, struct dive *dive, int timestep, struct decostop *decostoptable, deco_state_cache &cache, bool is_planner, bool show_disclaimer);
|
||||||
void setupPrefs()
|
void setupPrefs()
|
||||||
{
|
{
|
||||||
copy_prefs(&default_prefs, &prefs);
|
copy_prefs(&default_prefs, &prefs);
|
||||||
|
@ -443,7 +443,7 @@ bool compareDecoTime(int actualRunTimeSeconds, int benchmarkRunTimeSeconds, int
|
||||||
|
|
||||||
void TestPlan::testMetric()
|
void TestPlan::testMetric()
|
||||||
{
|
{
|
||||||
struct deco_state *cache = NULL;
|
deco_state_cache cache;
|
||||||
|
|
||||||
setupPrefs();
|
setupPrefs();
|
||||||
prefs.unit_system = METRIC;
|
prefs.unit_system = METRIC;
|
||||||
|
@ -453,7 +453,7 @@ void TestPlan::testMetric()
|
||||||
struct diveplan testPlan = {};
|
struct diveplan testPlan = {};
|
||||||
setupPlan(&testPlan);
|
setupPlan(&testPlan);
|
||||||
|
|
||||||
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, &cache, 1, 0);
|
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, cache, 1, 0);
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
free(dive.notes);
|
free(dive.notes);
|
||||||
|
@ -484,7 +484,7 @@ void TestPlan::testMetric()
|
||||||
|
|
||||||
void TestPlan::testImperial()
|
void TestPlan::testImperial()
|
||||||
{
|
{
|
||||||
struct deco_state *cache = NULL;
|
deco_state_cache cache;
|
||||||
|
|
||||||
setupPrefs();
|
setupPrefs();
|
||||||
prefs.unit_system = IMPERIAL;
|
prefs.unit_system = IMPERIAL;
|
||||||
|
@ -494,7 +494,7 @@ void TestPlan::testImperial()
|
||||||
struct diveplan testPlan = {};
|
struct diveplan testPlan = {};
|
||||||
setupPlan(&testPlan);
|
setupPlan(&testPlan);
|
||||||
|
|
||||||
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, &cache, 1, 0);
|
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, cache, 1, 0);
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
free(dive.notes);
|
free(dive.notes);
|
||||||
|
@ -525,7 +525,7 @@ void TestPlan::testImperial()
|
||||||
|
|
||||||
void TestPlan::testVpmbMetric45m30minTx()
|
void TestPlan::testVpmbMetric45m30minTx()
|
||||||
{
|
{
|
||||||
struct deco_state *cache = NULL;
|
deco_state_cache cache;
|
||||||
|
|
||||||
setupPrefsVpmb();
|
setupPrefsVpmb();
|
||||||
prefs.unit_system = METRIC;
|
prefs.unit_system = METRIC;
|
||||||
|
@ -534,7 +534,7 @@ void TestPlan::testVpmbMetric45m30minTx()
|
||||||
struct diveplan testPlan = {};
|
struct diveplan testPlan = {};
|
||||||
setupPlanVpmb45m30mTx(&testPlan);
|
setupPlanVpmb45m30mTx(&testPlan);
|
||||||
|
|
||||||
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, &cache, 1, 0);
|
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, cache, 1, 0);
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
free(dive.notes);
|
free(dive.notes);
|
||||||
|
@ -555,7 +555,7 @@ void TestPlan::testVpmbMetric45m30minTx()
|
||||||
|
|
||||||
void TestPlan::testVpmbMetric60m10minTx()
|
void TestPlan::testVpmbMetric60m10minTx()
|
||||||
{
|
{
|
||||||
struct deco_state *cache = NULL;
|
deco_state_cache cache;
|
||||||
|
|
||||||
setupPrefsVpmb();
|
setupPrefsVpmb();
|
||||||
prefs.unit_system = METRIC;
|
prefs.unit_system = METRIC;
|
||||||
|
@ -564,7 +564,7 @@ void TestPlan::testVpmbMetric60m10minTx()
|
||||||
struct diveplan testPlan = {};
|
struct diveplan testPlan = {};
|
||||||
setupPlanVpmb60m10mTx(&testPlan);
|
setupPlanVpmb60m10mTx(&testPlan);
|
||||||
|
|
||||||
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, &cache, 1, 0);
|
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, cache, 1, 0);
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
free(dive.notes);
|
free(dive.notes);
|
||||||
|
@ -585,7 +585,7 @@ void TestPlan::testVpmbMetric60m10minTx()
|
||||||
|
|
||||||
void TestPlan::testVpmbMetric60m30minAir()
|
void TestPlan::testVpmbMetric60m30minAir()
|
||||||
{
|
{
|
||||||
struct deco_state *cache = NULL;
|
deco_state_cache cache;
|
||||||
|
|
||||||
setupPrefsVpmb();
|
setupPrefsVpmb();
|
||||||
prefs.unit_system = METRIC;
|
prefs.unit_system = METRIC;
|
||||||
|
@ -594,7 +594,7 @@ void TestPlan::testVpmbMetric60m30minAir()
|
||||||
struct diveplan testPlan = {};
|
struct diveplan testPlan = {};
|
||||||
setupPlanVpmb60m30minAir(&testPlan);
|
setupPlanVpmb60m30minAir(&testPlan);
|
||||||
|
|
||||||
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, &cache, 1, 0);
|
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, cache, 1, 0);
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
free(dive.notes);
|
free(dive.notes);
|
||||||
|
@ -615,7 +615,7 @@ void TestPlan::testVpmbMetric60m30minAir()
|
||||||
|
|
||||||
void TestPlan::testVpmbMetric60m30minEan50()
|
void TestPlan::testVpmbMetric60m30minEan50()
|
||||||
{
|
{
|
||||||
struct deco_state *cache = NULL;
|
deco_state_cache cache;
|
||||||
|
|
||||||
setupPrefsVpmb();
|
setupPrefsVpmb();
|
||||||
prefs.unit_system = METRIC;
|
prefs.unit_system = METRIC;
|
||||||
|
@ -624,7 +624,7 @@ void TestPlan::testVpmbMetric60m30minEan50()
|
||||||
struct diveplan testPlan = {};
|
struct diveplan testPlan = {};
|
||||||
setupPlanVpmb60m30minEan50(&testPlan);
|
setupPlanVpmb60m30minEan50(&testPlan);
|
||||||
|
|
||||||
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, &cache, 1, 0);
|
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, cache, 1, 0);
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
free(dive.notes);
|
free(dive.notes);
|
||||||
|
@ -651,7 +651,7 @@ void TestPlan::testVpmbMetric60m30minEan50()
|
||||||
|
|
||||||
void TestPlan::testVpmbMetric60m30minTx()
|
void TestPlan::testVpmbMetric60m30minTx()
|
||||||
{
|
{
|
||||||
struct deco_state *cache = NULL;
|
deco_state_cache cache;
|
||||||
|
|
||||||
setupPrefsVpmb();
|
setupPrefsVpmb();
|
||||||
prefs.unit_system = METRIC;
|
prefs.unit_system = METRIC;
|
||||||
|
@ -660,7 +660,7 @@ void TestPlan::testVpmbMetric60m30minTx()
|
||||||
struct diveplan testPlan = {};
|
struct diveplan testPlan = {};
|
||||||
setupPlanVpmb60m30minTx(&testPlan);
|
setupPlanVpmb60m30minTx(&testPlan);
|
||||||
|
|
||||||
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, &cache, 1, 0);
|
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, cache, 1, 0);
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
free(dive.notes);
|
free(dive.notes);
|
||||||
|
@ -687,7 +687,7 @@ void TestPlan::testVpmbMetric60m30minTx()
|
||||||
|
|
||||||
void TestPlan::testVpmbMetric100m60min()
|
void TestPlan::testVpmbMetric100m60min()
|
||||||
{
|
{
|
||||||
struct deco_state *cache = NULL;
|
deco_state_cache cache;
|
||||||
|
|
||||||
setupPrefsVpmb();
|
setupPrefsVpmb();
|
||||||
prefs.unit_system = METRIC;
|
prefs.unit_system = METRIC;
|
||||||
|
@ -696,7 +696,7 @@ void TestPlan::testVpmbMetric100m60min()
|
||||||
struct diveplan testPlan = {};
|
struct diveplan testPlan = {};
|
||||||
setupPlanVpmb100m60min(&testPlan);
|
setupPlanVpmb100m60min(&testPlan);
|
||||||
|
|
||||||
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, &cache, 1, 0);
|
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, cache, 1, 0);
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
free(dive.notes);
|
free(dive.notes);
|
||||||
|
@ -729,7 +729,7 @@ void TestPlan::testVpmbMetric100m60min()
|
||||||
|
|
||||||
void TestPlan::testMultipleGases()
|
void TestPlan::testMultipleGases()
|
||||||
{
|
{
|
||||||
struct deco_state *cache = NULL;
|
deco_state_cache cache;
|
||||||
|
|
||||||
setupPrefsVpmb();
|
setupPrefsVpmb();
|
||||||
prefs.unit_system = METRIC;
|
prefs.unit_system = METRIC;
|
||||||
|
@ -739,7 +739,7 @@ void TestPlan::testMultipleGases()
|
||||||
|
|
||||||
setupPlanSeveralGases(&testPlan);
|
setupPlanSeveralGases(&testPlan);
|
||||||
|
|
||||||
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, &cache, 1, 0);
|
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, cache, 1, 0);
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
free(dive.notes);
|
free(dive.notes);
|
||||||
|
@ -755,7 +755,7 @@ void TestPlan::testMultipleGases()
|
||||||
|
|
||||||
void TestPlan::testVpmbMetricMultiLevelAir()
|
void TestPlan::testVpmbMetricMultiLevelAir()
|
||||||
{
|
{
|
||||||
struct deco_state *cache = NULL;
|
deco_state_cache cache;
|
||||||
|
|
||||||
setupPrefsVpmb();
|
setupPrefsVpmb();
|
||||||
prefs.unit_system = METRIC;
|
prefs.unit_system = METRIC;
|
||||||
|
@ -764,7 +764,7 @@ void TestPlan::testVpmbMetricMultiLevelAir()
|
||||||
struct diveplan testPlan = {};
|
struct diveplan testPlan = {};
|
||||||
setupPlanVpmbMultiLevelAir(&testPlan);
|
setupPlanVpmbMultiLevelAir(&testPlan);
|
||||||
|
|
||||||
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, &cache, 1, 0);
|
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, cache, 1, 0);
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
free(dive.notes);
|
free(dive.notes);
|
||||||
|
@ -785,7 +785,7 @@ void TestPlan::testVpmbMetricMultiLevelAir()
|
||||||
|
|
||||||
void TestPlan::testVpmbMetric100m10min()
|
void TestPlan::testVpmbMetric100m10min()
|
||||||
{
|
{
|
||||||
struct deco_state *cache = NULL;
|
deco_state_cache cache;
|
||||||
|
|
||||||
setupPrefsVpmb();
|
setupPrefsVpmb();
|
||||||
prefs.unit_system = METRIC;
|
prefs.unit_system = METRIC;
|
||||||
|
@ -794,7 +794,7 @@ void TestPlan::testVpmbMetric100m10min()
|
||||||
struct diveplan testPlan = {};
|
struct diveplan testPlan = {};
|
||||||
setupPlanVpmb100m10min(&testPlan);
|
setupPlanVpmb100m10min(&testPlan);
|
||||||
|
|
||||||
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, &cache, 1, 0);
|
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, cache, 1, 0);
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
free(dive.notes);
|
free(dive.notes);
|
||||||
|
@ -831,7 +831,7 @@ void TestPlan::testVpmbMetric100m10min()
|
||||||
*/
|
*/
|
||||||
void TestPlan::testVpmbMetricRepeat()
|
void TestPlan::testVpmbMetricRepeat()
|
||||||
{
|
{
|
||||||
struct deco_state *cache = NULL;
|
deco_state_cache cache;
|
||||||
|
|
||||||
setupPrefsVpmb();
|
setupPrefsVpmb();
|
||||||
prefs.unit_system = METRIC;
|
prefs.unit_system = METRIC;
|
||||||
|
@ -840,7 +840,7 @@ void TestPlan::testVpmbMetricRepeat()
|
||||||
struct diveplan testPlan = {};
|
struct diveplan testPlan = {};
|
||||||
setupPlanVpmb30m20min(&testPlan);
|
setupPlanVpmb30m20min(&testPlan);
|
||||||
|
|
||||||
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, &cache, 1, 0);
|
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, cache, 1, 0);
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
free(dive.notes);
|
free(dive.notes);
|
||||||
|
@ -861,7 +861,7 @@ void TestPlan::testVpmbMetricRepeat()
|
||||||
int firstDiveRunTimeSeconds = dive.dc.duration.seconds;
|
int firstDiveRunTimeSeconds = dive.dc.duration.seconds;
|
||||||
|
|
||||||
setupPlanVpmb100mTo70m30min(&testPlan);
|
setupPlanVpmb100mTo70m30min(&testPlan);
|
||||||
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, &cache, 1, 0);
|
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, cache, 1, 0);
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
free(dive.notes);
|
free(dive.notes);
|
||||||
|
@ -898,7 +898,7 @@ void TestPlan::testVpmbMetricRepeat()
|
||||||
QVERIFY(compareDecoTime(dive.dc.duration.seconds, 127u * 60u + 20u, 127u * 60u + 20u));
|
QVERIFY(compareDecoTime(dive.dc.duration.seconds, 127u * 60u + 20u, 127u * 60u + 20u));
|
||||||
|
|
||||||
setupPlanVpmb30m20min(&testPlan);
|
setupPlanVpmb30m20min(&testPlan);
|
||||||
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, &cache, 1, 0);
|
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, cache, 1, 0);
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
free(dive.notes);
|
free(dive.notes);
|
||||||
|
@ -925,7 +925,7 @@ void TestPlan::testVpmbMetricRepeat()
|
||||||
|
|
||||||
void TestPlan::testCcrBailoutGasSelection()
|
void TestPlan::testCcrBailoutGasSelection()
|
||||||
{
|
{
|
||||||
struct deco_state *cache = NULL;
|
deco_state_cache cache;
|
||||||
|
|
||||||
setupPrefs();
|
setupPrefs();
|
||||||
prefs.unit_system = METRIC;
|
prefs.unit_system = METRIC;
|
||||||
|
@ -937,7 +937,7 @@ void TestPlan::testCcrBailoutGasSelection()
|
||||||
struct diveplan testPlan = {};
|
struct diveplan testPlan = {};
|
||||||
setupPlanCcr(&testPlan);
|
setupPlanCcr(&testPlan);
|
||||||
|
|
||||||
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, &cache, true, false);
|
plan(&test_deco_state, &testPlan, &dive, 60, stoptable, cache, true, false);
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
free(dive.notes);
|
free(dive.notes);
|
||||||
|
|
Loading…
Add table
Reference in a new issue