diff options
-rw-r--r-- | core/dive.c | 7 | ||||
-rw-r--r-- | core/dive.h | 5 | ||||
-rw-r--r-- | core/libdivecomputer.c | 51 |
3 files changed, 53 insertions, 10 deletions
diff --git a/core/dive.c b/core/dive.c index 6406242bf..8270c5478 100644 --- a/core/dive.c +++ b/core/dive.c @@ -648,6 +648,13 @@ struct sample *prepare_sample(struct divecomputer *dc) } sample = dc->sample + nr; memset(sample, 0, sizeof(*sample)); + + // Copy the sensor numbers - but not the pressure values + // from the previous sample if any. + if (nr) { + sample->sensor[0] = sample[-1].sensor[0]; + sample->sensor[1] = sample[-1].sensor[1]; + } return sample; } return NULL; diff --git a/core/dive.h b/core/dive.h index 2d1b761f0..df0c4107e 100644 --- a/core/dive.h +++ b/core/dive.h @@ -184,6 +184,7 @@ static inline int interpolate(int a, int b, int part, int whole) void get_gas_string(const struct gasmix *gasmix, char *text, int len); const char *gasname(const struct gasmix *gasmix); +#define MAX_SENSORS 2 struct sample // BASE TYPE BYTES UNITS RANGE DESCRIPTION { // --------- ----- ----- ----- ----------- duration_t time; // uint32_t 4 seconds (0-68 yrs) elapsed dive time up to this sample @@ -194,11 +195,11 @@ struct sample // BASE TYPE BYTES UNITS RANGE DE depth_t depth; // int32_t 4 mm (0-2000 km) dive depth of this sample depth_t stopdepth; // int32_t 4 mm (0-2000 km) depth of next deco stop temperature_t temperature; // int32_t 4 mdegrK (0-2 MdegK) ambient temperature - pressure_t pressure[2]; // int32_t 4 mbar (0-2 Mbar) cylinder pressures (main and CCR o2) + pressure_t pressure[MAX_SENSORS]; // int32_t 4 mbar (0-2 Mbar) cylinder pressures (main and CCR o2) o2pressure_t setpoint; // uint16_t 2 mbar (0-65 bar) O2 partial pressure (will be setpoint) o2pressure_t o2sensor[3]; // uint16_t 6 mbar (0-65 bar) Up to 3 PO2 sensor values (rebreather) bearing_t bearing; // int16_t 2 degrees (-32k to 32k deg) compass bearing - uint8_t sensor[2]; // uint8_t 1 sensorID (0-255) ID of cylinder pressure sensor + uint8_t sensor[MAX_SENSORS]; // uint8_t 1 sensorID (0-255) ID of cylinder pressure sensor uint8_t cns; // uint8_t 1 % (0-255 %) cns% accumulated uint8_t heartbeat; // uint8_t 1 beats/m (0-255) heart rate measurement volume_t sac; // 4 ml/min predefined SAC diff --git a/core/libdivecomputer.c b/core/libdivecomputer.c index c935ecbce..819db0226 100644 --- a/core/libdivecomputer.c +++ b/core/libdivecomputer.c @@ -307,6 +307,47 @@ static void handle_gasmix(struct divecomputer *dc, struct sample *sample, int id current_gas_index = idx; } +/* + * Adding a cylinder pressure sample field is not quite as trivial as it + * perhaps should be. + * + * We try to keep the same sensor index for the same sensor, so that even + * if the dive computer doesn't give pressure information for every sample, + * we don't move pressure information around between the different sensor + * indexes. + * + * The "prepare_sample()" function will always copy the sensor indices + * from the previous sample, so the indexes are pre-populated (but the + * pressures obviously are not) + */ +static void add_sample_pressure(struct sample *sample, int sensor, int mbar) +{ + int idx; + + if (!mbar) + return; + + /* Do we already have a slot for this sensor */ + for (idx = 0; idx < MAX_SENSORS; idx++) { + if (sensor != sample->sensor[idx]) + continue; + sample->pressure[idx].mbar = mbar; + return; + } + + /* Pick the first unused index if we couldn't reuse one */ + for (idx = 0; idx < MAX_SENSORS; idx++) { + if (sample->pressure[idx].mbar) + continue; + sample->sensor[idx] = sensor; + sample->pressure[idx].mbar = mbar; + return; + } + + /* We do not have enough slots for the pressure samples. */ + /* Should we warn the user about dropping pressure data? */ +} + void sample_cb(dc_sample_type_t type, dc_sample_value_t value, void *userdata) { @@ -352,15 +393,9 @@ sample_cb(dc_sample_type_t type, dc_sample_value_t value, void *userdata) case DC_SAMPLE_DEPTH: sample->depth.mm = lrint(value.depth * 1000); break; - case DC_SAMPLE_PRESSURE: { - int sensoridx = 0; - /* Do we already have a pressure reading? */ - if (sample->pressure[0].mbar) - sensoridx = 1; - sample->sensor[sensoridx] = value.pressure.tank; - sample->pressure[sensoridx].mbar = lrint(value.pressure.value * 1000); + case DC_SAMPLE_PRESSURE: + add_sample_pressure(sample, value.pressure.tank, lrint(value.pressure.value * 1000)); break; - } case DC_SAMPLE_GASMIX: handle_gasmix(dc, sample, value.gasmix); break; |