diff options
-rw-r--r-- | libdivecomputer.c | 4 | ||||
-rw-r--r-- | profile.c | 87 | ||||
-rw-r--r-- | uemis.c | 32 |
3 files changed, 77 insertions, 46 deletions
diff --git a/libdivecomputer.c b/libdivecomputer.c index 164b3a30f..dba6e6fe5 100644 --- a/libdivecomputer.c +++ b/libdivecomputer.c @@ -77,12 +77,12 @@ static void handle_event(struct divecomputer *dc, struct sample *sample, dc_samp /* we mark these for translation here, but we store the untranslated strings * and only translate them when they are displayed on screen */ static const char *events[] = { - N_("none"), N_("deco"), N_("rbt"), N_("ascent"), N_("ceiling"), N_("workload"), + N_("none"), N_("deco stop"), N_("rbt"), N_("ascent"), N_("ceiling"), N_("workload"), N_("transmitter"), N_("violation"), N_("bookmark"), N_("surface"), N_("safety stop"), N_("gaschange"), N_("safety stop (voluntary)"), N_("safety stop (mandatory)"), N_("deepstop"), N_("ceiling (safety stop)"), N_("unknown"), N_("divetime"), N_("maxdepth"), N_("OLF"), N_("PO2"), N_("airtime"), N_("rgbm"), N_("heading"), - N_("tissue level warning") + N_("tissue level warning"), N_("gaschange"), N_("non stop time") }; const int nr_events = sizeof(events) / sizeof(const char *); const char *name; @@ -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 @@ -19,6 +19,7 @@ #include "dive.h" #include "uemis.h" #include <libdivecomputer/parser.h> +#include <libdivecomputer/version.h> /* * following code is based on code found in at base64.sourceforge.net/b64.c @@ -101,8 +102,6 @@ bail: return datalen; } -static gboolean in_deco; - /* Create events from the flag bits and other data in the sample; * These bits basically represent what is displayed on screen at sample time. * Many of these 'warnings' are way hyper-active and seriously clutter the @@ -160,19 +159,21 @@ static void uemis_event(struct dive *dive, struct divecomputer *dc, struct sampl /* flags[7] reflects the little on screen icons that remind of previous * warnings / alerts - not useful for events */ - /* now add deco / ceiling events */ - if (u_sample->p_amb_tol > dive->surface_pressure.mbar && - u_sample->hold_time && - u_sample->hold_time < 99) { - add_event(dc, sample->time.seconds, SAMPLE_EVENT_CEILING, SAMPLE_FLAGS_BEGIN, - u_sample->hold_depth * 10, N_("ceiling")); - add_event(dc, sample->time.seconds, SAMPLE_EVENT_DECOSTOP, 0, - u_sample->hold_time * 60, N_("deco")); - in_deco = TRUE; - } else if (in_deco) { - in_deco = FALSE; - add_event(dc, sample->time.seconds, SAMPLE_EVENT_CEILING, SAMPLE_FLAGS_END, - 0, N_("ceiling")); + /* now add deco / NDL + * This will create an event for every sample (SUCK) but the + * code in the parser will then do the right thing and just + * keep the relevant ones */ + if (u_sample->p_amb_tol > dive->surface_pressure.mbar) { + if (u_sample->hold_time && u_sample->hold_time < 99) { + int hold_depth = u_sample->hold_depth / 100.0 + 0.5; + add_event(dc, sample->time.seconds, SAMPLE_EVENT_DECOSTOP, 0, + hold_depth | (u_sample->hold_time * 60) << 16 , N_("deco stop")); + } +#if DC_VERSION_CHECK(0, 3, 0) + } else { + add_event(dc, sample->time.seconds, SAMPLE_EVENT_NDL, 0, + u_sample->hold_time * 60, N_("non stop time")); +#endif } } @@ -189,7 +190,6 @@ void uemis_parse_divelog_binary(char *base64, void *datap) { struct divecomputer *dc = &dive->dc; int template, gasoffset; - in_deco = FALSE; datalen = uemis_convert_base64(base64, &data); dive->airtemp.mkelvin = *(uint16_t *)(data + 45) * 100 + 273150; |