altoslib: Avoid crashing when computing stats for empty flight logs
[fw/altos] / altoslib / AltosTimeSeries.java
index b5d831be0b6fff843684ff7949fcfa109f3e0d7c..9f3b4d807ef26bb36ae9a358515ac41c17f3bad5 100644 (file)
@@ -150,30 +150,51 @@ public class AltosTimeSeries implements Iterable<AltosTimeValue>, Comparable<Alt
                return min;
        }
 
+       public AltosTimeValue first() {
+               if (values.size() > 0)
+                       return values.get(0);
+               return null;
+       }
+
+       public AltosTimeValue last() {
+               if (values.size() > 0)
+                       return values.get(values.size() - 1);
+               return null;
+       }
+
        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) {