diff options
| author | Keith Packard <keithp@keithp.com> | 2010-07-28 17:08:42 -0700 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2010-07-28 17:08:42 -0700 | 
| commit | ce90f3fe2aa6e23695ccccb36a8e6e614a08ba31 (patch) | |
| tree | f3fe404e52c5ea9313b24e2aa3f2a2a6847aa221 | |
| parent | 6599e9576c3da9325a1731144c1b8bc4943184c0 (diff) | |
altosui: Add progress bar for eeprom downloading status
This has a progress bar tracking the state and block count while
downloading stuff from telemetrum.
Signed-off-by: Keith Packard <keithp@keithp.com>
| -rw-r--r-- | ao-tools/altosui/AltosEeprom.java | 87 | ||||
| -rw-r--r-- | ao-tools/altosui/AltosEepromMonitor.java | 118 | ||||
| -rw-r--r-- | ao-tools/altosui/AltosUI.java | 2 | ||||
| -rw-r--r-- | ao-tools/altosui/Makefile | 1 | 
4 files changed, 178 insertions, 30 deletions
| diff --git a/ao-tools/altosui/AltosEeprom.java b/ao-tools/altosui/AltosEeprom.java index 54e0bbc4..63698407 100644 --- a/ao-tools/altosui/AltosEeprom.java +++ b/ao-tools/altosui/AltosEeprom.java @@ -36,10 +36,11 @@ import altosui.AltosDeviceDialog;  import altosui.AltosPreferences;  import altosui.AltosLog;  import altosui.AltosVoice; +import altosui.AltosEepromMonitor;  import libaltosJNI.*; -public class AltosEeprom { +public class AltosEeprom implements Runnable {  	static final int AO_LOG_FLIGHT = 'F';  	static final int AO_LOG_SENSOR = 'A'; @@ -103,9 +104,9 @@ public class AltosEeprom {  		}  	} -	static void CaptureLog(AltosSerial serial_line) throws IOException, InterruptedException { +	static void CaptureLog(JFrame frame, AltosSerial serial_line) throws IOException, InterruptedException {  		int			serial = 0; -		int			block; +		int			block, state_block = 0;  		int			addr;  		int			flight = 0;  		int			year = 0, month = 0, day = 0; @@ -116,6 +117,7 @@ public class AltosEeprom {  		FileWriter		eeprom_file = null;  		AltosFile		eeprom_name;  		LinkedList<String>	eeprom_pending = new LinkedList<String>(); +		AltosEepromMonitor	monitor = new AltosEepromMonitor(frame, ao_flight_boost, ao_flight_landed);  		serial_line.printf("v\n"); @@ -140,11 +142,14 @@ public class AltosEeprom {  		if (serial == 0)  			throw new IOException("no serial number found"); +		monitor.set_serial(serial);  		/* Now scan the eeprom, reading blocks of data and converting to .eeprom file form */ +		state = 0; state_block = 0;  		for (block = 0; !done && block < 511; block++) {  			serial_line.printf("e %x\n", block);  			any_valid = false; +			monitor.set_value(state_names[state], state, block - state_block);  			for (addr = 0; addr < 0x100;) {  				String	line = serial_line.get_reply();  				int[] values = ParseHex(line); @@ -164,14 +169,18 @@ public class AltosEeprom {  					int	a = values[5] + (values[6] << 8);  					int	b = values[7] + (values[8] << 8); -					if (cmd == AO_LOG_FLIGHT) +					if (cmd == AO_LOG_FLIGHT) {  						flight = b; +						monitor.set_flight(flight); +					}  					/* Monitor state transitions to update display */  					if (cmd == AO_LOG_STATE && a <= ao_flight_landed) {  						System.out.printf ("%s\n", state_names[a]);  						if (a > ao_flight_pad)  							want_file = true; +						if (a > state) +							state_block = block;  						state = a;  					} @@ -189,6 +198,7 @@ public class AltosEeprom {  							else  								eeprom_name = new AltosFile(serial, flight, "eeprom-new"); +							monitor.set_file(eeprom_name.getName());  							eeprom_file = new FileWriter(eeprom_name);  							if (eeprom_file != null) {  								FlushPending(eeprom_file, eeprom_pending); @@ -224,35 +234,23 @@ public class AltosEeprom {  			eeprom_file.flush();  			eeprom_file.close();  		} +		monitor.done();  	} -	public static void SaveFlightData (JFrame frame) { -		altos_device	device = AltosDeviceDialog.show(frame, null); -		boolean		remote = false; -		AltosSerial	serial_line = new AltosSerial(); +	JFrame		frame; +	altos_device	device; +	AltosSerial	serial_line; +	boolean		remote; +	Thread		eeprom_thread; -		if (device == null) -			return; +	public void run () { +		if (remote) { +			serial_line.printf("m 0\n"); +			serial_line.set_channel(AltosPreferences.channel()); +			serial_line.printf("p\n"); +		}  		try { -			serial_line.open(device); -			if (!device.getProduct().startsWith("TeleMetrum")) -				remote = true; - -			if (remote) { -				serial_line.printf("m 0\n"); -				serial_line.set_channel(AltosPreferences.channel()); -				serial_line.printf("p\n"); -			} -			CaptureLog(serial_line); -			if (remote) -				serial_line.printf("~"); -			serial_line.close(); -		} catch (FileNotFoundException ee) { -			JOptionPane.showMessageDialog(frame, -						      String.format("Cannot open device \"%s\"", -								    device.getPath()), -						      "Cannot open target device", -						      JOptionPane.ERROR_MESSAGE); +			CaptureLog(frame, serial_line);  		} catch (IOException ee) {  			JOptionPane.showMessageDialog(frame,  						      device.getPath(), @@ -260,5 +258,36 @@ public class AltosEeprom {  						      JOptionPane.ERROR_MESSAGE);  		} catch (InterruptedException ie) {  		} +		if (remote) +			serial_line.printf("~"); +		serial_line.close(); +	} + +	public AltosEeprom(JFrame given_frame) { +		frame = given_frame; +		device = AltosDeviceDialog.show(frame, null); +		serial_line = new AltosSerial(); +		remote = false; + +		if (device != null) { +			try { +				serial_line.open(device); +				if (!device.getProduct().startsWith("TeleMetrum")) +					remote = true; +				eeprom_thread = new Thread(this); +				eeprom_thread.start(); +			} catch (FileNotFoundException ee) { +				JOptionPane.showMessageDialog(frame, +							      String.format("Cannot open device \"%s\"", +									    device.getPath()), +							      "Cannot open target device", +							      JOptionPane.ERROR_MESSAGE); +			} catch (IOException ee) { +				JOptionPane.showMessageDialog(frame, +							      device.getPath(), +							      ee.getLocalizedMessage(), +							      JOptionPane.ERROR_MESSAGE); +			} +		}  	}  } diff --git a/ao-tools/altosui/AltosEepromMonitor.java b/ao-tools/altosui/AltosEepromMonitor.java new file mode 100644 index 00000000..a7b1dd3e --- /dev/null +++ b/ao-tools/altosui/AltosEepromMonitor.java @@ -0,0 +1,118 @@ +/* + * Copyright © 2010 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +package altosui; + +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 altosui.AltosSerial; +import altosui.AltosSerialMonitor; +import altosui.AltosTelemetry; +import altosui.AltosState; +import altosui.AltosDeviceDialog; +import altosui.AltosPreferences; +import altosui.AltosLog; +import altosui.AltosVoice; + +public class AltosEepromMonitor extends JDialog { + +	JPanel		panel; +	Box		box; +	JLabel		serial_label; +	JLabel		flight_label; +	JLabel		file_label; +	JProgressBar	pbar; +	int		min_state, max_state; + +	public AltosEepromMonitor(JFrame owner, int in_min_state, int in_max_state) { +		super (owner, "Download Flight Data"); + +		box = Box.createVerticalBox(); + +		serial_label = new JLabel("Serial:"); +		box.add(serial_label); +		flight_label = new JLabel("Flight:"); +		box.add(flight_label); +		file_label = new JLabel("File:"); +		box.add(file_label); + +		min_state = in_min_state; +		max_state = in_max_state; +		pbar = new JProgressBar(); +		pbar.setMinimum(0); +		pbar.setMaximum((max_state - min_state) * 100); +		pbar.setValue(0); +		pbar.setString("startup"); +		pbar.setStringPainted(true); +		box.add(pbar); + +		panel = new JPanel(); +		panel.add(box); + +		add(panel); + +		setMinimumSize(new Dimension(600, 0)); +		setContentPane(panel); +		pack(); +		setVisible(true); +	} + +	public void set_value(String state_name, int in_state, int in_block) { +		int block = in_block; +		int state = in_state; + +		if (block > 100) +			block = 100; +		if (state < min_state) state = min_state; +		if (state >= max_state) state = max_state - 1; +		state -= min_state; + +		int pos = state * 100 + block; + +		System.out.printf ("State %s (%d + %d) = %d\n", +				   state_name, in_state, in_block, pos); + +		pbar.setString(state_name); +		pbar.setValue(pos); +	} + +	public void set_serial(int serial) { +		serial_label.setText(String.format("Serial: %d", serial)); +	} + +	public void set_flight(int flight) { +		flight_label.setText(String.format("Flight: %d", flight)); +	} + +	public void set_file(String file) { +		file_label.setText(String.format("File: %s", file)); +	} + +	public void done() { +		setVisible(false); +		dispose(); +	} +} diff --git a/ao-tools/altosui/AltosUI.java b/ao-tools/altosui/AltosUI.java index 92c3d0a3..863d173e 100644 --- a/ao-tools/altosui/AltosUI.java +++ b/ao-tools/altosui/AltosUI.java @@ -613,7 +613,7 @@ public class AltosUI extends JFrame {  	 * a TeleDongle over the packet link  	 */  	private void SaveFlightData() { -		AltosEeprom.SaveFlightData(AltosUI.this); +		new AltosEeprom(AltosUI.this);  	}  	/* Create the AltosUI menus diff --git a/ao-tools/altosui/Makefile b/ao-tools/altosui/Makefile index 2a91d657..2c284aaa 100644 --- a/ao-tools/altosui/Makefile +++ b/ao-tools/altosui/Makefile @@ -4,6 +4,7 @@ CLASSPATH=classes:./*  CLASSFILES=\  	AltosConvert.class \  	AltosEeprom.class \ +	AltosEepromMonitor.class \  	AltosFile.class \  	AltosGPS.class \  	AltosGreatCircle.class \ | 
