diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-09-16 09:10:13 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-09-16 09:10:13 -0700 |
commit | 82f143d2299fbe918cc24a6ea661cb3d8c8df6c4 (patch) | |
tree | aebb3f6536d32b8e1c2e5872717e282c202611c2 /profile.c | |
parent | 7c5c9e202408bf4ec86c84826ebc7b2ba0d00c2d (diff) | |
download | subsurface-82f143d2299fbe918cc24a6ea661cb3d8c8df6c4.tar.gz |
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 <torvalds@linux-foundation.org>
Diffstat (limited to 'profile.c')
-rw-r--r-- | profile.c | 98 |
1 files changed, 37 insertions, 61 deletions
@@ -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; |