From e7491d3bf50ad31bbee38abc9da823c9cbdb9cd1 Mon Sep 17 00:00:00 2001 From: Dirk Hohndel Date: Sat, 19 Nov 2011 14:43:37 -0500 Subject: [PATCH] Make pressure plot shading by sac rate consistent Some parts of the existing code used the depth at the time of the sample to calculate the sac rate - it makes much more sense to use the average depth. But that requires us to loop over the entries and average the individual sac rates per segment instead of just using the beginning and end depth of the multi-segment interval we use for smoothing purposes. This may seem like a subtle detail, but it does in fact matter when we plot the synthetic tank pressure values that we create when we have no tank pressure data in the samples. Another detail we change here is to not artificially start with a forward looking segment of the full SAC_WINDOW but instead just start with the first two data points and then simply let the time window grow until it hits SAC_WINDOW - at which point it becomes a sliding window. Signed-off-by: Dirk Hohndel --- profile.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/profile.c b/profile.c index 3b69f18..9fab8b2 100644 --- a/profile.c +++ b/profile.c @@ -670,19 +670,19 @@ static void plot_cylinder_pressure(struct graphics_context *gc, struct plot_info last = i; last_entry = entry; if (first_plot) { - /* don't start with a sac of 0 */ - int fe = i + 1; - struct plot_data *future_entry = pi->entry + fe; - while (fe < pi->nr && future_entry->sec - entry->sec < SAC_WINDOW) { - fe++; - future_entry = pi->entry + fe; - } - sac = GET_LOCAL_SAC(entry, future_entry, dive); + /* don't start with a sac of 0, so just calculate the first one */ + sac = GET_LOCAL_SAC(entry, pi->entry + i + 1, dive); + } + } else { + int j; + sac = 0; + for (j = last; j < i; j++) + sac += GET_LOCAL_SAC(pi->entry + j, pi->entry + j + 1, dive); + sac /= (i - last); + if (entry->sec - last_entry->sec >= SAC_WINDOW) { + last++; + last_entry = pi->entry + last; } - } else if (entry->sec - last_entry->sec >= SAC_WINDOW) { - sac = GET_LOCAL_SAC(last_entry, entry, dive); - last++; - last_entry = pi->entry + last; } set_sac_color(gc, sac, dive->sac); if (lift_pen) { @@ -998,10 +998,11 @@ static void fill_missing_tank_pressures(struct dive *dive, struct plot_info *pi, list = NULL; continue; } - magic = (nlist->end - cur_pr[entry->cylinderindex]) / pt; } + magic = (nlist->end - cur_pr[entry->cylinderindex]) / pt; + } if (pt != 0.0) { double cur_pt = (entry->sec - (entry-1)->sec) * - (1 + entry->depth / 10000.0); + (1 + (entry->depth + (entry-1)->depth) / 20000.0); INTERPOLATED_PRESSURE(entry) = cur_pr[entry->cylinderindex] + cur_pt * magic; cur_pr[entry->cylinderindex] = INTERPOLATED_PRESSURE(entry); @@ -1217,7 +1218,7 @@ static struct plot_info *create_plot_info(struct dive *dive, int nr_samples, str } /* finally, do the discrete integration to get the SAC rate equivalent */ current->pressure_time += (entry->sec - (entry-1)->sec) * - (1 + entry->depth / 10000.0); + (1 + (entry->depth + (entry-1)->depth) / 20000.0); missing_pr |= !SENSOR_PRESSURE(entry); } -- 2.45.2