altosui: Open serial device at 'new' time. Prohibit duplicate opens.
[fw/altos] / ao-tools / altosui / AltosEepromDownload.java
index f2fcd09e687c3d3fb9e85b4eabb7e920b021b87c..8996b9243a5284cc8a5b2606a6d15abc648e653b 100644 (file)
@@ -28,18 +28,6 @@ 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.AltosEepromMonitor;
-
 import libaltosJNI.*;
 
 public class AltosEepromDownload implements Runnable {
@@ -84,7 +72,7 @@ public class AltosEepromDownload implements Runnable {
        }
 
        JFrame                  frame;
-       altos_device            device;
+       AltosDevice             device;
        AltosSerial             serial_line;
        boolean                 remote;
        Thread                  eeprom_thread;
@@ -142,6 +130,7 @@ public class AltosEepromDownload implements Runnable {
 
                                if (values == null) {
                                        System.out.printf("invalid line: %s\n", line);
+                                       continue;
                                } else if (values[0] != addr) {
                                        System.out.printf("data address out of sync at 0x%x\n",
                                                          block * 256 + values[0]);
@@ -223,9 +212,10 @@ public class AltosEepromDownload implements Runnable {
 
        public void run () {
                if (remote) {
-                       serial_line.printf("m 0\n");
-                       serial_line.set_channel(AltosPreferences.channel());
-                       serial_line.printf("p\n");
+                       serial_line.set_channel(AltosPreferences.channel(device.getSerial()));
+                       serial_line.set_callsign(AltosPreferences.callsign());
+                       serial_line.printf("p\nE 0\n");
+                       serial_line.flush_input();
                }
 
                monitor = new AltosEepromMonitor(frame, Altos.ao_flight_boost, Altos.ao_flight_landed);
@@ -246,20 +236,20 @@ public class AltosEepromDownload implements Runnable {
                if (remote)
                        serial_line.printf("~");
                monitor.done();
+               serial_line.flush_output();
                serial_line.close();
        }
 
        public AltosEepromDownload(JFrame given_frame) {
                frame = given_frame;
-               device = AltosDeviceDialog.show(frame, null);
+               device = AltosDeviceDialog.show(frame, AltosDevice.product_any);
 
-               serial_line = new AltosSerial();
                remote = false;
 
                if (device != null) {
                        try {
-                               serial_line.open(device);
-                               if (!device.getProduct().startsWith("TeleMetrum"))
+                               serial_line = new AltosSerial(device);
+                               if (!device.matchProduct(AltosDevice.product_telemetrum))
                                        remote = true;
                                eeprom_thread = new Thread(this);
                                eeprom_thread.start();
@@ -269,6 +259,12 @@ public class AltosEepromDownload implements Runnable {
                                                                            device.getPath()),
                                                              "Cannot open target device",
                                                              JOptionPane.ERROR_MESSAGE);
+                       } catch (AltosSerialInUseException si) {
+                               JOptionPane.showMessageDialog(frame,
+                                                             String.format("Device \"%s\" already in use",
+                                                                           device.getPath()),
+                                                             "Device in use",
+                                                             JOptionPane.ERROR_MESSAGE);
                        } catch (IOException ee) {
                                JOptionPane.showMessageDialog(frame,
                                                              device.getPath(),