X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altosui%2FAltosFlashUI.java;h=f26a391614e17275f5451d94517daa661b2019b5;hp=f63097ac408ad1f71356311365b487203ce8788f;hb=2120d362cefceba69e75996b6391d9558978c01d;hpb=51c7741040d95c5deece939dae5e4136cc04afc4 diff --git a/altosui/AltosFlashUI.java b/altosui/AltosFlashUI.java index f63097ac..f26a3916 100644 --- a/altosui/AltosFlashUI.java +++ b/altosui/AltosFlashUI.java @@ -21,16 +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.altosuilib_1.*; public class AltosFlashUI - extends JDialog - implements Runnable, ActionListener + extends AltosUIDialog + implements ActionListener { Container pane; Box box; @@ -41,21 +38,39 @@ public class AltosFlashUI JProgressBar pbar; JButton cancel; - File file; - Thread thread; JFrame frame; + + // Hex file with rom image + File file; + + // Debug connection AltosDevice debug_dongle; + + // Desired Rom configuration + AltosRomconfig rom_config; + + // Flash controller AltosFlash flash; public void actionPerformed(ActionEvent e) { if (e.getSource() == cancel) { - abort(); + if (flash != null) + flash.abort(); + setVisible(false); dispose(); } else { String cmd = e.getActionCommand(); - if (cmd.equals("done")) - ; - else if (cmd.equals("start")) { + if (e.getID() == -1) { + JOptionPane.showMessageDialog(frame, + e.getActionCommand(), + file.toString(), + JOptionPane.ERROR_MESSAGE); + setVisible(false); + dispose(); + } else if (cmd.equals("done")) { + setVisible(false); + dispose(); + } else if (cmd.equals("start")) { setVisible(true); } else { pbar.setValue(e.getID()); @@ -64,52 +79,6 @@ public class AltosFlashUI } } - public void run() { - 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(); - 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.toShortString()), - "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(); - } - - public void abort() { - if (flash != null) - flash.abort(); - } - public void build_dialog() { GridBagConstraints c; Insets il = new Insets(4,4,4,4); @@ -149,7 +118,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(); @@ -182,21 +151,14 @@ public class AltosFlashUI setLocationRelativeTo(frame); } - public AltosFlashUI(JFrame in_frame) { - super(in_frame, "Program Altusmetrum Device", false); - - frame = in_frame; - - build_dialog(); - - debug_dongle = AltosDeviceDialog.show(frame, AltosDevice.product_any); - - if (debug_dongle == null) - return; + void set_serial(int serial_number) { + serial_value.setText(String.format("%d", serial_number)); + } + boolean select_source_file() { JFileChooser hexfile_chooser = new JFileChooser(); - File firmwaredir = AltosPreferences.firmwaredir(); + File firmwaredir = AltosUIPreferences.firmwaredir(); if (firmwaredir != null) hexfile_chooser.setCurrentDirectory(firmwaredir); @@ -205,14 +167,138 @@ public class AltosFlashUI int returnVal = hexfile_chooser.showOpenDialog(frame); if (returnVal != JFileChooser.APPROVE_OPTION) + return false; + file = hexfile_chooser.getSelectedFile(); + if (file == null) + return false; + AltosUIPreferences.set_firmwaredir(file.getParentFile()); + return true; + } + + boolean select_debug_dongle() { + debug_dongle = AltosDeviceUIDialog.show(frame, Altos.product_any); + + if (debug_dongle == 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, + ((FileNotFoundException) e).getMessage(), + "Cannot open file", + JOptionPane.ERROR_MESSAGE); + } else if (e instanceof AltosSerialInUseException) { + JOptionPane.showMessageDialog(frame, + String.format("Device \"%s\" already in use", + debug_dongle.toShortString()), + "Device in use", + JOptionPane.ERROR_MESSAGE); + } else if (e instanceof IOException) { + JOptionPane.showMessageDialog(frame, + e.getMessage(), + file.toString(), + JOptionPane.ERROR_MESSAGE); + } + } + + class flash_task implements Runnable { + AltosFlashUI ui; + Thread t; + AltosFlash flash; + + public void run () { + try { + flash = new AltosFlash(ui.file, ui.debug_dongle); + flash.addActionListener(ui); + + final AltosRomconfig current_config = flash.romconfig(); + + final Semaphore await_rom_config = new Semaphore(0); + SwingUtilities.invokeLater(new Runnable() { + public void run() { + ui.flash = flash; + ui.update_rom_config_info(current_config); + await_rom_config.release(); + } + }); + await_rom_config.acquire(); + + if (ui.rom_config != null) { + flash.set_romconfig(ui.rom_config); + flash.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); + } + }); + } catch (AltosSerialInUseException ee) { + final Exception e = ee; + SwingUtilities.invokeLater(new Runnable() { + public void run() { + ui.exception(e); + } + }); + } finally { + if (flash != null) + flash.close(); + } + } + + public flash_task(AltosFlashUI in_ui) { + ui = in_ui; + t = new Thread(this); + t.start(); + } + } + + flash_task flasher; + + /* + * Execute the steps for flashing + * a device. Note that this returns immediately; + * this dialog is not modal + */ + void showDialog() { + if (!select_debug_dongle()) + return; + if (!select_source_file()) return; + build_dialog(); + flash_task f = new flash_task(this); + } - file = hexfile_chooser.getSelectedFile(); + static void show(JFrame frame) { + AltosFlashUI ui = new AltosFlashUI(frame); - if (file != null) - AltosPreferences.set_firmwaredir(file.getParentFile()); + ui.showDialog(); + } - thread = new Thread(this); - thread.start(); + public AltosFlashUI(JFrame in_frame) { + super(in_frame, "Program Altusmetrum Device", false); + + frame = in_frame; } } \ No newline at end of file