[PATCH] Use actual min and max temperatures in statistics.

subsurface at henrik.synth.no subsurface at henrik.synth.no
Thu Jan 24 10:58:59 PST 2013


From: Henrik Brautaset Aronsen <subsurface at henrik.synth.no>

The statistics page only used each dive's "watertemp" attribute,
regardless of actual higher/lower temperatures in the samples.  By
finding the actual max/min temperatures, the statistics page utilize
more "real" data, and look better even on single dives.

Signed-off-by: Henrik Brautaset Aronsen <subsurface at henrik.synth.no>
---


Moved min/max temperature parsing from parse-xml.c to dive.c.  Much
better!  Thanks for the hint, Linus.

Henrik


 dive.c       | 13 +++++++++++++
 dive.h       |  1 +
 statistics.c | 41 +++++++++++++++++++++++++++++++++--------
 3 files changed, 47 insertions(+), 8 deletions(-)

diff --git a/dive.c b/dive.c
index c7d4d3d..392a024 100644
--- a/dive.c
+++ b/dive.c
@@ -248,6 +248,17 @@ static void fixup_pressure(struct dive *dive, struct sample *sample)
 	cyl->sample_end.mbar = pressure;
 }
 
+static void update_min_max_temperatures(struct dive *dive, struct sample *sample)
+{
+	if (sample->temperature.mkelvin) {
+		if (!dive->maxtemp.mkelvin || sample->temperature.mkelvin > dive->maxtemp.mkelvin)
+			dive->maxtemp = sample->temperature;
+		if (!dive->mintemp.mkelvin || sample->temperature.mkelvin < dive->mintemp.mkelvin)
+			dive->mintemp = sample->temperature;
+	}
+}
+
+
 /*
  * If the cylinder tank pressures are within half a bar
  * (about 8 PSI) of the sample pressures, we consider it
@@ -479,6 +490,8 @@ struct dive *fixup_dive(struct dive *dive)
 			if (!mintemp || temp < mintemp)
 				mintemp = temp;
 		}
+		update_min_max_temperatures(dive, sample);
+		
 		depthtime += (time - lasttime) * (lastdepth + depth) / 2;
 		lastdepth = depth;
 		lasttime = time;
diff --git a/dive.h b/dive.h
index fc82f5e..9dd1dae 100644
--- a/dive.h
+++ b/dive.h
@@ -316,6 +316,7 @@ struct dive {
 	weightsystem_t weightsystem[MAX_WEIGHTSYSTEMS];
 	char *suit;
 	int sac, otu, cns, maxcns;
+	temperature_t mintemp, maxtemp;
 
 	/* Eventually we'll do multiple dive computers */
 	struct divecomputer dc;
diff --git a/statistics.c b/statistics.c
index 1050b39..0cdbf71 100644
--- a/statistics.c
+++ b/statistics.c
@@ -107,6 +107,37 @@ enum {
 
 static char * get_time_string(int seconds, int maxdays);
 
+static void process_temperatures(struct dive *dp, stats_t *stats, const char *unit)
+{
+	int min_temp, mean_temp, max_temp = 0;
+
+	if (dp->maxtemp.mkelvin)
+		max_temp = dp->maxtemp.mkelvin;
+	else
+		max_temp = dp->dc.watertemp.mkelvin;
+
+	if (max_temp && (!stats->max_temp || max_temp > stats->max_temp))
+		stats->max_temp = max_temp;
+
+	if (dp->mintemp.mkelvin)
+		min_temp = dp->mintemp.mkelvin;
+	else
+		min_temp = dp->dc.watertemp.mkelvin;
+
+	if (min_temp && (!stats->min_temp || min_temp < stats->min_temp))
+		stats->min_temp = min_temp;
+
+	if (min_temp || max_temp) {
+		mean_temp = min_temp;
+		if (mean_temp)
+			mean_temp = (mean_temp + max_temp) / 2;
+		else
+			mean_temp = max_temp;
+		stats->combined_temp += get_temp_units(mean_temp, &unit);
+		stats->combined_count++;
+	}
+}
+
 static void process_dive(struct dive *dp, stats_t *stats)
 {
 	int old_tt, sac_time = 0;
@@ -122,14 +153,8 @@ static void process_dive(struct dive *dp, stats_t *stats)
 		stats->max_depth.mm = dp->dc.maxdepth.mm;
 	if (stats->min_depth.mm == 0 || dp->dc.maxdepth.mm < stats->min_depth.mm)
 		stats->min_depth.mm = dp->dc.maxdepth.mm;
-	if (dp->dc.watertemp.mkelvin) {
-		if (stats->min_temp == 0 || dp->dc.watertemp.mkelvin < stats->min_temp)
-			stats->min_temp = dp->dc.watertemp.mkelvin;
-		if (dp->dc.watertemp.mkelvin > stats->max_temp)
-			stats->max_temp = dp->dc.watertemp.mkelvin;
-		stats->combined_temp += get_temp_units(dp->dc.watertemp.mkelvin, &unit);
-		stats->combined_count++;
-	}
+
+	process_temperatures(dp, stats, unit);
 
 	/* Maybe we should drop zero-duration dives */
 	if (!dp->dc.duration.seconds)
-- 
1.8.1.1



More information about the subsurface mailing list