diff options
Diffstat (limited to 'altoslib/AltosFlightSeries.java')
| -rw-r--r-- | altoslib/AltosFlightSeries.java | 145 | 
1 files changed, 103 insertions, 42 deletions
diff --git a/altoslib/AltosFlightSeries.java b/altoslib/AltosFlightSeries.java index 57f1a491..d130d3ad 100644 --- a/altoslib/AltosFlightSeries.java +++ b/altoslib/AltosFlightSeries.java @@ -21,7 +21,7 @@ public class AltosFlightSeries extends AltosDataListener {  	public ArrayList<AltosTimeSeries> series = new ArrayList<AltosTimeSeries>();  	public double	speed_filter_width = 4.0; -	public double	accel_filter_width = 4.0; +	public double	accel_filter_width = 1.0;  	public int[] indices() {  		int[] indices = new int[series.size()]; @@ -150,18 +150,17 @@ public class AltosFlightSeries extends AltosDataListener {  	public void set_state(int state) { -		if (state == AltosLib.ao_flight_pad) -			return; - -		if (state_series == null) -			state_series = add_series(state_name, AltosConvert.state_name); -		else if (this.state == state) -			return; -		this.state = state; -		state_series.add(time(), state); +		if (state != AltosLib.ao_flight_pad && state != AltosLib.MISSING && state != AltosLib.ao_flight_stateless) { +			if (state_series == null) +				state_series = add_series(state_name, AltosConvert.state_name); +			if (this.state() != state) +				state_series.add(time(), state); +		} +		super.set_state(state);  	}  	public AltosTimeSeries	accel_series; +	public boolean		accel_computed;  	public static final String accel_name = "Accel"; @@ -176,23 +175,61 @@ public class AltosFlightSeries extends AltosDataListener {  			accel_series = add_series(accel_name, AltosConvert.accel);  		accel_series.add(time(), acceleration); +		accel_computed = false;  	} -	private void compute_accel() { -		if (accel_series != null) -			return; +	private AltosTimeSeries compute_accel() { +		AltosTimeSeries	new_accel_series = null;  		if (speed_series != null) { -			AltosTimeSeries temp_series = make_series(speed_name, AltosConvert.speed); -			speed_series.filter(temp_series, accel_filter_width); -			accel_series = add_series(accel_name, AltosConvert.accel); -			temp_series.differentiate(accel_series); +			AltosTimeSeries temp_series; +			if (accel_filter_width > 0) { +				temp_series = make_series(speed_name, AltosConvert.speed); +				speed_series.filter(temp_series, accel_filter_width); +			} else +				temp_series = speed_series; + +			new_accel_series = make_series(accel_name, AltosConvert.accel); +			temp_series.differentiate(new_accel_series); +		} +		return new_accel_series; +	} + +	public void set_filter(double speed_filter, double accel_filter) { +		this.speed_filter_width = speed_filter; +		this.accel_filter_width = accel_filter; + +		AltosTimeSeries new_speed_series = compute_speed(); + +		if (new_speed_series != null) { +			speed_series.erase_values(); +			for (AltosTimeValue tv : new_speed_series) +				speed_series.add(tv); +		} +		if (accel_computed) { +			AltosTimeSeries new_accel_series = compute_accel(); +			if (new_accel_series != null) { +				accel_series.erase_values(); +				for (AltosTimeValue tv : new_accel_series) +					accel_series.add(tv); +			}  		}  	}  	public void set_received_time(long received_time) {  	} +	public AltosTimeSeries tick_series; + +	public static final String tick_name = "Tick"; + +	public void set_tick(int tick) { +		super.set_tick(tick); +		if (tick_series == null) +			tick_series = add_series(tick_name, null); +		tick_series.add(time(), tick); +	} +  	public AltosTimeSeries rssi_series;  	public static final String rssi_name = "RSSI"; @@ -259,21 +296,24 @@ public class AltosFlightSeries extends AltosDataListener {  	public static final String speed_name = "Speed"; -	private void compute_speed() { -		if (speed_series != null) -			return; - +	private AltosTimeSeries compute_speed() { +		AltosTimeSeries new_speed_series = null;  		AltosTimeSeries	alt_speed_series = null;  		AltosTimeSeries accel_speed_series = null;  		if (altitude_series != null) { -			AltosTimeSeries temp_series = make_series(altitude_name, AltosConvert.height); -			altitude_series.filter(temp_series, speed_filter_width); +			AltosTimeSeries temp_series; + +			if (speed_filter_width > 0) { +				temp_series = make_series(speed_name, AltosConvert.height); +				altitude_series.filter(temp_series, speed_filter_width); +			} else +				temp_series = altitude_series;  			alt_speed_series = make_series(speed_name, AltosConvert.speed);  			temp_series.differentiate(alt_speed_series);  		} -		if (accel_series != null) { +		if (accel_series != null && !accel_computed) {  			if (orient_series != null) {  				vert_accel_series = add_series(vert_accel_name, AltosConvert.accel); @@ -309,26 +349,25 @@ public class AltosFlightSeries extends AltosDataListener {  				}  			}  			if (apogee_time == AltosLib.MISSING) { -				speed_series = alt_speed_series; +				new_speed_series = alt_speed_series;  			} else { -				speed_series = make_series(speed_name, AltosConvert.speed); +				new_speed_series = make_series(speed_name, AltosConvert.speed);  				for (AltosTimeValue d : accel_speed_series) {  					if (d.time <= apogee_time) -						speed_series.add(d); +						new_speed_series.add(d);  				}  				for (AltosTimeValue d : alt_speed_series) {  					if (d.time > apogee_time) -						speed_series.add(d); +						new_speed_series.add(d);  				}  			}  		} else if (alt_speed_series != null) { -			speed_series = alt_speed_series; +			new_speed_series = alt_speed_series;  		} else if (accel_speed_series != null) { -			speed_series = accel_speed_series; +			new_speed_series = accel_speed_series;  		} -		if (speed_series != null) -			add_series(speed_series); +		return new_speed_series;  	}  	public AltosTimeSeries orient_series; @@ -450,13 +489,24 @@ public class AltosFlightSeries extends AltosDataListener {  	public ArrayList<AltosGPSTimeValue> gps_series;  	public AltosGPS gps_before(double time) { -		AltosGPS gps = null; -		for (AltosGPSTimeValue gtv : gps_series) -			if (gtv.time <= time) -				gps = gtv.gps; -			else -				break; -		return gps; +		AltosGPSTimeValue nearest = null; +		for (AltosGPSTimeValue gtv : gps_series) { +			if (nearest == null) +				nearest = gtv; +			else { +				if (gtv.time <= time) { +					if (nearest.time <= time && gtv.time > nearest.time) +						nearest = gtv; +				} else { +					if (nearest.time > time && gtv.time < nearest.time) +						nearest = gtv; +				} +			} +		} +		if (nearest != null) +			return nearest.gps; +		else +			return null;  	}  	public AltosTimeSeries	sats_in_view; @@ -482,6 +532,7 @@ public class AltosFlightSeries extends AltosDataListener {  	public static final String gps_hdop_name = "GPS Horizontal Dilution of Precision";  	public void set_gps(AltosGPS gps) { +		super.set_gps(gps);  		if (gps_series == null)  			gps_series = new ArrayList<AltosGPSTimeValue>();  		gps_series.add(new AltosGPSTimeValue(time(), gps)); @@ -643,7 +694,7 @@ public class AltosFlightSeries extends AltosDataListener {  	public  void set_igniter_voltage(double[] voltage) {  		int channels = voltage.length;  		if (igniter_voltage == null || igniter_voltage.length <= channels) { -			AltosTimeSeries[]	new_igniter_voltage = new AltosTimeSeries[channels + 1]; +			AltosTimeSeries[]	new_igniter_voltage = new AltosTimeSeries[channels];  			int			i = 0;  			if (igniter_voltage != null) { @@ -681,8 +732,18 @@ public class AltosFlightSeries extends AltosDataListener {  	public void finish() {  		compute_orient(); -		compute_speed(); -		compute_accel(); +		if (speed_series == null) { +			speed_series = compute_speed(); +			if (speed_series != null) +				add_series(speed_series); +		} +		if (accel_series == null) { +			accel_series = compute_accel(); +			if (accel_series != null) { +				add_series(accel_series); +				accel_computed = true; +			} +		}  		compute_height();  	}  | 
