altosui: Add support for downloading TeleMini/TeleNano flight logs
[fw/altos] / altosui / AltosEepromBlock.java
index 0c1a4a9287b6ecd9beb373fc785b08fb6b36cc41..650920d1b353629c7cdf3d18ae6846997054832c 100644 (file)
@@ -38,18 +38,27 @@ public class AltosEepromBlock extends ArrayList<AltosEepromRecord> {
        int     state;
        boolean has_date;
        int     year, month, day;
+       boolean has_lat;
+       double  lat;
+       boolean has_lon;
+       double  lon;
+       boolean has_time;
+       int     hour, minute, second;
+       ParseException  parse_exception = null;
 
-       public AltosEepromBlock (AltosSerial serial_line, int block) throws TimeoutException, InterruptedException {
+       public AltosEepromBlock (AltosEepromChunk chunk) {
                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;) {
+               has_lat = false;
+               has_lon = false;
+               has_time = false;
+               for (addr = 0; addr < chunk.chunk_size;) {
                        try {
-                               AltosEepromRecord r = new AltosEepromRecord(serial_line, block * 256 + addr);
+                               AltosEepromRecord r = new AltosEepromRecord(chunk, addr);
 
                                if (r.cmd == Altos.AO_LOG_FLIGHT) {
                                        flight = r.b;
@@ -70,11 +79,31 @@ public class AltosEepromBlock extends ArrayList<AltosEepromRecord> {
                                        day = (r.b & 0xff);
                                        has_date = true;
                                }
-
+                               if (r.cmd == Altos.AO_LOG_GPS_TIME) {
+                                       hour = (r.a & 0xff);
+                                       minute = (r.a >> 8);
+                                       second = (r.b & 0xff);
+                                       has_time = true;
+                               }
+                               if (r.cmd == Altos.AO_LOG_GPS_LAT) {
+                                       lat = (double) (r.a | (r.b << 16)) / 1e7;
+                                       has_lat = true;
+                               }
+                               if (r.cmd == Altos.AO_LOG_GPS_LON) {
+                                       lon = (double) (r.a | (r.b << 16)) / 1e7;
+                                       has_lon = true;
+                               }
+                               if (!done)
+                                       add(addr / 8, r);
                                if (r.cmd == Altos.AO_LOG_STATE && r.a == Altos.ao_flight_landed)
                                        done = true;
-                               add(addr / 8, r);
                        } catch (ParseException pe) {
+                               AltosEepromRecord       r = new AltosEepromRecord(Altos.AO_LOG_INVALID,
+                                                                                 0, 0, 0);
+                               if (parse_exception == null)
+                                       parse_exception = pe;
+                               if (!done)
+                                       add(addr/8, r);
                        }
                        addr += 8;
                }