From 82f143d2299fbe918cc24a6ea661cb3d8c8df6c4 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Fri, 16 Sep 2011 09:10:13 -0700 Subject: [PATCH] Plot pressure data based on 'struct plot_info' rather than raw dive data Further movement to using the sanitized and cleaned-up plot info rather than the raw data. The raw dive data contains samples from the end of the dive that we don't want to drop, but that we also don't want to actually use for plotting the dive. So the eventual end goal here is to not ever use the raw dive samples directly for plotting, but use the diveplot data that we have analyzed for min/max (properly ignoring final entries) etc. There's still some data that we take from the samples when plotting, but it's getting rarer. Signed-off-by: Linus Torvalds --- profile.c | 98 +++++++++++++++++++++---------------------------------- 1 file changed, 37 insertions(+), 61 deletions(-) diff --git a/profile.c b/profile.c index 2400321..7b2f31f 100644 --- a/profile.c +++ b/profile.c @@ -14,7 +14,7 @@ int selected_dive = 0; struct plot_info { int nr; int maxtime; - int maxdepth; + int meandepth, maxdepth; int minpressure, maxpressure; int mintemp, maxtemp; struct plot_data { @@ -77,9 +77,9 @@ static int get_maxtime(struct plot_info *pi) return MAX(30*60, ROUND_UP(seconds, 60*10)); } -static int round_depth_up(depth_t depth) +static int get_maxdepth(struct plot_info *pi) { - unsigned mm = depth.mm; + unsigned mm = pi->maxdepth; /* Minimum 30m */ return MAX(30000, ROUND_UP(mm+3000, 10000)); } @@ -181,13 +181,13 @@ static void plot_text_samples(struct graphics_context *gc, struct plot_info *pi) } } -static void plot_depth_text(struct dive *dive, struct graphics_context *gc, struct plot_info *pi) +static void plot_depth_text(struct graphics_context *gc, struct plot_info *pi) { int maxtime, maxdepth; /* Get plot scaling limits */ maxtime = get_maxtime(pi); - maxdepth = round_depth_up(dive->maxdepth); + maxdepth = get_maxdepth(pi); gc->leftx = 0; gc->rightx = maxtime; gc->topy = 0; gc->bottomy = maxdepth; @@ -238,7 +238,7 @@ static void plot_minmax_profile(struct graphics_context *gc, struct plot_info *p plot_minmax_profile_minute(gc, pi, 0, 0.1); } -static void plot_depth_profile(struct dive *dive, struct graphics_context *gc, struct plot_info *pi) +static void plot_depth_profile(struct graphics_context *gc, struct plot_info *pi) { int i; cairo_t *cr = gc->cr; @@ -248,7 +248,7 @@ static void plot_depth_profile(struct dive *dive, struct graphics_context *gc, s /* Get plot scaling limits */ maxtime = get_maxtime(pi); - maxdepth = round_depth_up(dive->maxdepth); + maxdepth = get_maxdepth(pi); /* Time markers: every 5 min */ gc->leftx = 0; gc->rightx = maxtime; @@ -275,8 +275,8 @@ static void plot_depth_profile(struct dive *dive, struct graphics_context *gc, s /* Show mean depth */ set_source_rgba(gc, 1, 0.2, 0.2, 0.40); - move_to(gc, 0, dive->meandepth.mm); - line_to(gc, 1, dive->meandepth.mm); + move_to(gc, 0, pi->meandepth); + line_to(gc, 1, pi->meandepth); cairo_stroke(cr); gc->leftx = 0; gc->rightx = maxtime; @@ -400,52 +400,20 @@ static void plot_temperature_profile(struct dive *dive, struct graphics_context } /* gets both the actual start and end pressure as well as the scaling factors */ -static int get_cylinder_pressure_range(struct dive *dive, struct graphics_context *gc, - struct plot_info *pi, - pressure_t *startp, pressure_t *endp) +static int get_cylinder_pressure_range(struct graphics_context *gc, struct plot_info *pi) { - int i; - int min, max; - gc->leftx = 0; gc->rightx = get_maxtime(pi); - max = 0; - min = 5000000; - if (startp) - startp->mbar = endp->mbar = 0; - - for (i = 0; i < dive->samples; i++) { - int mbar; - struct sample *sample = dive->sample + i; - - /* FIXME! We only track cylinder 0 right now */ - if (sample->cylinderindex) - continue; - mbar = sample->cylinderpressure.mbar; - if (!mbar) - continue; - if (mbar < min) - min = mbar; - if (mbar > max) - max = mbar; - } - if (startp) - startp->mbar = max; - if (endp) - endp->mbar = min; - if (!max) - return 0; - gc->topy = 0; gc->bottomy = max * 1.5; - return 1; + gc->topy = 0; gc->bottomy = pi->maxpressure * 1.5; + return pi->maxpressure != 0; } -static void plot_cylinder_pressure(struct dive *dive, struct graphics_context *gc, - struct plot_info *pi) +static void plot_cylinder_pressure(struct dive *dive, struct graphics_context *gc, struct plot_info *pi) { int i, sec = -1; - if (!get_cylinder_pressure_range(dive, gc, pi, NULL, NULL)) + if (!get_cylinder_pressure_range(gc, pi)) return; cairo_set_source_rgba(gc->cr, 0.2, 1.0, 0.2, 0.80); @@ -533,36 +501,39 @@ static void plot_info(struct dive *dive, struct graphics_context *gc) } } -static void plot_cylinder_pressure_text(struct dive *dive, struct graphics_context *gc, - struct plot_info *pi) +static int mbar_to_PSI(int mbar) { - pressure_t startp, endp; + pressure_t p = {mbar}; + return to_PSI(p); +} - if (get_cylinder_pressure_range(dive, gc, pi, &startp, &endp)) { +static void plot_cylinder_pressure_text(struct graphics_context *gc, struct plot_info *pi) +{ + if (get_cylinder_pressure_range(gc, pi)) { int start, end; const char *unit = "bar"; switch (output_units.pressure) { case PASCAL: - start = startp.mbar * 100; - end = startp.mbar * 100; + start = pi->maxpressure * 100; + end = pi->minpressure * 100; unit = "pascal"; break; case BAR: - start = (startp.mbar + 500) / 1000; - end = (endp.mbar + 500) / 1000; + start = (pi->maxpressure + 500) / 1000; + end = (pi->minpressure + 500) / 1000; unit = "bar"; break; case PSI: - start = to_PSI(startp); - end = to_PSI(endp); + start = mbar_to_PSI(pi->maxpressure); + end = mbar_to_PSI(pi->minpressure); unit = "psi"; break; } text_render_options_t tro = {10, 0.2, 1.0, 0.2, LEFT, TOP}; - plot_text(gc, &tro, 0, startp.mbar, "%d %s", start, unit); - plot_text(gc, &tro, dive->duration.seconds, endp.mbar, + plot_text(gc, &tro, 0, pi->maxpressure, "%d %s", start, unit); + plot_text(gc, &tro, pi->maxtime, pi->minpressure, "%d %s", end, unit); } } @@ -702,6 +673,11 @@ static struct plot_info *create_plot_info(struct dive *dive) pi->nr = lastindex+1; pi->maxtime = pi->entry[lastindex].sec; + pi->minpressure = dive->cylinder[0].end.mbar; + pi->maxpressure = dive->cylinder[0].start.mbar; + + pi->meandepth = dive->meandepth.mm; + return analyze_plot_info(pi); } @@ -734,12 +710,12 @@ void plot(struct graphics_context *gc, int w, int h, struct dive *dive) plot_cylinder_pressure(dive, gc, pi); /* Depth profile */ - plot_depth_profile(dive, gc, pi); + plot_depth_profile(gc, pi); /* Text on top of all graphs.. */ plot_temperature_text(gc, pi); - plot_depth_text(dive, gc, pi); - plot_cylinder_pressure_text(dive, gc, pi); + plot_depth_text(gc, pi); + plot_cylinder_pressure_text(gc, pi); /* And info box in the lower right corner.. */ gc->leftx = 0; gc->rightx = 1.0; -- 2.43.0