From e3088930ab58327fac744e4672906892560dc93e Mon Sep 17 00:00:00 2001 From: Henrik Brautaset Aronsen Date: Thu, 24 Jan 2013 19:58:59 +0100 Subject: [PATCH] Use actual min and max temperatures in statistics. 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 Signed-off-by: Dirk Hohndel --- 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 f6807f3e6..d66eec9a3 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 a6908416d..f1b9dcc52 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 1050b39ad..0cdbf7146 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)