use multimaint-merge to make Debian changelogs less ugly
[fw/altos] / altosui / AltosEepromManage.java
index 2704f883c46d4b1869a8532b8aa9c5b87c8a286c..2e5206280b1e308e5aef46d5358faefc4b769835 100644 (file)
@@ -44,7 +44,10 @@ public class AltosEepromManage implements ActionListener {
 
        public void finish() {
                if (serial_line != null) {
-                       serial_line.flush_output();
+                       try {
+                               serial_line.flush_input();
+                       } catch (InterruptedException ie) {
+                       }
                        serial_line.close();
                        serial_line = null;
                }
@@ -67,14 +70,14 @@ public class AltosEepromManage implements ActionListener {
        public void actionPerformed(ActionEvent e) {
                String  cmd = e.getActionCommand();
                boolean success = e.getID() != 0;
+               boolean running = false;
 
-               System.out.printf("Eeprom manager action %s %d\n", cmd, e.getID());
                if (cmd.equals("download")) {
                        if (success) {
-                               if (any_delete)
+                               if (any_delete) {
                                        delete.start();
-                               else
-                                       finish();
+                                       running = true;
+                               }
                        }
                } else if (cmd.equals("delete")) {
                        if (success) {
@@ -84,14 +87,120 @@ public class AltosEepromManage implements ActionListener {
                                                              serial_line.device.toShortString(),
                                                              JOptionPane.INFORMATION_MESSAGE);
                        }
+               }
+               if (!running)
                        finish();
+       }
+
+       public void got_flights(AltosEepromList in_flights) {
+               boolean running = false;;
+
+               flights = in_flights;
+               try {
+                       if (flights.size() == 0) {
+                               JOptionPane.showMessageDialog(frame,
+                                                             String.format("No flights available on %d",
+                                                                           device.getSerial()),
+                                                             serial_line.device.toShortString(),
+                                                             JOptionPane.INFORMATION_MESSAGE);
+                       } else {
+                               AltosEepromSelect       select = new AltosEepromSelect(frame, flights);
+
+                               if (select.run()) {
+                                       for (AltosEepromLog flight : flights) {
+                                               any_download = any_download || flight.download;
+                                               any_delete = any_delete || flight.delete;
+                                       }
+                                       if (any_download) {
+                                               download = new AltosEepromDownload(frame,
+                                                                                  serial_line,
+                                                                                  remote,
+                                                                                  flights);
+                                               download.addActionListener(this);
+                                       }
+
+                                       if (any_delete) {
+                                               delete = new AltosEepromDelete(frame,
+                                                                              serial_line,
+                                                                              remote,
+                                                                              flights);
+                                               delete.addActionListener(this);
+                                       }
+
+                                       /*
+                                        * Start flight log download
+                                        */
+
+                                       if (any_download) {
+                                               download.start();
+                                               running = true;
+                                       }
+                                       else if (any_delete) {
+                                               delete.start();
+                                               running = true;
+                                       }
+                               }
+                       }
+                       if (!running)
+                               finish();
+               } catch (Exception e) {
+                       got_exception(e);
+               }
+       }
+
+       public void got_exception(Exception e) {
+               if (e instanceof IOException) {
+                       IOException     ee = (IOException) e;
+                       JOptionPane.showMessageDialog(frame,
+                                                     device.toShortString(),
+                                                     ee.getLocalizedMessage(),
+                                                     JOptionPane.ERROR_MESSAGE);
+               } else if (e instanceof TimeoutException) {
+                       TimeoutException te = (TimeoutException) e;
+                       JOptionPane.showMessageDialog(frame,
+                                                     String.format("Communications failed with \"%s\"",
+                                                                   device.toShortString()),
+                                                     "Cannot open target device",
+                                                     JOptionPane.ERROR_MESSAGE);
+               }
+               finish();
+       }
+
+       class EepromGetList implements Runnable {
+
+               AltosEepromManage       manage;
+
+               public void run () {
+                       Runnable r;
+                       try {
+                               flights = new AltosEepromList(serial_line, remote);
+                               r = new Runnable() {
+                                               public void run() {
+                                                       got_flights(flights);
+                                               }
+                                       };
+                       } catch (Exception e) {
+                               final Exception f_e = e;
+                               r = new Runnable() {
+                                               public void run() {
+                                                       got_exception(f_e);
+                                               }
+                                       };
+                       }
+                       SwingUtilities.invokeLater(r);
+               }
+
+               public EepromGetList(AltosEepromManage in_manage) {
+                       manage = in_manage;
                }
        }
 
        public AltosEepromManage(JFrame given_frame) {
 
+               boolean running = false;
+
                frame = given_frame;
-               device = AltosDeviceDialog.show(frame, AltosDevice.product_any);
+               device = AltosDeviceDialog.show(frame, Altos.product_any);
 
                remote = false;
                any_download = false;
@@ -100,53 +209,14 @@ public class AltosEepromManage implements ActionListener {
                if (device != null) {
                        try {
                                serial_line = new AltosSerial(device);
-                               if (!device.matchProduct(AltosDevice.product_telemetrum))
+                               if (device.matchProduct(Altos.product_basestation))
                                        remote = true;
 
-                               flights = new AltosEepromList(serial_line, remote);
+                               serial_line.set_frame(frame);
 
-                               if (flights.size() == 0) {
-                                       JOptionPane.showMessageDialog(frame,
-                                                                     String.format("No flights available on %d",
-                                                                                   device.getSerial()),
-                                                                     serial_line.device.toShortString(),
-                                               JOptionPane.INFORMATION_MESSAGE);
-                               } else {
-                                       AltosEepromSelect       select = new AltosEepromSelect(frame, flights);
-
-                                       if (select.run()) {
-                                               for (AltosEepromLog flight : flights) {
-                                                       any_download = any_download || flight.download;
-                                                       any_delete = any_delete || flight.delete;
-                                               }
-                                               if (any_download) {
-                                                       download = new AltosEepromDownload(frame,
-                                                                                          serial_line,
-                                                                                          remote,
-                                                                                          flights);
-                                                       download.addActionListener(this);
-                                               }
-
-                                               if (any_delete) {
-                                                       delete = new AltosEepromDelete(frame,
-                                                                                      serial_line,
-                                                                                      remote,
-                                                                                      flights);
-                                                       delete.addActionListener(this);
-                                               }
-
-                                               /*
-                                                * Start flight log download
-                                                */
-
-                                               if (any_download)
-                                                       download.start();
-                                               else if (any_delete)
-                                                       delete.start();
-                                               else
-                                                       finish();
-                                       }
-                               }
+                               EepromGetList   get_list = new EepromGetList(this);
+                               Thread          t = new Thread(get_list);
+                               t.start();
                        } catch (FileNotFoundException ee) {
                                JOptionPane.showMessageDialog(frame,
                                                              String.format("Cannot open device \"%s\"",
@@ -159,21 +229,6 @@ public class AltosEepromManage implements ActionListener {
                                                                            device.toShortString()),
                                                              "Device in use",
                                                              JOptionPane.ERROR_MESSAGE);
-                       } catch (IOException ee) {
-                               JOptionPane.showMessageDialog(frame,
-                                                             device.toShortString(),
-                                                             ee.getLocalizedMessage(),
-                                                             JOptionPane.ERROR_MESSAGE);
-                               finish();
-                       } catch (TimeoutException te) {
-                               JOptionPane.showMessageDialog(frame,
-                                                             String.format("Communications failed with \"%s\"",
-                                                                           device.toShortString()),
-                                                             "Cannot open target device",
-                                                             JOptionPane.ERROR_MESSAGE);
-                               finish();
-                       } catch (InterruptedException ie) {
-                               finish();
                        }
                }
        }