diff options
Diffstat (limited to 'altoslib')
98 files changed, 812 insertions, 221 deletions
| diff --git a/altoslib/AltosAccel.java b/altoslib/AltosAccel.java index 3d340e5d..d91da4da 100644 --- a/altoslib/AltosAccel.java +++ b/altoslib/AltosAccel.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosAccel extends AltosUnits { diff --git a/altoslib/AltosCRCException.java b/altoslib/AltosCRCException.java index 253ca435..507c446b 100644 --- a/altoslib/AltosCRCException.java +++ b/altoslib/AltosCRCException.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosCRCException extends Exception {  	public int rssi; diff --git a/altoslib/AltosCSV.java b/altoslib/AltosCSV.java index 27e1fade..4a9278d9 100644 --- a/altoslib/AltosCSV.java +++ b/altoslib/AltosCSV.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*;  import java.util.*; @@ -29,6 +29,14 @@ public class AltosCSV implements AltosWriter {  	LinkedList<AltosState>	pad_states;  	AltosState		state; +	static boolean		has_basic; +	static boolean		has_battery; +	static boolean		has_flight_state; +	static boolean		has_advanced; +	static boolean		has_gps; +	static boolean		has_gps_sat; +	static boolean		has_companion; +  	static final int ALTOS_CSV_VERSION = 5;  	/* Version 4 format: @@ -55,10 +63,12 @@ public class AltosCSV implements AltosWriter {  	 *	accelerometer speed (m/s)  	 *	barometer speed (m/s)  	 *	temp (°C) -	 *	battery (V)  	 *	drogue (V)  	 *	main (V)  	 * +	 * Battery +	 *	battery (V) +	 *  	 * Advanced sensors (if available)  	 *	accel_x (m/s²)  	 *	accel_y (m/s²) @@ -87,7 +97,9 @@ public class AltosCSV implements AltosWriter {  	 *	from_pad_azimuth (deg true)  	 *	from_pad_range (m)  	 *	from_pad_elevation (deg from horizon) +	 *	pdop  	 *	hdop +	 *	vdop  	 *  	 * GPS Sat data  	 *	C/N0 data for all 32 valid SDIDs @@ -107,7 +119,7 @@ public class AltosCSV implements AltosWriter {  	void write_general(AltosState state) {  		out.printf("%s, %d, %d, %s, %8.2f, %8.2f, %4d, %3d",  			   ALTOS_CSV_VERSION, state.serial, state.flight, state.callsign, -			   (double) state.time, (double) state.tick / 100.0, +			   (double) state.time_since_boost(), (double) state.tick / 100.0,  			   state.rssi,  			   state.status & 0x7f);  	} @@ -121,11 +133,11 @@ public class AltosCSV implements AltosWriter {  	}  	void write_basic_header() { -		out.printf("acceleration,pressure,altitude,height,accel_speed,baro_speed,temperature,battery_voltage,drogue_voltage,main_voltage"); +		out.printf("acceleration,pressure,altitude,height,accel_speed,baro_speed,temperature,drogue_voltage,main_voltage");  	}  	void write_basic(AltosState state) { -		out.printf("%8.2f,%10.2f,%8.2f,%8.2f,%8.2f,%8.2f,%5.1f,%5.2f,%5.2f,%5.2f", +		out.printf("%8.2f,%10.2f,%8.2f,%8.2f,%8.2f,%8.2f,%5.1f,%5.2f,%5.2f",  			   state.acceleration(),  			   state.pressure(),  			   state.altitude(), @@ -133,11 +145,18 @@ public class AltosCSV implements AltosWriter {  			   state.speed(),  			   state.speed(),  			   state.temperature, -			   state.battery_voltage,  			   state.apogee_voltage,  			   state.main_voltage);  	} +	void write_battery_header() { +		out.printf("battery_voltage"); +	} + +	void write_battery(AltosState state) { +		out.printf("%5.2f", state.battery_voltage); +	} +  	void write_advanced_header() {  		out.printf("accel_x,accel_y,accel_z,gyro_x,gyro_y,gyro_z");  	} @@ -150,14 +169,14 @@ public class AltosCSV implements AltosWriter {  			imu = new AltosIMU();  		if (mag == null)  			mag = new AltosMag(); -		out.printf("%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d", +		out.printf("%7.2f,%7.2f,%7.2f,%7.2f,%7.2f,%7.2f,%7.2f,%7.2f,%7.2f",  			   imu.accel_x, imu.accel_y, imu.accel_z,  			   imu.gyro_x, imu.gyro_y, imu.gyro_z,  			   mag.x, mag.y, mag.z);  	}  	void write_gps_header() { -		out.printf("connected,locked,nsat,latitude,longitude,altitude,year,month,day,hour,minute,second,pad_dist,pad_range,pad_az,pad_el,hdop"); +		out.printf("connected,locked,nsat,latitude,longitude,altitude,year,month,day,hour,minute,second,pad_dist,pad_range,pad_az,pad_el,pdop,hdop,vdop");  	}  	void write_gps(AltosState state) { @@ -169,7 +188,7 @@ public class AltosCSV implements AltosWriter {  		if (from_pad == null)  			from_pad = new AltosGreatCircle(); -		out.printf("%2d,%2d,%3d,%12.7f,%12.7f,%8.1f,%5d,%3d,%3d,%3d,%3d,%3d,%9.0f,%9.0f,%4.0f,%4.0f,%6.1f", +		out.printf("%2d,%2d,%3d,%12.7f,%12.7f,%8.1f,%5d,%3d,%3d,%3d,%3d,%3d,%9.0f,%9.0f,%4.0f,%4.0f,%6.1f,%6.1f,%6.1f",  			   gps.connected?1:0,  			   gps.locked?1:0,  			   gps.nsat, @@ -186,7 +205,9 @@ public class AltosCSV implements AltosWriter {  			   state.range,  			   from_pad.bearing,  			   state.elevation, -			   gps.hdop); +			   gps.pdop, +			   gps.hdop, +			   gps.vdop);  	}  	void write_gps_sat_header() { @@ -239,52 +260,83 @@ public class AltosCSV implements AltosWriter {  			out.printf(",0");  	} -	void write_header(boolean advanced, boolean gps, boolean companion) { +	void write_header() {  		out.printf("#"); write_general_header(); -		out.printf(","); write_flight_header(); -		out.printf(","); write_basic_header(); -		if (advanced) -			out.printf(","); write_advanced_header(); -		if (gps) { -			out.printf(","); write_gps_header(); -			out.printf(","); write_gps_sat_header(); +		if (has_flight_state) { +			out.printf(","); +			write_flight_header();  		} -		if (companion) { -			out.printf(","); write_companion_header(); +		if (has_basic) { +			out.printf(","); +			write_basic_header(); +		} +		if (has_battery) { +			out.printf(","); +			write_battery_header(); +		} +		if (has_advanced) { +			out.printf(","); +			write_advanced_header(); +		} +		if (has_gps) { +			out.printf(","); +			write_gps_header(); +		} +		if (has_gps_sat) { +			out.printf(","); +			write_gps_sat_header(); +		} +		if (has_companion) { +			out.printf(","); +			write_companion_header();  		}  		out.printf ("\n");  	}  	void write_one(AltosState state) { -		write_general(state); out.printf(","); -		write_flight(state); out.printf(","); -		write_basic(state); out.printf(","); -		if (state.imu != null || state.mag != null) +		write_general(state); +		if (has_flight_state) { +			out.printf(","); +			write_flight(state); +		} +		if (has_basic) { +			out.printf(","); +			write_basic(state); +		} +		if (has_battery) { +			out.printf(","); +			write_battery(state); +		} +		if (has_advanced) { +			out.printf(",");  			write_advanced(state); -		if (state.gps != null) { +		} +		if (has_gps) { +			out.printf(","); +			write_gps(state); +		} +		if (has_gps_sat) {  			out.printf(","); -			write_gps(state); out.printf(",");  			write_gps_sat(state);  		} -		if (state.companion != null) { +		if (has_companion) {  			out.printf(",");  			write_companion(state);  		}  		out.printf ("\n");  	} -	void flush_pad() { +	private void flush_pad() {  		while (!pad_states.isEmpty()) {  			write_one (pad_states.remove());  		}  	} -	public void write(AltosState state) { +	private void write(AltosState state) {  		if (state.state == AltosLib.ao_flight_startup)  			return;  		if (!header_written) { -			write_header(state.imu != null || state.mag != null, -				     state.gps != null, state.companion != null); +			write_header();  			header_written = true;  		}  		if (!seen_boost) { @@ -300,7 +352,7 @@ public class AltosCSV implements AltosWriter {  			pad_states.add(state);  	} -	public PrintStream out() { +	private PrintStream out() {  		return out;  	} @@ -314,6 +366,31 @@ public class AltosCSV implements AltosWriter {  	public void write(AltosStateIterable states) {  		states.write_comments(out()); + +		has_flight_state = false; +		has_basic = false; +		has_battery = false; +		has_advanced = false; +		has_gps = false; +		has_gps_sat = false; +		has_companion = false; +		for (AltosState state : states) { +			if (state.state != AltosLib.ao_flight_stateless && state.state != AltosLib.ao_flight_invalid && state.state != AltosLib.ao_flight_startup) +				has_flight_state = true; +			if (state.acceleration() != AltosLib.MISSING || state.pressure() != AltosLib.MISSING) +				has_basic = true; +			if (state.battery_voltage != AltosLib.MISSING) +				has_battery = true; +			if (state.imu != null || state.mag != null) +				has_advanced = true; +			if (state.gps != null) { +				has_gps = true; +				if (state.gps.cc_gps_sat != null) +					has_gps_sat = true; +			} +			if (state.companion != null) +				has_companion = true; +		}  		for (AltosState state : states)  			write(state);  	} diff --git a/altoslib/AltosCompanion.java b/altoslib/AltosCompanion.java index 09bfe9f3..47deb2a3 100644 --- a/altoslib/AltosCompanion.java +++ b/altoslib/AltosCompanion.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosCompanion {  	public final static int	board_id_telescience = 0x0a; diff --git a/altoslib/AltosConfigData.java b/altoslib/AltosConfigData.java index e1043958..fc1f2442 100644 --- a/altoslib/AltosConfigData.java +++ b/altoslib/AltosConfigData.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.util.*;  import java.text.*; @@ -31,6 +31,7 @@ public class AltosConfigData implements Iterable<String> {  	public int	log_format;  	public int	log_space;  	public String	version; +	public int	altitude_32;  	/* Strings returned */  	public LinkedList<String>	lines; @@ -46,6 +47,7 @@ public class AltosConfigData implements Iterable<String> {  	public String	callsign;  	public int	radio_enable;  	public int	radio_calibration; +	public int	telemetry_rate;  	/* Old HAS_RADIO values */  	public int	radio_channel;  	public int	radio_setting; @@ -56,6 +58,7 @@ public class AltosConfigData implements Iterable<String> {  	/* HAS_LOG */  	public int	flight_log_max; +	public int 	log_fixed;  	/* HAS_IGNITE */  	public int	ignite_mode; @@ -71,6 +74,7 @@ public class AltosConfigData implements Iterable<String> {  	/* HAS_APRS */  	public int		aprs_interval; +	public int		aprs_ssid;  	/* HAS_BEEP */  	public int		beep; @@ -234,12 +238,14 @@ public class AltosConfigData implements Iterable<String> {  		radio_calibration = -1;  		radio_channel = -1;  		radio_setting = -1; +		telemetry_rate = -1;  		accel_cal_plus = -1;  		accel_cal_minus = -1;  		pad_orientation = -1;  		flight_log_max = -1; +		log_fixed = -1;  		ignite_mode = -1;  		aes_key = ""; @@ -250,6 +256,7 @@ public class AltosConfigData implements Iterable<String> {  		pyro_firing_time = -1;  		aprs_interval = -1; +		aprs_ssid = -1;  		beep = -1; @@ -270,6 +277,7 @@ public class AltosConfigData implements Iterable<String> {  		try { flight = get_int(line, "current-flight"); } catch (Exception e) {}  		try { log_format = get_int(line, "log-format"); } catch (Exception e) {}  		try { log_space = get_int(line, "log-space"); } catch (Exception e) {} +		try { altitude_32 = get_int(line, "altitude-32"); } catch (Exception e) {}  		try { version = get_string(line, "software-version"); } catch (Exception e) {}  		/* Version also contains MS5607 info, which we ignore here */ @@ -290,6 +298,7 @@ public class AltosConfigData implements Iterable<String> {  		try { callsign = get_string(line, "Callsign:"); } catch (Exception e) {}  		try { radio_enable = get_int(line, "Radio enable:"); } catch (Exception e) {}  		try { radio_calibration = get_int(line, "Radio cal:"); } catch (Exception e) {} +		try { telemetry_rate = get_int(line, "Telemetry rate:"); } catch (Exception e) {}  		/* Old HAS_RADIO values */  		try { radio_channel = get_int(line, "Radio channel:"); } catch (Exception e) {} @@ -309,6 +318,7 @@ public class AltosConfigData implements Iterable<String> {  		/* HAS_LOG */  		try { flight_log_max = get_int(line, "Max flight log:"); } catch (Exception e) {} +		try { log_fixed = get_int(line, "Log fixed:"); } catch (Exception e) {}  		/* HAS_IGNITE */  		try { ignite_mode = get_int(line, "Ignite mode:"); } catch (Exception e) {} @@ -333,6 +343,7 @@ public class AltosConfigData implements Iterable<String> {  		/* HAS_APRS */  		try { aprs_interval = get_int(line, "APRS interval:"); } catch (Exception e) {} +		try { aprs_ssid = get_int(line, "APRS SSID:"); } catch (Exception e) {}  		/* HAS_BEEP */  		try { beep = get_int(line, "Beeper setting:"); } catch (Exception e) {} @@ -375,6 +386,10 @@ public class AltosConfigData implements Iterable<String> {  		return radio_frequency >= 0 || radio_setting >= 0 || radio_channel >= 0;  	} +	public boolean has_telemetry_rate() { +		return telemetry_rate >= 0; +	} +  	public void set_frequency(double freq) {  		int	frequency = radio_frequency;  		int	setting = radio_setting; @@ -414,6 +429,8 @@ public class AltosConfigData implements Iterable<String> {  			return false;  		if (product.startsWith("TeleMetrum-v2"))  			return false; +		if (product.startsWith("EasyMega")) +			return false;  		return true;  	} @@ -437,6 +454,8 @@ public class AltosConfigData implements Iterable<String> {  			callsign = source.callsign();  		if (radio_calibration >= 0)  			radio_calibration = source.radio_calibration(); +		if (telemetry_rate >= 0) +			telemetry_rate = source.telemetry_rate();  		/* HAS_ACCEL */  		if (pad_orientation >= 0) @@ -459,6 +478,8 @@ public class AltosConfigData implements Iterable<String> {  		/* HAS_APRS */  		if (aprs_interval >= 0)  			aprs_interval = source.aprs_interval(); +		if (aprs_ssid >= 0) +			aprs_ssid = source.aprs_ssid();  		/* HAS_BEEP */  		if (beep >= 0) @@ -474,16 +495,21 @@ public class AltosConfigData implements Iterable<String> {  		dest.set_serial(serial);  		dest.set_product(product);  		dest.set_version(version); +		dest.set_altitude_32(altitude_32);  		dest.set_main_deploy(main_deploy);  		dest.set_apogee_delay(apogee_delay);  		dest.set_apogee_lockout(apogee_lockout);  		dest.set_radio_calibration(radio_calibration);  		dest.set_radio_frequency(frequency()); +		dest.set_telemetry_rate(telemetry_rate);  		boolean max_enabled = true;  		if (log_space() == 0)  			max_enabled = false; +		if (log_fixed > 0) +			max_enabled = false; +  		switch (log_format) {  		case AltosLib.AO_LOG_FORMAT_TINY:  			max_enabled = false; @@ -507,6 +533,7 @@ public class AltosConfigData implements Iterable<String> {  			dest.set_pyros(null);  		dest.set_pyro_firing_time(pyro_firing_time);  		dest.set_aprs_interval(aprs_interval); +		dest.set_aprs_ssid(aprs_ssid);  		dest.set_beep(beep);  		dest.set_tracker_motion(tracker_motion);  		dest.set_tracker_interval(tracker_interval); @@ -537,14 +564,36 @@ public class AltosConfigData implements Iterable<String> {  							radio_calibration);  			/* When remote, reset the dongle frequency at the same time */  			if (remote) { +				link.flush_output();  				link.stop_remote();  				link.set_radio_frequency(frequency); +				link.flush_output();  				link.start_remote();  			}  		} -		if (callsign != null) +		if (telemetry_rate >= 0) { +			link.printf("c T %d\n", telemetry_rate); +			if (remote) { +				link.flush_output(); +				link.stop_remote(); +				link.set_telemetry_rate(telemetry_rate); +				link.flush_output(); +				link.start_remote(); +			} +		} + +		if (callsign != null) {  			link.printf("c c %s\n", callsign); +			if (remote) { +				link.flush_output(); +				link.stop_remote(); +				link.set_callsign(callsign); +				link.flush_output(); +				link.start_remote(); +			} +		} +  		if (radio_enable >= 0)  			link.printf("c e %d\n", radio_enable); @@ -577,6 +626,8 @@ public class AltosConfigData implements Iterable<String> {  		/* HAS_APRS */  		if (aprs_interval >= 0)  			link.printf("c A %d\n", aprs_interval); +		if (aprs_ssid >= 0) +			link.printf("c S %d\n", aprs_ssid);  		/* HAS_BEEP */  		if (beep >= 0) diff --git a/altoslib/AltosConfigDataException.java b/altoslib/AltosConfigDataException.java index ae5621cc..a932d3e3 100644 --- a/altoslib/AltosConfigDataException.java +++ b/altoslib/AltosConfigDataException.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosConfigDataException extends Exception { diff --git a/altoslib/AltosConfigValues.java b/altoslib/AltosConfigValues.java index 724ba7dc..3f0a7075 100644 --- a/altoslib/AltosConfigValues.java +++ b/altoslib/AltosConfigValues.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public interface AltosConfigValues {  	/* set and get all of the dialog values */ @@ -25,6 +25,8 @@ public interface AltosConfigValues {  	public abstract void set_serial(int serial); +	public abstract void set_altitude_32(int altitude_32); +  	public abstract void set_main_deploy(int new_main_deploy);  	public abstract int main_deploy() throws AltosConfigDataException; @@ -53,6 +55,10 @@ public interface AltosConfigValues {  	public abstract String callsign(); +	public abstract void set_telemetry_rate(int new_telemetry_rate); + +	public abstract int telemetry_rate() throws AltosConfigDataException; +  	public abstract void set_flight_log_max(int new_flight_log_max);  	public abstract void set_flight_log_max_enabled(boolean enable); @@ -81,6 +87,10 @@ public interface AltosConfigValues {  	public abstract void set_aprs_interval(int new_aprs_interval); +	public abstract int aprs_ssid() throws AltosConfigDataException; + +	public abstract void set_aprs_ssid(int new_aprs_ssid); +  	public abstract int beep() throws AltosConfigDataException;  	public abstract void set_beep(int new_beep); diff --git a/altoslib/AltosConvert.java b/altoslib/AltosConvert.java index dc0fbb62..18878c02 100644 --- a/altoslib/AltosConvert.java +++ b/altoslib/AltosConvert.java @@ -18,7 +18,7 @@  /*   * Sensor data conversion functions   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosConvert {  	/* diff --git a/altoslib/AltosDebug.java b/altoslib/AltosDebug.java index b0e52fc1..e58fbaf2 100644 --- a/altoslib/AltosDebug.java +++ b/altoslib/AltosDebug.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*; @@ -52,7 +52,7 @@ public class AltosDebug {  	public static final byte GET_CHIP_ID =		0x68; -	AltosLink	link; +	private AltosLink	link;  	boolean	debug_mode; @@ -112,7 +112,11 @@ public class AltosDebug {  		int i = 0;  		int start = 0;  		while (i < length) { -			String	line = link.get_reply().trim(); +			String	line = link.get_reply(); +			if (line == null) +				throw new IOException("No reply"); + +			line = line.trim();  			if (!AltosLib.ishex(line) || line.length() % 2 != 0)  				throw new IOException(  					String.format @@ -277,4 +281,4 @@ public class AltosDebug {  	public AltosDebug (AltosLink link) {  		this.link = link;  	} -}
\ No newline at end of file +} diff --git a/altoslib/AltosDistance.java b/altoslib/AltosDistance.java index 76ca20c0..67bb58e9 100644 --- a/altoslib/AltosDistance.java +++ b/altoslib/AltosDistance.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosDistance extends AltosUnits { diff --git a/altoslib/AltosEeprom.java b/altoslib/AltosEeprom.java index 020590eb..532c9f1d 100644 --- a/altoslib/AltosEeprom.java +++ b/altoslib/AltosEeprom.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosEepromChunk.java b/altoslib/AltosEepromChunk.java index 91eebc5a..4d12f564 100644 --- a/altoslib/AltosEepromChunk.java +++ b/altoslib/AltosEepromChunk.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.text.*;  import java.util.concurrent.*; diff --git a/altoslib/AltosEepromDownload.java b/altoslib/AltosEepromDownload.java index a2dfc438..a448ee64 100644 --- a/altoslib/AltosEepromDownload.java +++ b/altoslib/AltosEepromDownload.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosEepromFile.java b/altoslib/AltosEepromFile.java index b7e446ce..a1579b55 100644 --- a/altoslib/AltosEepromFile.java +++ b/altoslib/AltosEepromFile.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosEepromGPS.java b/altoslib/AltosEepromGPS.java index 3c1852c0..8c991a6e 100644 --- a/altoslib/AltosEepromGPS.java +++ b/altoslib/AltosEepromGPS.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*;  import java.util.*; @@ -37,7 +37,7 @@ public class AltosEepromGPS extends AltosEeprom {  	/* AO_LOG_GPS_TIME elements */  	public int latitude() { return data32(0); }  	public int longitude() { return data32(4); } -	public int altitude() { return data16(8); } +	public int altitude_low() { return data16(8); }  	public int hour() { return data8(10); }  	public int minute() { return data8(11); }  	public int second() { return data8(12); } @@ -52,6 +52,7 @@ public class AltosEepromGPS extends AltosEeprom {  	public int hdop() { return data8(23); }  	public int vdop() { return data8(24); }  	public int mode() { return data8(25); } +	public int altitude_high() { return data16(26); }  	public boolean has_seconds() { return cmd == AltosLib.AO_LOG_GPS_TIME; } @@ -90,8 +91,10 @@ public class AltosEepromGPS extends AltosEeprom {  		switch (cmd) {  		case AltosLib.AO_LOG_FLIGHT: -			state.set_boost_tick(tick); -			state.set_flight(flight()); +			if (state.flight == AltosLib.MISSING) { +				state.set_boost_tick(tick); +				state.set_flight(flight()); +			}  			/* no place to log start lat/lon yet */  			break;  		case AltosLib.AO_LOG_GPS_TIME: @@ -99,7 +102,10 @@ public class AltosEepromGPS extends AltosEeprom {  			gps = state.make_temp_gps(false);  			gps.lat = latitude() / 1e7;  			gps.lon = longitude() / 1e7; -			gps.alt = altitude(); +			if (state.altitude_32()) +				gps.alt = (altitude_low() & 0xffff) | (altitude_high() << 16); +			else +				gps.alt = altitude_low();  			gps.hour = hour();  			gps.minute = minute(); @@ -118,8 +124,21 @@ public class AltosEepromGPS extends AltosEeprom {  			gps.ground_speed = ground_speed() * 1.0e-2;  			gps.course = course() * 2;  			gps.climb_rate = climb_rate() * 1.0e-2; -			gps.hdop = hdop(); -			gps.vdop = vdop(); +			if (state.compare_version("1.4.9") >= 0) { +				gps.pdop = pdop() / 10.0; +				gps.hdop = hdop() / 10.0; +				gps.vdop = vdop() / 10.0; +			} else { +				gps.pdop = pdop() / 100.0; +				if (gps.pdop < 0.8) +					gps.pdop += 2.56; +				gps.hdop = hdop() / 100.0; +				if (gps.hdop < 0.8) +					gps.hdop += 2.56; +				gps.vdop = vdop() / 100.0; +				if (gps.vdop < 0.8) +					gps.vdop += 2.56; +			}  			break;  		}  	} diff --git a/altoslib/AltosEepromHeader.java b/altoslib/AltosEepromHeader.java index 839aa06e..71030655 100644 --- a/altoslib/AltosEepromHeader.java +++ b/altoslib/AltosEepromHeader.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*;  import java.util.*; @@ -96,6 +96,22 @@ public class AltosEepromHeader extends AltosEeprom {  		case AltosLib.AO_LOG_SOFTWARE_VERSION:  			state.set_firmware_version(data);  			break; +		case AltosLib.AO_LOG_FREQUENCY: +		case AltosLib.AO_LOG_APOGEE_LOCKOUT: +		case AltosLib.AO_LOG_RADIO_RATE: +		case AltosLib.AO_LOG_IGNITE_MODE: +		case AltosLib.AO_LOG_PAD_ORIENTATION: +		case AltosLib.AO_LOG_RADIO_ENABLE: +		case AltosLib.AO_LOG_AES_KEY: +		case AltosLib.AO_LOG_APRS: +		case AltosLib.AO_LOG_BEEP_SETTING: +		case AltosLib.AO_LOG_TRACKER_SETTING: +		case AltosLib.AO_LOG_PYRO_TIME: +		case AltosLib.AO_LOG_APRS_ID: +			break; +		case AltosLib.AO_LOG_ALTITUDE_32: +			state.set_altitude_32(config_a); +			break;  		}  	} @@ -161,6 +177,22 @@ public class AltosEepromHeader extends AltosEeprom {  		case AltosLib.AO_LOG_BARO_CRC:  			out.printf ("# Baro crc: %d\n", config_a);  			break; +		case AltosLib.AO_LOG_FREQUENCY: +		case AltosLib.AO_LOG_APOGEE_LOCKOUT: +		case AltosLib.AO_LOG_RADIO_RATE: +		case AltosLib.AO_LOG_IGNITE_MODE: +		case AltosLib.AO_LOG_PAD_ORIENTATION: +		case AltosLib.AO_LOG_RADIO_ENABLE: +		case AltosLib.AO_LOG_AES_KEY: +		case AltosLib.AO_LOG_APRS: +		case AltosLib.AO_LOG_BEEP_SETTING: +		case AltosLib.AO_LOG_TRACKER_SETTING: +		case AltosLib.AO_LOG_PYRO_TIME: +		case AltosLib.AO_LOG_APRS_ID: +			break; +		case AltosLib.AO_LOG_ALTITUDE_32: +			out.printf("# Altitude-32: %d\n", config_a); +			break;  		}  	} @@ -205,6 +237,9 @@ public class AltosEepromHeader extends AltosEeprom {  			} else if (tokens[0].equals("log-format")) {  				cmd = AltosLib.AO_LOG_LOG_FORMAT;  				config_a = Integer.parseInt(tokens[1]); +			} else if (tokens[0].equals("altitude-32")) { +				cmd = AltosLib.AO_LOG_ALTITUDE_32; +				config_a = Integer.parseInt(tokens[1]);  			} else if (tokens[0].equals("software-version")) {  				cmd = AltosLib.AO_LOG_SOFTWARE_VERSION;  				data = tokens[1]; diff --git a/altoslib/AltosEepromIterable.java b/altoslib/AltosEepromIterable.java index d6832c1b..dd0afd9f 100644 --- a/altoslib/AltosEepromIterable.java +++ b/altoslib/AltosEepromIterable.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosEepromList.java b/altoslib/AltosEepromList.java index ab853a88..740499d3 100644 --- a/altoslib/AltosEepromList.java +++ b/altoslib/AltosEepromList.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosEepromLog.java b/altoslib/AltosEepromLog.java index 1a430c03..5a11fa54 100644 --- a/altoslib/AltosEepromLog.java +++ b/altoslib/AltosEepromLog.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.text.*;  import java.util.concurrent.*; diff --git a/altoslib/AltosEepromMega.java b/altoslib/AltosEepromMega.java index 71719a26..adaa7f31 100644 --- a/altoslib/AltosEepromMega.java +++ b/altoslib/AltosEepromMega.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*;  import java.util.*; @@ -67,7 +67,7 @@ public class AltosEepromMega extends AltosEeprom {  	/* AO_LOG_GPS_TIME elements */  	public int latitude() { return data32(0); }  	public int longitude() { return data32(4); } -	public int altitude() { return data16(8); } +	public int altitude_low() { return data16(8); }  	public int hour() { return data8(10); }  	public int minute() { return data8(11); }  	public int second() { return data8(12); } @@ -82,6 +82,7 @@ public class AltosEepromMega extends AltosEeprom {  	public int hdop() { return data8(23); }  	public int vdop() { return data8(24); }  	public int mode() { return data8(25); } +	public int altitude_high() { return data16(26); }  	/* AO_LOG_GPS_SAT elements */  	public int nsat() { return data16(0); } @@ -168,7 +169,11 @@ public class AltosEepromMega extends AltosEeprom {  			gps = state.make_temp_gps(false);  			gps.lat = latitude() / 1e7;  			gps.lon = longitude() / 1e7; -			gps.alt = altitude(); + +			if (state.altitude_32()) +				gps.alt = (altitude_low() & 0xffff) | (altitude_high() << 16); +			else +				gps.alt = altitude_low();  			gps.hour = hour();  			gps.minute = minute(); @@ -187,8 +192,21 @@ public class AltosEepromMega extends AltosEeprom {  			gps.ground_speed = ground_speed() * 1.0e-2;  			gps.course = course() * 2;  			gps.climb_rate = climb_rate() * 1.0e-2; -			gps.hdop = hdop(); -			gps.vdop = vdop(); +			if (state.compare_version("1.4.9") >= 0) { +				gps.pdop = pdop() / 10.0; +				gps.hdop = hdop() / 10.0; +				gps.vdop = vdop() / 10.0; +			} else { +				gps.pdop = pdop() / 100.0; +				if (gps.pdop < 0.8) +					gps.pdop += 2.56; +				gps.hdop = hdop() / 100.0; +				if (gps.hdop < 0.8) +					gps.hdop += 2.56; +				gps.vdop = vdop() / 100.0; +				if (gps.vdop < 0.8) +					gps.vdop += 2.56; +			}  			break;  		case AltosLib.AO_LOG_GPS_SAT:  			state.set_tick(tick); diff --git a/altoslib/AltosEepromMetrum2.java b/altoslib/AltosEepromMetrum2.java index d137614a..d9a65989 100644 --- a/altoslib/AltosEepromMetrum2.java +++ b/altoslib/AltosEepromMetrum2.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*;  import java.util.*; @@ -49,7 +49,8 @@ public class AltosEepromMetrum2 extends AltosEeprom {  	/* AO_LOG_GPS_POS elements */  	public int latitude() { return data32(0); }  	public int longitude() { return data32(4); } -	public int altitude() { return data16(8); } +	public int altitude_low() { return data16(8); } +	public int altitude_high() { return data16(10); }  	/* AO_LOG_GPS_TIME elements */  	public int hour() { return data8(0); } @@ -59,6 +60,7 @@ public class AltosEepromMetrum2 extends AltosEeprom {  	public int year() { return data8(4); }  	public int month() { return data8(5); }  	public int day() { return data8(6); } +	public int pdop() { return data8(7); }  	/* AO_LOG_GPS_SAT elements */  	public int nsat() { return data8(0); } @@ -117,7 +119,10 @@ public class AltosEepromMetrum2 extends AltosEeprom {  			gps = state.make_temp_gps(false);  			gps.lat = latitude() / 1e7;  			gps.lon = longitude() / 1e7; -			gps.alt = altitude(); +			if (state.altitude_32()) +				gps.alt = (altitude_low() & 0xffff) | (altitude_high() << 16); +			else +				gps.alt = altitude_low();  			break;  		case AltosLib.AO_LOG_GPS_TIME:  			gps = state.make_temp_gps(false); @@ -136,6 +141,7 @@ public class AltosEepromMetrum2 extends AltosEeprom {  			gps.year = 2000 + year();  			gps.month = month();  			gps.day = day(); +			gps.pdop = pdop() / 10.0;  			break;  		case AltosLib.AO_LOG_GPS_SAT:  			gps = state.make_temp_gps(true); diff --git a/altoslib/AltosEepromMini.java b/altoslib/AltosEepromMini.java index 32985639..f197539e 100644 --- a/altoslib/AltosEepromMini.java +++ b/altoslib/AltosEepromMini.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosEepromMonitor.java b/altoslib/AltosEepromMonitor.java index b97287c3..173a2cd8 100644 --- a/altoslib/AltosEepromMonitor.java +++ b/altoslib/AltosEepromMonitor.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public interface AltosEepromMonitor { diff --git a/altoslib/AltosEepromTM.java b/altoslib/AltosEepromTM.java index 77fe20c5..6d36cf47 100644 --- a/altoslib/AltosEepromTM.java +++ b/altoslib/AltosEepromTM.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosEepromTm.java b/altoslib/AltosEepromTm.java index 6cbb7253..81b42f21 100644 --- a/altoslib/AltosEepromTm.java +++ b/altoslib/AltosEepromTm.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosFile.java b/altoslib/AltosFile.java index 2a738996..ba639a04 100644 --- a/altoslib/AltosFile.java +++ b/altoslib/AltosFile.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.File;  import java.util.*; diff --git a/altoslib/AltosFlash.java b/altoslib/AltosFlash.java index 8e8722c2..a8519550 100644 --- a/altoslib/AltosFlash.java +++ b/altoslib/AltosFlash.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*; @@ -345,9 +345,23 @@ public class AltosFlash extends AltosProgrammer {  			debug = new AltosDebug(link);  		input = new FileInputStream(file);  		image = new AltosHexfile(input); -		if (debug != null && !debug.check_connection()) { + +		boolean connection_ok = true; + +		if (debug != null) { +			try { +				connection_ok = debug.check_connection(); +			} catch (IOException ie) { +				debug.close(); +				throw ie; +			} catch (InterruptedException ie) { +				debug.close(); +				throw ie; +			} +		} +		if (!connection_ok) {  			debug.close();  			throw new IOException("Debug port not connected");  		}  	} -}
\ No newline at end of file +} diff --git a/altoslib/AltosFlashListener.java b/altoslib/AltosFlashListener.java index 8bb86bba..7a51c330 100644 --- a/altoslib/AltosFlashListener.java +++ b/altoslib/AltosFlashListener.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public interface AltosFlashListener {  	public void position(String label, int percent); diff --git a/altoslib/AltosFlightReader.java b/altoslib/AltosFlightReader.java index 2fcd556e..be103838 100644 --- a/altoslib/AltosFlightReader.java +++ b/altoslib/AltosFlightReader.java @@ -15,22 +15,22 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.text.*;  import java.io.*;  import java.util.concurrent.*; -public class AltosFlightReader { +public abstract class AltosFlightReader {  	public String name;  	public int serial; -	public void init() { } +	public void init() {} -	public AltosState read() throws InterruptedException, ParseException, AltosCRCException, IOException { return null; } +	public abstract AltosState read() throws InterruptedException, ParseException, AltosCRCException, IOException; -	public void close(boolean interrupted) { } +	public abstract void close(boolean interrupted);  	public void set_frequency(double frequency) throws InterruptedException, TimeoutException { } @@ -38,12 +38,18 @@ public class AltosFlightReader {  	public void set_telemetry(int telemetry) { } +	public void set_telemetry_rate(int telemetry_rate) throws InterruptedException, TimeoutException { } +  	public void save_telemetry() { } +	public void save_telemetry_rate() { } +  	public void update(AltosState state) throws InterruptedException { }  	public boolean supports_telemetry(int telemetry) { return false; } +	public boolean supports_telemetry_rate(int telemetry_rate) { return false; } +  	public File backing_file() { return null; }  	public boolean has_monitor_battery() throws InterruptedException { return false; } diff --git a/altoslib/AltosFlightStats.java b/altoslib/AltosFlightStats.java index 56feb848..1b88cb9f 100644 --- a/altoslib/AltosFlightStats.java +++ b/altoslib/AltosFlightStats.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*; diff --git a/altoslib/AltosFrequency.java b/altoslib/AltosFrequency.java index 7c291ea9..6093df49 100644 --- a/altoslib/AltosFrequency.java +++ b/altoslib/AltosFrequency.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosFrequency {  	public double	frequency; @@ -41,4 +41,4 @@ public class AltosFrequency {  		frequency = f;  		description = d;  	} -}
\ No newline at end of file +} diff --git a/altoslib/AltosGPS.java b/altoslib/AltosGPS.java index 2708d026..0154e95d 100644 --- a/altoslib/AltosGPS.java +++ b/altoslib/AltosGPS.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.text.*;  import java.util.concurrent.*; @@ -40,10 +40,11 @@ public class AltosGPS implements Cloneable {  	public double	ground_speed;	/* m/s */  	public int	course;		/* degrees */  	public double	climb_rate;	/* m/s */ +	public double	pdop;		/* unitless */  	public double	hdop;		/* unitless */  	public double	vdop;		/* unitless */ -	public int	h_error;	/* m */ -	public int	v_error;	/* m */ +	public double	h_error;	/* m */ +	public double	v_error;	/* m */  	public AltosGPSSat[] cc_gps_sat;	/* tracking data */ @@ -95,6 +96,7 @@ public class AltosGPS implements Cloneable {  						      AltosLib.MISSING, 1/100.0);  			course = map.get_int(AltosTelemetryLegacy.AO_TELEM_GPS_COURSE,  					     AltosLib.MISSING); +			pdop = map.get_double(AltosTelemetryLegacy.AO_TELEM_GPS_PDOP, MISSING, 1.0);  			hdop = map.get_double(AltosTelemetryLegacy.AO_TELEM_GPS_HDOP, MISSING, 1.0);  			vdop = map.get_double(AltosTelemetryLegacy.AO_TELEM_GPS_VDOP, MISSING, 1.0);  			h_error = map.get_int(AltosTelemetryLegacy.AO_TELEM_GPS_HERROR, MISSING); @@ -268,14 +270,26 @@ public class AltosGPS implements Cloneable {  		cc_gps_sat[cc_gps_sat.length - 1] = sat;  	} -	public AltosGPS() { +	private void init() {  		lat = AltosLib.MISSING;  		lon = AltosLib.MISSING;  		alt = AltosLib.MISSING; +		ground_speed = AltosLib.MISSING; +		course = AltosLib.MISSING; +		climb_rate = AltosLib.MISSING; +		pdop = AltosLib.MISSING; +		hdop = AltosLib.MISSING; +		vdop = AltosLib.MISSING; +		h_error = AltosLib.MISSING; +		v_error = AltosLib.MISSING;  		ClearGPSTime();  		cc_gps_sat = null;  	} +	public AltosGPS() { +		init(); +	} +  	public AltosGPS clone() {  		AltosGPS	g = new AltosGPS(); @@ -295,7 +309,9 @@ public class AltosGPS implements Cloneable {  		g.ground_speed = ground_speed;	/* m/s */  		g.course = course;		/* degrees */  		g.climb_rate = climb_rate;	/* m/s */ -		g.hdop = hdop;		/* unitless? */ +		g.pdop = pdop;		/* unitless */ +		g.hdop = hdop;		/* unitless */ +		g.vdop = vdop;		/* unitless */  		g.h_error = h_error;	/* m */  		g.v_error = v_error;	/* m */ @@ -327,9 +343,11 @@ public class AltosGPS implements Cloneable {  			ground_speed = old.ground_speed;	/* m/s */  			course = old.course;		/* degrees */  			climb_rate = old.climb_rate;	/* m/s */ +			pdop = old.pdop;		/* unitless? */  			hdop = old.hdop;		/* unitless? */ -			h_error = old.h_error;	/* m */ -			v_error = old.v_error;	/* m */ +			vdop = old.vdop;		/* unitless? */ +			h_error = old.h_error;		/* m */ +			v_error = old.v_error;		/* m */  			if (old.cc_gps_sat != null) {  				cc_gps_sat = new AltosGPSSat[old.cc_gps_sat.length]; @@ -340,11 +358,7 @@ public class AltosGPS implements Cloneable {  				}  			}  		} else { -			lat = AltosLib.MISSING; -			lon = AltosLib.MISSING; -			alt = AltosLib.MISSING; -			ClearGPSTime(); -			cc_gps_sat = null; +			init();  		}  	} diff --git a/altoslib/AltosGPSSat.java b/altoslib/AltosGPSSat.java index ef24d497..adbcbe61 100644 --- a/altoslib/AltosGPSSat.java +++ b/altoslib/AltosGPSSat.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosGPSSat {  	public int	svid; diff --git a/altoslib/AltosGreatCircle.java b/altoslib/AltosGreatCircle.java index 4782c34d..716eeef9 100644 --- a/altoslib/AltosGreatCircle.java +++ b/altoslib/AltosGreatCircle.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.lang.Math; diff --git a/altoslib/AltosHeight.java b/altoslib/AltosHeight.java index 84981032..8c67e043 100644 --- a/altoslib/AltosHeight.java +++ b/altoslib/AltosHeight.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosHeight extends AltosUnits { diff --git a/altoslib/AltosHexfile.java b/altoslib/AltosHexfile.java index d5fa8f5f..9ee64bdc 100644 --- a/altoslib/AltosHexfile.java +++ b/altoslib/AltosHexfile.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*;  import java.util.LinkedList; diff --git a/altoslib/AltosHexsym.java b/altoslib/AltosHexsym.java index 403b5644..52eb81db 100644 --- a/altoslib/AltosHexsym.java +++ b/altoslib/AltosHexsym.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosHexsym {  	String	name; diff --git a/altoslib/AltosIMU.java b/altoslib/AltosIMU.java index a22b3fed..89d7def4 100644 --- a/altoslib/AltosIMU.java +++ b/altoslib/AltosIMU.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.util.concurrent.*; diff --git a/altoslib/AltosIdle.java b/altoslib/AltosIdle.java index 55f6f5c9..0f723d14 100644 --- a/altoslib/AltosIdle.java +++ b/altoslib/AltosIdle.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosIdleFetch.java b/altoslib/AltosIdleFetch.java index 5cd8bf36..50745d97 100644 --- a/altoslib/AltosIdleFetch.java +++ b/altoslib/AltosIdleFetch.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*;  import java.util.*; @@ -118,6 +118,10 @@ public class AltosIdleFetch implements AltosStateUpdate {  			       AltosIdler.idle_ms5607, AltosIdler.idle_mma655x,  			       AltosIdler.idle_imu, AltosIdler.idle_mag,  			       AltosIdler.idle_sensor_mega), +		new AltosIdler("EasyMega", +			       AltosIdler.idle_ms5607, AltosIdler.idle_mma655x, +			       AltosIdler.idle_imu, AltosIdler.idle_mag, +			       AltosIdler.idle_sensor_mega),  	};  	AltosLink		link; diff --git a/altoslib/AltosIdleMonitor.java b/altoslib/AltosIdleMonitor.java index f81abdff..85bcff10 100644 --- a/altoslib/AltosIdleMonitor.java +++ b/altoslib/AltosIdleMonitor.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*;  import java.util.concurrent.*; diff --git a/altoslib/AltosIdleMonitorListener.java b/altoslib/AltosIdleMonitorListener.java index 6a9abea2..4382430c 100644 --- a/altoslib/AltosIdleMonitorListener.java +++ b/altoslib/AltosIdleMonitorListener.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public interface AltosIdleMonitorListener {  	public void update(AltosState state, AltosListenerState listener_state); diff --git a/altoslib/AltosIgnite.java b/altoslib/AltosIgnite.java index c21f17ac..b458911e 100644 --- a/altoslib/AltosIgnite.java +++ b/altoslib/AltosIgnite.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.util.*;  import java.io.*; diff --git a/altoslib/AltosKML.java b/altoslib/AltosKML.java index d55da9ef..e701fda3 100644 --- a/altoslib/AltosKML.java +++ b/altoslib/AltosKML.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*; @@ -28,18 +28,25 @@ public class AltosKML implements AltosWriter {  	double			gps_start_altitude;  	static final String[] kml_state_colors = { -		"FF000000", -		"FF000000", -		"FF000000", -		"FF0000FF", -		"FF4080FF", -		"FF00FFFF", -		"FFFF0000", -		"FF00FF00", -		"FF000000", -		"FFFFFFFF" +		"FF000000",	// startup +		"FF000000",	// idle +		"FF000000",	// pad +		"FF0000FF",	// boost +		"FF4080FF",	// fast +		"FF00FFFF",	// coast +		"FFFF0000",	// drogue +		"FF00FF00",	// main +		"FF000000",	// landed +		"FFFFFFFF",	// invalid +		"FFFF0000",	// stateless  	}; +	static String state_color(int state) { +		if (state < 0 || kml_state_colors.length <= state) +			return kml_state_colors[AltosLib.ao_flight_invalid]; +		return kml_state_colors[state]; +	} +  	static final String kml_header_start =  		"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +  		"<kml xmlns=\"http://www.opengis.net/kml/2.2\">\n" + @@ -95,7 +102,8 @@ public class AltosKML implements AltosWriter {  	void state_start(AltosState state) {  		String	state_name = AltosLib.state_name(state.state); -		out.printf(kml_style_start, state_name, kml_state_colors[state.state]); +		String	state_color = state_color(state.state); +		out.printf(kml_style_start, state_name, state_color);  		out.printf("\tState: %s\n", state_name);  		out.printf("%s", kml_style_end);  		out.printf(kml_placemark_start, state_name, state_name); diff --git a/altoslib/AltosLatitude.java b/altoslib/AltosLatitude.java index 6156d6dc..2b507173 100644 --- a/altoslib/AltosLatitude.java +++ b/altoslib/AltosLatitude.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosLatitude extends AltosLocation {  	public String pos() { return "N"; } diff --git a/altoslib/AltosLib.java b/altoslib/AltosLib.java index 69c6d604..2e9dc648 100644 --- a/altoslib/AltosLib.java +++ b/altoslib/AltosLib.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.util.*;  import java.io.*; @@ -51,6 +51,20 @@ public class AltosLib {  	public static final int AO_LOG_SERIAL_NUMBER = 2002;  	public static final int AO_LOG_LOG_FORMAT = 2003; +	public static final int AO_LOG_FREQUENCY = 2004; +	public static final int AO_LOG_APOGEE_LOCKOUT = 2005; +	public static final int AO_LOG_RADIO_RATE = 2006; +	public static final int AO_LOG_IGNITE_MODE = 2007; +	public static final int AO_LOG_PAD_ORIENTATION = 2008; +	public static final int AO_LOG_RADIO_ENABLE = 2009; +	public static final int AO_LOG_AES_KEY = 2010; +	public static final int AO_LOG_APRS = 2011; +	public static final int AO_LOG_BEEP_SETTING = 2012; +	public static final int AO_LOG_TRACKER_SETTING = 2013; +	public static final int AO_LOG_PYRO_TIME = 2014; +	public static final int AO_LOG_APRS_ID = 2015; +	public static final int AO_LOG_ALTITUDE_32 = 2016; +  	/* Added for header fields in telemega files */  	public static final int AO_LOG_BARO_RESERVED = 3000;  	public static final int AO_LOG_BARO_SENS = 3001; @@ -98,6 +112,7 @@ public class AltosLib {  	public final static int product_telegps = 0x0025;  	public final static int product_easymini = 0x0026;  	public final static int product_telemini = 0x0027; +	public final static int product_easymega = 0x0028;  	public final static int product_altusmetrum_min = 0x000a;  	public final static int product_altusmetrum_max = 0x002c; @@ -129,7 +144,8 @@ public class AltosLib {  		new Product("megadongle", product_megadongle),  		new Product("telegps", product_telegps),  		new Product("easymini", product_easymini), -		new Product("telemini", product_telemini) +		new Product("telemini", product_telemini), +		new Product("easymega", product_easymega)  	};  	public static int name_to_product(String name) { @@ -161,6 +177,15 @@ public class AltosLib {  		"Off", "Standard Telemetry", "TeleMetrum v0.9", "TeleMetrum v0.8"  	}; +	public static final int ao_telemetry_rate_38400 = 0; +	public static final int ao_telemetry_rate_9600 = 1; +	public static final int ao_telemetry_rate_2400 = 2; +	public static final int ao_telemetry_rate_max = 2; + +	public static final Integer[] ao_telemetry_rate_values = { +		38400, 9600, 2400 +	}; +  	public static final String launch_sites_url = "http://www.altusmetrum.org/AltOS/launch-sites.txt";  	public static final int ao_telemetry_standard_len = 32; @@ -206,6 +231,31 @@ public class AltosLib {  								 telemetry));  	} +	private static int[] split_version(String version) { +		String[] tokens = version.split("\\."); +		int[] ret = new int[tokens.length]; +		for (int i = 0; i < tokens.length; i++) +			ret[i] = Integer.parseInt(tokens[i]); +		return ret; +	} + +	public static int compare_version(String version_a, String version_b) { +		int[] a = split_version(version_a); +		int[] b = split_version(version_b); + +		for (int i = 0; i < Math.min(a.length, b.length); i++) { +			if (a[i] < b[i]) +				return -1; +			if (a[i] > b[i]) +				return 1; +		} +		if (a.length < b.length) +			return -1; +		if (a.length > b.length) +			return 1; +		return 0; +	} +  	private static String[] state_to_string = {  		"startup",  		"idle", @@ -281,7 +331,7 @@ public class AltosLib {  		return false;  	} -	public static boolean ishex(int c) { +	public static final boolean ishex(int c) {  		if ('0' <= c && c <= '9')  			return true;  		if ('a' <= c && c <= 'f') @@ -291,7 +341,7 @@ public class AltosLib {  		return false;  	} -	public static boolean ishex(String s) { +	public static final boolean ishex(String s) {  		for (int i = 0; i < s.length(); i++)  			if (!ishex(s.charAt(i)))  				return false; @@ -415,10 +465,17 @@ public class AltosLib {  		if ((s.length() & 1) != 0)  			throw new NumberFormatException(String.format("invalid line \"%s\"", s)); -		n = s.length() / 2; +		byte[] bytes = s.getBytes(unicode_set); +		n = bytes.length / 2;  		r = new int[n]; -		for (i = 0; i < n; i++) -			r[i] = hexbyte(s, i * 2); +		for (i = 0; i < n; i++) { +			int h = fromhex(bytes[(i << 1)]); +			int l = fromhex(bytes[(i << 1) + 1]); +			if (h < 0 || l < 0) +				throw new NumberFormatException(String.format("invalid hex \"%c%c\"", +									      bytes[(i<<1)], bytes[(i<<1) + 1])); +			r[i] = (h << 4) + l; +		}  		return r;  	} diff --git a/altoslib/AltosLine.java b/altoslib/AltosLine.java index f9c712a3..f56938c6 100644 --- a/altoslib/AltosLine.java +++ b/altoslib/AltosLine.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosLine {  	public String	line; diff --git a/altoslib/AltosLink.java b/altoslib/AltosLink.java index 7f434a06..62bd82b9 100644 --- a/altoslib/AltosLink.java +++ b/altoslib/AltosLink.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*;  import java.util.concurrent.*; @@ -163,8 +163,21 @@ public abstract class AltosLink implements Runnable {  		if (!can_cancel && remote)  			System.out.printf("Uh-oh, reading remote serial device from swing thread\n"); -		if (remote && can_cancel) +		if (remote && can_cancel) {  			timeout = 500; +			switch (telemetry_rate) { +			case AltosLib.ao_telemetry_rate_38400: +			default: +				timeout = 500; +				break; +			case AltosLib.ao_telemetry_rate_9600: +				timeout = 2000; +				break; +			case AltosLib.ao_telemetry_rate_2400: +				timeout = 8000; +				break; +			} +		}  		try {  			++in_reply; @@ -274,6 +287,8 @@ public abstract class AltosLink implements Runnable {  	}  	public void flush_output() { +		if (pending_output == null) +			return;  		for (String s : pending_output)  			System.out.print(s);  		pending_output.clear(); @@ -305,6 +320,7 @@ public abstract class AltosLink implements Runnable {  	 */  	public boolean monitor_mode = false;  	public int telemetry = AltosLib.ao_telemetry_standard; +	public int telemetry_rate = -1;  	public double frequency;  	public String callsign;  	AltosConfigData	config_data; @@ -356,6 +372,15 @@ public abstract class AltosLink implements Runnable {  		flush_output();  	} +	public void set_telemetry_rate(int in_telemetry_rate) { +		telemetry_rate = in_telemetry_rate; +		if (monitor_mode) +			printf("m 0\nc T %d\nm %x\n", telemetry_rate, telemetry_len()); +		else +			printf("c T %d\n", telemetry_rate); +		flush_output(); +	} +  	public void set_monitor(boolean monitor) {  		monitor_mode = monitor;  		if (monitor) @@ -383,10 +408,14 @@ public abstract class AltosLink implements Runnable {  		flush_output();  	} -	public AltosConfigData config_data() throws InterruptedException, TimeoutException { + 	public AltosConfigData config_data() throws InterruptedException, TimeoutException {  		synchronized(config_data_lock) { -			if (config_data == null) +			if (config_data == null) { +				printf("m 0\n");  				config_data = new AltosConfigData(this); +				if (monitor_mode) +					set_monitor(true); +			}  			return config_data;  		}  	} @@ -430,7 +459,12 @@ public abstract class AltosLink implements Runnable {  		if (debug)  			System.out.printf("start remote %7.3f\n", frequency);  		set_radio_frequency(frequency); -		set_callsign(AltosPreferences.callsign()); +		if (telemetry_rate < 0) +			telemetry_rate = AltosPreferences.telemetry_rate(serial); +		set_telemetry_rate(telemetry_rate); +		if (callsign.equals("")) +			callsign = AltosPreferences.callsign(); +		set_callsign(callsign);  		printf("p\nE 0\n");  		flush_input();  		remote = true; diff --git a/altoslib/AltosListenerState.java b/altoslib/AltosListenerState.java index 5bf761b0..054ff1d0 100644 --- a/altoslib/AltosListenerState.java +++ b/altoslib/AltosListenerState.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosListenerState {  	public int	crc_errors; diff --git a/altoslib/AltosLocation.java b/altoslib/AltosLocation.java index 725a02ba..9bbbb899 100644 --- a/altoslib/AltosLocation.java +++ b/altoslib/AltosLocation.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public abstract class AltosLocation extends AltosUnits { diff --git a/altoslib/AltosLog.java b/altoslib/AltosLog.java index c4e9e425..28116e3d 100644 --- a/altoslib/AltosLog.java +++ b/altoslib/AltosLog.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*;  import java.text.*; @@ -72,6 +72,7 @@ public class AltosLog implements Runnable {  			}  			log_file.flush();  			file = a; +			AltosPreferences.set_logfile(link.serial, file);  		}  		return log_file != null;  	} diff --git a/altoslib/AltosLongitude.java b/altoslib/AltosLongitude.java index 29a5dcd4..dbcd6bf0 100644 --- a/altoslib/AltosLongitude.java +++ b/altoslib/AltosLongitude.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosLongitude extends AltosLocation {  	public String pos() { return "E"; } diff --git a/altoslib/AltosMag.java b/altoslib/AltosMag.java index 9262de2d..690241f1 100644 --- a/altoslib/AltosMag.java +++ b/altoslib/AltosMag.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.util.concurrent.*; diff --git a/altoslib/AltosMma655x.java b/altoslib/AltosMma655x.java index cb2e63d4..7f0dab98 100644 --- a/altoslib/AltosMma655x.java +++ b/altoslib/AltosMma655x.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.util.concurrent.*; @@ -23,14 +23,15 @@ public class AltosMma655x implements Cloneable {  	int	accel; -	public boolean parse_line(String line) { -		String[] items = line.split("\\s+"); -		if (line.startsWith("MMA655X value:")) { -			if (items.length >= 3) -				accel = Integer.parseInt(items[1]); -		} else -			return false; -		return true; +	public boolean parse_line(String line) throws NumberFormatException { +		if (line.startsWith("MMA655X value")) { +			String[] items = line.split("\\s+"); +			if (items.length >= 3) { +				accel = Integer.parseInt(items[2]); +				return true; +			} +		} +		return false;  	}  	public AltosMma655x() { @@ -51,17 +52,18 @@ public class AltosMma655x implements Cloneable {  			if (mma655x != null)  				state.set_accel(mma655x.accel);  		} catch (TimeoutException te) { +		} catch (NumberFormatException ne) {  		}  	} -	public AltosMma655x(AltosLink link) throws InterruptedException, TimeoutException { +	public AltosMma655x(AltosLink link) throws InterruptedException, TimeoutException, NumberFormatException {  		this();  		link.printf("A\n");  		for (;;) {  			String line = link.get_reply_no_dialog(5000);  			if (line == null)  				throw new TimeoutException(); -			if (!parse_line(line)) +			if (parse_line(line))  				break;  		}  	} diff --git a/altoslib/AltosMs5607.java b/altoslib/AltosMs5607.java index 5aa3a7ec..81e0641c 100644 --- a/altoslib/AltosMs5607.java +++ b/altoslib/AltosMs5607.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.util.concurrent.*; diff --git a/altoslib/AltosNoSymbol.java b/altoslib/AltosNoSymbol.java index f5e53b8c..d436c3f1 100644 --- a/altoslib/AltosNoSymbol.java +++ b/altoslib/AltosNoSymbol.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosNoSymbol extends Exception {  	public AltosNoSymbol(String name) { diff --git a/altoslib/AltosOrient.java b/altoslib/AltosOrient.java index 5fcbe28d..348c6844 100644 --- a/altoslib/AltosOrient.java +++ b/altoslib/AltosOrient.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosOrient extends AltosUnits { diff --git a/altoslib/AltosParse.java b/altoslib/AltosParse.java index 1bff7682..9cb99a0d 100644 --- a/altoslib/AltosParse.java +++ b/altoslib/AltosParse.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.text.*; diff --git a/altoslib/AltosPreferences.java b/altoslib/AltosPreferences.java index d299f27b..dba57dcb 100644 --- a/altoslib/AltosPreferences.java +++ b/altoslib/AltosPreferences.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*;  import java.util.*; @@ -35,6 +35,12 @@ public class AltosPreferences {  	/* telemetry format preference name */  	public final static String telemetryPreferenceFormat = "TELEMETRY-%d"; +	/* telemetry rate format preference name */ +	public final static String telemetryRatePreferenceFormat = "RATE-%d"; + +	/* log file format preference name */ +	public final static String logfilePreferenceFormat = "LOGFILE-%d"; +  	/* voice preference name */  	public final static String voicePreference = "VOICE"; @@ -50,6 +56,9 @@ public class AltosPreferences {  	/* scanning telemetry preferences name */  	public final static String scanningTelemetryPreference = "SCANNING-TELEMETRY"; +	/* scanning telemetry rate preferences name */ +	public final static String scanningTelemetryRatePreference = "SCANNING-RATE"; +  	/* Launcher serial preference name */  	public final static String launcherSerialPreference = "LAUNCHER-SERIAL"; @@ -74,6 +83,12 @@ public class AltosPreferences {  	/* Telemetry (map serial to telemetry format) */  	public static Hashtable<Integer, Integer> telemetries; +	/* Telemetry rate (map serial to telemetry format) */ +	public static Hashtable<Integer, Integer> telemetry_rates; + +	/* Log file (map serial to logfile name) */ +	public static Hashtable<Integer, File> logfiles; +  	/* Voice preference */  	public static boolean voice; @@ -86,6 +101,8 @@ public class AltosPreferences {  	/* Scanning telemetry */  	public static int scanning_telemetry; +	public static int scanning_telemetry_rate; +  	/* List of frequencies */  	public final static String common_frequencies_node_name = "COMMON-FREQUENCIES";  	public static AltosFrequency[] common_frequencies; @@ -140,6 +157,10 @@ public class AltosPreferences {  	public static int launcher_channel;  	public static void init(AltosPreferencesBackend in_backend) { + +		if (backend != null) +			return; +  		backend = in_backend;  		/* Initialize logdir from preferences */ @@ -159,12 +180,18 @@ public class AltosPreferences {  		telemetries = new Hashtable<Integer,Integer>(); +		telemetry_rates = new Hashtable<Integer,Integer>(); + +		logfiles = new Hashtable<Integer,File>(); +  		voice = backend.getBoolean(voicePreference, true);  		callsign = backend.getString(callsignPreference,"N0CALL");  		scanning_telemetry = backend.getInt(scanningTelemetryPreference,(1 << AltosLib.ao_telemetry_standard)); +		scanning_telemetry_rate = backend.getInt(scanningTelemetryRatePreference,(1 << AltosLib.ao_telemetry_rate_38400)); +  		launcher_serial = backend.getInt(launcherSerialPreference, 0);  		launcher_channel = backend.getInt(launcherChannelPreference, 0); @@ -266,6 +293,46 @@ public class AltosPreferences {  		}  	} +	public static void set_telemetry_rate(int serial, int new_telemetry_rate) { +		synchronized (backend) { +			telemetry_rates.put(serial, new_telemetry_rate); +			backend.putInt(String.format(telemetryRatePreferenceFormat, serial), new_telemetry_rate); +			flush_preferences(); +		} +	} + +	public static int telemetry_rate(int serial) { +		synchronized (backend) { +			if (telemetry_rates.containsKey(serial)) +				return telemetry_rates.get(serial); +			int telemetry_rate = backend.getInt(String.format(telemetryRatePreferenceFormat, serial), +							    AltosLib.ao_telemetry_rate_38400); +			telemetry_rates.put(serial, telemetry_rate); +			return telemetry_rate; +		} +	} + +	public static void set_logfile(int serial, File new_logfile) { +		synchronized(backend) { +			logfiles.put(serial, new_logfile); +			backend.putString(String.format(logfilePreferenceFormat, serial), new_logfile.getPath()); +			flush_preferences(); +		} +	} + +	public static File logfile(int serial) { +		synchronized(backend) { +			if (logfiles.containsKey(serial)) +				return logfiles.get(serial); +			String logfile_string = backend.getString(String.format(logfilePreferenceFormat, serial), null); +			if (logfile_string == null) +				return null; +			File logfile = new File(logfile_string); +			logfiles.put(serial, logfile); +			return logfile; +		} +	} +  	public static void set_scanning_telemetry(int new_scanning_telemetry) {  		synchronized (backend) {  			scanning_telemetry = new_scanning_telemetry; @@ -280,6 +347,20 @@ public class AltosPreferences {  		}  	} +	public static void set_scanning_telemetry_rate(int new_scanning_telemetry_rate) { +		synchronized (backend) { +			scanning_telemetry_rate = new_scanning_telemetry_rate; +			backend.putInt(scanningTelemetryRatePreference, scanning_telemetry_rate); +			flush_preferences(); +		} +	} + +	public static int scanning_telemetry_rate() { +		synchronized(backend) { +			return scanning_telemetry_rate; +		} +	} +  	public static void set_voice(boolean new_voice) {  		synchronized (backend) {  			voice = new_voice; diff --git a/altoslib/AltosPreferencesBackend.java b/altoslib/AltosPreferencesBackend.java index 461b5c80..76a99acb 100644 --- a/altoslib/AltosPreferencesBackend.java +++ b/altoslib/AltosPreferencesBackend.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.File; diff --git a/altoslib/AltosProgrammer.java b/altoslib/AltosProgrammer.java index c96f04ca..443082d5 100644 --- a/altoslib/AltosProgrammer.java +++ b/altoslib/AltosProgrammer.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*; diff --git a/altoslib/AltosPyro.java b/altoslib/AltosPyro.java index 9e47bc80..60b8fe52 100644 --- a/altoslib/AltosPyro.java +++ b/altoslib/AltosPyro.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.util.*;  import java.text.*; diff --git a/altoslib/AltosReplayReader.java b/altoslib/AltosReplayReader.java index bf7e0e5b..2864e02a 100644 --- a/altoslib/AltosReplayReader.java +++ b/altoslib/AltosReplayReader.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*;  import java.util.*; @@ -27,6 +27,7 @@ import java.util.*;  public class AltosReplayReader extends AltosFlightReader {  	Iterator<AltosState>	iterator;  	File	file; +	boolean real_time;  	public AltosState read() {  		if (iterator.hasNext()) @@ -39,16 +40,22 @@ public class AltosReplayReader extends AltosFlightReader {  	public void update(AltosState state) throws InterruptedException {  		/* Make it run in realtime after the rocket leaves the pad */ -		if (state.state > AltosLib.ao_flight_pad && state.time_change > 0) +		if (real_time && state.state > AltosLib.ao_flight_pad && state.time_change > 0)  			Thread.sleep((int) (Math.min(state.time_change,10) * 1000));  		state.set_received_time(System.currentTimeMillis());  	}  	public File backing_file() { return file; } -	public AltosReplayReader(Iterator<AltosState> in_iterator, File in_file) { +	public AltosReplayReader(Iterator<AltosState> in_iterator, File in_file, +				 boolean in_real_time) {  		iterator = in_iterator;  		file = in_file; +		real_time = in_real_time;  		name = file.getName();  	} + +	public AltosReplayReader(Iterator<AltosState> in_iterator, File in_file) { +		this(in_iterator, in_file, false); +	}  } diff --git a/altoslib/AltosRomconfig.java b/altoslib/AltosRomconfig.java index 10df11af..d0de5492 100644 --- a/altoslib/AltosRomconfig.java +++ b/altoslib/AltosRomconfig.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*; diff --git a/altoslib/AltosSelfFlash.java b/altoslib/AltosSelfFlash.java index 502c6d65..3ec69213 100644 --- a/altoslib/AltosSelfFlash.java +++ b/altoslib/AltosSelfFlash.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*; diff --git a/altoslib/AltosSensorEMini.java b/altoslib/AltosSensorEMini.java index ee0238f9..53a8e998 100644 --- a/altoslib/AltosSensorEMini.java +++ b/altoslib/AltosSensorEMini.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.util.concurrent.TimeoutException; diff --git a/altoslib/AltosSensorMM.java b/altoslib/AltosSensorMM.java index e34e71b7..cdc2ac42 100644 --- a/altoslib/AltosSensorMM.java +++ b/altoslib/AltosSensorMM.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.util.concurrent.TimeoutException; diff --git a/altoslib/AltosSensorMega.java b/altoslib/AltosSensorMega.java index 02f3a256..3c7213eb 100644 --- a/altoslib/AltosSensorMega.java +++ b/altoslib/AltosSensorMega.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.util.concurrent.TimeoutException; diff --git a/altoslib/AltosSensorMetrum.java b/altoslib/AltosSensorMetrum.java index e5421ef5..d977e886 100644 --- a/altoslib/AltosSensorMetrum.java +++ b/altoslib/AltosSensorMetrum.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.util.concurrent.TimeoutException; diff --git a/altoslib/AltosSensorTM.java b/altoslib/AltosSensorTM.java index 2d60d8cf..344e7449 100644 --- a/altoslib/AltosSensorTM.java +++ b/altoslib/AltosSensorTM.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.util.concurrent.TimeoutException; diff --git a/altoslib/AltosSensorTMini.java b/altoslib/AltosSensorTMini.java index b9eeca0c..edd76da2 100644 --- a/altoslib/AltosSensorTMini.java +++ b/altoslib/AltosSensorTMini.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.util.concurrent.TimeoutException; diff --git a/altoslib/AltosSpeed.java b/altoslib/AltosSpeed.java index 9134f5f4..d2f86214 100644 --- a/altoslib/AltosSpeed.java +++ b/altoslib/AltosSpeed.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosSpeed extends AltosUnits { diff --git a/altoslib/AltosState.java b/altoslib/AltosState.java index b05cd358..5fce15c4 100644 --- a/altoslib/AltosState.java +++ b/altoslib/AltosState.java @@ -19,7 +19,7 @@   * Track flight state from telemetry or eeprom data stream   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosState implements Cloneable { @@ -271,6 +271,7 @@ public class AltosState implements Cloneable {  	public int	state;  	public int	flight;  	public int	serial; +	public int	altitude_32;  	public int	receiver_serial;  	public boolean	landed;  	public boolean	ascent;	/* going up? */ @@ -472,15 +473,23 @@ public class AltosState implements Cloneable {  		pressure.set(p, time);  	} +	public double baro_height() { +		double a = altitude(); +		double g = ground_altitude(); +		if (a != AltosLib.MISSING && g != AltosLib.MISSING) +			return a - g; +		return AltosLib.MISSING; +	} +  	public double height() {  		double k = kalman_height.value();  		if (k != AltosLib.MISSING)  			return k; -		double a = altitude(); -		double g = ground_altitude(); -		if (a != AltosLib.MISSING && g != AltosLib.MISSING) -			return a - g; +		double b = baro_height(); +		if (b != AltosLib.MISSING) +			return b; +  		return gps_height();  	} @@ -762,6 +771,7 @@ public class AltosState implements Cloneable {  		product = null;  		serial = AltosLib.MISSING;  		receiver_serial = AltosLib.MISSING; +		altitude_32 = AltosLib.MISSING;  		baro = null;  		companion = null; @@ -899,6 +909,7 @@ public class AltosState implements Cloneable {  		product = old.product;  		serial = old.serial;  		receiver_serial = old.receiver_serial; +		altitude_32 = old.altitude_32;  		baro = old.baro;  		companion = old.companion; @@ -1024,15 +1035,27 @@ public class AltosState implements Cloneable {  		firmware_version = version;  	} +	public int compare_version(String other_version) { +		if (firmware_version == null) +			return AltosLib.MISSING; +		return AltosLib.compare_version(firmware_version, other_version); +	} + +	private void re_init() { +		int bt = boost_tick; +		int rs = receiver_serial; +		init(); +		boost_tick = bt; +		receiver_serial = rs; +	} +  	public void set_flight(int flight) {  		/* When the flight changes, reset the state */ -		if (flight != AltosLib.MISSING && flight != 0) { +		if (flight != AltosLib.MISSING) {  			if (this.flight != AltosLib.MISSING &&  			    this.flight != flight) { -				int bt = boost_tick; -				init(); -				boost_tick = bt; +				re_init();  			}  			this.flight = flight;  		} @@ -1043,9 +1066,7 @@ public class AltosState implements Cloneable {  		if (serial != AltosLib.MISSING) {  			if (this.serial != AltosLib.MISSING &&  			    this.serial != serial) { -				int bt = boost_tick; -				init(); -				boost_tick = bt; +				re_init();  			}  			this.serial = serial;  		} @@ -1056,6 +1077,15 @@ public class AltosState implements Cloneable {  			receiver_serial = serial;  	} +	public boolean altitude_32() { +		return altitude_32 == 1; +	} + +	public void set_altitude_32(int altitude_32) { +		if (altitude_32 != AltosLib.MISSING) +			this.altitude_32 = altitude_32; +	} +  	public int rssi() {  		if (rssi == AltosLib.MISSING)  			return 0; diff --git a/altoslib/AltosStateIterable.java b/altoslib/AltosStateIterable.java index be812095..4154b71c 100644 --- a/altoslib/AltosStateIterable.java +++ b/altoslib/AltosStateIterable.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*;  import java.util.*; @@ -26,4 +26,18 @@ public abstract class AltosStateIterable implements Iterable<AltosState> {  	}  	public abstract void write(PrintStream out); + +	public static AltosStateIterable iterable(File file) { +		FileInputStream in; +		try { +			in = new FileInputStream(file); +		} catch (Exception e) { +			System.out.printf("Failed to open file '%s'\n", file); +			return null; +		} +		if (file.getName().endsWith("telem")) +			return new AltosTelemetryFile(in); +		else +			return new AltosEepromFile(in); +	}  } diff --git a/altoslib/AltosStateUpdate.java b/altoslib/AltosStateUpdate.java index ac4e963e..70530f75 100644 --- a/altoslib/AltosStateUpdate.java +++ b/altoslib/AltosStateUpdate.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public interface AltosStateUpdate {  	public void	update_state(AltosState state) throws InterruptedException; diff --git a/altoslib/AltosTelemetry.java b/altoslib/AltosTelemetry.java index 8182ec6b..a123d752 100644 --- a/altoslib/AltosTelemetry.java +++ b/altoslib/AltosTelemetry.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.text.*; @@ -114,6 +114,29 @@ public abstract class AltosTelemetry implements AltosStateUpdate {  		return telem;  	} +	public static int extend_height(AltosState state, int height_16) { +		double	compare_height; +		int	height = height_16; + +		if (state.gps != null && state.gps.alt != AltosLib.MISSING) { +			compare_height = state.gps_height(); +		} else { +			compare_height = state.height(); +		} + +		if (compare_height != AltosLib.MISSING) { +			int	high_bits = (int) Math.floor (compare_height / 65536.0); + +			height = (high_bits << 16) | (height_16 & 0xffff); + +			if (Math.abs(height + 65536 - compare_height) < Math.abs(height - compare_height)) +				height += 65536; +			else if (Math.abs(height - 65536 - compare_height) < Math.abs(height - compare_height)) +				height -= 65536; +		} +		return height; +	} +  	public static AltosTelemetry parse(String line) throws ParseException, AltosCRCException {  		String[] word = line.split("\\s+");  		int i =0; diff --git a/altoslib/AltosTelemetryConfiguration.java b/altoslib/AltosTelemetryConfiguration.java index e3884051..f578e6ad 100644 --- a/altoslib/AltosTelemetryConfiguration.java +++ b/altoslib/AltosTelemetryConfiguration.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosTelemetryConfiguration extends AltosTelemetryStandard { diff --git a/altoslib/AltosTelemetryFile.java b/altoslib/AltosTelemetryFile.java index 3d3fa407..15344b8d 100644 --- a/altoslib/AltosTelemetryFile.java +++ b/altoslib/AltosTelemetryFile.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosTelemetryIterable.java b/altoslib/AltosTelemetryIterable.java index cba97ddc..ac42597d 100644 --- a/altoslib/AltosTelemetryIterable.java +++ b/altoslib/AltosTelemetryIterable.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosTelemetryLegacy.java b/altoslib/AltosTelemetryLegacy.java index 3367ece7..72a8bc4a 100644 --- a/altoslib/AltosTelemetryLegacy.java +++ b/altoslib/AltosTelemetryLegacy.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.text.*; @@ -186,6 +186,7 @@ public class AltosTelemetryLegacy extends AltosTelemetry {  	 *	g_v		GPS vertical speed (integer, cm/sec)  	 *	g_s		GPS horizontal speed (integer, cm/sec)  	 *	g_c		GPS course (integer, 0-359) +	 *	g_pd		GPS pdop (integer * 10)  	 *	g_hd		GPS hdop (integer * 10)  	 *	g_vd		GPS vdop (integer * 10)  	 *	g_he		GPS h error (integer) @@ -209,6 +210,7 @@ public class AltosTelemetryLegacy extends AltosTelemetry {  	final static String AO_TELEM_GPS_VERTICAL_SPEED		= "g_v";  	final static String AO_TELEM_GPS_HORIZONTAL_SPEED	= "g_g";  	final static String AO_TELEM_GPS_COURSE			= "g_c"; +	final static String AO_TELEM_GPS_PDOP			= "g_pd";  	final static String AO_TELEM_GPS_HDOP			= "g_hd";  	final static String AO_TELEM_GPS_VDOP			= "g_vd";  	final static String AO_TELEM_GPS_HERROR			= "g_he"; diff --git a/altoslib/AltosTelemetryLocation.java b/altoslib/AltosTelemetryLocation.java index 8368188f..427ae16e 100644 --- a/altoslib/AltosTelemetryLocation.java +++ b/altoslib/AltosTelemetryLocation.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosTelemetryLocation extends AltosTelemetryStandard { @@ -37,11 +37,12 @@ public class AltosTelemetryLocation extends AltosTelemetryStandard {  	int	climb_rate;  	int	course; +	public static final int	AO_GPS_MODE_ALTITUDE_24 = (1 << 0);	/* Reports 24-bits of altitude */ +  	public AltosTelemetryLocation(int[] bytes) {  		super(bytes);  		flags          = uint8(5); -		altitude       = int16(6);  		latitude       = uint32(8);  		longitude      = uint32(12);  		year	       = uint8(16); @@ -57,6 +58,11 @@ public class AltosTelemetryLocation extends AltosTelemetryStandard {  		ground_speed   = uint16(26);  		climb_rate     = int16(28);  		course	       = uint8(30); + +		if ((mode & AO_GPS_MODE_ALTITUDE_24) != 0) { +			altitude = (int8(31) << 16) | uint16(6); +		} else +			altitude = int16(6);  	}  	public void update_state(AltosState state) { @@ -80,8 +86,9 @@ public class AltosTelemetryLocation extends AltosTelemetryStandard {  			gps.ground_speed = ground_speed * 1.0e-2;  			gps.course = course * 2;  			gps.climb_rate = climb_rate * 1.0e-2; -			gps.hdop = hdop; -			gps.vdop = vdop; +			gps.pdop = pdop / 10.0; +			gps.hdop = hdop / 10.0; +			gps.vdop = vdop / 10.0;  		}  		state.set_temp_gps();  	} diff --git a/altoslib/AltosTelemetryMap.java b/altoslib/AltosTelemetryMap.java index 8d0de355..758311eb 100644 --- a/altoslib/AltosTelemetryMap.java +++ b/altoslib/AltosTelemetryMap.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.text.*;  import java.util.HashMap; diff --git a/altoslib/AltosTelemetryMegaData.java b/altoslib/AltosTelemetryMegaData.java index fac5695f..d949c02f 100644 --- a/altoslib/AltosTelemetryMegaData.java +++ b/altoslib/AltosTelemetryMegaData.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosTelemetryMegaData extends AltosTelemetryStandard {  	int	state; @@ -31,12 +31,12 @@ public class AltosTelemetryMegaData extends AltosTelemetryStandard {  	int	acceleration;  	int	speed; -	int	height; +	int	height_16;  	public AltosTelemetryMegaData(int[] bytes) {  		super(bytes); -		state = int8(5); +		state = uint8(5);  		v_batt = int16(6);  		v_pyro = int16(8); @@ -44,7 +44,7 @@ public class AltosTelemetryMegaData extends AltosTelemetryStandard {  		sense = new int[6];  		for (int i = 0; i < 6; i++) { -			sense[i] = int8(10 + i) << 4; +			sense[i] = uint8(10 + i) << 4;  			sense[i] |= sense[i] >> 8;  		} @@ -55,7 +55,8 @@ public class AltosTelemetryMegaData extends AltosTelemetryStandard {  		acceleration = int16(26);  		speed = int16(28); -		height = int16(30); + +		height_16 = int16(30);  	}  	public void update_state(AltosState state) { @@ -79,7 +80,13 @@ public class AltosTelemetryMegaData extends AltosTelemetryStandard {  		state.set_ground_pressure(ground_pres);  		state.set_accel_g(accel_plus_g, accel_minus_g); -		state.set_kalman(height, speed/16.0, acceleration / 16.0); +		/* Fill in the high bits of height from recent GPS +		 * data if available, otherwise guess using the +		 * previous kalman height +		 */ + +		state.set_kalman(extend_height(state, height_16), +				 speed/16.0, acceleration / 16.0);  	}  } diff --git a/altoslib/AltosTelemetryMegaSensor.java b/altoslib/AltosTelemetryMegaSensor.java index 9e73bc4e..1b568c88 100644 --- a/altoslib/AltosTelemetryMegaSensor.java +++ b/altoslib/AltosTelemetryMegaSensor.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosTelemetryMegaSensor extends AltosTelemetryStandard {  	int	accel; diff --git a/altoslib/AltosTelemetryMetrumData.java b/altoslib/AltosTelemetryMetrumData.java index 96617306..3377d969 100644 --- a/altoslib/AltosTelemetryMetrumData.java +++ b/altoslib/AltosTelemetryMetrumData.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosTelemetryMetrumData extends AltosTelemetryStandard { diff --git a/altoslib/AltosTelemetryMetrumSensor.java b/altoslib/AltosTelemetryMetrumSensor.java index e7055404..beab6da9 100644 --- a/altoslib/AltosTelemetryMetrumSensor.java +++ b/altoslib/AltosTelemetryMetrumSensor.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosTelemetryMetrumSensor extends AltosTelemetryStandard { @@ -27,7 +27,7 @@ public class AltosTelemetryMetrumSensor extends AltosTelemetryStandard {  	int	acceleration;  	int	speed; -	int	height; +	int	height_16;  	int	v_batt;  	int	sense_a; @@ -43,7 +43,7 @@ public class AltosTelemetryMetrumSensor extends AltosTelemetryStandard {  		acceleration  = int16(14);  		speed         = int16(16); -		height        = int16(18); +		height_16     = int16(18);  		v_batt        = int16(20);  		sense_a       = int16(22); @@ -59,7 +59,8 @@ public class AltosTelemetryMetrumSensor extends AltosTelemetryStandard {  		state.set_pressure(pres);  		state.set_temperature(temp/100.0); -		state.set_kalman(height, speed/16.0, acceleration/16.0); +		state.set_kalman(extend_height(state, height_16), +				 speed/16.0, acceleration/16.0);  		state.set_battery_voltage(AltosConvert.mega_battery_voltage(v_batt)); diff --git a/altoslib/AltosTelemetryMini.java b/altoslib/AltosTelemetryMini.java index fbfaff8e..221bb67c 100644 --- a/altoslib/AltosTelemetryMini.java +++ b/altoslib/AltosTelemetryMini.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosTelemetryMini extends AltosTelemetryStandard { diff --git a/altoslib/AltosTelemetryRaw.java b/altoslib/AltosTelemetryRaw.java index 0dca62aa..2a535e84 100644 --- a/altoslib/AltosTelemetryRaw.java +++ b/altoslib/AltosTelemetryRaw.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosTelemetryRaw extends AltosTelemetryStandard {  	public AltosTelemetryRaw(int[] bytes) { diff --git a/altoslib/AltosTelemetryReader.java b/altoslib/AltosTelemetryReader.java index 3dff661a..7539452d 100644 --- a/altoslib/AltosTelemetryReader.java +++ b/altoslib/AltosTelemetryReader.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  import java.text.*;  import java.io.*; @@ -26,11 +26,19 @@ public class AltosTelemetryReader extends AltosFlightReader {  	AltosLog	log;  	double		frequency;  	int		telemetry; +	int		telemetry_rate;  	AltosState	state = null; +	AltosFlightReader	stacked;  	LinkedBlockingQueue<AltosLine> telem;  	public AltosState read() throws InterruptedException, ParseException, AltosCRCException, IOException { +		if (stacked != null) { +			state = stacked.read(); +			if (state != null) +				return state; +			stacked = null; +		}  		AltosLine l = telem.take();  		if (l.line == null)  			throw new IOException("IO error"); @@ -52,6 +60,12 @@ public class AltosTelemetryReader extends AltosFlightReader {  	}  	public void close(boolean interrupted) { + +		if (stacked != null) { +			stacked.close(interrupted); +			stacked = null; +		} +  		link.remove_monitor(telem);  		log.close();  		try { @@ -92,6 +106,23 @@ public class AltosTelemetryReader extends AltosFlightReader {  		}  	} +	public boolean supports_telemetry_rate(int telemetry_rate) { +		try { +			/* Version 1.4.1.1 supports all rates, older versions don't */ +			if (link.config_data().compare_version("1.4.1.1") >= 0) +				return true; + +			if (telemetry_rate == AltosLib.ao_telemetry_rate_38400) +				return true; +			else +				return false; +		} catch (InterruptedException ie) { +			return false; +		} catch (TimeoutException te) { +			return true; +		} +	} +  	public void save_frequency() {  		AltosPreferences.set_frequency(link.serial, frequency);  	} @@ -105,6 +136,15 @@ public class AltosTelemetryReader extends AltosFlightReader {  		AltosPreferences.set_telemetry(link.serial, telemetry);  	} +	public void set_telemetry_rate(int in_telemetry_rate) { +		telemetry_rate = in_telemetry_rate; +		link.set_telemetry_rate(telemetry_rate); +	} + +	public void save_telemetry_rate() { +		AltosPreferences.set_telemetry_rate(link.serial, telemetry_rate); +	} +  	public void set_monitor(boolean monitor) {  		link.set_monitor(monitor);  	} @@ -121,9 +161,10 @@ public class AltosTelemetryReader extends AltosFlightReader {  		return link.monitor_battery();  	} -	public AltosTelemetryReader (AltosLink in_link) +	public AltosTelemetryReader (AltosLink in_link, AltosFlightReader in_stacked)  		throws IOException, InterruptedException, TimeoutException {  		link = in_link; +		stacked = in_stacked;  		boolean success = false;  		try {  			log = new AltosLog(link); @@ -133,6 +174,8 @@ public class AltosTelemetryReader extends AltosFlightReader {  			set_frequency(frequency);  			telemetry = AltosPreferences.telemetry(link.serial);  			set_telemetry(telemetry); +			telemetry_rate = AltosPreferences.telemetry_rate(link.serial); +			set_telemetry_rate(telemetry_rate);  			link.add_monitor(telem);  			success = true;  		} finally { @@ -140,4 +183,22 @@ public class AltosTelemetryReader extends AltosFlightReader {  				close(true);  		}  	} + +	private static AltosFlightReader existing_data(AltosLink link) { +		if (link == null) +			return null; + +		File	file = AltosPreferences.logfile(link.serial); +		if (file != null) { +			AltosStateIterable	iterable = AltosStateIterable.iterable(file); +			if (iterable != null) +				return new AltosReplayReader(iterable.iterator(), file, false); +		} +		return null; +	} + +	public AltosTelemetryReader(AltosLink link) +		throws IOException, InterruptedException, TimeoutException { +		this(link, existing_data(link)); +	}  } diff --git a/altoslib/AltosTelemetrySatellite.java b/altoslib/AltosTelemetrySatellite.java index d611e88c..d1cdaf6d 100644 --- a/altoslib/AltosTelemetrySatellite.java +++ b/altoslib/AltosTelemetrySatellite.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosTelemetrySatellite extends AltosTelemetryStandard {  	int		channels; diff --git a/altoslib/AltosTelemetrySensor.java b/altoslib/AltosTelemetrySensor.java index ad4d9283..fc3fe858 100644 --- a/altoslib/AltosTelemetrySensor.java +++ b/altoslib/AltosTelemetrySensor.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosTelemetrySensor extends AltosTelemetryStandard { diff --git a/altoslib/AltosTelemetryStandard.java b/altoslib/AltosTelemetryStandard.java index 23ae9d21..f4dfd8e9 100644 --- a/altoslib/AltosTelemetryStandard.java +++ b/altoslib/AltosTelemetryStandard.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public abstract class AltosTelemetryStandard extends AltosTelemetry {  	int[]	bytes; diff --git a/altoslib/AltosTemperature.java b/altoslib/AltosTemperature.java index 5fa71b86..e654fada 100644 --- a/altoslib/AltosTemperature.java +++ b/altoslib/AltosTemperature.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosTemperature extends AltosUnits { diff --git a/altoslib/AltosUnits.java b/altoslib/AltosUnits.java index d29cfae7..dbdb7882 100644 --- a/altoslib/AltosUnits.java +++ b/altoslib/AltosUnits.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public abstract class AltosUnits { diff --git a/altoslib/AltosUnitsListener.java b/altoslib/AltosUnitsListener.java index ca6faafd..664aed67 100644 --- a/altoslib/AltosUnitsListener.java +++ b/altoslib/AltosUnitsListener.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public interface AltosUnitsListener {  	public void units_changed(boolean imperial_units); diff --git a/altoslib/AltosVoltage.java b/altoslib/AltosVoltage.java index 351bf115..22bd1aee 100644 --- a/altoslib/AltosVoltage.java +++ b/altoslib/AltosVoltage.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public class AltosVoltage extends AltosUnits { diff --git a/altoslib/AltosWriter.java b/altoslib/AltosWriter.java index c3479a93..fb208b02 100644 --- a/altoslib/AltosWriter.java +++ b/altoslib/AltosWriter.java @@ -15,12 +15,10 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_4; +package org.altusmetrum.altoslib_5;  public interface AltosWriter { -	public void write(AltosState state); -  	public void write(AltosStateIterable states);  	public void close(); diff --git a/altoslib/Makefile.am b/altoslib/Makefile.am index e81418bb..0ad9b7da 100644 --- a/altoslib/Makefile.am +++ b/altoslib/Makefile.am @@ -131,7 +131,7 @@ JAR=altoslib_$(ALTOSLIB_VERSION).jar  all-local: $(JAR)  clean-local: -	-rm -rf bin $(JAR) +	-rm -rf $(JAVAROOT) altoslib_*.jar  install-altoslibJAVA: $(JAR)  	@$(NORMAL_INSTALL) | 
