altosui: Split eeprom download code apart
[fw/altos] / altosui / AltosEepromBlock.java
diff --git a/altosui/AltosEepromBlock.java b/altosui/AltosEepromBlock.java
new file mode 100644 (file)
index 0000000..0c1a4a9
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Copyright © 2011 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.*;
+import java.lang.reflect.Array;
+
+import libaltosJNI.*;
+
+public class AltosEepromBlock extends ArrayList<AltosEepromRecord> {
+       boolean has_flight;
+       int     flight;
+       boolean has_state;
+       int     state;
+       boolean has_date;
+       int     year, month, day;
+
+       public AltosEepromBlock (AltosSerial serial_line, int block) throws TimeoutException, InterruptedException {
+               int     addr;
+               boolean done = false;
+
+               has_flight = false;
+               has_state = false;
+               has_date = false;
+               serial_line.printf("e %x\n", block);
+               for (addr = 0; !done && addr < 0x100;) {
+                       try {
+                               AltosEepromRecord r = new AltosEepromRecord(serial_line, block * 256 + addr);
+
+                               if (r.cmd == Altos.AO_LOG_FLIGHT) {
+                                       flight = r.b;
+                                       has_flight = true;
+                               }
+
+                               /* Monitor state transitions to update display */
+                               if (r.cmd == Altos.AO_LOG_STATE && r.a <= Altos.ao_flight_landed) {
+                                       if (!has_state || r.a > state) {
+                                               state = r.a;
+                                               has_state = true;
+                                       }
+                               }
+
+                               if (r.cmd == Altos.AO_LOG_GPS_DATE) {
+                                       year = 2000 + (r.a & 0xff);
+                                       month = (r.a >> 8) & 0xff;
+                                       day = (r.b & 0xff);
+                                       has_date = true;
+                               }
+
+                               if (r.cmd == Altos.AO_LOG_STATE && r.a == Altos.ao_flight_landed)
+                                       done = true;
+                               add(addr / 8, r);
+                       } catch (ParseException pe) {
+                       }
+                       addr += 8;
+               }
+       }
+}
\ No newline at end of file