diff options
| author | Keith Packard <keithp@keithp.com> | 2012-03-27 11:58:39 -0700 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2012-03-27 11:58:39 -0700 | 
| commit | d77a4ea206d627635159f35c76c744687d4e633b (patch) | |
| tree | b8dbf66c2cfeb7817c6ff0e443b6f1a63f910975 | |
| parent | d8ebb83e64d66fa159e75aa560d39d80bb6d9d04 (diff) | |
altosui: Show only supported telemetry version
Make it clear in the UI which telemetry versions are supported,
providing the combobox only for new firmware which supports all versions.
Signed-off-by: Keith Packard <keithp@keithp.com>
| -rw-r--r-- | altosui/AltosConfigData.java | 33 | ||||
| -rw-r--r-- | altosui/AltosFlightReader.java | 2 | ||||
| -rw-r--r-- | altosui/AltosFlightUI.java | 74 | ||||
| -rw-r--r-- | altosui/AltosTelemetryReader.java | 27 | 
4 files changed, 110 insertions, 26 deletions
| diff --git a/altosui/AltosConfigData.java b/altosui/AltosConfigData.java index e5c3566b..0608b4d3 100644 --- a/altosui/AltosConfigData.java +++ b/altosui/AltosConfigData.java @@ -104,6 +104,39 @@ public class AltosConfigData implements Iterable<String> {  		}  	} +	int[] parse_version(String v) { +		String[] parts = v.split("\\."); +		int r[] = new int[parts.length]; + +		for (int i = 0; i < parts.length; i++) { +			try { +				r[i] = Altos.fromdec(parts[i]); +			} catch (NumberFormatException n) { +				r[i] = 0; +			} +		} + +		return r; +	} +	 +	public int compare_version(String other) { +		int[]	me = parse_version(version); +		int[]	them = parse_version(other); + +		int	l = Math.min(me.length, them.length); + +		for (int i = 0; i < l; i++) { +			int	d = me[i] - them[i]; +			if (d != 0) +				return d; +		} +		if (me.length > l) +			return 1; +		if (them.length > l) +			return -1; +		return 0; +	} +  	public AltosConfigData(AltosSerial serial_line) throws InterruptedException, TimeoutException {  		serial_line.printf("c s\nf\nl\nv\n");  		lines = new LinkedList<String>(); diff --git a/altosui/AltosFlightReader.java b/altosui/AltosFlightReader.java index 47df375d..3ddf171d 100644 --- a/altosui/AltosFlightReader.java +++ b/altosui/AltosFlightReader.java @@ -43,5 +43,7 @@ public class AltosFlightReader {  	void update(AltosState state) throws InterruptedException { } +	boolean supports_telemetry(int telemetry) { return false; } +  	File backing_file() { return null; }  } diff --git a/altosui/AltosFlightUI.java b/altosui/AltosFlightUI.java index dcf85277..d99da43d 100644 --- a/altosui/AltosFlightUI.java +++ b/altosui/AltosFlightUI.java @@ -169,6 +169,7 @@ public class AltosFlightUI extends AltosFrame implements AltosFlightDisplay, Alt  	Container	bag;  	AltosFreqList	frequencies;  	JComboBox	telemetries; +	JLabel		telemetry;  	ActionListener	show_timer; @@ -216,32 +217,53 @@ public class AltosFlightUI extends AltosFrame implements AltosFlightDisplay, Alt  			bag.add (frequencies, c);  			// Telemetry format menu -			telemetries = new JComboBox(); -			for (int i = 1; i <= Altos.ao_telemetry_max; i++) -				telemetries.addItem(Altos.telemetry_name(i)); -			int telemetry = AltosPreferences.telemetry(serial); -			if (telemetry <= Altos.ao_telemetry_off || -			    telemetry > Altos.ao_telemetry_max) -				telemetry = Altos.ao_telemetry_standard; -			telemetries.setSelectedIndex(telemetry - 1); -			telemetries.setMaximumRowCount(Altos.ao_telemetry_max); -			telemetries.setPreferredSize(null); -			telemetries.revalidate(); -			telemetries.addActionListener(new ActionListener() { -					public void actionPerformed(ActionEvent e) { -						int telemetry = telemetries.getSelectedIndex() + 1; -						reader.set_telemetry(telemetry); -						reader.save_telemetry(); -					} -				}); -			c.gridx = 1; -			c.gridy = 0; -			c.weightx = 0; -			c.weighty = 0; -			c.fill = GridBagConstraints.NONE; -			c.anchor = GridBagConstraints.WEST; -			bag.add (telemetries, c); -			c.insets = new Insets(0, 0, 0, 0); +			if (reader.supports_telemetry(Altos.ao_telemetry_standard)) { +				telemetries = new JComboBox(); +				for (int i = 1; i <= Altos.ao_telemetry_max; i++)  +					telemetries.addItem(Altos.telemetry_name(i)); +				int telemetry = AltosPreferences.telemetry(serial); +				if (telemetry <= Altos.ao_telemetry_off || +				    telemetry > Altos.ao_telemetry_max) +					telemetry = Altos.ao_telemetry_standard; +				telemetries.setSelectedIndex(telemetry - 1); +				telemetries.setMaximumRowCount(Altos.ao_telemetry_max); +				telemetries.setPreferredSize(null); +				telemetries.revalidate(); +				telemetries.addActionListener(new ActionListener() { +						public void actionPerformed(ActionEvent e) { +							int telemetry = telemetries.getSelectedIndex() + 1; +							reader.set_telemetry(telemetry); +							reader.save_telemetry(); +						} +					}); +				c.gridx = 1; +				c.gridy = 0; +				c.weightx = 0; +				c.weighty = 0; +				c.fill = GridBagConstraints.NONE; +				c.anchor = GridBagConstraints.WEST; +				bag.add (telemetries, c); +				c.insets = new Insets(0, 0, 0, 0); +			} else { +				String	version; + +				if (reader.supports_telemetry(Altos.ao_telemetry_0_9)) +					version = "Telemetry: 0.9"; +				else if (reader.supports_telemetry(Altos.ao_telemetry_0_8)) +					version = "Telemetry: 0.8"; +				else +					version = "Telemetry: None"; + +				telemetry = new JLabel(version); +				c.gridx = 1; +				c.gridy = 0; +				c.weightx = 0; +				c.weighty = 0; +				c.fill = GridBagConstraints.NONE; +				c.anchor = GridBagConstraints.WEST; +				bag.add (telemetry, c); +				c.insets = new Insets(0, 0, 0, 0); +			}  		}  		/* Flight status is always visible */ diff --git a/altosui/AltosTelemetryReader.java b/altosui/AltosTelemetryReader.java index 1f327a67..85dc9cbc 100644 --- a/altosui/AltosTelemetryReader.java +++ b/altosui/AltosTelemetryReader.java @@ -56,6 +56,33 @@ class AltosTelemetryReader extends AltosFlightReader {  		serial.set_radio_frequency(frequency);  	} +	public boolean supports_telemetry(int telemetry) { + +		try { +			/* Version 1.0 or later firmware supports all telemetry formats */ +			if (serial.config_data().compare_version("1.0") >= 0) +				return true; + +			/* Version 0.9 firmware only supports 0.9 telemetry */ +			if (serial.config_data().compare_version("0.9") >= 0) { +				if (telemetry == Altos.ao_telemetry_0_9) +					return true; +				else +					return false; +			} + +			/* Version 0.8 firmware only supports 0.8 telemetry */ +			if (telemetry == Altos.ao_telemetry_0_8) +				return true; +			else +				return false; +		} catch (InterruptedException ie) { +			return true; +		} catch (TimeoutException te) { +			return true; +		} +	} +  	void save_frequency() {  		AltosPreferences.set_frequency(device.getSerial(), frequency);  	} | 
