]> git.tdb.fi Git - ext/subsurface.git/blobdiff - profile.c
This should fix the missing end pressure for broken dive computers
[ext/subsurface.git] / profile.c
index f1f3761506fc1f5b65cbc6255b7c00ec4ef14ed2..f0ae0c9311c5eba3c3bc24130c01d8b02c36eb59 100644 (file)
--- a/profile.c
+++ b/profile.c
@@ -21,8 +21,7 @@ struct plot_info {
        int nr;
        int maxtime;
        int meandepth, maxdepth;
-       int minpressure, maxpressure;
-       int endpressure; /* start pressure better be max pressure */
+       int maxpressure;
        int mintemp, maxtemp;
        struct plot_data {
                unsigned int same_cylinder:1;
@@ -102,9 +101,9 @@ static void dump_pi (struct plot_info *pi)
        int i;
 
        printf("pi:{nr:%d maxtime:%d meandepth:%d maxdepth:%d \n"
-               "    minpressure:%d maxpressure:%d endpressure:%d mintemp:%d maxtemp:%d\n",
+               "    maxpressure:%d mintemp:%d maxtemp:%d\n",
                pi->nr, pi->maxtime, pi->meandepth, pi->maxdepth,
-               pi->minpressure, pi->maxpressure, pi->endpressure, pi->mintemp, pi->maxtemp);
+               pi->maxpressure, pi->mintemp, pi->maxtemp);
        for (i = 0; i < pi->nr; i++)
                printf("    entry[%d]:{same_cylinder:%d cylinderindex:%d sec:%d pressure:{%d,%d}\n"
                        "                temperature:%d depth:%d smoothed:%d}\n",
@@ -657,6 +656,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;
@@ -671,14 +672,19 @@ static void plot_cylinder_pressure_text(struct graphics_context *gc, struct plot
 
        /* 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) */
+        * 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;
                        }
@@ -686,14 +692,14 @@ 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);
+       if (GET_PRESSURE(entry))
+               last_pressure[cyl] = GET_PRESSURE(entry);
        last_time[cyl] = entry->sec;
 
        for (cyl = 0; cyl < MAX_CYLINDERS; cyl++) {
@@ -780,12 +786,10 @@ 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) {
-                       if (!pi->minpressure || pressure < pi->minpressure)
-                               pi->minpressure = pressure;
                        if (pressure > pi->maxpressure)
                                pi->maxpressure = pressure;
                }
@@ -931,6 +935,7 @@ static void fill_missing_tank_pressures(struct dive *dive, struct plot_info *pi,
                                if (!nlist) {
                                        /* just continue without calculating
                                         * interpolated values */
+                                       INTERPOLATED_PRESSURE(entry) = cur_pr[entry->cylinderindex];
                                        list = NULL;
                                        continue;
                                }
@@ -1167,10 +1172,17 @@ 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 */
+       /* 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;
+       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 */
@@ -1179,8 +1191,15 @@ static struct plot_info *create_plot_info(struct dive *dive, int nr_samples, str
                pi->nr++;
        pi->maxtime = pi->entry[lastindex].sec;
 
-       pi->endpressure = pi->minpressure = dive->cylinder[0].end.mbar;
-       pi->maxpressure = dive->cylinder[0].start.mbar;
+       /* Analyze_plot_info() will do the sample max pressures,
+        * this handles the manual pressures
+        */
+       pi->maxpressure = 0;
+       for (cyl = 0; cyl < MAX_CYLINDERS; cyl++) {
+               unsigned int mbar = dive->cylinder[cyl].start.mbar;
+               if (mbar > pi->maxpressure)
+                       pi->maxpressure = mbar;
+       }
 
        pi->meandepth = dive->meandepth.mm;