summaryrefslogtreecommitdiff
path: root/altoslib/AltosTimeSeries.java
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2017-06-27 23:36:05 -0700
committerKeith Packard <keithp@keithp.com>2017-06-27 23:36:05 -0700
commit46ff12a88136d3c274610255a918870aff9328cd (patch)
tree0fac5fbe7cf34a695c6278c34e3b97ce73fdaa62 /altoslib/AltosTimeSeries.java
parent13abb6739ae9be5a8733724c5d9b3f714f32bea4 (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.java41
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) {