]> git.tdb.fi Git - ext/subsurface.git/commitdiff
Don't overwrite the end pressure with sample data if one already exists
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 19 Oct 2011 16:25:47 +0000 (09:25 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 19 Oct 2011 16:25:47 +0000 (09:25 -0700)
If we have en explicit end pressure in the dive information, we should
not change it just because we also have some samples.  The sample data
may not be complete (read: "Linus wireless connection dropped during the
dive again, and he fixed up the end pressure manually afterwards").

The beginning pressure already works correctly, because it will only use
the sample data for the first sample if no pressure existed before.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
dive.c

diff --git a/dive.c b/dive.c
index deb72fc804225712edf164d52ab1a4fca5ba1d93..0341d09928cd4ef9ad9a974858a17c037db55a4c 100644 (file)
--- a/dive.c
+++ b/dive.c
@@ -140,26 +140,46 @@ static void update_temperature(temperature_t *temperature, int new)
        }
 }
 
-static void fixup_pressure(struct dive *dive, struct sample *sample)
+/*
+ * If you have more than 32 cylinders, you'd better have a 64-bit build.
+ * And if you have more than 64 cylinders, you need to use another tool,
+ * or fix this up to do something odd.
+ */
+static unsigned long fixup_pressure(struct dive *dive, struct sample *sample, unsigned long flags)
 {
+       unsigned long mask;
        unsigned int pressure, index;
        cylinder_t *cyl;
 
        pressure = sample->cylinderpressure.mbar;
        if (!pressure)
-               return;
+               return flags;
        index = sample->cylinderindex;
        if (index >= MAX_CYLINDERS)
-               return;
+               return flags;
        cyl = dive->cylinder + index;
        if (!cyl->start.mbar)
                cyl->start.mbar = pressure;
+       /*
+        * If we already have an end pressure, without
+        * ever having seen a sample for this cylinder,
+        * that means that somebody set the end pressure
+        * by hand
+        */
+       mask = 1ul << index;
+       if (cyl->end.mbar) {
+               if (!(flags & mask))
+                       return flags;
+       }
+       flags |= mask;
+
        /* we need to handle the user entering beginning and end tank pressures
         * - maybe even IF we have samples. But for now if we have air pressure
         * data in the samples, we use that instead of the minimum
         * if (!cyl->end.mbar || pressure < cyl->end.mbar)
         */
-        cyl->end.mbar = pressure;
+       cyl->end.mbar = pressure;
+       return flags;
 }
 
 struct dive *fixup_dive(struct dive *dive)
@@ -171,6 +191,7 @@ struct dive *fixup_dive(struct dive *dive)
        int maxdepth = 0, mintemp = 0;
        int lastdepth = 0;
        int lasttemp = 0;
+       unsigned long flags = 0;
 
        for (i = 0; i < dive->samples; i++) {
                struct sample *sample = dive->sample + i;
@@ -188,7 +209,7 @@ struct dive *fixup_dive(struct dive *dive)
                                maxdepth = depth;
                }
 
-               fixup_pressure(dive, sample);
+               flags = fixup_pressure(dive, sample, flags);
 
                if (temp) {
                        /*