aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2011-11-19 07:09:14 -0500
committerGravatar Dirk Hohndel <dirk@hohndel.org>2011-11-19 15:12:11 -0500
commitb5abdd46f0dfedacc248c1d96737f96e65bb9ed1 (patch)
treebd2239b9773af5775d17a5da98eadbdd734f4a21
parent9930e1ecadc5cf1990978c00772a09776791da26 (diff)
downloadsubsurface-b5abdd46f0dfedacc248c1d96737f96e65bb9ed1.tar.gz
Remove redundant linear sample tank pressure data
I've seen at least DivingLog do this. If you manually enter beginning and end pressure for a tank it will either linearize the samples in between or offer to simulate a dive (with constant SAC rate). At least the first case is reasonably easy to detect. We throw out those samples and ensure that we still have valid beginning and end pressure for that dive. Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r--dive.c53
1 files changed, 48 insertions, 5 deletions
diff --git a/dive.c b/dive.c
index cd797d276..31be3291d 100644
--- a/dive.c
+++ b/dive.c
@@ -236,7 +236,7 @@ static int same_rounded_pressure(pressure_t a, pressure_t b)
struct dive *fixup_dive(struct dive *dive)
{
- int i;
+ int i,j;
double depthtime = 0;
int lasttime = 0;
int lastindex = -1;
@@ -244,6 +244,7 @@ struct dive *fixup_dive(struct dive *dive)
int maxdepth = 0, mintemp = 0;
int lastdepth = 0;
int lasttemp = 0, lastpressure = 0;
+ int pressure_delta[MAX_CYLINDERS] = {INT_MAX, };
for (i = 0; i < dive->samples; i++) {
struct sample *sample = dive->sample + i;
@@ -253,10 +254,25 @@ struct dive *fixup_dive(struct dive *dive)
int pressure = sample->cylinderpressure.mbar;
int index = sample->cylinderindex;
- /* Remove duplicate redundant pressure information */
- if (pressure == lastpressure && index == lastindex)
- sample->cylinderpressure.mbar = 0;
-
+ if (index == lastindex) {
+ /* Remove duplicate redundant pressure information */
+ if (pressure == lastpressure)
+ sample->cylinderpressure.mbar = 0;
+ /* check for simply linear data in the samples
+ +INT_MAX means uninitialized, -INT_MAX means not linear */
+ if (pressure_delta[index] != -INT_MAX && lastpressure) {
+ if (pressure_delta[index] == INT_MAX) {
+ pressure_delta[index] = abs(pressure - lastpressure);
+ } else {
+ int cur_delta = abs(pressure - lastpressure);
+ if (cur_delta && abs(cur_delta - pressure_delta[index]) > 150) {
+ /* ok the samples aren't just a linearisation
+ * between start and end */
+ pressure_delta[index] = -INT_MAX;
+ }
+ }
+ }
+ }
lastindex = index;
lastpressure = pressure;
@@ -290,6 +306,33 @@ struct dive *fixup_dive(struct dive *dive)
lastdepth = depth;
lasttime = time;
}
+ /* if all the samples for a cylinder have pressure data that
+ * is basically equidistant throw out the sample cylinder pressure
+ * information but make sure we still have a valid start and end
+ * pressure
+ * this happens when DivingLog decides to linearalize the
+ * pressure between beginning and end and for strange reasons
+ * decides to put that in the sample data as if it came from
+ * the dive computer; we don't want that (we'll visualize with
+ * constant SAC rate instead)
+ * WARNING WARNING - I have only seen this in single tank dives
+ * --- maybe I should try to create a multi tank dive and see what
+ * --- divinglog does there - but the code right now is only tested
+ * --- for the single tank case */
+ for (j = 0; j < MAX_CYLINDERS; j++) {
+ if (abs(pressure_delta[j]) != INT_MAX) {
+ cylinder_t *cyl = dive->cylinder + j;
+ for (i = 0; i < dive->samples; i++)
+ if (dive->sample[i].cylinderindex == j)
+ dive->sample[i].cylinderpressure.mbar = 0;
+ if (! cyl->start.mbar)
+ cyl->start.mbar = cyl->sample_start.mbar;
+ if (! cyl->end.mbar)
+ cyl->end.mbar = cyl->sample_end.mbar;
+ cyl->sample_start.mbar = 0;
+ cyl->sample_end.mbar = 0;
+ }
+ }
if (end < 0)
return dive;