diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2013-01-06 11:13:46 -0800 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2013-01-06 11:40:21 -0800 |
commit | c8830ffe482457f4e1fc4782dc3118d3d41ee0b7 (patch) | |
tree | b70e5e699fcc11e29378122945a2861673cdee38 /planner.c | |
parent | c607f09f402ccd0b6463c6e7630ee2d162d78579 (diff) | |
download | subsurface-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.c | 22 |
1 files changed, 14 insertions, 8 deletions
@@ -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); } |