From: Keith Packard Date: Tue, 26 Apr 2011 04:17:07 +0000 (-0700) Subject: altosui: Separate out flash debug code to separate thread X-Git-Tag: 0.9.3~47 X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=commitdiff_plain;h=2e7b7b80432bb251ac39efa1fa05d32b5f250e14;hp=214cd69c0e4a1617ed5cde8fc2f46a4cee6ecced altosui: Separate out flash debug code to separate thread This avoids blocking the Swing thread while waiting for the serial device. Signed-off-by: Keith Packard --- diff --git a/altosui/AltosFlash.java b/altosui/AltosFlash.java index 802adc8c..e91e9806 100644 --- a/altosui/AltosFlash.java +++ b/altosui/AltosFlash.java @@ -28,7 +28,7 @@ import java.text.*; import java.util.prefs.*; import java.util.concurrent.LinkedBlockingQueue; -public class AltosFlash implements Runnable { +public class AltosFlash { File file; FileInputStream input; AltosHexfile image; @@ -252,9 +252,7 @@ public class AltosFlash implements Runnable { throw new IOException("Failed to execute program on target"); } - Thread thread; - - public void run() { + public void flash() { try { if (!check_rom_config()) throw new IOException("Invalid rom config settings"); @@ -333,15 +331,14 @@ public class AltosFlash implements Runnable { } } - public void flash() { - thread = new Thread(this); - thread.start(); + public void close() { + if (debug != null) + debug.close(); } synchronized public void abort() { aborted = true; - if (debug != null) - debug.close(); + close(); } public void addActionListener(ActionListener l) { diff --git a/altosui/AltosFlashUI.java b/altosui/AltosFlashUI.java index ad7aeac8..3874b500 100644 --- a/altosui/AltosFlashUI.java +++ b/altosui/AltosFlashUI.java @@ -26,7 +26,7 @@ import java.io.*; import java.util.*; import java.text.*; import java.util.prefs.*; -import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.*; public class AltosFlashUI extends JDialog @@ -41,14 +41,24 @@ 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) { + if (flash != null) + flash.abort(); setVisible(false); dispose(); } else { @@ -111,7 +121,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,18 +154,11 @@ 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, Altos.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(); @@ -167,46 +170,128 @@ public class AltosFlashUI int returnVal = hexfile_chooser.showOpenDialog(frame); if (returnVal != JFileChooser.APPROVE_OPTION) - return; - + return false; file = hexfile_chooser.getSelectedFile(); + if (file == null) + return false; + AltosPreferences.set_firmwaredir(file.getParentFile()); + return true; + } - if (file != null) - AltosPreferences.set_firmwaredir(file.getParentFile()); + boolean select_debug_dongle() { + debug_dongle = AltosDeviceDialog.show(frame, Altos.product_any); - try { - flash = new AltosFlash(file, debug_dongle); - flash.addActionListener(this); - AltosRomconfigUI romconfig_ui = new AltosRomconfigUI (frame); + if (debug_dongle == null) + return false; + return true; + } - romconfig_ui.set(flash.romconfig()); - AltosRomconfig romconfig = romconfig_ui.showDialog(); + 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; + } - 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) { + void exception (Exception e) { + if (e instanceof FileNotFoundException) { JOptionPane.showMessageDialog(frame, "Cannot open image", file.toString(), 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 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 { + 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); + System.out.printf("Done updating rom config info\n"); + await_rom_config.release(); + } + }); + System.out.printf("Waiting for rom configuration updates\n"); + await_rom_config.acquire(); + System.out.printf("Got rom config update\n"); + + if (ui.rom_config != null) { + System.out.printf("rom_config not null\n"); + flash.set_romconfig(ui.rom_config); + flash.flash(); + } + } catch (Exception ee) { + final Exception e = ee; + System.out.printf("exception %s\n", e.toString()); + SwingUtilities.invokeLater(new Runnable() { + public void run() { + ui.exception(e); + } + }); + } + 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); + } + + 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 diff --git a/altosui/AltosRomconfigUI.java b/altosui/AltosRomconfigUI.java index e1dc974e..7e21735c 100644 --- a/altosui/AltosRomconfigUI.java +++ b/altosui/AltosRomconfigUI.java @@ -126,6 +126,11 @@ public class AltosRomconfigUI setLocationRelativeTo(owner); } + public AltosRomconfigUI(JFrame frame, AltosRomconfig config) { + this(frame); + set(config); + } + boolean selected; /* Listen for events from our buttons */ @@ -183,4 +188,9 @@ public class AltosRomconfigUI return romconfig(); return null; } + + public static AltosRomconfig show(JFrame frame, AltosRomconfig config) { + AltosRomconfigUI ui = new AltosRomconfigUI(frame, config); + return ui.showDialog(); + } } diff --git a/altosui/AltosUI.java b/altosui/AltosUI.java index 7955c1c2..7bb4ba12 100644 --- a/altosui/AltosUI.java +++ b/altosui/AltosUI.java @@ -219,7 +219,7 @@ public class AltosUI extends JFrame { } void FlashImage() { - new AltosFlashUI(AltosUI.this); + AltosFlashUI.show(AltosUI.this); } void FireIgniter() {