Fix missing pressure plot at start of the dive in some situations

In some situations we could end up with no sample pressure and no
interpolated pressure at time = 0. This is now fixed.

Fix notes in test dive the exposed the issue.

Also change the code in create_plot_info to keep the number of samples and
the number of corresponding pi entries in separate variables. This avoids
future changes from breaking if they assume they can access
dive->sample[nr_samples - 1] (which is a reasonable assumption to make).

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Dirk Hohndel 2011-11-04 15:34:30 -07:00
parent 93d07f631a
commit 4b735521e2
2 changed files with 14 additions and 10 deletions

View file

@ -5,7 +5,7 @@
<temperature air='27.0 C' water='26.0 C' /> <temperature air='27.0 C' water='26.0 C' />
<location>8th test dive, with samples</location> <location>8th test dive, with samples</location>
<notes>SAC should be 0.93 cuft/min or 26.2 l/min <notes>SAC should be 0.93 cuft/min or 26.2 l/min
Tank pressure plotted incorrectly (issues with first sample of first tank). Tank pressure plotted correctly (linear approximation)
Descent light green Descent light green
First Ascent red, second orange, third yellow, last green First Ascent red, second orange, third yellow, last green
</notes> </notes>

View file

@ -660,8 +660,10 @@ static void plot_cylinder_pressure_text(struct graphics_context *gc, struct plot
if (!get_cylinder_pressure_range(gc, pi)) if (!get_cylinder_pressure_range(gc, pi))
return; return;
/* only loop over the actual events from the dive computer */ /* only loop over the actual events from the dive computer
for (i = 2; i < pi->nr; i++) { * plus the second synthetic event at the start (to make sure
* we get "time=0" right) */
for (i = 1; i < pi->nr; i++) {
entry = pi->entry + i; entry = pi->entry + i;
if (!entry->same_cylinder) { if (!entry->same_cylinder) {
@ -889,8 +891,9 @@ static void fill_missing_tank_pressures(struct dive *dive, struct plot_info *pi,
cur_pr[cyl] = track_pr[cyl]->start; cur_pr[cyl] = track_pr[cyl]->start;
} }
/* The first two are "fillers" */ /* The first two are "fillers", but in case we don't have a sample
for (i = 2; i < pi->nr; i++) { * at time 0 we need to process the second of them here */
for (i = 1; i < pi->nr; i++) {
entry = pi->entry + i; entry = pi->entry + i;
if (SENSOR_PRESSURE(entry)) { if (SENSOR_PRESSURE(entry)) {
cur_pr[entry->cylinderindex] = SENSOR_PRESSURE(entry); cur_pr[entry->cylinderindex] = SENSOR_PRESSURE(entry);
@ -929,7 +932,8 @@ static void fill_missing_tank_pressures(struct dive *dive, struct plot_info *pi,
INTERPOLATED_PRESSURE(entry) = INTERPOLATED_PRESSURE(entry) =
cur_pr[entry->cylinderindex] + cur_pt * magic; cur_pr[entry->cylinderindex] + cur_pt * magic;
cur_pr[entry->cylinderindex] = INTERPOLATED_PRESSURE(entry); cur_pr[entry->cylinderindex] = INTERPOLATED_PRESSURE(entry);
} } else
INTERPOLATED_PRESSURE(entry) = cur_pr[entry->cylinderindex];
} }
} }
} }
@ -1109,14 +1113,14 @@ static struct plot_info *create_plot_info(struct dive *dive, int nr_samples, str
entry = pi->entry + i + pi_idx; entry = pi->entry + i + pi_idx;
ev = get_next_gaschange(ev->next); ev = get_next_gaschange(ev->next);
} }
nr_samples += pi_idx - 2; nr = nr_samples + pi_idx - 2;
check_gas_change_events(dive, pi); check_gas_change_events(dive, pi);
for (cyl = 0; cyl < MAX_CYLINDERS; cyl++) /* initialize the start pressures */ for (cyl = 0; cyl < MAX_CYLINDERS; cyl++) /* initialize the start pressures */
track_pr[cyl] = pr_track_alloc(dive->cylinder[cyl].start.mbar, -1); track_pr[cyl] = pr_track_alloc(dive->cylinder[cyl].start.mbar, -1);
current = track_pr[pi->entry[2].cylinderindex]; current = track_pr[pi->entry[2].cylinderindex];
for (i = 0; i < nr_samples; i++) { for (i = 0; i < nr + 1; i++) {
entry = pi->entry + i + 2; entry = pi->entry + i + 1;
entry->same_cylinder = entry->cylinderindex == cylinderindex; entry->same_cylinder = entry->cylinderindex == cylinderindex;
cylinderindex = entry->cylinderindex; cylinderindex = entry->cylinderindex;
@ -1155,7 +1159,7 @@ static struct plot_info *create_plot_info(struct dive *dive, int nr_samples, str
} }
} }
/* Fill in the last two entries with empty values but valid times */ /* Fill in the last two entries with empty values but valid times */
i = nr_samples + 2; i = nr + 2;
pi->entry[i].sec = sec + 20; pi->entry[i].sec = sec + 20;
pi->entry[i+1].sec = sec + 40; pi->entry[i+1].sec = sec + 40;
/* the number of actual entries - we may have allocated more if there /* the number of actual entries - we may have allocated more if there