diff options
-rw-r--r-- | dive.c | 25 | ||||
-rw-r--r-- | dive.h | 1 | ||||
-rw-r--r-- | profile.c | 18 | ||||
-rw-r--r-- | qt-ui/profile/diveeventitem.cpp | 15 | ||||
-rw-r--r-- | statistics.c | 2 |
5 files changed, 50 insertions, 11 deletions
@@ -782,6 +782,19 @@ static int same_rounded_pressure(pressure_t a, pressure_t b) return abs(a.mbar - b.mbar) <= 500; } +/* Some dive computers (Cobalt) don't start the dive with cylinder 0 but explicitly + * tell us what the first gas is with a gas change event in the first sample. + * Sneakily we'll use a return value of 0 (or FALSE) when there is no explicit + * first cylinder - in which case cylinder 0 is indeed the first cylinder */ +int explicit_first_cylinder(struct dive *dive, struct divecomputer *dc) +{ + struct event *ev = get_next_event(dc->events, "gaschange"); + if (ev && ev->time.seconds == dc->sample[0].time.seconds) + return get_cylinder_index(dive, ev); + else + return 0; +} + void sanitize_gasmix(struct gasmix *mix) { unsigned int o2, he; @@ -1095,10 +1108,14 @@ static void fixup_dive_dc(struct dive *dive, struct divecomputer *dc) int lasto2val[3] = { 0, 0, 0 }; int lasttemp = 0, lastpressure = 0, lastdiluentpressure = 0; int pressure_delta[MAX_CYLINDERS] = { INT_MAX, }; + int first_cylinder; /* Fixup duration and mean depth */ fixup_dc_duration(dc); update_min_max_temperatures(dive, dc->watertemp); + + /* make sure we know for which tank the pressure values are intended */ + first_cylinder = explicit_first_cylinder(dive, dc); for (i = 0; i < dc->samples; i++) { struct sample *sample = dc->sample + i; int time = sample->time.seconds; @@ -1106,7 +1123,13 @@ static void fixup_dive_dc(struct dive *dive, struct divecomputer *dc) int temp = sample->temperature.mkelvin; int pressure = sample->cylinderpressure.mbar; int diluent_pressure = sample->diluentpressure.mbar; - int index = sample->sensor; + int index; + + /* if we have an explicit first cylinder */ + if (sample->sensor == 0 && first_cylinder != 0) + sample->sensor = first_cylinder; + + index = sample->sensor; if (index == lastindex) { /* Remove duplicate redundant pressure information */ @@ -360,6 +360,7 @@ extern unsigned int dive_get_picture_count(struct dive *d); extern void picture_load_exif_data(struct picture *p, timestamp_t *timestamp); extern void dive_set_geodata_from_picture(struct dive *d, struct picture *pic); +extern int explicit_first_cylinder(struct dive *dive, struct divecomputer *dc); static inline int dive_has_gps_location(struct dive *dive) { @@ -378,6 +378,19 @@ static int set_cylinder_index(struct plot_info *pi, int i, int cylinderindex, un return i; } +/* normally the first cylinder has index 0... if not, we need to fix this up here */ +static int set_first_cylinder_index(struct plot_info *pi, int i, int cylinderindex, unsigned int end) +{ + while (i < pi->nr) { + struct plot_data *entry = pi->entry + i; + if (entry->sec > end) + break; + entry->cylinderindex = cylinderindex; + i++; + } + return i; +} + static void check_gas_change_events(struct dive *dive, struct divecomputer *dc, struct plot_info *pi) { int i = 0, cylinderindex = 0; @@ -386,6 +399,11 @@ static void check_gas_change_events(struct dive *dive, struct divecomputer *dc, if (!ev) return; + // for dive computers that tell us their first gas as an event on the first sample + // we need to make sure things are setup correctly + if ((cylinderindex = explicit_first_cylinder(dive, dc)) != 0) + set_first_cylinder_index(pi, 0, cylinderindex, ~0u); + do { i = set_cylinder_index(pi, i, cylinderindex, ev->time.seconds); cylinderindex = get_cylinder_index(dive, ev); diff --git a/qt-ui/profile/diveeventitem.cpp b/qt-ui/profile/diveeventitem.cpp index bd22c0db9..bd9735a96 100644 --- a/qt-ui/profile/diveeventitem.cpp +++ b/qt-ui/profile/diveeventitem.cpp @@ -127,16 +127,13 @@ bool DiveEventItem::shouldBeHidden() struct event *event = internalEvent; /* - * Gas change events - particularly at the beginning of a dive - are - * special. It's just the dive computer specifying the initial gas. - * - * Don't bother showing them if they match the first gas already + * Some gas change events are special. Some dive computers just tell us the initial gas this way. + * Don't bother showing those */ - if (!strcmp(event->name, "gaschange") && event->time.seconds <= 30) { - struct dive *dive = &displayed_dive; - if (dive && get_cylinder_index(dive, event) == 0) - return true; - } + struct sample *first_sample = &get_dive_dc(&displayed_dive, dc_number)->sample[0]; + if (!strcmp(event->name, "gaschange") && (event->time.seconds < 30 || event->time.seconds == first_sample->time.seconds)) + return true; + for (int i = 0; i < evn_used; i++) { if (!strcmp(event->name, ev_namelist[i].ev_name) && ev_namelist[i].plot_ev == false) return true; diff --git a/statistics.c b/statistics.c index 01adf4f14..d78e4a862 100644 --- a/statistics.c +++ b/statistics.c @@ -302,7 +302,7 @@ bool is_cylinder_used(struct dive *dive, int idx) for_each_dc(dive, dc) { struct event *event = get_next_event(dc->events, "gaschange"); while (event) { - if (event->time.seconds < 30) + if (event->time.seconds < 30 || event->time.seconds == dc->sample[0].time.seconds) firstGasExplicit = true; if (get_cylinder_index(dive, event) == idx) return true; |