altoslib: Remember flight list in AltosConfigData
authorKeith Packard <keithp@keithp.com>
Tue, 9 Jun 2020 03:49:42 +0000 (20:49 -0700)
committerKeith Packard <keithp@keithp.com>
Tue, 9 Jun 2020 04:07:40 +0000 (21:07 -0700)
Do this instead of having to re-fetch and re-parse in AltosEepromList

Signed-off-by: Keith Packard <keithp@keithp.com>
altoslib/AltosConfigData.java
altoslib/AltosConfigValues.java
altoslib/AltosEepromList.java
altoslib/AltosJson.java

index 3c5f6c06678977f6a7790c850e125a543dbc0611..dc9fd6b378ec6708ac2aaebede9c18fc0b729ec8 100644 (file)
@@ -89,6 +89,7 @@ public class AltosConfigData {
 
        /* Log listing replies */
        public int      stored_flight;
+       public AltosEepromFlight[] flights;
 
        /* HAS_TRACKER */
        public int      tracker_motion;
@@ -162,7 +163,7 @@ public class AltosConfigData {
        public int log_available() {
                switch (log_format) {
                case AltosLib.AO_LOG_FORMAT_TINY:
-                       if (stored_flight == 0)
+                       if (flights == null)
                                return 1;
                        return 0;
                case AltosLib.AO_LOG_FORMAT_TELEMETRY:
@@ -175,10 +176,10 @@ public class AltosConfigData {
                        int     log_space = log_space();
                        int     log_used;
 
-                       if (stored_flight <= 0)
+                       if (flights == null)
                                log_used = 0;
                        else
-                               log_used = stored_flight * log_max;
+                               log_used = flights.length * log_max;
                        int     log_avail;
 
                        if (log_used >= log_space)
@@ -306,7 +307,8 @@ public class AltosConfigData {
 
                storage_size = AltosLib.MISSING;
                storage_erase_unit = AltosLib.MISSING;
-               stored_flight = AltosLib.MISSING;
+               stored_flight = 0;
+               flights = null;
 
                accel_zero_along = AltosLib.MISSING;
                accel_zero_across = AltosLib.MISSING;
@@ -484,7 +486,32 @@ public class AltosConfigData {
                try { storage_erase_unit = get_int(line, "Storage erase unit:"); } catch (Exception e) {}
 
                /* Log listing replies */
-               try { get_int(line, "flight"); stored_flight++; }  catch (Exception e) {}
+               try {
+                       int flight = get_int(line, "flight");
+                       String[] tokens = line.split("\\s+");
+                       if (tokens.length >= 6) {
+                               int     start = -1, end = -1;
+                               try {
+                                       if (tokens[2].equals("start"))
+                                               start = AltosParse.parse_hex(tokens[3]);
+                                       if (tokens[4].equals("end"))
+                                               end = AltosParse.parse_hex(tokens[5]);
+                                       if (flight != 0 && start >= 0 && end > 0) {
+                                               int len;
+                                               if (flights == null)
+                                                       len = 0;
+                                               else
+                                                       len = flights.length;
+                                               AltosEepromFlight [] new_flights = new AltosEepromFlight[len + 1];
+                                               for (int i = 0; i < len; i++)
+                                                       new_flights[i] = flights[i];
+                                               new_flights[len] = new AltosEepromFlight(flight, start, end);
+                                               flights = new_flights;
+                                               stored_flight = flights.length;
+                                       }
+                               } catch (ParseException pe) { System.out.printf("Parse error %s\n", pe.toString()); }
+                       }
+               }  catch (Exception e) {}
 
                /* HAS_GYRO */
                try {
@@ -701,7 +728,7 @@ public class AltosConfigData {
                        max_enabled = false;
                        break;
                default:
-                       if (stored_flight != AltosLib.MISSING)
+                       if (flights != null)
                                max_enabled = false;
                        break;
                }
index 9496fa3577636ff7e32f17923ccd3198c60e936e..8fa3fa41b697056ee271f76b1db6dddf1b2e2b0a 100644 (file)
@@ -64,7 +64,7 @@ public interface AltosConfigValues {
 
        public abstract int flight_log_max() throws AltosConfigDataException;
 
-       public abstract void set_flight_log_max_limit(int flight_log_max_limit);
+       public abstract void set_flight_log_max_limit(int flight_log_max_limit, int storage_erase_unit);
 
        public abstract void set_ignite_mode(int new_ignite_mode);
 
index 1abc638b8290f681a88991cf29e2a69f1ace16f4..0d15fa5a9e32a2ef22fb03444d4eecb6ef65728a 100644 (file)
@@ -39,6 +39,12 @@ class AltosEepromFlight {
                start = in_start;
                end = in_end;
        }
+
+       public AltosEepromFlight() {
+               flight = 0;
+               start = 0;
+               end = 0;
+       }
 }
 
 /*
@@ -55,59 +61,17 @@ public class AltosEepromList extends ArrayList<AltosEepromLog> {
                        if (remote)
                                link.start_remote();
                        config_data = new AltosConfigData (link);
-//                     if (config_data.serial == 0)
-//                             throw new IOException("no serial number found");
-
-                       ArrayList<AltosEepromFlight> flights = new ArrayList<AltosEepromFlight>();
-
-                       if (config_data.flight_log_max != 0 || config_data.log_format != 0) {
-
-                               /* Devices with newer firmware will support the 'l'
-                                * command which will list the region of storage
-                                * occupied by each available flight
-                                */
-                               link.printf("l\n");
-                               for (;;) {
-                                       String line = link.get_reply(5000);
-                                       if (line == null)
-                                               throw new TimeoutException();
-                                       if (line.contains("done"))
-                                               break;
-                                       if (line.contains("Syntax"))
-                                               continue;
-                                       String[] tokens = line.split("\\s+");
-                                       if (tokens.length < 6)
-                                               break;
-
-                                       int     flight = -1, start = -1, end = -1;
-                                       try {
-                                               if (tokens[0].equals("flight"))
-                                                       flight = AltosParse.parse_int(tokens[1]);
-                                               if (tokens[2].equals("start"))
-                                                       start = AltosParse.parse_hex(tokens[3]);
-                                               if (tokens[4].equals("end"))
-                                                       end = AltosParse.parse_hex(tokens[5]);
-                                               if (flight != 0 && start >= 0 && end > 0)
-                                                       flights.add(new AltosEepromFlight(flight, start, end));
-                                       } catch (ParseException pe) { System.out.printf("Parse error %s\n", pe.toString()); }
-                               }
-                       } else {
-
-                               /* Older devices will hold only a single
-                                * flight. This also assumes that any older
-                                * device will have a 1MB flash device
-                                */
-                               flights.add(new AltosEepromFlight(0, 0, 0xfff));
-                       }
 
                        /* With the list of flights collected, collect more complete
                         * information on them by reading the first block or two of
                         * data. This will add GPS coordinates and a date. For older
                         * firmware, this will also extract the flight number.
                         */
-                       for (AltosEepromFlight flight : flights) {
-                               add(new AltosEepromLog(config_data, link,
-                                                      flight.flight, flight.start, flight.end));
+                       if (config_data.flights != null) {
+                               for (AltosEepromFlight flight : config_data.flights) {
+                                       add(new AltosEepromLog(config_data, link,
+                                                              flight.flight, flight.start, flight.end));
+                               }
                        }
                } finally {
                        if (remote)
index cbeeee8785ba26319f60fc439af0b6a142987a37..1c3a342df12504130095def04323323e59877253 100644 (file)
@@ -1218,6 +1218,10 @@ public class AltosJson extends JsonUtil {
                } else if (object instanceof String) {
                        type = type_string;
                        string = (String) object;
+               } else if (object == null) {
+                       System.out.printf("unexpected null object\n");
+               } else if (object.getClass() == null) {
+                       System.out.printf("unexpected null object class\n");
                } else if (object.getClass().isArray()) {
                        assert_array(true);