summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/dive.c7
-rw-r--r--core/dive.h5
-rw-r--r--core/libdivecomputer.c51
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;