altosui: Use timeouts to recover from broken packet links.
[fw/altos] / ao-tools / altosui / AltosFlashUI.java
index 73a97a6b9177d29c073153bd32a4d37333a88607..d3b72c67737b507fd6274429614cc6f1641a1138 100644 (file)
@@ -28,9 +28,6 @@ import java.text.*;
 import java.util.prefs.*;
 import java.util.concurrent.LinkedBlockingQueue;
 
-import altosui.AltosHexfile;
-import altosui.AltosFlash;
-
 public class AltosFlashUI
        extends JDialog
        implements Runnable, ActionListener
@@ -68,35 +65,42 @@ public class AltosFlashUI
        }
 
        public void run() {
-               flash = new AltosFlash(file, debug_dongle);
-               flash.addActionListener(this);
                try {
-                       flash.open();
+                       flash = new AltosFlash(file, debug_dongle);
+                       flash.addActionListener(this);
                        AltosRomconfigUI romconfig_ui = new AltosRomconfigUI (frame);
 
                        romconfig_ui.set(flash.romconfig());
-                       romconfig_ui.showDialog();
-
-                       AltosRomconfig romconfig = romconfig_ui.romconfig();
-                       if (romconfig == null || !romconfig.valid())
-                               return;
-                       flash.set_romconfig(romconfig);
-                       serial_value.setText(String.format("%d",
-                                                          flash.romconfig().serial_number));
-                       file_value.setText(file.toString());
-                       setVisible(true);
-                       flash.flash();
+                       AltosRomconfig romconfig = romconfig_ui.showDialog();
+
+                       if (romconfig != null && romconfig.valid()) {
+                               flash.set_romconfig(romconfig);
+                               serial_value.setText(String.format("%d",
+                                                                  flash.romconfig().serial_number));
+                               file_value.setText(file.toString());
+                               setVisible(true);
+                               flash.flash();
+                               flash = null;
+                       }
                } catch (FileNotFoundException ee) {
                        JOptionPane.showMessageDialog(frame,
                                                      "Cannot open image",
                                                      file.toString(),
                                                      JOptionPane.ERROR_MESSAGE);
+               } catch (AltosSerialInUseException si) {
+                       JOptionPane.showMessageDialog(frame,
+                                                     String.format("Device \"%s\" already in use",
+                                                                   debug_dongle.toString()),
+                                                     "Device in use",
+                                                     JOptionPane.ERROR_MESSAGE);
                } catch (IOException e) {
                        JOptionPane.showMessageDialog(frame,
                                                      e.getMessage(),
                                                      file.toString(),
                                                      JOptionPane.ERROR_MESSAGE);
                } catch (InterruptedException ie) {
+               } finally {
+                       abort();
                }
                dispose();
        }
@@ -185,13 +189,17 @@ public class AltosFlashUI
 
                build_dialog();
 
-               debug_dongle = AltosDeviceDialog.show(frame, AltosDevice.Any);
+               debug_dongle = AltosDeviceDialog.show(frame, AltosDevice.product_any);
 
                if (debug_dongle == null)
                        return;
 
                JFileChooser    hexfile_chooser = new JFileChooser();
 
+               File firmwaredir = AltosPreferences.firmwaredir();
+               if (firmwaredir != null)
+                       hexfile_chooser.setCurrentDirectory(firmwaredir);
+
                hexfile_chooser.setDialogTitle("Select Flash Image");
                hexfile_chooser.setFileFilter(new FileNameExtensionFilter("Flash Image", "ihx"));
                int returnVal = hexfile_chooser.showOpenDialog(frame);
@@ -201,6 +209,9 @@ public class AltosFlashUI
 
                file = hexfile_chooser.getSelectedFile();
 
+               if (file != null)
+                       AltosPreferences.set_firmwaredir(file.getParentFile());
+
                thread = new Thread(this);
                thread.start();
        }