X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altosui%2FAltosFlashUI.java;h=5ec5ea8a2bc49a645640a05d8b3d2c1e09afa0a8;hp=0302ccd38d9231fd25e8166d2547422efe5c1d01;hb=710343a23c7e6e9c079eafdf3aeea8a40cc2ce61;hpb=b8f05cdc0e9b4a96852eed9d38ff6d5950e2d2ed diff --git a/altosui/AltosFlashUI.java b/altosui/AltosFlashUI.java index 0302ccd3..5ec5ea8a 100644 --- a/altosui/AltosFlashUI.java +++ b/altosui/AltosFlashUI.java @@ -21,15 +21,13 @@ import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; -import javax.swing.table.*; import java.io.*; -import java.util.*; -import java.text.*; -import java.util.prefs.*; -import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.*; +import org.altusmetrum.altoslib_2.*; +import org.altusmetrum.altosuilib_1.*; public class AltosFlashUI - extends JDialog + extends AltosUIDialog implements ActionListener { Container pane; @@ -41,14 +39,48 @@ public class AltosFlashUI JProgressBar pbar; JButton cancel; - File file; - Thread thread; JFrame frame; - AltosDevice debug_dongle; - AltosFlash flash; + + // Hex file with rom image + File file; + + // Debug connection + AltosDevice device; + + AltosLink link; + + // Desired Rom configuration + AltosRomconfig rom_config; + + // Flash controller + AltosProgrammer programmer; + + private static String[] pair_programmed = { + "teleballoon", + "telebt", + "teledongle", + "telefire", + "telemetrum-v0", + "telemetrum-v1", + "telemini", + "telenano", + "teleshield", + "teleterra" + }; + + private boolean is_pair_programmed() { + String name = file.getName(); + for (int i = 0; i < pair_programmed.length; i++) { + if (name.startsWith(pair_programmed[i])) + return true; + } + return false; + } public void actionPerformed(ActionEvent e) { if (e.getSource() == cancel) { + if (programmer != null) + programmer.abort(); setVisible(false); dispose(); } else { @@ -111,7 +143,7 @@ public class AltosFlashUI c.gridx = 1; c.gridy = 1; c.anchor = GridBagConstraints.LINE_START; c.insets = ir; - file_value = new JLabel(""); + file_value = new JLabel(file.toString()); pane.add(file_value, c); pbar = new JProgressBar(); @@ -144,69 +176,244 @@ public class AltosFlashUI setLocationRelativeTo(frame); } - public AltosFlashUI(JFrame in_frame) { - super(in_frame, "Program Altusmetrum Device", false); + void set_serial(int serial_number) { + serial_value.setText(String.format("%d", serial_number)); + } - frame = in_frame; + static class AltosHexfileFilter extends javax.swing.filechooser.FileFilter { + int product; + String head; + String description; - build_dialog(); + public AltosHexfileFilter(int product, String head, String description) { + this.product = product; + this.head = head; + this.description = description; + } - debug_dongle = AltosDeviceDialog.show(frame, AltosDevice.product_any); + public boolean accept(File file) { + return !file.isFile() || (file.getName().startsWith(head) && file.getName().endsWith(".ihx")); + } - if (debug_dongle == null) - return; + 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(); - File firmwaredir = AltosPreferences.firmwaredir(); + File firmwaredir = AltosUIPreferences.firmwaredir(); if (firmwaredir != null) 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 (!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) - return; - + return false; file = hexfile_chooser.getSelectedFile(); + if (file == null) + return false; + AltosUIPreferences.set_firmwaredir(file.getParentFile()); + + return true; + } - if (file != null) - AltosPreferences.set_firmwaredir(file.getParentFile()); + boolean select_device() { + int product = Altos.product_any; - try { - flash = new AltosFlash(file, debug_dongle); - flash.addActionListener(this); - AltosRomconfigUI romconfig_ui = new AltosRomconfigUI (frame); - - romconfig_ui.set(flash.romconfig()); - 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(); - } - } catch (FileNotFoundException ee) { + device = AltosDeviceUIDialog.show(frame, Altos.product_any); + + if (device == null) + return false; + return true; + } + + boolean update_rom_config_info(AltosRomconfig existing_config) { + AltosRomconfig new_config; + new_config = AltosRomconfigUI.show(frame, existing_config); + if (new_config == null) + return false; + rom_config = new_config; + set_serial(rom_config.serial_number); + setVisible(true); + return true; + } + + void exception (Exception e) { + if (e instanceof FileNotFoundException) { JOptionPane.showMessageDialog(frame, - "Cannot open image", - file.toString(), + ((FileNotFoundException) e).getMessage(), + "Cannot open file", JOptionPane.ERROR_MESSAGE); - } catch (AltosSerialInUseException si) { + } 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); - } catch (IOException e) { + } else if (e instanceof IOException) { JOptionPane.showMessageDialog(frame, e.getMessage(), file.toString(), JOptionPane.ERROR_MESSAGE); - } catch (InterruptedException ie) { } } + + class flash_task implements Runnable, AltosFlashListener { + AltosFlashUI ui; + Thread t; + 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 { + if (ui.is_pair_programmed()) + programmer = new AltosFlash(ui.file, link, this); + else + programmer = new AltosSelfFlash(ui.file, link, this); + + final AltosRomconfig current_config = programmer.romconfig(); + + final Semaphore await_rom_config = new Semaphore(0); + SwingUtilities.invokeLater(new Runnable() { + public void run() { + ui.programmer = programmer; + ui.update_rom_config_info(current_config); + await_rom_config.release(); + } + }); + await_rom_config.acquire(); + + if (ui.rom_config != null) { + programmer.set_romconfig(ui.rom_config); + programmer.flash(); + } + } catch (InterruptedException ee) { + final Exception e = ee; + SwingUtilities.invokeLater(new Runnable() { + public void run() { + ui.exception(e); + } + }); + } catch (IOException ee) { + final Exception e = ee; + SwingUtilities.invokeLater(new Runnable() { + public void run() { + ui.exception(e); + } + }); + } finally { + if (programmer != null) + programmer.close(); + } + } + + public flash_task(AltosFlashUI in_ui) { + ui = in_ui; + t = new Thread(this); + t.start(); + } + } + + flash_task flasher; + + private boolean open_device() { + 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 = AltosUSBDevice.list(AltosLib.product_altusmetrum); + 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_device()) + return; + if (!select_source_file()) + return; + if (!open_device()) + return; + build_dialog(); + flash_task f = new flash_task(this); + } + + static void show(JFrame frame) { + AltosFlashUI ui = new AltosFlashUI(frame); + + ui.showDialog(); + } + + public AltosFlashUI(JFrame in_frame) { + super(in_frame, "Program Altusmetrum Device", false); + + frame = in_frame; + } } \ No newline at end of file