]> git.tdb.fi Git - ext/subsurface.git/blobdiff - dive.c
Merge branch 'ui-tweaks' of https://github.com/nathansamson/diveclog
[ext/subsurface.git] / dive.c
diff --git a/dive.c b/dive.c
index 9b7b072ba9a69d776aeb41b0544ee4031288b1af..7fe6eb17b863f0ceeef887d81636fcb77991a3e8 100644 (file)
--- a/dive.c
+++ b/dive.c
  */
 static void update_depth(depth_t *depth, int new)
 {
-       int old = depth->mm;
+       if (new) {
+               int old = depth->mm;
 
-       if (abs(old - new) > 1000)
-               depth->mm = new;
+               if (abs(old - new) > 1000)
+                       depth->mm = new;
+       }
+}
+
+static void update_pressure(pressure_t *pressure, int new)
+{
+       if (new) {
+               int old = pressure->mbar;
+
+               if (abs(old - new) > 1000)
+                       pressure->mbar = new;
+       }
+}
+
+static void update_duration(duration_t *duration, int new)
+{
+       if (new)
+               duration->seconds = new;
+}
+
+static void update_temperature(temperature_t *temperature, int new)
+{
+       if (new) {
+               int old = temperature->mkelvin;
+
+               if (abs(old - new) > 1000)
+                       temperature->mkelvin = new;
+       }
 }
 
 struct dive *fixup_dive(struct dive *dive)
@@ -34,15 +62,16 @@ struct dive *fixup_dive(struct dive *dive)
        int lasttime = 0;
        int start = -1, end = -1;
        int startpress = 0, endpress = 0;
-       int starttemp = 0, endtemp = 0;
        int maxdepth = 0, mintemp = 0;
        int lastdepth = 0;
+       int lasttemp = 0;
+       temperature_t *redundant_temp = NULL;
 
        for (i = 0; i < dive->samples; i++) {
                struct sample *sample = dive->sample + i;
                int time = sample->time.seconds;
                int depth = sample->depth.mm;
-               int press = sample->tankpressure.mbar;
+               int press = sample->cylinderpressure.mbar;
                int temp = sample->temperature.mkelvin;
 
                if (lastdepth)
@@ -60,9 +89,21 @@ struct dive *fixup_dive(struct dive *dive)
                                startpress = press;
                }
                if (temp) {
-                       endtemp = temp;
-                       if (!starttemp)
-                               starttemp = temp;
+                       /*
+                        * If we have consecutive identical
+                        * temperature readings, throw away
+                        * the redundant ones. We care about
+                        * the "edges" only.
+                        */
+                       if (lasttemp == temp) {
+                               if (redundant_temp)
+                                       redundant_temp->mkelvin = 0;
+                               redundant_temp = &sample->temperature;
+                       } else {
+                               redundant_temp = NULL;
+                               lasttemp = temp;
+                       }
+
                        if (!mintemp || temp < mintemp)
                                mintemp = temp;
                }
@@ -72,18 +113,16 @@ struct dive *fixup_dive(struct dive *dive)
        }
        if (end < 0)
                return dive;
-       dive->duration.seconds = end - start;
+
+       update_duration(&dive->duration, end - start);
        if (start != end)
-               update_depth(&dive->meandepth, depthtime / (end - start));
-       if (startpress)
-               dive->beginning_pressure.mbar = startpress;
-       if (endpress)
-               dive->end_pressure.mbar = endpress;
-       if (mintemp)
-               dive->watertemp.mkelvin = mintemp;
+               depthtime /= (end - start);
 
-       if (maxdepth)
-               update_depth(&dive->maxdepth, maxdepth);
+       update_depth(&dive->meandepth, depthtime);
+       update_pressure(&dive->beginning_pressure, startpress);
+       update_pressure(&dive->end_pressure, endpress);
+       update_temperature(&dive->watertemp, mintemp);
+       update_depth(&dive->maxdepth, maxdepth);
 
        return dive;
 }
@@ -168,10 +207,10 @@ add_sample_b:
                        sample.depth = as->depth;
                if (as->temperature.mkelvin)
                        sample.temperature = as->temperature;
-               if (as->tankpressure.mbar)
-                       sample.tankpressure = as->tankpressure;
-               if (as->tankindex)
-                       sample.tankindex = as->tankindex;
+               if (as->cylinderpressure.mbar)
+                       sample.cylinderpressure = as->cylinderpressure;
+               if (as->cylinderindex)
+                       sample.cylinderindex = as->cylinderindex;
 
                res = add_sample(&sample, at, res);
 
@@ -199,6 +238,27 @@ static char *merge_text(const char *a, const char *b)
        return res;
 }
 
+/* Pick whichever has any info (if either). Prefer 'a' */
+static void merge_cylinder_type(cylinder_type_t *res, cylinder_type_t *a, cylinder_type_t *b)
+{
+       if (a->size.mliter)
+               b = a;
+       *res = *b;
+}
+
+static void merge_cylinder_mix(gasmix_t *res, gasmix_t *a, gasmix_t *b)
+{
+       if (a->o2.permille)
+               b = a;
+       *res = *b;
+}
+
+static void merge_cylinder_info(cylinder_t *res, cylinder_t *a, cylinder_t *b)
+{
+       merge_cylinder_type(&res->type, &a->type, &b->type);
+       merge_cylinder_mix(&res->gasmix, &a->gasmix, &b->gasmix);
+}
+
 /*
  * This could do a lot more merging. Right now it really only
  * merges almost exact duplicates - something that happens easily
@@ -219,7 +279,6 @@ struct dive *try_to_merge(struct dive *a, struct dive *b)
        memset(res, 0, dive_size(alloc_samples));
 
        res->when = a->when;
-       res->name = merge_text(a->name, b->name);
        res->location = merge_text(a->location, b->location);
        res->notes = merge_text(a->notes, b->notes);
        MERGE_MAX(res, a, b, maxdepth.mm);
@@ -230,12 +289,8 @@ struct dive *try_to_merge(struct dive *a, struct dive *b)
        MERGE_MIN(res, a, b, watertemp.mkelvin);
        MERGE_MAX(res, a, b, beginning_pressure.mbar);
        MERGE_MAX(res, a, b, end_pressure.mbar);
-       for (i = 0; i < MAX_MIXES; i++) {
-               if (a->gasmix[i].o2.permille) {
-                       res->gasmix[i] = a->gasmix[i];
-                       continue;
-               }
-               res->gasmix[i] = b->gasmix[i];
-       }
+       for (i = 0; i < MAX_CYLINDERS; i++)
+               merge_cylinder_info(res->cylinder+i, a->cylinder + i, b->cylinder + i);
+
        return merge_samples(res, a, b, 0);
 }