X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altosui%2FAltosFlashUI.java;h=d8c70a0675136b23112bbd18b9edd7cc756ef5e8;hp=f8c24b16c662a2498cb6b4570f087461f9c198f5;hb=8ba523cd793f2263bb1acd7a5a10f8964075bdc5;hpb=52d3cad4f744140e1aa06fdfc0d49a0cf8734fd4 diff --git a/altosui/AltosFlashUI.java b/altosui/AltosFlashUI.java index f8c24b16..d8c70a06 100644 --- a/altosui/AltosFlashUI.java +++ b/altosui/AltosFlashUI.java @@ -23,9 +23,11 @@ import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; import java.io.*; import java.util.concurrent.*; +import org.altusmetrum.altoslib_4.*; +import org.altusmetrum.altosuilib_2.*; public class AltosFlashUI - extends AltosDialog + extends AltosUIDialog implements ActionListener { Container pane; @@ -43,18 +45,51 @@ public class AltosFlashUI File file; // Debug connection - AltosDevice debug_dongle; + AltosDevice device; + + AltosLink link; // Desired Rom configuration AltosRomconfig rom_config; // Flash controller - AltosFlash flash; + AltosProgrammer programmer; + + private static String[] pair_programmed = { + "teleballoon", + "telebt", + "teledongle", + "telefire", + "telemetrum-v0", + "telemetrum-v1", + "telemini", + "telenano", + "teleshield", + "teleterra" + }; + + private boolean is_pair_programmed() { + + if (file != null) { + String name = file.getName(); + for (int i = 0; i < pair_programmed.length; i++) { + if (name.startsWith(pair_programmed[i])) + return true; + } + } + if (device != null) { + if (!device.matchProduct(AltosLib.product_altusmetrum) && + (device.matchProduct(AltosLib.product_teledongle) || + device.matchProduct(AltosLib.product_telebt))) + return true; + } + return false; + } public void actionPerformed(ActionEvent e) { if (e.getSource() == cancel) { - if (flash != null) - flash.abort(); + if (programmer != null) + programmer.abort(); setVisible(false); dispose(); } else { @@ -154,6 +189,33 @@ public class AltosFlashUI serial_value.setText(String.format("%d", serial_number)); } + 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 boolean accept(File file) { + return !file.isFile() || (file.getName().startsWith(head) && file.getName().endsWith(".ihx")); + } + + public String getDescription() { + return description; + } + } + + 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"), + }; + boolean select_source_file() { JFileChooser hexfile_chooser = new JFileChooser(); @@ -162,7 +224,21 @@ public class AltosFlashUI hexfile_chooser.setCurrentDirectory(firmwaredir); hexfile_chooser.setDialogTitle("Select Flash Image"); - hexfile_chooser.setFileFilter(new FileNameExtensionFilter("Flash Image", "ihx")); + + 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]); + } + } + int returnVal = hexfile_chooser.showOpenDialog(frame); if (returnVal != JFileChooser.APPROVE_OPTION) @@ -171,13 +247,16 @@ public class AltosFlashUI if (file == null) return false; AltosUIPreferences.set_firmwaredir(file.getParentFile()); + return true; } - boolean select_debug_dongle() { - debug_dongle = AltosDeviceDialog.show(frame, Altos.product_any); + boolean select_device() { + int product = Altos.product_any; + + device = AltosDeviceUIDialog.show(frame, Altos.product_any); - if (debug_dongle == null) + if (device == null) return false; return true; } @@ -202,7 +281,7 @@ public class AltosFlashUI } else if (e instanceof AltosSerialInUseException) { JOptionPane.showMessageDialog(frame, String.format("Device \"%s\" already in use", - debug_dongle.toShortString()), + device.toShortString()), "Device in use", JOptionPane.ERROR_MESSAGE); } else if (e instanceof IOException) { @@ -213,22 +292,40 @@ public class AltosFlashUI } } - class flash_task implements Runnable { + class flash_task implements Runnable, AltosFlashListener { AltosFlashUI ui; Thread t; - AltosFlash flash; + AltosProgrammer programmer; + + public void position(String in_s, int in_percent) { + final String s = in_s; + final int percent = in_percent; + Runnable r = new Runnable() { + public void run() { + try { + ui.actionPerformed(new ActionEvent(this, + percent, + s)); + } catch (Exception ex) { + } + } + }; + SwingUtilities.invokeLater(r); + } public void run () { try { - flash = new AltosFlash(ui.file, ui.debug_dongle); - flash.addActionListener(ui); + if (ui.is_pair_programmed()) + programmer = new AltosFlash(ui.file, link, this); + else + programmer = new AltosSelfFlash(ui.file, link, this); - final AltosRomconfig current_config = flash.romconfig(); + final AltosRomconfig current_config = programmer.romconfig(); final Semaphore await_rom_config = new Semaphore(0); SwingUtilities.invokeLater(new Runnable() { public void run() { - ui.flash = flash; + ui.programmer = programmer; ui.update_rom_config_info(current_config); await_rom_config.release(); } @@ -236,8 +333,8 @@ public class AltosFlashUI await_rom_config.acquire(); if (ui.rom_config != null) { - flash.set_romconfig(ui.rom_config); - flash.flash(); + programmer.set_romconfig(ui.rom_config); + programmer.flash(); } } catch (InterruptedException ee) { final Exception e = ee; @@ -253,16 +350,9 @@ public class AltosFlashUI ui.exception(e); } }); - } catch (AltosSerialInUseException ee) { - final Exception e = ee; - SwingUtilities.invokeLater(new Runnable() { - public void run() { - ui.exception(e); - } - }); } finally { - if (flash != null) - flash.close(); + if (programmer != null) + programmer.close(); } } @@ -275,18 +365,65 @@ 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())); + + while (!link.is_loader()) { + link.to_loader(); + + java.util.List devices = null; + + for (int tries = 0; tries < 10; tries++) { + Thread.sleep(100); + devices = AltosUSBDevice.list(AltosLib.product_altusmetrum); + if (devices.size() != 0) + break; + } + + if (devices.size() == 1) + device = devices.get(0); + else { + device = AltosDeviceUIDialog.show(frame, AltosLib.product_altusmetrum); + if (device == null) + return false; + } + link = new AltosSerial(device); + } + return true; + } catch (AltosSerialInUseException ee) { + exception(ee); + } catch (FileNotFoundException fe) { + exception(fe); + } catch (IOException ie) { + exception (ie); + } + return false; + } + /* * Execute the steps for flashing * a device. Note that this returns immediately; * this dialog is not modal */ void showDialog() { - if (!select_debug_dongle()) + if (!select_device()) return; if (!select_source_file()) return; + try { + if (!open_device()) + return; + } catch (InterruptedException ie) { + return; + } build_dialog(); - //flash_task f = new flash_task(this); + flash_task f = new flash_task(this); } static void show(JFrame frame) { @@ -300,4 +437,4 @@ public class AltosFlashUI frame = in_frame; } -} \ No newline at end of file +}