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) {  | 
