]> git.tdb.fi Git - ext/subsurface.git/blobdiff - profile.c
Fix breakage caused by Linus' changes to tank pressure handling
[ext/subsurface.git] / profile.c
index e5d8aa9b9065d5cc335e9a74413da3bd2eae1aae..7fc7850394f6c0312364cca5e390a5ff833375f8 100644 (file)
--- a/profile.c
+++ b/profile.c
@@ -648,6 +648,8 @@ static void plot_pressure_value(struct graphics_context *gc, int mbar, int sec,
        plot_text(gc, &tro, sec, mbar, "%d %s", pressure, unit);
 }
 
+#define GET_PRESSURE(_entry) (SENSOR_PRESSURE(_entry) ? : INTERPOLATED_PRESSURE(_entry))
+
 static void plot_cylinder_pressure_text(struct graphics_context *gc, struct plot_info *pi)
 {
        int i;
@@ -660,14 +662,21 @@ static void plot_cylinder_pressure_text(struct graphics_context *gc, struct plot
        if (!get_cylinder_pressure_range(gc, pi))
                return;
 
-       /* only loop over the actual events from the dive computer */
-       for (i = 2; i < pi->nr; i++) {
+       /* only loop over the actual events from the dive computer
+        * plus the second synthetic event at the start (to make sure
+        * we get "time=0" right)
+        * sadly with a recent change that first entry may no longer
+        * have any pressure reading - in that case just grab the
+        * pressure from the second entry */
+       if (GET_PRESSURE(pi->entry + 1) == 0 && GET_PRESSURE(pi->entry + 2) !=0)
+               INTERPOLATED_PRESSURE(pi->entry + 1) = GET_PRESSURE(pi->entry + 2);
+       for (i = 1; i < pi->nr; i++) {
                entry = pi->entry + i;
 
                if (!entry->same_cylinder) {
                        cyl = entry->cylinderindex;
                        if (!seen_cyl[cyl]) {
-                               mbar = SENSOR_PRESSURE(entry) ? : INTERPOLATED_PRESSURE(entry);
+                               mbar = GET_PRESSURE(entry);
                                plot_pressure_value(gc, mbar, entry->sec, LEFT, BOTTOM);
                                seen_cyl[cyl] = TRUE;
                        }
@@ -675,14 +684,13 @@ static void plot_cylinder_pressure_text(struct graphics_context *gc, struct plot
                                /* remember the last pressure and time of
                                 * the previous cylinder */
                                cyl = (entry - 1)->cylinderindex;
-                               last_pressure[cyl] =
-                                       SENSOR_PRESSURE(entry - 1) ? : INTERPOLATED_PRESSURE(entry - 1);
+                               last_pressure[cyl] = GET_PRESSURE(entry - 1);
                                last_time[cyl] = (entry - 1)->sec;
                        }
                }
        }
        cyl = entry->cylinderindex;
-       last_pressure[cyl] = SENSOR_PRESSURE(entry) ? : INTERPOLATED_PRESSURE(entry);
+       last_pressure[cyl] = GET_PRESSURE(entry);
        last_time[cyl] = entry->sec;
 
        for (cyl = 0; cyl < MAX_CYLINDERS; cyl++) {
@@ -769,7 +777,7 @@ static struct plot_info *analyze_plot_info(struct plot_info *pi)
        /* Do pressure min/max based on the non-surface data */
        for (i = 0; i < nr; i++) {
                struct plot_data *entry = pi->entry+i;
-               int pressure = SENSOR_PRESSURE(entry) ? : INTERPOLATED_PRESSURE(entry);
+               int pressure = GET_PRESSURE(entry);
                int temperature = entry->temperature;
 
                if (pressure) {
@@ -889,8 +897,9 @@ static void fill_missing_tank_pressures(struct dive *dive, struct plot_info *pi,
                cur_pr[cyl] = track_pr[cyl]->start;
        }
 
-       /* The first two are "fillers" */
-       for (i = 2; i < pi->nr; i++) {
+       /* The first two are "fillers", but in case we don't have a sample
+        * at time 0 we need to process the second of them here */
+       for (i = 1; i < pi->nr; i++) {
                entry = pi->entry + i;
                if (SENSOR_PRESSURE(entry)) {
                        cur_pr[entry->cylinderindex] = SENSOR_PRESSURE(entry);
@@ -929,7 +938,8 @@ static void fill_missing_tank_pressures(struct dive *dive, struct plot_info *pi,
                                INTERPOLATED_PRESSURE(entry) =
                                        cur_pr[entry->cylinderindex] + cur_pt * magic;
                                cur_pr[entry->cylinderindex] = INTERPOLATED_PRESSURE(entry);
-                       }
+                       } else
+                               INTERPOLATED_PRESSURE(entry) = cur_pr[entry->cylinderindex];
                }
        }
 }
@@ -1094,7 +1104,7 @@ static struct plot_info *create_plot_info(struct dive *dive, int nr_samples, str
                entry->temperature = sample->temperature.mkelvin;
 
                if (depth || lastdepth)
-                       lastindex = i+pi_idx;
+                       lastindex = i + pi_idx;
 
                lastdepth = depth;
                if (depth > pi->maxdepth)
@@ -1109,14 +1119,14 @@ static struct plot_info *create_plot_info(struct dive *dive, int nr_samples, str
                entry = pi->entry + i + pi_idx;
                ev = get_next_gaschange(ev->next);
        }
-       nr_samples += pi_idx - 2;
+       nr = nr_samples + pi_idx - 2;
        check_gas_change_events(dive, pi);
 
        for (cyl = 0; cyl < MAX_CYLINDERS; cyl++) /* initialize the start pressures */
                track_pr[cyl] = pr_track_alloc(dive->cylinder[cyl].start.mbar, -1);
        current = track_pr[pi->entry[2].cylinderindex];
-       for (i = 0; i < nr_samples; i++) {
-               entry = pi->entry + i + 2;
+       for (i = 0; i < nr + 1; i++) {
+               entry = pi->entry + i + 1;
 
                entry->same_cylinder = entry->cylinderindex == cylinderindex;
                cylinderindex = entry->cylinderindex;
@@ -1154,13 +1164,23 @@ static struct plot_info *create_plot_info(struct dive *dive, int nr_samples, str
                        pr_track->end = pr;
                }
        }
-       /* Fill in the last two entries with empty values but valid times */
-       i = nr_samples + 2;
+       /* Fill in the last two entries with empty values but valid times
+        * without creating a false cylinder change event */
+       i = nr + 2;
        pi->entry[i].sec = sec + 20;
+       pi->entry[i].same_cylinder = 1;
+       pi->entry[i].cylinderindex = pi->entry[i-1].cylinderindex;
+       INTERPOLATED_PRESSURE(pi->entry + i) = GET_PRESSURE(pi->entry + i - 1);
        pi->entry[i+1].sec = sec + 40;
-       /* the number of actual entries - we may have allocated more if there
-        * were gas change events, but this is how many were filled */
+       pi->entry[i+1].same_cylinder = 1;
+       pi->entry[i+1].cylinderindex = pi->entry[i-1].cylinderindex;
+       INTERPOLATED_PRESSURE(pi->entry + i + 1) = GET_PRESSURE(pi->entry + i - 1);
+       /* the number of actual entries - some computers have lots of
+        * depth 0 samples at the end of a dive, we want to make sure
+        * we have exactly one of them at the end */
        pi->nr = lastindex+1;
+       while (pi->nr <= i+2 && pi->entry[pi->nr-1].depth > 0)
+               pi->nr++;
        pi->maxtime = pi->entry[lastindex].sec;
 
        pi->endpressure = pi->minpressure = dive->cylinder[0].end.mbar;