no longer need patch
[fw/altos] / altosuilib / AltosFlashUI.java
index b91776aa198ebb120c4b0a633c3a4d21ff1830cf..3665aaf1e5a5fd472391e054b2238aa86ed623a0 100644 (file)
@@ -16,7 +16,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altosuilib_13;
+package org.altusmetrum.altosuilib_14;
 
 import java.awt.*;
 import java.awt.event.*;
@@ -24,7 +24,7 @@ import javax.swing.*;
 import javax.swing.filechooser.FileNameExtensionFilter;
 import java.io.*;
 import java.util.concurrent.*;
-import org.altusmetrum.altoslib_13.*;
+import org.altusmetrum.altoslib_14.*;
 
 public class AltosFlashUI
        extends AltosUIDialog
@@ -45,7 +45,7 @@ public class AltosFlashUI
        File            file;
 
        // Debug connection
-       AltosDevice     device;
+       AltosUSBDevice  device;
 
        AltosLink       link;
 
@@ -64,8 +64,7 @@ public class AltosFlashUI
                "telemetrum-v1",
                "telemini-v1",
                "telenano",
-               "teleshield",
-               "teleterra"
+               "teleshield"
        };
 
        private static final String[] pair_programmed_devices = {
@@ -78,8 +77,11 @@ public class AltosFlashUI
                "TeleMetrum-v1",
                "TeleMini-v1",
                "TeleNano",
-               "TeleShield",
-               "TeleTerra"
+               "TeleShield"
+       };
+
+       private static final String[] log_erased_devices = {
+               "TeleGPS"
        };
 
        private boolean is_pair_programmed() {
@@ -101,6 +103,17 @@ public class AltosFlashUI
                return false;
        }
 
+       private boolean is_log_erased() {
+               if (device != null) {
+                       String  name = device.toString();
+                       for (int i = 0; i < log_erased_devices.length; i++) {
+                               if (name.startsWith(log_erased_devices[i]))
+                                       return true;
+                       }
+               }
+               return false;
+       }
+
        public void actionPerformed(ActionEvent e) {
                if (e.getSource() == cancel) {
                        if (programmer != null)
@@ -133,7 +146,7 @@ public class AltosFlashUI
                Insets il = new Insets(4,4,4,4);
                Insets ir = new Insets(4,4,4,4);
 
-               pane = getContentPane();
+               pane = getScrollablePane();
                pane.setLayout(new GridBagLayout());
 
                c = new GridBagConstraints();
@@ -205,14 +218,29 @@ public class AltosFlashUI
        }
 
        static class AltosHexfileFilter extends javax.swing.filechooser.FileFilter {
-               int product;
                String head;
                String description;
 
-               public AltosHexfileFilter(int product, String head, String description) {
-                       this.product = product;
-                       this.head = head;
-                       this.description = description;
+               public AltosHexfileFilter(String usb_product) {
+                       int l;
+                       int dash;
+
+                       /* Trim off any trailing variants (1.0a vs 1.0) */
+                       for (dash = usb_product.length(); dash > 0; dash--) {
+                               char c = usb_product.charAt(dash-1);
+                               if (c == '-')
+                                       break;
+                       }
+                       if (dash == 0)
+                               dash = usb_product.length();
+
+                       for (l = usb_product.length(); l > dash; l--) {
+                               char c = usb_product.charAt(l-1);
+                               if (c < 'a' || 'z' < c)
+                                       break;
+                       }
+                       head = usb_product.substring(0, l).toLowerCase();
+                       description = String.format("%s Image File", usb_product);
                }
 
                public boolean accept(File file) {
@@ -224,14 +252,6 @@ public class AltosFlashUI
                }
        }
 
-       static AltosHexfileFilter[] filters = {
-               new AltosHexfileFilter(AltosLib.product_telemetrum, "telemetrum", "TeleMetrum Image"),
-               new AltosHexfileFilter(AltosLib.product_teledongle, "teledongle", "TeleDongle Image"),
-               new AltosHexfileFilter(AltosLib.product_telemega, "telemega", "TeleMega Image"),
-               new AltosHexfileFilter(AltosLib.product_easymini, "easymini", "EasyMini Image"),
-               new AltosHexfileFilter(AltosLib.product_easymega, "easymega", "EasyMega Image"),
-       };
-
        boolean select_source_file() {
                JFileChooser    hexfile_chooser = new JFileChooser();
 
@@ -241,18 +261,14 @@ public class AltosFlashUI
 
                hexfile_chooser.setDialogTitle("Select Flash Image");
 
-               for (int i = 0; i < filters.length; i++) {
-                       hexfile_chooser.addChoosableFileFilter(filters[i]);
-               }
                javax.swing.filechooser.FileFilter ihx_filter = new FileNameExtensionFilter("Flash Image", "ihx");
                hexfile_chooser.addChoosableFileFilter(ihx_filter);
                hexfile_chooser.setFileFilter(ihx_filter);
 
                if (!is_pair_programmed() && !device.matchProduct(AltosLib.product_altusmetrum)) {
-                       for (int i = 0; i < filters.length; i++) {
-                               if (device != null && device.matchProduct(filters[i].product))
-                                       hexfile_chooser.setFileFilter(filters[i]);
-                       }
+                       AltosHexfileFilter filter = new AltosHexfileFilter(device.usb_product());
+                       hexfile_chooser.addChoosableFileFilter(filter);
+                       hexfile_chooser.setFileFilter(filter);
                }
 
                int returnVal = hexfile_chooser.showOpenDialog(frame);
@@ -270,7 +286,7 @@ public class AltosFlashUI
        boolean select_device() {
                int     product = AltosLib.product_any;
 
-               device = AltosDeviceUIDialog.show(frame, AltosLib.product_any);
+               device = AltosDeviceUIDialog.show_usb(frame, AltosLib.product_any);
 
                if (device == null)
                        return false;
@@ -325,7 +341,7 @@ public class AltosFlashUI
                                return false;
                }
 
-               if (existing_config.radio_calibration_broken) {
+               if (existing_config != null && existing_config.radio_calibration_broken) {
                        int ret = JOptionPane.showConfirmDialog(this,
                                                                String.format("Radio calibration value %d may be incorrect\nFlash anyways?",
                                                                              existing_config.radio_calibration),
@@ -393,10 +409,12 @@ public class AltosFlashUI
                                else
                                        programmer = new AltosSelfFlash(ui.file, link, this);
 
-                               final AltosRomconfig    current_config = programmer.target_romconfig();
+                               final AltosRomconfig    current_config = programmer.target_romconfig(device.usb_id(), device.usb_product());
 
                                final AltosRomconfig    image_config = programmer.image_romconfig();
 
+                               System.out.printf("product %s current %s image %s\n", device.usb_product(), current_config, image_config);
+
                                final Semaphore await_rom_config = new Semaphore(0);
                                SwingUtilities.invokeLater(new Runnable() {
                                                public void run() {
@@ -440,13 +458,20 @@ public class AltosFlashUI
 
        flash_task      flasher;
 
+       boolean erase_answer;
 
        class open_task implements Runnable {
                AltosDevice     device;
                Thread          t;
                open_dialog     dialog;
+               AltosLink       link;
 
                public void do_exception(final Exception e) {
+                       if (link != null) {
+                               try {
+                                       link.close();
+                               } catch (Exception ex) {}
+                       }
                        SwingUtilities.invokeLater(
                                new Runnable() {
                                        public void run() {
@@ -464,37 +489,57 @@ public class AltosFlashUI
                                });
                }
 
-               public void do_failure() {
+               public boolean do_notify_erase(final AltosConfigData config_data) {
+                       erase_answer = false;
+                       final Semaphore erase_answer_done = new Semaphore(0);
                        SwingUtilities.invokeLater(
                                new Runnable() {
                                        public void run() {
-                                               try { dialog.open_failure(); } catch (Exception ex) { }
-                                       }
-                               });
-               }
-
-               public void do_cancel() {
-                       SwingUtilities.invokeLater(
-                               new Runnable() {
-                                       public void run() {
-                                               try { dialog.open_cancel(); } catch (Exception ex) { }
+                                               int ret = JOptionPane.showConfirmDialog(dialog.owner,
+                                                                                          String.format("Updating %s from firmware %s will erase stored data, continue?",
+                                                                                                        config_data.product,
+                                                                                                        config_data.version),
+                                                                                          "Erase Stored Data?",
+                                                                                          JOptionPane.YES_NO_OPTION);
+                                               erase_answer = ret == JOptionPane.YES_OPTION;
+                                               erase_answer_done.release();
                                        }
                                });
+                       try {
+                               erase_answer_done.acquire();
+                       } catch (Exception ex) {
+                               return false;
+                       }
+                       return erase_answer;
                }
 
                public void run () {
+                       link = null;
                        try {
-                               AltosLink link = null;
+                               boolean new_device = false;
 
                                for (;;) {
                                        System.out.printf("Attempting to open %s\n", device.toShortString());
 
-                                       link = new AltosSerial(device);
+                                       for (int i = 0; i < 20; i++) {
+                                               link = new AltosSerial(device);
+
+                                               if (link != null)
+                                                       break;
+
+                                               if (!new_device)
+                                                       break;
 
+                                               System.out.printf("Waiting for device to become ready\n");
+
+                                               Thread.sleep(1000);
+                                       }
                                        if (link == null)
                                                throw new IOException(String.format("%s: open failed",
                                                                                    device.toShortString()));
 
+                                       System.out.printf("Checking device ready\n");
+
                                        /* See if the link is usable already */
                                        if (is_pair_programmed() || link.is_loader()) {
                                                System.out.printf("Device ready for use\n");
@@ -502,6 +547,24 @@ public class AltosFlashUI
                                                return;
                                        }
 
+                                       System.out.printf("Checking log erased\n");
+
+                                       if (is_log_erased()) {
+                                               System.out.printf("Fetching config data\n");
+                                               AltosConfigData config_data = link.config_data();
+                                               System.out.printf("version %s\n", config_data.version);
+                                               /* Completely erase TeleGPS flash when firmware is old */
+                                               if (config_data.compare_version("1.9.7") < 0)
+                                               {
+                                                       if (!do_notify_erase(config_data))
+                                                               throw new IOException(String.format("%s: not erasing log",
+                                                                                                   device.toShortString()));
+                                                       System.out.printf("Erasing log\n");
+                                                       link.printf("Z DoIt\n");
+                                                       link.synchronize(120 * 1000);
+                                               }
+                                       }
+
                                        java.util.List<AltosDevice> prev_devices =
                                                AltosUSBDevice.list(AltosLib.product_altusmetrum);
 
@@ -539,7 +602,8 @@ public class AltosFlashUI
                                                                }
                                                        if (!matched) {
                                                                System.out.printf("Identified new device %s\n", d.toShortString());
-                                                               device = d;
+                                                               device = (AltosUSBDevice) d;
+                                                               new_device = true;
                                                                break;
                                                        }
                                                }
@@ -553,7 +617,10 @@ public class AltosFlashUI
                                do_exception(fe);
                        } catch (IOException ie) {
                                do_exception (ie);
+                       } catch (TimeoutException te) {
+                               do_exception (te);
                        } catch (InterruptedException ie) {
+                               do_exception (ie);
                        }
                }
 
@@ -598,18 +665,6 @@ public class AltosFlashUI
                        done = true;
                }
 
-               public void open_failure() {
-                       System.out.printf("open_failure\n");
-                       setVisible(false);
-                       done = true;
-               }
-
-               public void open_cancel() {
-                       System.out.printf("open_cancel\n");
-                       setVisible(false);
-                       done = true;
-               }
-
                public AltosLink do_open(open_task open) throws InterruptedException {
                        this.open = open;
                        setVisible(true);
@@ -630,7 +685,7 @@ public class AltosFlashUI
                        super(in_owner, "Open Flash Target Device", true);
                        owner = in_owner;
 
-                       Container               pane = getContentPane();
+                       Container               pane = getScrollablePane();
                        GridBagConstraints      c = new GridBagConstraints();
                        Insets                  i = new Insets(4,4,4,4);