altosui: Show only supported telemetry version
authorKeith Packard <keithp@keithp.com>
Tue, 27 Mar 2012 18:58:39 +0000 (11:58 -0700)
committerKeith Packard <keithp@keithp.com>
Tue, 27 Mar 2012 18:58:39 +0000 (11:58 -0700)
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>
altosui/AltosConfigData.java
altosui/AltosFlightReader.java
altosui/AltosFlightUI.java
altosui/AltosTelemetryReader.java

index e5c3566b6c9b4826d54709db35057eb62c07f66b..0608b4d396ef2b98d7190a8d6529ec3e6f0a2689 100644 (file)
@@ -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>();
index 47df375d67dc9bb62ad09e132971d652fde486b2..3ddf171d3b7788286701de65235c9caa90c6fb3f 100644 (file)
@@ -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; }
 }
index dcf852776a0904f4dd78850bb9300c3056440b6c..d99da43dea0622b4f50bbd53ddbabeeb647bea9d 100644 (file)
@@ -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 */
index 1f327a67c75773bf95a6c81ec583fd554042bef7..85dc9cbc57d9f7f219a759c360552626d5871e1f 100644 (file)
@@ -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);
        }