}
}
+ 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>();
Container bag;
AltosFreqList frequencies;
JComboBox telemetries;
+ JLabel telemetry;
ActionListener show_timer;
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 */
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);
}