diff options
author | Henrik Brautaset Aronsen <subsurface@henrik.synth.no> | 2013-01-24 19:58:59 +0100 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2013-01-24 13:00:03 -0800 |
commit | e3088930ab58327fac744e4672906892560dc93e (patch) | |
tree | f58167085dab3419256b44a17c3d9beee5a3804d | |
parent | b8efe709a8e6c23a2bf3849a454565634b2a0545 (diff) | |
download | subsurface-e3088930ab58327fac744e4672906892560dc93e.tar.gz |
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 <subsurface@henrik.synth.no>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r-- | dive.c | 13 | ||||
-rw-r--r-- | dive.h | 1 | ||||
-rw-r--r-- | statistics.c | 41 |
3 files changed, 47 insertions, 8 deletions
@@ -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; @@ -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) |