From: Keith Packard Date: Tue, 9 Jun 2020 03:49:42 +0000 (-0700) Subject: altoslib: Remember flight list in AltosConfigData X-Git-Tag: 1.9.3~1^2~24 X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=commitdiff_plain;h=e4c93942bbde7a538d1dca114f20dc827275a8e1 altoslib: Remember flight list in AltosConfigData Do this instead of having to re-fetch and re-parse in AltosEepromList Signed-off-by: Keith Packard --- diff --git a/altoslib/AltosConfigData.java b/altoslib/AltosConfigData.java index 3c5f6c06..dc9fd6b3 100644 --- a/altoslib/AltosConfigData.java +++ b/altoslib/AltosConfigData.java @@ -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; } diff --git a/altoslib/AltosConfigValues.java b/altoslib/AltosConfigValues.java index 9496fa35..8fa3fa41 100644 --- a/altoslib/AltosConfigValues.java +++ b/altoslib/AltosConfigValues.java @@ -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); diff --git a/altoslib/AltosEepromList.java b/altoslib/AltosEepromList.java index 1abc638b..0d15fa5a 100644 --- a/altoslib/AltosEepromList.java +++ b/altoslib/AltosEepromList.java @@ -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 { if (remote) link.start_remote(); config_data = new AltosConfigData (link); -// if (config_data.serial == 0) -// throw new IOException("no serial number found"); - - ArrayList flights = new ArrayList(); - - 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) diff --git a/altoslib/AltosJson.java b/altoslib/AltosJson.java index cbeeee87..1c3a342d 100644 --- a/altoslib/AltosJson.java +++ b/altoslib/AltosJson.java @@ -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);