From 55156e63c3bf3baa4b07f2d40bb15d1ab8d87ec3 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Tue, 13 Sep 2011 08:16:29 -0700 Subject: [PATCH] Label the temperature graph Oooh, pretty. Or not. The temperature graph is usually ugly as hell, but Dirk has the cool dive computer with lots and lots of temperature readings. Which makes the graph a pretty graph, rather than a butt-ugly staircase like mine. Next time: get a dive computer with an OLED screen, and that can draw pretty temperature graphs. Signed-off-by: Linus Torvalds --- profile.c | 76 ++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 59 insertions(+), 17 deletions(-) diff --git a/profile.c b/profile.c index 551918b..be9a334 100644 --- a/profile.c +++ b/profile.c @@ -297,11 +297,9 @@ static void plot_depth_profile(struct dive *dive, struct graphics_context *gc, s cairo_stroke(cr); } -static void plot_temperature_profile(struct dive *dive, struct graphics_context *gc) +static int setup_temperature_limits(struct dive *dive, struct graphics_context *gc) { int i; - cairo_t *cr = gc->cr; - int begins = 0, sec = 0; int maxtime, mintemp, maxtemp; /* Get plot scaling limits */ @@ -313,32 +311,75 @@ static void plot_temperature_profile(struct dive *dive, struct graphics_context int mkelvin = sample->temperature.mkelvin; if (!mkelvin) continue; - if (!begins) { - begins = mkelvin; - sec = sample->time.seconds; - } if (mkelvin > maxtemp) maxtemp = mkelvin; if (mkelvin < mintemp) mintemp = mkelvin; } - if (mintemp >= maxtemp) - return; gc->leftx = 0; gc->rightx = maxtime; /* Show temperatures in roughly the lower third */ gc->topy = maxtemp + (maxtemp - mintemp)*2; gc->bottomy = mintemp - (maxtemp - mintemp)/2; - cairo_set_source_rgba(cr, 0.2, 0.2, 1.0, 0.8); - move_to(gc, sec, begins); + return maxtemp > mintemp; +} + +static void plot_temperature_text(struct dive *dive, struct graphics_context *gc) +{ + int i; + static const text_render_options_t tro = {12, 0.2, 0.2, 1.0, LEFT, TOP}; + + int last = 0; + + if (!setup_temperature_limits(dive, gc)) + return; + for (i = 0; i < dive->samples; i++) { + const char *unit; struct sample *sample = dive->sample+i; int mkelvin = sample->temperature.mkelvin; + int sec, deg; if (!mkelvin) - mkelvin = begins; - line_to(gc, sample->time.seconds, mkelvin); - begins = mkelvin; + continue; + sec = sample->time.seconds; + if (sec < last) + continue; + last = sec + 300; + if (output_units.temperature == FAHRENHEIT) { + deg = to_F(sample->temperature); + unit = "F"; + } else { + deg = to_C(sample->temperature); + unit = "C"; + } + plot_text(gc, &tro, sec, mkelvin, "%d %s", deg, unit); + } +} + +static void plot_temperature_profile(struct dive *dive, struct graphics_context *gc) +{ + int i; + cairo_t *cr = gc->cr; + int last = 0; + + if (!setup_temperature_limits(dive, gc)) + return; + + cairo_set_source_rgba(cr, 0.2, 0.2, 1.0, 0.8); + for (i = 0; i < dive->samples; i++) { + struct sample *sample = dive->sample+i; + int mkelvin = sample->temperature.mkelvin; + if (!mkelvin) { + if (!last) + continue; + mkelvin = last; + } + if (last) + line_to(gc, sample->time.seconds, mkelvin); + else + move_to(gc, sample->time.seconds, mkelvin); + last = mkelvin; } cairo_stroke(cr); } @@ -625,16 +666,17 @@ static void plot(struct graphics_context *gc, int w, int h, struct dive *dive) gc->maxx = (w - 2*topx); gc->maxy = (h - 2*topy); + /* Temperature profile */ + plot_temperature_profile(dive, gc); + /* Cylinder pressure plot */ plot_cylinder_pressure(dive, gc); /* Depth profile */ plot_depth_profile(dive, gc, pi); - /* Temperature profile */ - plot_temperature_profile(dive, gc); - /* Text on top of all graphs.. */ + plot_temperature_text(dive, gc); plot_depth_text(dive, gc, pi); plot_cylinder_pressure_text(dive, gc); -- 2.45.2