]> git.tdb.fi Git - ext/subsurface.git/commitdiff
Exclude surface intervals from sac rate calculation
authorDirk Hohndel <dirk@hohndel.org>
Mon, 21 Nov 2011 21:23:13 +0000 (13:23 -0800)
committerDirk Hohndel <dirk@hohndel.org>
Mon, 21 Nov 2011 21:23:13 +0000 (13:23 -0800)
We assume every sample with a depth of less than 10cm to be on the
surface.

This does not impact our interpolated pressures (one could assume that the
diver is not breathing from the regulator when on the surface - but
without air integration that's just an assumption).

It also doesn't change our tank pressure coloring by sac rate as that
always uses the momentary sac rate. Technically speaking this might impact
the actual colors printed (as those are relative to the total sac on the
dive which may go up due to this change).

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
divelist.c

index 48a9ea99a5030fd679dd773190fa3405b388f263..a8afd3ac2e5aac5540bd0faef71d3863c33d8c4c 100644 (file)
@@ -320,6 +320,7 @@ static double calculate_airuse(struct dive *dive)
 static int calculate_sac(struct dive *dive)
 {
        double airuse, pressure, sac;
+       int duration, i;
 
        airuse = calculate_airuse(dive);
        if (!airuse)
@@ -327,9 +328,25 @@ static int calculate_sac(struct dive *dive)
        if (!dive->duration.seconds)
                return 0;
 
+       /* find and eliminate long surface intervals */
+       duration = dive->duration.seconds;
+       for (i = 0; i < dive->samples; i++) {
+               if (dive->sample[i].depth.mm < 100) { /* less than 10cm */
+                       int end = i + 1;
+                       while (end < dive->samples && dive->sample[end].depth.mm < 100)
+                               end++;
+                       /* we only want the actual surface time during a dive */
+                       if (end < dive->samples) {
+                               end--;
+                               duration -= dive->sample[end].time.seconds -
+                                               dive->sample[i].time.seconds;
+                               i = end + 1;
+                       }
+               }
+       }
        /* Mean pressure in atm: 1 atm per 10m */
        pressure = 1 + (dive->meandepth.mm / 10000.0);
-       sac = airuse / pressure * 60 / dive->duration.seconds;
+       sac = airuse / pressure * 60 / duration;
 
        /* milliliters per minute.. */
        return sac * 1000;