diff options
| author | Keith Packard <keithp@keithp.com> | 2014-07-02 22:48:13 -0700 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2014-07-05 00:38:10 -0700 | 
| commit | 55e6558fa7cb23fb1363a86c83fbd6abf67ea324 (patch) | |
| tree | 45f14786b0c165bdb6d7249f70bf0626aad4a500 /altoslib | |
| parent | 292cb8380b478542555b5f370e8252eafa2f74ac (diff) | |
altoslib: Support multiple telemetry rates
Altos now supports 2400 and 9600 baud in addition to the classic 38400
baud rate. Add support to altoslib for these as well
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'altoslib')
| -rw-r--r-- | altoslib/AltosConfigData.java | 9 | ||||
| -rw-r--r-- | altoslib/AltosConfigValues.java | 4 | ||||
| -rw-r--r-- | altoslib/AltosFlightReader.java | 6 | ||||
| -rw-r--r-- | altoslib/AltosLib.java | 9 | ||||
| -rw-r--r-- | altoslib/AltosLink.java | 14 | ||||
| -rw-r--r-- | altoslib/AltosPreferences.java | 48 | ||||
| -rw-r--r-- | altoslib/AltosTelemetryReader.java | 29 | 
7 files changed, 118 insertions, 1 deletions
| diff --git a/altoslib/AltosConfigData.java b/altoslib/AltosConfigData.java index 3bf8ea43..847436cd 100644 --- a/altoslib/AltosConfigData.java +++ b/altoslib/AltosConfigData.java @@ -46,6 +46,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; @@ -235,6 +236,7 @@ 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; @@ -292,6 +294,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) {} @@ -440,6 +443,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) @@ -484,6 +489,7 @@ public class AltosConfigData implements Iterable<String> {  		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) @@ -554,6 +560,9 @@ public class AltosConfigData implements Iterable<String> {  		if (radio_enable >= 0)  			link.printf("c e %d\n", radio_enable); +		if (telemetry_rate >= 0) +			link.printf("c T %d\n", telemetry_rate); +  		/* HAS_ACCEL */  		/* UI doesn't support accel cal */  		if (pad_orientation >= 0) diff --git a/altoslib/AltosConfigValues.java b/altoslib/AltosConfigValues.java index b0c49e98..987da53b 100644 --- a/altoslib/AltosConfigValues.java +++ b/altoslib/AltosConfigValues.java @@ -53,6 +53,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); diff --git a/altoslib/AltosFlightReader.java b/altoslib/AltosFlightReader.java index ac151396..c0565e88 100644 --- a/altoslib/AltosFlightReader.java +++ b/altoslib/AltosFlightReader.java @@ -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/AltosLib.java b/altoslib/AltosLib.java index ec32fffc..c2ec0e3b 100644 --- a/altoslib/AltosLib.java +++ b/altoslib/AltosLib.java @@ -161,6 +161,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; diff --git a/altoslib/AltosLink.java b/altoslib/AltosLink.java index ef40c8cb..eadab5df 100644 --- a/altoslib/AltosLink.java +++ b/altoslib/AltosLink.java @@ -274,6 +274,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 +307,7 @@ public abstract class AltosLink implements Runnable {  	 */  	public boolean monitor_mode = false;  	public int telemetry = AltosLib.ao_telemetry_standard; +	public int telemetry_rate = AltosLib.ao_telemetry_rate_38400;  	public double frequency;  	public String callsign;  	AltosConfigData	config_data; @@ -356,6 +359,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,7 +395,7 @@ 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) {  				printf("m 0\n"); diff --git a/altoslib/AltosPreferences.java b/altoslib/AltosPreferences.java index 159951e4..72cfeb4b 100644 --- a/altoslib/AltosPreferences.java +++ b/altoslib/AltosPreferences.java @@ -35,6 +35,9 @@ 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"; +  	/* voice preference name */  	public final static String voicePreference = "VOICE"; @@ -50,6 +53,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 +80,9 @@ 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; +  	/* Voice preference */  	public static boolean voice; @@ -86,6 +95,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; @@ -159,12 +170,16 @@ public class AltosPreferences {  		telemetries = new Hashtable<Integer,Integer>(); +		telemetry_rates = new Hashtable<Integer,Integer>(); +  		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 +281,25 @@ 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_scanning_telemetry(int new_scanning_telemetry) {  		synchronized (backend) {  			scanning_telemetry = new_scanning_telemetry; @@ -280,6 +314,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/AltosTelemetryReader.java b/altoslib/AltosTelemetryReader.java index 589f57f2..5ed50134 100644 --- a/altoslib/AltosTelemetryReader.java +++ b/altoslib/AltosTelemetryReader.java @@ -26,6 +26,7 @@ public class AltosTelemetryReader extends AltosFlightReader {  	AltosLog	log;  	double		frequency;  	int		telemetry; +	int		telemetry_rate;  	AltosState	state = null;  	LinkedBlockingQueue<AltosLine> telem; @@ -92,6 +93,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 +123,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);  	} @@ -133,6 +160,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 { | 
