From 99d1cecf067daca5d7ed45effac659150e978504 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Mon, 29 Aug 2016 14:07:17 -0700 Subject: Hacky workaround for multiple gas pressures per sample In subsurface, we only have one cylinder pressure per sample (well, technically two: we have a separate o2 pressure for rebreather diving). Which makes things "interesting" if the dive computer can actually have multiple pressure sensors, and can report them all concurrently. Like the Suunto EON Steel. We used to just take the last one (each sensor reading would just overwrite any previous ones), and this quick hack just changes the logic to prefer the "current" cylinder instead. It's wrong, and it's stupid, but it's the best we can do without major surgery. Signed-off-by: Linus Torvalds Signed-off-by: Dirk Hohndel --- core/libdivecomputer.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'core') diff --git a/core/libdivecomputer.c b/core/libdivecomputer.c index 5ba445390..90c2c61cb 100644 --- a/core/libdivecomputer.c +++ b/core/libdivecomputer.c @@ -43,6 +43,7 @@ double progress_bar_fraction = 0.0; static int stoptime, stopdepth, ndl, po2, cns; static bool in_deco, first_temp_is_air; +static int current_gas_index; /* * Directly taken from libdivecomputer's examples/common.c to improve @@ -215,6 +216,8 @@ static int parse_gasmixes(device_data_t *devdata, struct dive *dive, dc_parser_t static void handle_event(struct divecomputer *dc, struct sample *sample, dc_sample_value_t value) { int type, time; + struct event *ev; + /* 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[] = { @@ -244,7 +247,9 @@ static void handle_event(struct divecomputer *dc, struct sample *sample, dc_samp if (sample) time += sample->time.seconds; - add_event(dc, time, type, value.event.flags, value.event.value, name); + ev = add_event(dc, time, type, value.event.flags, value.event.value, name); + if (event_is_gaschange(ev) && ev->gas.index >= 0) + current_gas_index = ev->gas.index; } void @@ -293,6 +298,13 @@ sample_cb(dc_sample_type_t type, dc_sample_value_t value, void *userdata) sample->depth.mm = rint(value.depth * 1000); break; case DC_SAMPLE_PRESSURE: + /* Do we already have a pressure reading? */ + if (sample->cylinderpressure.mbar) { + /* Do we prefer the one we already have? */ + /* If so, just ignore the new one */ + if (sample->sensor == current_gas_index) + break; + } sample->sensor = value.pressure.tank; sample->cylinderpressure.mbar = rint(value.pressure.value * 1000); break; @@ -699,6 +711,7 @@ static int dive_cb(const unsigned char *data, unsigned int size, /* reset the deco / ndl data */ ndl = stoptime = stopdepth = 0; in_deco = false; + current_gas_index = -1; rc = create_parser(devdata, &parser); if (rc != DC_STATUS_SUCCESS) { -- cgit v1.2.3-70-g09d2