From ce90f3fe2aa6e23695ccccb36a8e6e614a08ba31 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Wed, 28 Jul 2010 17:08:42 -0700 Subject: [PATCH] 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 --- ao-tools/altosui/AltosEeprom.java | 87 +++++++++++------ ao-tools/altosui/AltosEepromMonitor.java | 118 +++++++++++++++++++++++ ao-tools/altosui/AltosUI.java | 2 +- ao-tools/altosui/Makefile | 1 + 4 files changed, 178 insertions(+), 30 deletions(-) create mode 100644 ao-tools/altosui/AltosEepromMonitor.java 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 eeprom_pending = new LinkedList(); + 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 + * + * 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 \ -- 2.30.2