Remove code that zeroes out duplicate oxygen sensor and temperature values
Remove the code that changes all duplicate oxygen sensor, setpoint and
temperature
values from a dive log to zero. One of the motivations is that a zero
setpoint
value indicates an Open Circuit dive segment, not Closed Circuit
Rebreather. The
code in dive.c is removed and the comments for the corresponding
restoration code that restores
the last known values into sensor or temperature with zero values is
[fill_o2_values()
in profile.c] is changed to apply to the present situation.
Signed-off-by: willem ferguson <[email protected]>
I did some experimenting with the code that restores zeroed oxygen
values to last-known values.
If I remove the restoration code, then the o2 profile for the Poseidon
data goes wonky: o2 values are
not reported with every sample, so the restoration code is still
required. Same applies to
temperature data.
Kind regards,
willem
>From 4801a22ec7493e41560300543d4bb20c9678847f Mon Sep 17 00:00:00 2001
From: willem ferguson <[email protected]>
Date: Fri, 31 Oct 2014 21:00:17 +0200
Subject: [PATCH 2/2] Remove code that zeroes out duplicate oxygen sensor and
temperature values
Remove the code that changes all duplicate oxygen sensor, setpoint and temperature
values from a dive log to zero. One of the motivations is that a zero setpoint
value indicates an Open Circuit dive segment, not Closed Circuit Rebreather. The
code in dive.c is removed and the comments for the corresponding code that reinserts
the last known values into sensor or temperature with zero values is [fill_o2_values()
in profile.c] is changed to apply to the present situation.
Signed-off-by: willem ferguson <[email protected]>
---
dive.c | 51 ++++++++++++++++++++++++++-------------------------
profile.c | 27 +++++++++++----------------
2 files changed, 37 insertions(+), 41 deletions(-)
diff --git a/dive.c b/dive.c
index 9f4df56..118ee2b 100644
--- a/dive.c
+++ b/dive.c
@@ -1098,15 +1098,16 @@ static void fixup_dc_events(struct divecomputer *dc)
static void fixup_dive_dc(struct dive *dive, struct divecomputer *dc)
{
- int i, j, o2val;
+ int i, j;
double depthtime = 0;
int lasttime = 0;
int lastindex = -1;
int maxdepth = dc->maxdepth.mm;
int mintemp = 0;
int lastdepth = 0;
- int lasttemp = 0, lastpressure = 0, lastdiluentpressure = 0;
- int lasto2val[3] = { 0, 0, 0 };
+ int lastpressure = 0, lastdiluentpressure = 0;
int pressure_delta[MAX_CYLINDERS] = { INT_MAX, };
int first_cylinder;
@@ -1164,31 +1165,31 @@ static void fixup_dive_dc(struct dive *dive, struct divecomputer *dc)
fixup_pressure(dive, sample);
if (temp) {
- /*
- * If we have consecutive identical
- * temperature readings, throw away
- * the redundant ones.
- */
- if (lasttemp == temp)
- sample->temperature.mkelvin = 0;
- else
- lasttemp = temp;
-
if (!mintemp || temp < mintemp)
mintemp = temp;
}
-
- // If there are consecutive identical O2 sensor readings, throw away the redundant ones.
- for (j = 0; j < dc->no_o2sensors; j++) { // for CCR oxygen sensor data:
- o2val = sample->o2sensor[j].mbar;
- if (o2val) {
- if (lasto2val[j] == o2val)
- sample->o2sensor[j].mbar = 0;
- else
- lasto2val[j] = o2val;
- }
- }
-
update_min_max_temperatures(dive, sample->temperature);
depthtime += (time - lasttime) * (lastdepth + depth) / 2;
diff --git a/profile.c b/profile.c
index 4bc9422..bc59c48 100644
--- a/profile.c
+++ b/profile.c
@@ -929,30 +929,26 @@ static void calculate_gas_information_new(struct dive *dive, struct plot_info *p
void fill_o2_values(struct divecomputer *dc, struct plot_info *pi, struct dive *dive)
/* For CCR:
- * In the samples from each dive computer, any duplicate values for the
- * oxygen sensors were removed (i.e. set to 0) in order to conserve
- * storage space (see function fixup_dive_dc). But for drawing the profile
- * a complete series of valid o2 pressure values is required. This function
- * takes the oxygen sensor data and setpoint values from the structures
- * of plotinfo and re-inserts the duplicate values set to 0 so
- * that the oxygen sensor data are complete and ready for plotting.
- * The original sequence of oxygen values are recreated without attempting
- * any interpolations for values set to zero, recreating the raw data from
- * the CCR dive log. This function called by: create_plot_info_new() */
+ * In the samples from each dive computer, there may be uninitialised oxygen
+ * sensor or setpoint values, e.g. when events were inserted into the dive log
+ * or if the dive computer does not report o2 values with every sample. But
+ * for drawing the profile a complete series of valid o2 pressure values is
+ * required. This function takes the oxygen sensor data and setpoint values
+ * from the structures of plotinfo and replaces the zero values with their
+ * last known values so that the oxygen sensor data are complete and ready
+ * for plotting. This function called by: create_plot_info_new() */
{
int i, j;
double last_setpoint, last_sensor[3], o2pressure, amb_pressure;
for (i = 0; i < pi->nr; i++) {
struct plot_data *entry = pi->entry + i;
- // For 1st iteration, initialise the last_ values
if (dc->dctype == CCR) {
- if (i == 0) {
+ if (i == 0) { // For 1st iteration, initialise the last_ values:
last_setpoint = pi->entry->o2setpoint;
for (j = 0; j < dc->no_o2sensors; j++)
last_sensor[j] = pi->entry->o2sensor[j];
- } else {
- // Now re-insert the missing oxygen pressure values
+ } else { // Now set the missing oxygen pressure values:
if (entry->o2setpoint)
last_setpoint = entry->o2setpoint;
else
@@ -962,7 +958,7 @@ void fill_o2_values(struct divecomputer *dc, struct plot_info *pi, struct dive *
last_sensor[j] = entry->o2sensor[j];
else
entry->o2sensor[j] = last_sensor[j];
- } // having initialised the empty o2 sensor values for this point on the profile,
+ } // Having initialised the empty o2 sensor values for this point on the profile,
amb_pressure = depth_to_mbar(entry->depth, dive) / 1000.0;
o2pressure = calculate_ccr_po2(entry,dc); // ...calculate the po2 based on the sensor data
entry->pressures.o2 = MIN(o2pressure, amb_pressure);
@@ -1026,7 +1022,6 @@ void create_plot_info_new(struct dive *dive, struct divecomputer *dc, struct plo
populate_pressure_information(dive, dc, pi, NONDILUENT); /* .. calculate missing pressure entries for all gasses except diluent */
if (dc->dctype == CCR) /* For CCR dives.. */
populate_pressure_information(dive, dc, pi, DILUENT); /* .. calculate missing diluent gas pressure entries */
-
fill_o2_values(dc, pi, dive); /* .. and insert the O2 sensor data having 0 values. */
calculate_sac(dive, pi); /* Calculate sac */
calculate_deco_information(dive, dc, pi, false); /* and ceiling information, using gradient factor values in Preferences) */
--
1.9.1
_______________________________________________
subsurface mailing list
[email protected]
http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface