X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altosuilib%2FAltosFlashUI.java;h=7186e91b33024f14fc7c1e21d3c0dda5f99a6cfe;hp=6dc80272a6772089517ef07bf9da02b0551efd19;hb=695dba4e37ccca9a2dc06e1656699a13406002c1;hpb=75420fecbc76ab718661718ada249673e139a29d diff --git a/altosuilib/AltosFlashUI.java b/altosuilib/AltosFlashUI.java index 6dc80272..7186e91b 100644 --- a/altosuilib/AltosFlashUI.java +++ b/altosuilib/AltosFlashUI.java @@ -45,7 +45,7 @@ public class AltosFlashUI File file; // Debug connection - AltosDevice device; + AltosUSBDevice device; AltosLink link; @@ -116,10 +116,10 @@ public class AltosFlashUI JOptionPane.ERROR_MESSAGE); setVisible(false); dispose(); - } else if (cmd.equals("done")) { + } else if (cmd.equals(AltosFlashListener.flash_done)) { setVisible(false); dispose(); - } else if (cmd.equals("start")) { + } else if (cmd.equals(AltosFlashListener.flash_start)) { setVisible(true); } else { pbar.setValue(e.getID()); @@ -205,14 +205,20 @@ 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; + + /* Trim off any trailing variants (1.0a vs 1.0) */ + for (l = usb_product.length(); l > 0; 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 +230,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 +239,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 +264,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,6 +319,17 @@ public class AltosFlashUI return false; } + 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), + "Radio Calibration Invalid", + JOptionPane.YES_NO_OPTION); + if (ret != JOptionPane.YES_OPTION) + return false; + } + + new_config = AltosRomconfigUI.show(frame, existing_config); if (new_config == null) return false; @@ -346,7 +351,7 @@ public class AltosFlashUI device.toShortString()), "Device in use", JOptionPane.ERROR_MESSAGE); - } else if (e instanceof IOException) { + } else { JOptionPane.showMessageDialog(frame, e.getMessage(), file.toString(), @@ -382,10 +387,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() { @@ -429,45 +436,248 @@ public class AltosFlashUI flash_task flasher; - private boolean open_device() throws InterruptedException { - try { - link = new AltosSerial(device); - if (is_pair_programmed()) - return true; - if (link == null) - throw new IOException(String.format("%s: open failed", device.toShortString())); + class open_task implements Runnable { + AltosDevice device; + Thread t; + open_dialog dialog; - while (!link.is_loader()) { - link.to_loader(); + public void do_exception(final Exception e) { + SwingUtilities.invokeLater( + new Runnable() { + public void run() { + try { dialog.open_exception(e); } catch (Exception ex) { } + } + }); + } - java.util.List devices = null; + public void do_success(final AltosLink link) { + SwingUtilities.invokeLater( + new Runnable() { + public void run() { + try { dialog.open_success(link); } catch (Exception ex) { } + } + }); + } - for (int tries = 0; tries < 10; tries++) { - Thread.sleep(100); - devices = AltosUSBDevice.list(AltosLib.product_altusmetrum); - if (devices.size() != 0) - break; - } + public void do_failure() { + 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) { } + } + }); + } + + public void run () { + try { + AltosLink link = null; + boolean new_device = false; + + for (;;) { + System.out.printf("Attempting to open %s\n", device.toShortString()); + + for (int i = 0; i < 20; i++) { + link = new AltosSerial(device); - if (devices.size() == 1) - device = devices.get(0); - else { - device = AltosDeviceUIDialog.show(frame, AltosLib.product_altusmetrum); - if (device == null) - return false; + 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())); + + /* See if the link is usable already */ + if (is_pair_programmed() || link.is_loader()) { + System.out.printf("Device ready for use\n"); + do_success(link); + return; + } + + java.util.List prev_devices = + AltosUSBDevice.list(AltosLib.product_altusmetrum); + + /* Nope, switch to loader and + * wait for it to re-appear + */ + + System.out.printf("Switch to loader\n"); + + link.to_loader(); + + /* This is a bit fragile, but + * I'm not sure what else to + * do other than ask the user. + * + * Search for a device which + * wasn't there before we + * asked the target to switch + * to loader mode + */ + + device = null; + for (;;) { + Thread.sleep(100); + java.util.List devices = + AltosUSBDevice.list(AltosLib.product_altusmetrum); + + for (AltosDevice d : devices) { + boolean matched = false; + System.out.printf("\tfound device %s\n", d.toShortString()); + for (AltosDevice p : prev_devices) + if (d.equals(p)) { + matched = true; + break; + } + if (!matched) { + System.out.printf("Identified new device %s\n", d.toShortString()); + device = (AltosUSBDevice) d; + new_device = true; + break; + } + } + if (device != null) + break; + } } - link = new AltosSerial(device); + } catch (AltosSerialInUseException ee) { + do_exception(ee); + } catch (FileNotFoundException fe) { + do_exception(fe); + } catch (IOException ie) { + do_exception (ie); + } catch (InterruptedException ie) { } - return true; - } catch (AltosSerialInUseException ee) { - exception(ee); - } catch (FileNotFoundException fe) { - exception(fe); - } catch (IOException ie) { - exception (ie); } - return false; + + public void cancel() { + t.interrupt(); + } + + public open_task(AltosDevice device, open_dialog dialog) { + this.device = device; + this.dialog = dialog; + t = new Thread(this); + t.start(); + } + } + + class open_dialog + extends AltosUIDialog + implements ActionListener + { + AltosUIFrame owner; + + private JLabel opening_label; + private JButton cancel_button; + + boolean done = false; + + AltosLink link = null; + + open_task open = null; + + public void open_exception(Exception e) { + System.out.printf("open_exception\n"); + setVisible(false); + exception(e); + done = true; + } + + public void open_success(AltosLink link) { + System.out.printf("open_success\n"); + setVisible(false); + this.link = link; + 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); + return link; + } + + public void actionPerformed(ActionEvent e) { + String cmd = e.getActionCommand(); + + if (cmd.equals("cancel")) + if (open != null) + open.cancel(); + done = true; + setVisible(false); + } + + public open_dialog(AltosUIFrame in_owner) { + super(in_owner, "Open Flash Target Device", true); + owner = in_owner; + + Container pane = getContentPane(); + GridBagConstraints c = new GridBagConstraints(); + Insets i = new Insets(4,4,4,4); + + + pane.setLayout(new GridBagLayout()); + + opening_label = new JLabel("Opening Device"); + c.fill = GridBagConstraints.HORIZONTAL; + c.anchor = GridBagConstraints.LINE_START; + c.insets = i; + c.weightx = 0; + c.weighty = 0; + + c.gridx = 0; + c.gridy = 0; + + pane.add(opening_label, c); + + cancel_button = new JButton("Cancel"); + cancel_button.addActionListener(this); + cancel_button.setActionCommand("cancel"); + + c.gridy = 1; + pane.add(cancel_button, c); + pack(); + setLocationRelativeTo(owner); + } + } + + private boolean open_device() throws InterruptedException { + + open_dialog dialog = new open_dialog(frame); + + open_task open = new open_task(device, dialog); + + link = dialog.do_open(open); + + return link != null; } /*