altos: Support staging by going back to boost as needed
[fw/altos] / altosui / AltosEepromRecord.java
index e5196c50039a69434d36bd661f612ad50bb3ae08..d8a07951a72369f7a73fa7cecd45565bb3c51476 100644 (file)
@@ -38,57 +38,26 @@ public class AltosEepromRecord {
        public String   data;
        public boolean  tick_valid;
 
-       int[] ParseHex(String line) {
-               String[] tokens = line.split("\\s+");
-               int[] array = new int[tokens.length];
+       static final int        record_length = 8;
 
-               for (int i = 0; i < tokens.length; i++)
-                       try {
-                               array[i] = Integer.parseInt(tokens[i], 16);
-                       } catch (NumberFormatException ne) {
-                               return null;
-                       }
-               return array;
-       }
-
-       int checksum(int[] line) {
-               int     csum = 0x5a;
-               for (int i = 1; i < line.length; i++)
-                       csum += line[i];
-               return csum & 0xff;
-       }
+       public AltosEepromRecord (AltosEepromChunk chunk, int start) throws ParseException {
 
-       public AltosEepromRecord (AltosSerial serial_line, int addr)
-               throws TimeoutException, ParseException, InterruptedException {
-               String  line = serial_line.get_reply(5000);
-               if (line == null)
-                       throw new TimeoutException();
-               int[] values = ParseHex(line);
-
-               if (values == null || values.length < 9) {
-                       System.out.printf("invalid line %s", line);
-                       throw new ParseException(String.format("inalid line %s", line), 0);
-               }
-               if (values[0] != (addr & 0xff))
-                       throw new ParseException(String.format("data address out of sync at 0x%x",
-                                                              addr), 0);
-               int i;
-               for (i = 1; i < values.length; i++)
-                       if (values[i] != 0xff)
-                               break;
-               cmd = values[1];
+               cmd = chunk.data(start);
                tick_valid = true;
-               if (i != values.length) {
-                       if (checksum(values) != 0)
-                               throw new ParseException(String.format("invalid checksum at 0x%x in line %s", addr, line), 0);
+
+               tick_valid = !chunk.erased(start, record_length);
+               if (tick_valid) {
+                       if (AltosConvert.checksum(chunk.data, start, record_length) != 0)
+                               throw new ParseException(String.format("invalid checksum at 0x%x",
+                                                                      chunk.address + start), 0);
                } else {
                        cmd = Altos.AO_LOG_INVALID;
-                       tick_valid = false;
                }
 
-               tick = values[3] + (values[4] << 8);
-               a = values[5] + (values[6] << 8);
-               b = values[7] + (values[8] << 8);
+               tick = chunk.data16(start + 2);
+               a = chunk.data16(start + 4);
+               b = chunk.data16(start + 6);
+
                data = null;
        }
 
@@ -138,6 +107,9 @@ public class AltosEepromRecord {
                                } else if (tokens[0].equals("Radio") && tokens[1].equals("cal:")) {
                                        cmd = Altos.AO_LOG_RADIO_CAL;
                                        a = Integer.parseInt(tokens[2]);
+                               } else if (tokens[0].equals("Max") && tokens[1].equals("flight") && tokens[2].equals("log:")) {
+                                       cmd = Altos.AO_LOG_MAX_FLIGHT_LOG;
+                                       a = Integer.parseInt(tokens[3]);
                                } else if (tokens[0].equals("manufacturer")) {
                                        cmd = Altos.AO_LOG_MANUFACTURER;
                                        data = tokens[1];
@@ -147,6 +119,9 @@ public class AltosEepromRecord {
                                } else if (tokens[0].equals("serial-number")) {
                                        cmd = Altos.AO_LOG_SERIAL_NUMBER;
                                        a = Integer.parseInt(tokens[1]);
+                               } else if (tokens[0].equals("log-format")) {
+                                       cmd = Altos.AO_LOG_LOG_FORMAT;
+                                       a = Integer.parseInt(tokens[1]);
                                } else if (tokens[0].equals("software-version")) {
                                        cmd = Altos.AO_LOG_SOFTWARE_VERSION;
                                        data = tokens[1];