diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2013-11-19 22:50:02 -0800 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2013-11-19 23:07:04 -0800 |
commit | 0ca12c36011804eb4b2c3034269bab51ad04a500 (patch) | |
tree | c65fa118622154f60572ed54674bebb16ff41b07 /dive.c | |
parent | 36cb50fb37f8cede4f334b268406ebd55c12ece6 (diff) | |
download | subsurface-0ca12c36011804eb4b2c3034269bab51ad04a500.tar.gz |
Collect per tank SAC rate
This is a bit painful, but we basically walk the samples and pick the
valid tank from the events. And then we do a simple discrete integration
to figure out the mean depth per tank and duration per tank. And then we
assemble all that into per tank statistics.
Strangely the value calculated here seems slightly higher than one would
expect from the overall SAC rate. This inconsistency should be
investigated a bit further, but my guess it it's based on the assumption
that the DC provided mean depth is possibly more accurate than what we can
calculate from the profile.
Fixes #284
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'dive.c')
-rw-r--r-- | dive.c | 42 |
1 files changed, 42 insertions, 0 deletions
@@ -5,6 +5,7 @@ #include <limits.h> #include "gettext.h" #include "dive.h" +#include "planner.h" struct tag_entry *g_tag_list = NULL; @@ -339,6 +340,47 @@ static void fixup_dc_duration(struct divecomputer *dc) } } +void per_cylinder_mean_depth(struct dive *dive, struct divecomputer *dc, int *mean, int *duration) +{ + int i; + int depthtime[MAX_CYLINDERS] = {0,}; + int lasttime = 0, lastdepth = 0; + int idx = 0; + + for (i = 0; i < MAX_CYLINDERS; i++) + mean[i] = duration[i] = 0; + struct event *ev = get_next_event(dc->events, "gaschange"); + if (!ev) { + // special case - no gas changes + mean[0] = dc->meandepth.mm; + duration[0] = dc->duration.seconds; + return; + } + for (i = 0; i < dc->samples; i++) { + struct sample *sample = dc->sample + i; + int time = sample->time.seconds; + int depth = sample->depth.mm; + if (ev && time >= ev->time.seconds) { + int o2 = (ev->value & 0xFFFF) * 10; + int he = (ev->value >> 16) * 10; + idx = get_gasidx(dive, o2, he); + ev = get_next_event(ev->next, "gaschange"); + } + + /* We ignore segments at the surface */ + if (depth > SURFACE_THRESHOLD || lastdepth > SURFACE_THRESHOLD) { + duration[idx] += time - lasttime; + depthtime[idx] += (time - lasttime) * (depth + lastdepth) / 2; + } + lastdepth = depth; + lasttime = time; + } + for (i = 0; i < MAX_CYLINDERS; i++) { + if (duration[i]) + mean[i] = (depthtime[i] + duration[i] / 2) / duration[i]; + } +} + static void fixup_pressure(struct dive *dive, struct sample *sample) { unsigned int pressure, index; |