diff options
| -rw-r--r-- | altosui/AltosFlash.java | 15 | ||||
| -rw-r--r-- | altosui/AltosFlashUI.java | 159 | ||||
| -rw-r--r-- | altosui/AltosRomconfigUI.java | 10 | ||||
| -rw-r--r-- | altosui/AltosUI.java | 2 | 
4 files changed, 139 insertions, 47 deletions
| 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() { | 
