diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2012-11-28 21:13:21 -0700 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2012-11-28 21:13:21 -0700 |
commit | 10fac7a6af7e95b45029372f32ce544c705f6887 (patch) | |
tree | 9777ea690e990051934d6ae38c0afb8963deb1ec /profile.c | |
parent | 7259cf5bb64f7cf914c216c4c46cef5f416bb5a6 (diff) | |
download | subsurface-10fac7a6af7e95b45029372f32ce544c705f6887.tar.gz |
Updating events for libdivecomputer 0.3 (and tracking uemis support)
I was a little too eager to add the deco feature to Subsurface. Jef and I
went back and forth a few more times and the definition of those events
changed. I guess I shouldn't have commited that code until the
corresponding libdivecomputer code had been pushed.
This commit now brings us in sync with the current master of
libdivecomputer (but should compile with 0.2 as well - only deco events
won't work then).
One issue that I see is that deco / ndl aren't really a good fit for the
event model. I actually disabled the drawing of the little yellow
triangles for ndl events as for example on the Uemis those events are
created whenever the remaining non stop time changes - and that can be
every few seconds.
The correct solution may be to treat this as a function of the samples,
but for now this works and is tested with both OSTC and Uemis SDA.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'profile.c')
-rw-r--r-- | profile.c | 87 |
1 files changed, 59 insertions, 28 deletions
@@ -16,6 +16,7 @@ #include "divelist.h" #include "color.h" #include "libdivecomputer/parser.h" +#include "libdivecomputer/version.h" int selected_dive = 0; char zoomed_plot = 0; @@ -369,27 +370,50 @@ static void plot_one_event(struct graphics_context *gc, struct plot_info *pi, st break; depth = data->depth; } - /* draw a little tirangular marker and attach tooltip */ - x = SCALEX(gc, event->time.seconds); - y = SCALEY(gc, depth); - set_source_rgba(gc, ALERT_BG); - cairo_move_to(gc->cr, x-15, y+6); - cairo_line_to(gc->cr, x-3 , y+6); - cairo_line_to(gc->cr, x-9, y-6); - cairo_line_to(gc->cr, x-15, y+6); - cairo_stroke_preserve(gc->cr); - cairo_fill(gc->cr); - set_source_rgba(gc, ALERT_FG); - cairo_move_to(gc->cr, x-9, y-3); - cairo_line_to(gc->cr, x-9, y+1); - cairo_move_to(gc->cr, x-9, y+4); - cairo_line_to(gc->cr, x-9, y+4); - cairo_stroke(gc->cr); + /* don't draw NDL event triangles */ + if (strcmp(event->name, "non stop time")) { + /* draw a little triangular marker and attach tooltip */ + x = SCALEX(gc, event->time.seconds); + y = SCALEY(gc, depth); + set_source_rgba(gc, ALERT_BG); + cairo_move_to(gc->cr, x-15, y+6); + cairo_line_to(gc->cr, x-3 , y+6); + cairo_line_to(gc->cr, x-9, y-6); + cairo_line_to(gc->cr, x-15, y+6); + cairo_stroke_preserve(gc->cr); + cairo_fill(gc->cr); + set_source_rgba(gc, ALERT_FG); + cairo_move_to(gc->cr, x-9, y-3); + cairo_line_to(gc->cr, x-9, y+1); + cairo_move_to(gc->cr, x-9, y+4); + cairo_line_to(gc->cr, x-9, y+4); + cairo_stroke(gc->cr); + } /* we display the event on screen - so translate */ - if (event->value) - snprintf(buffer, sizeof(buffer), "%s: %d", _(event->name), event->value); - else + if (event->value) { + if (event->type == SAMPLE_EVENT_DECOSTOP) { + /* deal with the packed depth / time data */ + int seconds = (event->value >> 16) % 60; + if (seconds) + snprintf(buffer, sizeof(buffer), "%s: %dmin %ds @ %dm", _(event->name), (event->value >> 16) / 60, + seconds, event->value & 0xFFFF); + else + snprintf(buffer, sizeof(buffer), "%s: %dmin @ %dm", _(event->name), (event->value >> 16) / 60, + event->value & 0xFFFF); +#if DC_VERSION_CHECK(0, 3, 0) + } else if (event->type == SAMPLE_EVENT_NDL) { + int seconds = event->value % 60; + if (seconds) + snprintf(buffer, sizeof(buffer), "%s: %dmin %ds", _(event->name), event->value / 60, seconds); + else + snprintf(buffer, sizeof(buffer), "%s: %dmin", _(event->name), event->value / 60); +#endif + } else { + snprintf(buffer, sizeof(buffer), "%s: %d", _(event->name), event->value); + } + } else { snprintf(buffer, sizeof(buffer), "%s", _(event->name)); + } attach_tooltip(x-15, y-6, 12, 12, buffer); } @@ -1690,7 +1714,7 @@ static struct plot_info *create_plot_info(struct dive *dive, struct divecomputer pr_track_t *pr_track, *current; gboolean missing_pr = FALSE; struct plot_data *entry = NULL; - struct event *ev, *ceil_ev; + struct event *ev, *deco_ev, *ndl_ev; double amb_pressure; /* we want to potentially add synthetic plot_info elements for the gas changes */ @@ -1716,7 +1740,8 @@ static struct plot_info *create_plot_info(struct dive *dive, struct divecomputer ev = get_next_event(ev->next, "gaschange"); } /* find the first deco/ceiling event (if any) */ - ceil_ev = get_next_event(dc->events, "ceiling"); + deco_ev = get_next_event(dc->events, "deco stop"); + ndl_ev = get_next_event(dc->events, "non stop time"); sec = 0; lastindex = 0; lastdepth = -1; @@ -1731,15 +1756,21 @@ static struct plot_info *create_plot_info(struct dive *dive, struct divecomputer continue; } entry = pi->entry + i + pi_idx; - while (ceil_ev && ceil_ev->time.seconds <= sample->time.seconds) { - struct event *next_ceil_ev = get_next_event(ceil_ev->next, "ceiling"); - if (!next_ceil_ev || next_ceil_ev->time.seconds > sample->time.seconds) + while (deco_ev && deco_ev->time.seconds <= sample->time.seconds) { + struct event *next_deco_ev = get_next_event(deco_ev->next, "deco stop"); + if (!next_deco_ev || next_deco_ev->time.seconds > sample->time.seconds) break; - ceil_ev = next_ceil_ev; + deco_ev = next_deco_ev; } - if (ceil_ev && ceil_ev->time.seconds <= sample->time.seconds) { - ceiling = ceil_ev->value; - ceil_ev = get_next_event(ceil_ev->next, "ceiling"); + if (deco_ev) + ndl_ev = get_next_event(deco_ev, "non stop time"); + /* if there is an NDL event that comes after the latest deco stop event but + * prior to this sample, then deco has ended */ + if (ndl_ev && ndl_ev->time.seconds <= sample->time.seconds) { + ceiling = 0; + } else if (deco_ev && deco_ev->time.seconds <= sample->time.seconds) { + ceiling = 1000 * (deco_ev->value & 0xffff); + deco_ev = get_next_event(deco_ev->next, "deco stop"); } while (ev && ev->time.seconds < sample->time.seconds) { /* insert two fake plot info structures for the end of |