diff options
-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) |