diff options
author | Keith Packard <keithp@keithp.com> | 2017-06-27 23:36:05 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2017-06-27 23:36:05 -0700 |
commit | 46ff12a88136d3c274610255a918870aff9328cd (patch) | |
tree | 0fac5fbe7cf34a695c6278c34e3b97ce73fdaa62 /altoslib/AltosTimeSeries.java | |
parent | 13abb6739ae9be5a8733724c5d9b3f714f32bea4 (diff) |
altoslib: Deal with multiple motors in flight stats
Combine boost/fast/coast sections when computing ascent stats.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'altoslib/AltosTimeSeries.java')
-rw-r--r-- | altoslib/AltosTimeSeries.java | 41 |
1 files changed, 29 insertions, 12 deletions
diff --git a/altoslib/AltosTimeSeries.java b/altoslib/AltosTimeSeries.java index b5d831be..b3c432fc 100644 --- a/altoslib/AltosTimeSeries.java +++ b/altoslib/AltosTimeSeries.java @@ -150,30 +150,47 @@ public class AltosTimeSeries implements Iterable<AltosTimeValue>, Comparable<Alt return min; } + public AltosTimeValue first() { + return values.get(0); + } + + public AltosTimeValue last() { + return values.get(values.size() - 1); + } + public double average() { - double total = 0; - int count = 0; + double total_value = 0; + double total_time = 0; + AltosTimeValue prev = null; for (AltosTimeValue tv : values) { - total += tv.value; - count++; + if (prev != null) { + total_value += (tv.value + prev.value) / 2 * (tv.time - prev.time); + total_time += (tv.time - prev.time); + } + prev = tv; } - if (count == 0) + if (total_time == 0) return AltosLib.MISSING; - return total / count; + return total_value / total_time; } public double average(double start_time, double end_time) { - double total = 0; - int count = 0; + double total_value = 0; + double total_time = 0; + AltosTimeValue prev = null; for (AltosTimeValue tv : values) { if (start_time <= tv.time && tv.time <= end_time) { - total += tv.value; - count++; + if (prev != null) { + total_value += (tv.value + prev.value) / 2 * (tv.time - start_time); + total_time += (tv.time - start_time); + } + start_time = tv.time; } + prev = tv; } - if (count == 0) + if (total_time == 0) return AltosLib.MISSING; - return total / count; + return total_value / total_time; } public AltosTimeSeries integrate(AltosTimeSeries integral) { |