altosui: Add progress bar for eeprom downloading status
authorKeith Packard <keithp@keithp.com>
Thu, 29 Jul 2010 00:08:42 +0000 (17:08 -0700)
committerKeith Packard <keithp@keithp.com>
Thu, 29 Jul 2010 00:08:42 +0000 (17:08 -0700)
This has a progress bar tracking the state and block count while
downloading stuff from telemetrum.

Signed-off-by: Keith Packard <keithp@keithp.com>
ao-tools/altosui/AltosEeprom.java
ao-tools/altosui/AltosEepromMonitor.java [new file with mode: 0644]
ao-tools/altosui/AltosUI.java
ao-tools/altosui/Makefile

index 54e0bbc4b9b503b80269e03b43cb02b2d471d03a..63698407fb3c9285ee75f4244355052fa05b1e6a 100644 (file)
@@ -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 (file)
index 0000000..a7b1dd3
--- /dev/null
@@ -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();
+       }
+}
index 92c3d0a3f43ccbbb3c3a401b2739adb8bd0713d3..863d173e530a731e2ecb3ba94a73f2eec8eadaab 100644 (file)
@@ -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
index 2a91d657a11a8f5cbabe5e373a8bc32766bd05bf..2c284aaa8d636ba3847e2264dcd6dcd3abf1964a 100644 (file)
@@ -4,6 +4,7 @@ CLASSPATH=classes:./*
 CLASSFILES=\
        AltosConvert.class \
        AltosEeprom.class \
+       AltosEepromMonitor.class \
        AltosFile.class \
        AltosGPS.class \
        AltosGreatCircle.class \