diff --git a/examples/output_xml.c b/examples/output_xml.c
index 882680a..f4c312d 100644
--- a/examples/output_xml.c
+++ b/examples/output_xml.c
@@ -157,7 +157,11 @@ sample_cb (dc_sample_type_t type, dc_sample_value_t value, void *userdata)
fprintf (sampledata->ostream, " %.2f\n", value.setpoint);
break;
case DC_SAMPLE_PPO2:
- fprintf (sampledata->ostream, " %.2f\n", value.ppo2);
+ if (value.ppo2.sensor != DC_SENSOR_NONE) {
+ fprintf (sampledata->ostream, " %.2f\n", value.ppo2.sensor, value.ppo2.value);
+ } else {
+ fprintf (sampledata->ostream, " %.2f\n", value.ppo2.value);
+ }
break;
case DC_SAMPLE_CNS:
fprintf (sampledata->ostream, " %.1f\n", value.cns * 100.0);
diff --git a/include/libdivecomputer/parser.h b/include/libdivecomputer/parser.h
index de1bbc1..c4d0a72 100644
--- a/include/libdivecomputer/parser.h
+++ b/include/libdivecomputer/parser.h
@@ -147,6 +147,7 @@ typedef struct dc_gasmix_t {
double nitrogen;
} dc_gasmix_t;
+#define DC_SENSOR_NONE 0xFFFFFFFF
#define DC_GASMIX_UNKNOWN 0xFFFFFFFF
typedef enum dc_tankvolume_t {
@@ -247,7 +248,10 @@ typedef union dc_sample_value_t {
const void *data;
} vendor;
double setpoint;
- double ppo2;
+ struct {
+ unsigned int sensor;
+ double value;
+ } ppo2;
double cns;
struct {
unsigned int type;
diff --git a/src/diverite_nitekq_parser.c b/src/diverite_nitekq_parser.c
index dec8204..6cfd9bc 100644
--- a/src/diverite_nitekq_parser.c
+++ b/src/diverite_nitekq_parser.c
@@ -293,7 +293,8 @@ diverite_nitekq_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callbac
if (offset + 1 > size)
return DC_STATUS_DATAFORMAT;
unsigned int ppo2 = data[offset];
- sample.ppo2 = ppo2 / 100.0;
+ sample.ppo2.sensor = DC_SENSOR_NONE;
+ sample.ppo2.value = ppo2 / 100.0;
if (callback) callback (DC_SAMPLE_PPO2, sample, userdata);
offset++;
}
diff --git a/src/divesoft_freedom_parser.c b/src/divesoft_freedom_parser.c
index 6280dbf..1f0b7b3 100644
--- a/src/divesoft_freedom_parser.c
+++ b/src/divesoft_freedom_parser.c
@@ -946,7 +946,8 @@ divesoft_freedom_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callba
if (callback) callback(DC_SAMPLE_DEPTH, sample, userdata);
if (ppo2) {
- sample.ppo2 = ppo2 * 10.0 / BAR;
+ sample.ppo2.sensor = DC_SENSOR_NONE;
+ sample.ppo2.value = ppo2 * 10.0 / BAR;
if (callback) callback(DC_SAMPLE_PPO2, sample, userdata);
}
@@ -1045,7 +1046,8 @@ divesoft_freedom_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callba
unsigned int ppo2 = array_uint16_le (data + offset + 4 + i * 2);
if (ppo2 == 0 || ppo2 == 0xFFFF)
continue;
- sample.ppo2 = ppo2 * 10.0 / BAR;
+ sample.ppo2.sensor = i;
+ sample.ppo2.value = ppo2 * 10.0 / BAR;
if (callback) callback(DC_SAMPLE_PPO2, sample, userdata);
}
} else if (id == MEASURE_ID_OXYGEN_MV) {
@@ -1055,7 +1057,8 @@ divesoft_freedom_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callba
if (!parser->calibrated || state == SENSTAT_UNCALIBRATED ||
state == SENSTAT_NOT_EXIST)
continue;
- sample.ppo2 = value / 100.0 * parser->calibration[i] / BAR;
+ sample.ppo2.sensor = i;
+ sample.ppo2.value = value / 100.0 * parser->calibration[i] / BAR;
if (callback) callback(DC_SAMPLE_PPO2, sample, userdata);
}
}
diff --git a/src/hw_ostc_parser.c b/src/hw_ostc_parser.c
index de354df..0ee02ac 100644
--- a/src/hw_ostc_parser.c
+++ b/src/hw_ostc_parser.c
@@ -1067,7 +1067,8 @@ hw_ostc_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t call
}
if (count) {
for (unsigned int j = 0; j < 3; ++j) {
- sample.ppo2 = ppo2[j] / 100.0;
+ sample.ppo2.sensor = i;
+ sample.ppo2.value = ppo2[j] / 100.0;
if (callback) callback (DC_SAMPLE_PPO2, sample, userdata);
}
}
diff --git a/src/shearwater_predator_parser.c b/src/shearwater_predator_parser.c
index 0975ff9..ab7752f 100644
--- a/src/shearwater_predator_parser.c
+++ b/src/shearwater_predator_parser.c
@@ -927,19 +927,21 @@ shearwater_predator_parser_samples_foreach (dc_parser_t *abstract, dc_sample_cal
if (ccr) {
// PPO2
if ((status & PPO2_EXTERNAL) == 0) {
-#ifdef SENSOR_AVERAGE
- sample.ppo2 = data[offset + pnf + 6] / 100.0;
+ sample.ppo2.sensor = DC_SENSOR_NONE;
+ sample.ppo2.value = data[offset + pnf + 6] / 100.0;
if (callback) callback (DC_SAMPLE_PPO2, sample, userdata);
-#else
- sample.ppo2 = data[offset + pnf + 12] * parser->calibration[0];
+
+ sample.ppo2.sensor = 0;
+ sample.ppo2.value = data[offset + pnf + 12] * parser->calibration[0];
if (callback && (parser->calibrated & 0x01)) callback (DC_SAMPLE_PPO2, sample, userdata);
- sample.ppo2 = data[offset + pnf + 14] * parser->calibration[1];
+ sample.ppo2.sensor = 1;
+ sample.ppo2.value = data[offset + pnf + 14] * parser->calibration[1];
if (callback && (parser->calibrated & 0x02)) callback (DC_SAMPLE_PPO2, sample, userdata);
- sample.ppo2 = data[offset + pnf + 15] * parser->calibration[2];
+ sample.ppo2.sensor = 2;
+ sample.ppo2.value = data[offset + pnf + 15] * parser->calibration[2];
if (callback && (parser->calibrated & 0x04)) callback (DC_SAMPLE_PPO2, sample, userdata);
-#endif
}
// Setpoint
diff --git a/src/tecdiving_divecomputereu_parser.c b/src/tecdiving_divecomputereu_parser.c
index bf134eb..ccfbb05 100644
--- a/src/tecdiving_divecomputereu_parser.c
+++ b/src/tecdiving_divecomputereu_parser.c
@@ -174,7 +174,8 @@ tecdiving_divecomputereu_parser_samples_foreach (dc_parser_t *abstract, dc_sampl
// ppO2
unsigned int ppo2 = data[offset + 1];
- sample.ppo2 = ppo2 / 10.0;
+ sample.ppo2.sensor = DC_SENSOR_NONE;
+ sample.ppo2.value = ppo2 / 10.0;
if (callback) callback (DC_SAMPLE_PPO2, sample, userdata);
// Setpoint