summaryrefslogtreecommitdiffstats
path: root/planner.c
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2013-01-06 11:13:46 -0800
committerGravatar Dirk Hohndel <dirk@hohndel.org>2013-01-06 11:40:21 -0800
commitc8830ffe482457f4e1fc4782dc3118d3d41ee0b7 (patch)
treeb70e5e699fcc11e29378122945a2861673cdee38 /planner.c
parentc607f09f402ccd0b6463c6e7630ee2d162d78579 (diff)
downloadsubsurface-c8830ffe482457f4e1fc4782dc3118d3d41ee0b7.tar.gz
Add the ability to cache our deco state
We kept reduing all the deco calculations, including the previous dives (if any) for each segment we add to the dive plan. This simply remembers the last stage and then just adds to that. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'planner.c')
-rw-r--r--planner.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/planner.c b/planner.c
index 02c746989..9d20d376f 100644
--- a/planner.c
+++ b/planner.c
@@ -11,7 +11,7 @@
int stoplevels[] = { 3000, 6000, 9000, 12000, 15000, 21000, 30000, 42000, 60000, 90000 };
/* returns the tissue tolerance at the end of this (partial) dive */
-double tissue_at_end(struct dive *dive)
+double tissue_at_end(struct dive *dive, char **cached_datap)
{
struct divecomputer *dc;
struct sample *sample, *psample;
@@ -20,11 +20,15 @@ double tissue_at_end(struct dive *dive)
if (!dive)
return 0.0;
- tissue_tolerance = init_decompression(dive);
-
+ if (*cached_datap) {
+ tissue_tolerance = restore_deco_state(*cached_datap);
+ } else {
+ tissue_tolerance = init_decompression(dive);
+ cache_deco_state(tissue_tolerance, cached_datap);
+ }
dc = &dive->dc;
if (!dc->samples)
- return 0.0;
+ return tissue_tolerance;
psample = sample = dc->sample;
t0 = 0;
for (i = 0; i < dc->samples; i++, sample++) {
@@ -41,7 +45,7 @@ double tissue_at_end(struct dive *dive)
}
/* how many seconds until we can ascend to the next stop? */
-int time_at_last_depth(struct dive *dive, int next_stop)
+int time_at_last_depth(struct dive *dive, int next_stop, char **cached_data_p)
{
int depth;
double surface_pressure, tissue_tolerance;
@@ -51,7 +55,7 @@ int time_at_last_depth(struct dive *dive, int next_stop)
if (!dive)
return 0;
surface_pressure = dive->surface_pressure.mbar / 1000.0;
- tissue_tolerance = tissue_at_end(dive);
+ tissue_tolerance = tissue_at_end(dive, cached_data_p);
sample = &dive->dc.sample[dive->dc.samples - 1];
depth = sample->depth.mm;
while (deco_allowed_depth(tissue_tolerance, surface_pressure, dive, 1) > next_stop) {
@@ -171,6 +175,7 @@ void plan(struct diveplan *diveplan)
int ceiling, depth, transitiontime;
int stopidx;
double tissue_tolerance;
+ char *cached_data = NULL;
if (!diveplan->surface_pressure)
diveplan->surface_pressure = 1013;
@@ -183,7 +188,7 @@ void plan(struct diveplan *diveplan)
o2 = dive->cylinder[sample->sensor].gasmix.o2.permille;
he = dive->cylinder[sample->sensor].gasmix.he.permille;
- tissue_tolerance = tissue_at_end(dive);
+ tissue_tolerance = tissue_at_end(dive, &cached_data);
ceiling = deco_allowed_depth(tissue_tolerance, diveplan->surface_pressure / 1000.0, dive, 1);
for (stopidx = 0; stopidx < sizeof(stoplevels) / sizeof(int); stopidx++)
@@ -200,7 +205,7 @@ void plan(struct diveplan *diveplan)
dive = create_dive_from_plan(diveplan);
record_dive(dive);
}
- wait_time = time_at_last_depth(dive, stoplevels[stopidx - 1]);
+ wait_time = time_at_last_depth(dive, stoplevels[stopidx - 1], &cached_data);
if (wait_time)
plan_add_segment(diveplan, wait_time, stoplevels[stopidx], o2, he);
transitiontime = (stoplevels[stopidx] - stoplevels[stopidx - 1]) / 150;
@@ -212,6 +217,7 @@ void plan(struct diveplan *diveplan)
stopidx--;
}
/* now make the dive visible as last dive of the dive list */
+ free(cached_data);
report_dives(FALSE, FALSE);
}