docs: Document altosui "Graph Data" button
[fw/altos] / ao-tools / altosui / AltosConfig.java
index ac73e7c5ea88894daf6a5817e466f860a4f6b9d3..1c42870f8d7ff61519a2df97b9eb88404cfab6cd 100644 (file)
@@ -26,21 +26,7 @@ import java.io.*;
 import java.util.*;
 import java.text.*;
 import java.util.prefs.*;
-import java.util.concurrent.LinkedBlockingQueue;
-
-import altosui.Altos;
-import altosui.AltosSerial;
-import altosui.AltosSerialMonitor;
-import altosui.AltosRecord;
-import altosui.AltosTelemetry;
-import altosui.AltosState;
-import altosui.AltosDeviceDialog;
-import altosui.AltosPreferences;
-import altosui.AltosLog;
-import altosui.AltosVoice;
-import altosui.AltosFlightStatusTableModel;
-import altosui.AltosFlightInfoTableModel;
-import altosui.AltosConfigUI;
+import java.util.concurrent.*;
 
 import libaltosJNI.*;
 
@@ -83,11 +69,12 @@ public class AltosConfig implements Runnable, ActionListener {
        int_ref         main_deploy;
        int_ref         apogee_delay;
        int_ref         radio_channel;
+       int_ref         radio_calibration;
        string_ref      version;
        string_ref      product;
        string_ref      callsign;
        AltosConfigUI   config_ui;
-
+       boolean         serial_started;
 
        boolean get_int(String line, String label, int_ref x) {
                if (line.startsWith(label)) {
@@ -121,31 +108,37 @@ public class AltosConfig implements Runnable, ActionListener {
        }
 
        void start_serial() throws InterruptedException {
+               serial_started = true;
                if (remote) {
-                       serial_line.printf("m 0\n");
-                       serial_line.set_channel(AltosPreferences.channel());
-                       serial_line.set_callsign(AltosPreferences.callsign());
-                       serial_line.printf("p\n");
+                       serial_line.set_radio();
+                       serial_line.printf("p\nE 0\n");
+                       serial_line.flush_input();
                }
        }
 
        void stop_serial() throws InterruptedException {
+               if (!serial_started)
+                       return;
+               serial_started = false;
                if (remote) {
-                       serial_line.printf("~\n");
-                       serial_line.flush();
+                       serial_line.printf("~");
+                       serial_line.flush_output();
                }
        }
 
-       void get_data() throws InterruptedException {
+       void get_data() throws InterruptedException, TimeoutException {
                try {
                        start_serial();
                        serial_line.printf("c s\nv\n");
                        for (;;) {
-                               String line = serial_line.get_reply();
+                               String line = serial_line.get_reply(5000);
+                               if (line == null)
+                                       throw new TimeoutException();
                                get_int(line, "serial-number", serial);
                                get_int(line, "Main deploy:", main_deploy);
                                get_int(line, "Apogee delay:", apogee_delay);
                                get_int(line, "Radio channel:", radio_channel);
+                               get_int(line, "Radio cal:", radio_calibration);
                                get_string(line, "Callsign:", callsign);
                                get_string(line,"software-version", version);
                                get_string(line,"product", product);
@@ -159,26 +152,38 @@ public class AltosConfig implements Runnable, ActionListener {
                }
        }
 
-       void init_ui () {
-               config_ui = new AltosConfigUI(owner);
+       void init_ui () throws InterruptedException, TimeoutException {
+               config_ui = new AltosConfigUI(owner, remote);
                config_ui.addActionListener(this);
                set_ui();
        }
 
-       void set_ui() {
+       void abort() {
+               JOptionPane.showMessageDialog(owner,
+                                             String.format("Connection to \"%s\" failed",
+                                                           device.toShortString()),
+                                             "Connection Failed",
+                                             JOptionPane.ERROR_MESSAGE);
                try {
-                       if (serial_line != null)
-                               get_data();
-                       config_ui.set_serial(serial.get());
-                       config_ui.set_product(product.get());
-                       config_ui.set_version(version.get());
-                       config_ui.set_main_deploy(main_deploy.get());
-                       config_ui.set_apogee_delay(apogee_delay.get());
-                       config_ui.set_radio_channel(radio_channel.get());
-                       config_ui.set_callsign(callsign.get());
-                       config_ui.set_clean();
+                       stop_serial();
                } catch (InterruptedException ie) {
                }
+               serial_line.close();
+               serial_line = null;
+       }
+
+       void set_ui() throws InterruptedException, TimeoutException {
+               if (serial_line != null)
+                       get_data();
+               config_ui.set_serial(serial.get());
+               config_ui.set_product(product.get());
+               config_ui.set_version(version.get());
+               config_ui.set_main_deploy(main_deploy.get());
+               config_ui.set_apogee_delay(apogee_delay.get());
+               config_ui.set_radio_channel(radio_channel.get());
+               config_ui.set_radio_calibration(radio_calibration.get());
+               config_ui.set_callsign(callsign.get());
+               config_ui.set_clean();
        }
 
        void run_dialog() {
@@ -188,12 +193,16 @@ public class AltosConfig implements Runnable, ActionListener {
                main_deploy.set(config_ui.main_deploy());
                apogee_delay.set(config_ui.apogee_delay());
                radio_channel.set(config_ui.radio_channel());
+               radio_calibration.set(config_ui.radio_calibration());
                callsign.set(config_ui.callsign());
                try {
                        start_serial();
                        serial_line.printf("c m %d\n", main_deploy.get());
                        serial_line.printf("c d %d\n", apogee_delay.get());
-                       serial_line.printf("c r %d\n", radio_channel.get());
+                       if (!remote) {
+                               serial_line.printf("c r %d\n", radio_channel.get());
+                               serial_line.printf("c f %d\n", radio_calibration.get());
+                       }
                        serial_line.printf("c c %s\n", callsign.get());
                        serial_line.printf("c w\n");
                } catch (InterruptedException ie) {
@@ -207,14 +216,28 @@ public class AltosConfig implements Runnable, ActionListener {
 
        public void actionPerformed(ActionEvent e) {
                String  cmd = e.getActionCommand();
-               if (cmd.equals("save")) {
-                       save_data();
-                       set_ui();
-               } else if (cmd.equals("reset")) {
-                       set_ui();
-               } else if (cmd.equals("close")) {
-                       if (serial_line != null)
-                               serial_line.close();
+               try {
+                       if (cmd.equals("Save")) {
+                               save_data();
+                               set_ui();
+                       } else if (cmd.equals("Reset")) {
+                               set_ui();
+                       } else if (cmd.equals("Reboot")) {
+                               if (serial_line != null) {
+                                       start_serial();
+                                       serial_line.printf("r eboot\n");
+                                       serial_line.flush_output();
+                                       stop_serial();
+                                       serial_line.close();
+                               }
+                       } else if (cmd.equals("Close")) {
+                               if (serial_line != null)
+                                       serial_line.close();
+                       }
+               } catch (InterruptedException ie) {
+                       abort();
+               } catch (TimeoutException te) {
+                       abort();
                }
        }
 
@@ -222,8 +245,10 @@ public class AltosConfig implements Runnable, ActionListener {
                try {
                        init_ui();
                        config_ui.make_visible();
-//             } catch (InterruptedException ie) {
-               } finally {
+               } catch (InterruptedException ie) {
+                       abort();
+               } catch (TimeoutException te) {
+                       abort();
                }
        }
 
@@ -234,28 +259,34 @@ public class AltosConfig implements Runnable, ActionListener {
                main_deploy = new int_ref(250);
                apogee_delay = new int_ref(0);
                radio_channel = new int_ref(0);
+               radio_calibration = new int_ref(1186611);
                callsign = new string_ref("N0CALL");
                version = new string_ref("unknown");
                product = new string_ref("unknown");
 
-               device = AltosDeviceDialog.show(owner, AltosDevice.Any);
-               serial_line = new AltosSerial();
+               device = AltosDeviceDialog.show(owner, AltosDevice.product_any);
                if (device != null) {
                        try {
-                               serial_line.open(device);
-                               if (!device.matchProduct(AltosDevice.TeleMetrum))
+                               serial_line = new AltosSerial(device);
+                               if (!device.matchProduct(AltosDevice.product_telemetrum))
                                        remote = true;
                                config_thread = new Thread(this);
                                config_thread.start();
                        } catch (FileNotFoundException ee) {
                                JOptionPane.showMessageDialog(owner,
                                                              String.format("Cannot open device \"%s\"",
-                                                                           device.getPath()),
+                                                                           device.toShortString()),
                                                              "Cannot open target device",
                                                              JOptionPane.ERROR_MESSAGE);
+                       } catch (AltosSerialInUseException si) {
+                               JOptionPane.showMessageDialog(owner,
+                                                             String.format("Device \"%s\" already in use",
+                                                                           device.toShortString()),
+                                                             "Device in use",
+                                                             JOptionPane.ERROR_MESSAGE);
                        } catch (IOException ee) {
                                JOptionPane.showMessageDialog(owner,
-                                                             device.getPath(),
+                                                             device.toShortString(),
                                                              ee.getLocalizedMessage(),
                                                              JOptionPane.ERROR_MESSAGE);
                        }