diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2011-11-04 15:34:30 -0700 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2011-11-04 15:38:46 -0700 |
commit | 4b735521e2561fe6d03f9f94122fbdc58f48e4a5 (patch) | |
tree | 9a76d724b1df37d3590915421891e8148d419033 | |
parent | 93d07f631aec470fb9f920f66ccb03ce699942b5 (diff) | |
download | subsurface-4b735521e2561fe6d03f9f94122fbdc58f48e4a5.tar.gz |
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>
-rw-r--r-- | dives/test8.xml | 2 | ||||
-rw-r--r-- | profile.c | 22 |
2 files changed, 14 insertions, 10 deletions
diff --git a/dives/test8.xml b/dives/test8.xml index 97097348c..d2edfc495 100644 --- a/dives/test8.xml +++ b/dives/test8.xml @@ -5,7 +5,7 @@ <temperature air='27.0 C' water='26.0 C' /> <location>8th test dive, with samples</location> <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 First Ascent red, second orange, third yellow, last green </notes> @@ -660,8 +660,10 @@ 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) */ + for (i = 1; i < pi->nr; i++) { entry = pi->entry + i; 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; } - /* 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 +932,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]; } } } @@ -1109,14 +1113,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; @@ -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 */ - i = nr_samples + 2; + i = nr + 2; pi->entry[i].sec = sec + 20; pi->entry[i+1].sec = sec + 40; /* the number of actual entries - we may have allocated more if there |