diff options
| author | Keith Packard <keithp@keithp.com> | 2012-06-21 09:50:18 -0700 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2012-06-21 09:50:18 -0700 | 
| commit | 6f421818fd7062f03bfaf9e606d6a4cfdcb13b49 (patch) | |
| tree | 912ddd51730e370b641e45da3065cd9273e4215e /altoslib/AltosRecord.java | |
| parent | ff5b0ba90e73a83360a2e8a7e9969ed2c3ce1514 (diff) | |
altosui: Support MM telemetry packets
Required restructuring the whole telemetry system to provide abstract
interfaces to flight data.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'altoslib/AltosRecord.java')
| -rw-r--r-- | altoslib/AltosRecord.java | 225 | 
1 files changed, 57 insertions, 168 deletions
diff --git a/altoslib/AltosRecord.java b/altoslib/AltosRecord.java index 10ef3061..e468f84b 100644 --- a/altoslib/AltosRecord.java +++ b/altoslib/AltosRecord.java @@ -22,8 +22,7 @@ import java.text.*;  import java.util.HashMap;  import java.io.*; -public class AltosRecord implements Comparable <AltosRecord> { -	public final static int	MISSING = 0x7fffffff; +public class AltosRecord implements Comparable <AltosRecord>, Cloneable {  	public static final int	seen_flight = 1;  	public static final int	seen_sensor = 2; @@ -33,8 +32,13 @@ public class AltosRecord implements Comparable <AltosRecord> {  	public static final int	seen_gps_lat = 32;  	public static final int	seen_gps_lon = 64;  	public static final int	seen_companion = 128; -	public int			seen; +	public int	seen; +	 +	public final static int	MISSING = 0x7fffffff; + +	/* Every AltosRecord implementation provides these fields */ +	  	public int	version;  	public String 	callsign;  	public int	serial; @@ -44,31 +48,13 @@ public class AltosRecord implements Comparable <AltosRecord> {  	public int	state;  	public int	tick; -	public int	accel; -	public int	pres; -	public int	temp; -	public int	batt; -	public int	drogue; -	public int	main; - -	public int	ground_accel; -	public int	ground_pres; -	public int	accel_plus_g; -	public int	accel_minus_g; - -	public double	acceleration; -	public double	speed; -	public double	height; - -	public int	flight_accel; -	public int	flight_vel; -	public int	flight_pres; +	/* Current flight dynamic state */ +	public double	acceleration;	/* m/s² */ +	public double	speed;		/* m/s */ +	public double	height;		/* m */  	public AltosGPS	gps; -	public boolean		new_gps; - -	public AltosIMU	imu; -	public AltosMag	mag; +	public boolean	new_gps;  	public double	time;	/* seconds since boost */ @@ -83,45 +69,42 @@ public class AltosRecord implements Comparable <AltosRecord> {  	public AltosRecordCompanion companion;  	/* -	 * Values for our MP3H6115A pressure sensor -	 * -	 * From the data sheet: +	 * Abstract methods that convert record data +	 * to standard units:  	 * -	 * Pressure range: 15-115 kPa -	 * Voltage at 115kPa: 2.82 -	 * Output scale: 27mV/kPa -	 * -	 * -	 * 27 mV/kPa * 2047 / 3300 counts/mV = 16.75 counts/kPa -	 * 2.82V * 2047 / 3.3 counts/V = 1749 counts/115 kPa +	 *	pressure:	Pa +	 *	voltage:	V +	 *	acceleration:	m/s² +	 *	speed:		m/s +	 *	height:		m +	 *	temperature:	°C  	 */ -	public static final double counts_per_kPa = 27 * 2047 / 3300; -	public static final double counts_at_101_3kPa = 1674.0; +	public double raw_pressure() { return MISSING; } -	public static double -	barometer_to_pressure(double count) -	{ -		return ((count / 16.0) / 2047.0 + 0.095) / 0.009 * 1000.0; -	} +	public double filtered_pressure() { return MISSING; } -	public double raw_pressure() { -		if (pres == MISSING) -			return MISSING; -		return barometer_to_pressure(pres); -	} +	public double ground_pressure() { return MISSING; } -	public double filtered_pressure() { -		if (flight_pres == MISSING) -			return MISSING; -		return barometer_to_pressure(flight_pres); -	} +	public double battery_voltage() { return MISSING; } -	public double ground_pressure() { -		if (ground_pres == MISSING) -			return MISSING; -		return barometer_to_pressure(ground_pres); -	} +	public double main_voltage() { return MISSING; } + +	public double drogue_voltage() { return MISSING; } + +	public double temperature() { return MISSING; } +	 +	public double acceleration() { return MISSING; } + +	public double accel_speed() { return MISSING; } + +	public AltosIMU imu() { return null; } + +	public AltosMag mag() { return null; } + +	/* +	 * Convert various pressure values to altitude +	 */  	public double raw_altitude() {  		double p = raw_pressure(); @@ -138,8 +121,9 @@ public class AltosRecord implements Comparable <AltosRecord> {  	}  	public double filtered_altitude() { -		if (height != MISSING && ground_pres != MISSING) -			return height + ground_altitude(); +		double	ga = ground_altitude(); +		if (height != MISSING && ga != MISSING) +			return height + ga;  		double	p = filtered_pressure();  		if (p == MISSING) @@ -167,94 +151,17 @@ public class AltosRecord implements Comparable <AltosRecord> {  		return r - g;  	} -	public double battery_voltage() { -		if (batt == MISSING) -			return MISSING; -		return AltosConvert.cc_battery_to_voltage(batt); -	} - -	public double main_voltage() { -		if (main == MISSING) -			return MISSING; -		return AltosConvert.cc_ignitor_to_voltage(main); -	} - -	public double drogue_voltage() { -		if (drogue == MISSING) -			return MISSING; -		return AltosConvert.cc_ignitor_to_voltage(drogue); -	} - -	/* Value for the CC1111 built-in temperature sensor -	 * Output voltage at 0°C = 0.755V -	 * Coefficient = 0.00247V/°C -	 * Reference voltage = 1.25V -	 * -	 * temp = ((value / 32767) * 1.25 - 0.755) / 0.00247 -	 *      = (value - 19791.268) / 32768 * 1.25 / 0.00247 -	 */ - -	public static double -	thermometer_to_temperature(double thermo) -	{ -		return (thermo - 19791.268) / 32728.0 * 1.25 / 0.00247; -	} - -	public double temperature() { -		if (temp == MISSING) -			return MISSING; -		return thermometer_to_temperature(temp); -	} - -	public double accel_counts_per_mss() { -		double	counts_per_g = Math.abs(accel_minus_g - accel_plus_g) / 2; - -		return counts_per_g / 9.80665; -	} - -	public double acceleration() { -		if (acceleration != MISSING) -			return acceleration; - -		if (ground_accel == MISSING || accel == MISSING) -			return MISSING; -		return (ground_accel - accel) / accel_counts_per_mss(); -	} - -	public double accel_speed() { -		if (speed != MISSING) -			return speed; -		if (flight_vel == MISSING) -			return MISSING; -		return flight_vel / (accel_counts_per_mss() * 100.0); -	} -  	public String state() {  		return AltosLib.state_name(state);  	} -	public static String gets(FileInputStream s) throws IOException { -		int c; -		String	line = ""; - -		while ((c = s.read()) != -1) { -			if (c == '\r') -				continue; -			if (c == '\n') { -				return line; -			} -			line = line + (char) c; -		} -		return null; -	} -  	public int compareTo(AltosRecord o) {  		return tick - o.tick;  	} -	public AltosRecord(AltosRecord old) { -		version = old.version; +	public void copy(AltosRecord old) {  		seen = old.seen; +		version = old.version;  		callsign = old.callsign;  		serial = old.serial;  		flight = old.flight; @@ -262,32 +169,27 @@ public class AltosRecord implements Comparable <AltosRecord> {  		status = old.status;  		state = old.state;  		tick = old.tick; -		accel = old.accel; -		pres = old.pres; -		temp = old.temp; -		batt = old.batt; -		drogue = old.drogue; -		main = old.main; -		flight_accel = old.flight_accel; -		ground_accel = old.ground_accel; -		flight_vel = old.flight_vel; -		flight_pres = old.flight_pres; -		ground_pres = old.ground_pres; -		accel_plus_g = old.accel_plus_g; -		accel_minus_g = old.accel_minus_g;  		acceleration = old.acceleration;  		speed = old.speed;  		height = old.height;  		gps = new AltosGPS(old.gps);  		new_gps = false;  		companion = old.companion; -		imu = old.imu; -		mag = old.mag; +	} + +	public AltosRecord clone() { +		try { +			AltosRecord n = (AltosRecord) super.clone(); +			n.copy(this); +			return n; +		} catch (CloneNotSupportedException e) { +			return null; +		}  	}  	public AltosRecord() { -		version = 0;  		seen = 0; +		version = 0;  		callsign = "N0CALL";  		serial = 0;  		flight = 0; @@ -295,19 +197,6 @@ public class AltosRecord implements Comparable <AltosRecord> {  		status = 0;  		state = AltosLib.ao_flight_startup;  		tick = 0; -		accel = MISSING; -		pres = MISSING; -		temp = MISSING; -		batt = MISSING; -		drogue = MISSING; -		main = MISSING; -		flight_accel = 0; -		ground_accel = 0; -		flight_vel = 0; -		flight_pres = 0; -		ground_pres = 0; -		accel_plus_g = 0; -		accel_minus_g = 0;  		acceleration = MISSING;  		speed = MISSING;  		height = MISSING;  | 
