altoslib: Make AltosConfigData parse all of the config data
authorKeith Packard <keithp@keithp.com>
Fri, 7 Dec 2012 01:08:39 +0000 (17:08 -0800)
committerKeith Packard <keithp@keithp.com>
Fri, 7 Dec 2012 01:08:39 +0000 (17:08 -0800)
It was missing quite a few. This also speeds up parsing of config from
TeleScience, TeleBT and TeleTerra by not listing flight info on those
products (where it doesn't make sense).

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

index 45a88783ad3a4a5e33fa023188804a66da6d077f..b4478da93ffb4aa67455db882f9e0b5fc0dae99e 100644 (file)
@@ -26,31 +26,54 @@ public class AltosConfigData implements Iterable<String> {
        /* Version information */
        public String   manufacturer;
        public String   product;
        /* Version information */
        public String   manufacturer;
        public String   product;
-       public String   version;
-       public int      log_format;
        public int      serial;
        public int      serial;
+       public int      flight;
+       public int      log_format;
+       public String   version;
 
        /* Strings returned */
        public LinkedList<String>       lines;
 
        /* Config information */
 
        /* Strings returned */
        public LinkedList<String>       lines;
 
        /* Config information */
-       public int      config_major;
-       public int      config_minor;
+       /* HAS_FLIGHT*/
        public int      main_deploy;
        public int      apogee_delay;
        public int      main_deploy;
        public int      apogee_delay;
-       public int      radio_channel;
-       public int      radio_setting;
+       public int      apogee_lockout;
+       
+       /* HAS_RADIO */
        public int      radio_frequency;
        public String   callsign;
        public int      radio_frequency;
        public String   callsign;
-       public int      accel_cal_plus, accel_cal_minus;
+       public int      radio_enable;
        public int      radio_calibration;
        public int      radio_calibration;
+       /* Old HAS_RADIO values */
+       public int      radio_channel;
+       public int      radio_setting;
+
+       /* HAS_ACCEL */
+       public int      accel_cal_plus, accel_cal_minus;
+       public int      pad_orientation;
+
+       /* HAS_LOG */
        public int      flight_log_max;
        public int      flight_log_max;
+
+       /* HAS_IGNITE */
        public int      ignite_mode;
        public int      ignite_mode;
-       public int      stored_flight;
+
+       /* HAS_AES */
+       public String   aes_key;
+
+       /* AO_PYRO_NUM */
+       public AltosPyro[]      pyros;
+       public int              npyro;
+       public int              pyro;
+
+       /* Storage info replies */
        public int      storage_size;
        public int      storage_erase_unit;
 
        public int      storage_size;
        public int      storage_erase_unit;
 
-       public AltosPyro[]      pyros;
+       /* Log listing replies */
+       public int      stored_flight;
+
 
        public static String get_string(String line, String label) throws  ParseException {
                if (line.startsWith(label)) {
 
        public static String get_string(String line, String label) throws  ParseException {
                if (line.startsWith(label)) {
@@ -85,6 +108,9 @@ public class AltosConfigData implements Iterable<String> {
                        if (stored_flight == 0)
                                return 1;
                        return 0;
                        if (stored_flight == 0)
                                return 1;
                        return 0;
+               case AltosLib.AO_LOG_FORMAT_TELEMETRY:
+               case AltosLib.AO_LOG_FORMAT_TELESCIENCE:
+                       return 1;
                default:
                        if (flight_log_max <= 0)
                                return 1;
                default:
                        if (flight_log_max <= 0)
                                return 1;
@@ -130,71 +156,124 @@ public class AltosConfigData implements Iterable<String> {
                return 0;
        }
 
                return 0;
        }
 
-       public AltosConfigData(AltosLink link) throws InterruptedException, TimeoutException {
-               link.printf("c s\nf\nl\nv\n");
+       public void reset() {
                lines = new LinkedList<String>();
                lines = new LinkedList<String>();
+
+               serial = -1;
                radio_setting = 0;
                radio_frequency = 0;
                radio_setting = 0;
                radio_frequency = 0;
-               stored_flight = 0;
-               serial = -1;
                pyros = null;
                pyros = null;
+               npyro = 0;
+               pyro = 0;
+       }
+       
+       public void parse_line(String line) {
+               lines.add(line);
+               /* Version replies */
+               try { manufacturer = get_string(line, "manufacturer"); } catch (Exception e) {}
+               try { product = get_string(line, "product"); } catch (Exception e) {}
+               try { serial = get_int(line, "serial-number"); } catch (Exception e) {}
+               try { flight = get_int(line, "current-flight"); } catch (Exception e) {}
+               try { log_format = get_int(line, "log-format"); } catch (Exception e) {}
+               try { version = get_string(line, "software-version"); } catch (Exception e) {}
+
+               /* Version also contains MS5607 info, which we ignore here */
+
+               /* Config show replies */
 
 
-               int npyro = 0;
-               int pyro = 0;
+               /* HAS_FLIGHT */
+               try { main_deploy = get_int(line, "Main deploy:"); } catch (Exception e) {}
+               try { apogee_delay = get_int(line, "Apogee delay:"); } catch (Exception e) {}
+               try { apogee_lockout = get_int(line, "Apogee lockout:"); } catch (Exception e) {}
+
+               /* HAS_RADIO */
+               try {
+                       radio_frequency = get_int(line, "Frequency:");
+                       if (radio_frequency < 0)
+                               radio_frequency = 434550;
+               } catch (Exception e) {}
+               try { callsign = get_string(line, "Callsign:"); } catch (Exception e) {}
+               try { radio_enable = get_int(line, "Radio enable:"); } catch (Exception e) {}
+               try { radio_calibration = get_int(line, "Radio cal:"); } catch (Exception e) {}
+
+               /* Old HAS_RADIO values */
+               try { radio_channel = get_int(line, "Radio channel:"); } catch (Exception e) {}
+               try { radio_setting = get_int(line, "Radio setting:"); } catch (Exception e) {}
+
+               /* HAS_ACCEL */
+               try {
+                       if (line.startsWith("Accel cal")) {
+                               String[] bits = line.split("\\s+");
+                               if (bits.length >= 6) {
+                                       accel_cal_plus = Integer.parseInt(bits[3]);
+                                       accel_cal_minus = Integer.parseInt(bits[5]);
+                               }
+                       }
+               } catch (Exception e) {}
+               try { pad_orientation = get_int(line, "Pad orientation:"); } catch (Exception e) {}
+
+               /* HAS_LOG */
+               try { flight_log_max = get_int(line, "Max flight log:"); } catch (Exception e) {}
+
+               /* HAS_IGNITE */
+               try { ignite_mode = get_int(line, "Ignite mode:"); } catch (Exception e) {}
+
+               /* HAS_AES */
+               try { aes_key = get_string(line, "AES key:"); } catch (Exception e) {}
+
+               /* AO_PYRO_NUM */
+               try {
+                       npyro = get_int(line, "Pyro-count:");
+                       pyros = new AltosPyro[npyro];
+                       pyro = 0;
+               } catch (Exception e) {}
+               if (npyro > 0) {
+                       try {
+                               AltosPyro p = new AltosPyro(pyro, line);
+                               if (pyro < npyro - 1)
+                                       pyros[pyro++] = p;
+                       } catch (Exception e) {}
+               }
+               
+               /* Storage info replies */
+               try { storage_size = get_int(line, "Storage size:"); } catch (Exception e) {}
+               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) {}
+       }
+
+       public AltosConfigData() {
+               this.reset();
+       }
+
+       private void read_link(AltosLink link, String finished) throws InterruptedException, TimeoutException {
                for (;;) {
                        String line = link.get_reply();
                        if (line == null)
                                throw new TimeoutException();
                        if (line.contains("Syntax error"))
                                continue;
                for (;;) {
                        String line = link.get_reply();
                        if (line == null)
                                throw new TimeoutException();
                        if (line.contains("Syntax error"))
                                continue;
-                       lines.add(line);
-                       if (pyro < npyro - 1) {
-                               if (pyros == null)
-                                       pyros = new AltosPyro[npyro];
-                               try {
-                                       pyros[pyro] = new AltosPyro(pyro, line);
-                               } catch (ParseException e) {
-                               }
-                               ++pyro;
-                               continue;
-                       }
-                       try { serial = get_int(line, "serial-number"); } catch (Exception e) {}
-                       try { log_format = get_int(line, "log-format"); } catch (Exception e) {}
-                       try { main_deploy = get_int(line, "Main deploy:"); } catch (Exception e) {}
-                       try { apogee_delay = get_int(line, "Apogee delay:"); } catch (Exception e) {}
-                       try { radio_channel = get_int(line, "Radio channel:"); } catch (Exception e) {}
-                       try { radio_setting = get_int(line, "Radio setting:"); } catch (Exception e) {}
-                       try {
-                               radio_frequency = get_int(line, "Frequency:");
-                               if (radio_frequency < 0)
-                                       radio_frequency = 434550;
-                       } catch (Exception e) {}
-                       try {
-                               if (line.startsWith("Accel cal")) {
-                                       String[] bits = line.split("\\s+");
-                                       if (bits.length >= 6) {
-                                               accel_cal_plus = Integer.parseInt(bits[3]);
-                                               accel_cal_minus = Integer.parseInt(bits[5]);
-                                       }
-                               }
-                       } catch (Exception e) {}
-                       try { radio_calibration = get_int(line, "Radio cal:"); } catch (Exception e) {}
-                       try { flight_log_max = get_int(line, "Max flight log:"); } catch (Exception e) {}
-                       try { ignite_mode = get_int(line, "Ignite mode:"); } catch (Exception e) {}
-                       try { callsign = get_string(line, "Callsign:"); } catch (Exception e) {}
-                       try { version = get_string(line,"software-version"); } catch (Exception e) {}
-                       try { product = get_string(line,"product"); } catch (Exception e) {}
-                       try { manufacturer = get_string(line,"manufacturer"); } catch (Exception e) {}
-
-                       try { get_int(line, "flight"); stored_flight++; }  catch (Exception e) {}
-                       try { storage_size = get_int(line, "Storage size:"); } catch (Exception e) {}
-                       try { storage_erase_unit = get_int(line, "Storage erase unit"); } catch (Exception e) {}
-                       try { npyro = get_int(line, "Pyro-count:"); pyro = 0; } catch (Exception e) {}
+                       this.parse_line(line);
 
                        /* signals the end of the version info */
 
                        /* signals the end of the version info */
-                       if (line.startsWith("software-version"))
+                       if (line.startsWith(finished))
                                break;
                }
        }
 
                                break;
                }
        }
 
+       public AltosConfigData(AltosLink link) throws InterruptedException, TimeoutException {
+               this.reset();
+               link.printf("c s\nf\nv\n");
+               read_link(link, "software-version");
+               switch (log_format) {
+               case AltosLib.AO_LOG_FORMAT_TELEMETRY:
+               case AltosLib.AO_LOG_FORMAT_TELESCIENCE:
+                       break;
+               default:
+                       link.printf("l\n");
+                       read_link(link, "done");
+               }
+       }
+
 }
\ No newline at end of file
 }
\ No newline at end of file