update changelogs for Debian build
[fw/altos] / ao-tools / altosui / AltosEeprom.java
index 54e0bbc4b9b503b80269e03b43cb02b2d471d03a..4c537a8901da0361ffe9bc0573ad049ee0707b44 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';
@@ -64,7 +65,7 @@ public class AltosEeprom {
        static final int ao_flight_landed = 8;
        static final int ao_flight_invalid = 9;
 
-       static String[] state_names = {
+       static final String[] state_names = {
                "startup",
                "idle",
                "pad",
@@ -77,7 +78,7 @@ public class AltosEeprom {
                "invalid",
        };
 
-       static int[] ParseHex(String line) {
+       int[] ParseHex(String line) {
                String[] tokens = line.split("\\s+");
                int[] array = new int[tokens.length];
 
@@ -90,22 +91,29 @@ public class AltosEeprom {
                return array;
        }
 
-       static int checksum(int[] line) {
+       int checksum(int[] line) {
                int     csum = 0x5a;
                for (int i = 1; i < line.length; i++)
                        csum += line[i];
                return csum & 0xff;
        }
 
-       static void FlushPending(FileWriter file, LinkedList<String> pending) throws IOException {
+       void FlushPending(FileWriter file, LinkedList<String> pending) throws IOException {
                while (!pending.isEmpty()) {
                        file.write(pending.remove());
                }
        }
 
-       static void CaptureLog(AltosSerial serial_line) throws IOException, InterruptedException {
+       JFrame                  frame;
+       altos_device            device;
+       AltosSerial             serial_line;
+       boolean                 remote;
+       Thread                  eeprom_thread;
+       AltosEepromMonitor      monitor;
+
+       void CaptureLog() 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;
@@ -140,11 +148,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 +175,17 @@ 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;
                                        }
 
@@ -185,10 +199,11 @@ public class AltosEeprom {
                                        if (eeprom_file == null) {
                                                if (serial != 0 && flight != 0 && want_file) {
                                                        if (year != 0 && month != 0 && day != 0)
-                                                               eeprom_name = new AltosFile(year, month, day, serial, flight, "eeprom-new");
+                                                               eeprom_name = new AltosFile(year, month, day, serial, flight, "eeprom");
                                                        else
-                                                               eeprom_name = new AltosFile(serial, flight, "eeprom-new");
+                                                               eeprom_name = new AltosFile(serial, flight, "eeprom");
 
+                                                       monitor.set_file(eeprom_name.getName());
                                                        eeprom_file = new FileWriter(eeprom_name);
                                                        if (eeprom_file != null) {
                                                                FlushPending(eeprom_file, eeprom_pending);
@@ -214,7 +229,7 @@ public class AltosEeprom {
                                done = true;
                }
                if (eeprom_file == null) {
-                       eeprom_name = new AltosFile(serial,flight,"eeprom-new");
+                       eeprom_name = new AltosFile(serial,flight,"eeprom");
                        eeprom_file = new FileWriter(eeprom_name);
                        if (eeprom_file != null) {
                                FlushPending(eeprom_file, eeprom_pending);
@@ -226,33 +241,21 @@ public class AltosEeprom {
                }
        }
 
-       public static void SaveFlightData (JFrame frame) {
-               altos_device    device = AltosDeviceDialog.show(frame, null);
-               boolean         remote = false;
-               AltosSerial     serial_line = new AltosSerial();
+       public void run () {
+               if (remote) {
+                       serial_line.printf("m 0\n");
+                       serial_line.set_channel(AltosPreferences.channel());
+                       serial_line.printf("p\n");
+               }
 
-               if (device == null)
-                       return;
+               monitor = new AltosEepromMonitor(frame, ao_flight_boost, ao_flight_landed);
+               monitor.addActionListener(new ActionListener() {
+                               public void actionPerformed(ActionEvent e) {
+                                       eeprom_thread.interrupt();
+                               }
+                       });
                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();
                } catch (IOException ee) {
                        JOptionPane.showMessageDialog(frame,
                                                      device.getPath(),
@@ -260,5 +263,38 @@ public class AltosEeprom {
                                                      JOptionPane.ERROR_MESSAGE);
                } catch (InterruptedException ie) {
                }
+               if (remote)
+                       serial_line.printf("~");
+               monitor.done();
+               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);
+                       }
+               }
        }
 }