X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altosui%2FAltosConfigTD.java;h=9b9cdcaac4d59f0c664deb65511c287dcb333503;hp=d3c452e1ceb4c6ee037c14513095a2c19cb79257;hb=cb23b992be8ba40c97d8988c134a814a13ccd58c;hpb=b4ab9f5dfa9f2a50e0528acf0a1fdeaa1f9bc523 diff --git a/altosui/AltosConfigTD.java b/altosui/AltosConfigTD.java index d3c452e1..9b9cdcaa 100644 --- a/altosui/AltosConfigTD.java +++ b/altosui/AltosConfigTD.java @@ -17,18 +17,12 @@ package altosui; -import java.awt.*; import java.awt.event.*; import javax.swing.*; -import javax.swing.filechooser.FileNameExtensionFilter; -import javax.swing.table.*; import java.io.*; -import java.util.*; -import java.text.*; -import java.util.prefs.*; import java.util.concurrent.*; - -import libaltosJNI.*; +import org.altusmetrum.altoslib_7.*; +import org.altusmetrum.altosuilib_7.*; public class AltosConfigTD implements ActionListener { @@ -68,11 +62,11 @@ public class AltosConfigTD implements ActionListener { int_ref radio_calibration; int_ref radio_setting; int_ref radio_frequency; + int_ref telemetry_rate; string_ref config_version; string_ref version; string_ref product; AltosConfigTDUI config_ui; - boolean serial_started; boolean made_visible; boolean get_int(String line, String label, int_ref x) { @@ -106,22 +100,13 @@ public class AltosConfigTD implements ActionListener { } } - void start_serial() throws InterruptedException, TimeoutException { - serial_started = true; - } - - void stop_serial() throws InterruptedException { - if (!serial_started) - return; - serial_started = false; - } - - void update_ui() { + synchronized void update_ui() { config_ui.set_serial(serial.get()); config_ui.set_product(product.get()); config_ui.set_version(version.get()); config_ui.set_radio_frequency(frequency()); config_ui.set_radio_calibration(radio_calibration.get()); + config_ui.set_telemetry_rate(telemetry_rate.get()); config_ui.set_clean(); if (!made_visible) { made_visible = true; @@ -129,7 +114,7 @@ public class AltosConfigTD implements ActionListener { } } - void process_line(String line) { + void finish_input(String line) { if (line == null) { abort(); return; @@ -139,91 +124,119 @@ public class AltosConfigTD implements ActionListener { update_ui(); return; } - get_string(line, "Config version", config_version); - get_int(line, "serial-number", serial); - get_int(line, "Radio channel:", radio_channel); - if (get_int(line, "Radio cal:", radio_calibration)) - System.out.printf("got radio cal %d\n", radio_calibration.get()); - if (get_int(line, "Frequency:", radio_frequency)) - System.out.printf("got radio freq %d\n", radio_frequency.get()); - get_int(line, "Radio setting:", radio_setting); - get_string(line,"software-version", version); - get_string(line,"product", product); } - final static int serial_mode_read = 0; - final static int serial_mode_save = 1; - final static int serial_mode_reboot = 2; - - class SerialData implements Runnable { - AltosConfigTD config; - int serial_mode; - - void process_line(String line) { - config.process_line(line); - } - void callback(String in_line) { - final String line = in_line; + synchronized void process_line(String line) { + if (line == null || line.equals("all finished")) { + final String last_line = line; Runnable r = new Runnable() { public void run() { - process_line(line); + finish_input(last_line); } }; SwingUtilities.invokeLater(r); + } else { + get_string(line, "Config version", config_version); + get_int(line, "serial-number", serial); + get_int(line, "Radio channel:", radio_channel); + get_int(line, "Radio cal:", radio_calibration); + get_int(line, "Frequency:", radio_frequency); + get_int(line, "Radio setting:", radio_setting); + get_int(line, "Telemetry rate:", telemetry_rate); + get_string(line,"software-version", version); + get_string(line,"product", product); } + } - void reset_data() { - serial.set(0); + synchronized void reset_data() { + serial.set(0); + radio_channel.set(0); + radio_setting.set(0); + radio_frequency.set(0); + radio_calibration.set(1186611); + telemetry_rate.set(Altos.ao_telemetry_rate_38400); + config_version.set("0.0"); + version.set("unknown"); + product.set("unknown"); + } + + synchronized double frequency() { + return AltosConvert.radio_to_frequency(radio_frequency.get(), + radio_setting.get(), + radio_calibration.get(), + radio_channel.get()); + } + + synchronized void set_frequency(double freq) { + int frequency = radio_frequency.get(); + int setting = radio_setting.get(); + + if (frequency > 0) { + radio_frequency.set((int) Math.floor (freq * 1000 + 0.5)); + } else if (setting > 0) { + radio_setting.set(AltosConvert.radio_frequency_to_setting(freq, + radio_calibration.get())); radio_channel.set(0); - radio_setting.set(0); - radio_frequency.set(0); - radio_calibration.set(1186611); - config_version.set("0.0"); - version.set("unknown"); - product.set("unknown"); + } else { + radio_channel.set(AltosConvert.radio_frequency_to_channel(freq)); } + } + + synchronized int telemetry_rate() { + return telemetry_rate.get(); + } + + synchronized void set_telemetry_rate(int new_telemetry_rate){ + int rate = telemetry_rate.get(); + + if (rate >= 0) + telemetry_rate.set(new_telemetry_rate); + } + + final static int serial_mode_read = 0; + final static int serial_mode_save = 1; + final static int serial_mode_reboot = 2; + + class SerialData implements Runnable { + AltosConfigTD config; + int serial_mode; void get_data() { try { boolean been_there = false; - config.start_serial(); - reset_data(); + config.reset_data(); for (;;) { - config.serial_line.printf("c s\nf\nl\nv\n"); + config.serial_line.printf("c s\nf\nv\n"); for (;;) { try { String line = config.serial_line.get_reply(5000); - if (line == null) - stop_serial(); - callback(line); - if (line.startsWith("software-version")) + config.process_line(line); + if (line != null && line.startsWith("software-version")) break; } catch (Exception e) { break; } } - System.out.printf("config_version %s\n", config_version.get()); if (been_there) break; if (!config_version.get().equals("0.0")) break; been_there = true; - config.serial_line.printf("C\n "); - config.serial_line.flush_input(); + if (config != null && config.serial_line != null) { + config.serial_line.printf("C\n "); + config.serial_line.flush_input(); + } } } catch (InterruptedException ie) { - } catch (TimeoutException te) { - } finally { - try { - stop_serial(); - } catch (InterruptedException ie) { - } } - double pref_frequency = AltosPreferences.frequency(serial.get()); - if (pref_frequency != 0) - radio_frequency.set((int) Math.floor (pref_frequency * 1000 + 0.5)); - callback("all finished"); + /* + * This makes sure the displayed frequency respects the limits that the + * available firmware version might place on the actual frequency + */ + config.set_frequency(AltosPreferences.frequency(serial.get())); + config.set_telemetry_rate(AltosPreferences.telemetry_rate(serial.get())); + config.process_line("all finished"); } void save_data() { @@ -231,6 +244,8 @@ public class AltosConfigTD implements ActionListener { if (frequency != 0) AltosPreferences.set_frequency(serial.get(), frequency); + AltosPreferences.set_telemetry_rate(serial.get(), + telemetry_rate()); } public void run () { @@ -264,8 +279,10 @@ public class AltosConfigTD implements ActionListener { } void abort() { - serial_line.close(); - serial_line = null; + if (serial_line != null) { + serial_line.close(); + serial_line = null; + } JOptionPane.showMessageDialog(owner, String.format("Connection to \"%s\" failed", device.toShortString()), @@ -281,31 +298,11 @@ public class AltosConfigTD implements ActionListener { update_ui(); } - double frequency() { - return AltosConvert.radio_to_frequency(radio_frequency.get(), - radio_setting.get(), - radio_calibration.get(), - radio_channel.get()); - } - - void set_frequency(double freq) { - int frequency = radio_frequency.get(); - int setting = radio_setting.get(); - - if (frequency > 0) { - radio_frequency.set((int) Math.floor (freq * 1000 + 0.5)); - } else if (setting > 0) { - radio_setting.set(AltosConvert.radio_frequency_to_setting(freq, - radio_calibration.get())); - radio_channel.set(0); - } else { - radio_channel.set(AltosConvert.radio_frequency_to_channel(freq)); - } - } - void save_data() { - - set_frequency(config_ui.radio_frequency()); + double freq = config_ui.radio_frequency(); + set_frequency(freq); + int telemetry_rate = config_ui.telemetry_rate(); + set_telemetry_rate(telemetry_rate); run_serial_thread(serial_mode_save); } @@ -338,11 +335,12 @@ public class AltosConfigTD implements ActionListener { radio_setting = new int_ref(0); radio_frequency = new int_ref(0); radio_calibration = new int_ref(1186611); + telemetry_rate = new int_ref(AltosLib.ao_telemetry_rate_38400); config_version = new string_ref("0.0"); version = new string_ref("unknown"); product = new string_ref("unknown"); - device = AltosDeviceDialog.show(owner, Altos.product_basestation); + device = AltosDeviceUIDialog.show(owner, Altos.product_basestation); if (device != null) { try { serial_line = new AltosSerial(device); @@ -364,12 +362,7 @@ public class AltosConfigTD implements ActionListener { device.toShortString()), "Device in use", JOptionPane.ERROR_MESSAGE); - } catch (IOException ee) { - JOptionPane.showMessageDialog(owner, - device.toShortString(), - ee.getLocalizedMessage(), - JOptionPane.ERROR_MESSAGE); } } } -} \ No newline at end of file +}