altoslib: Add new 'stateless' flight state for TeleGPS
authorKeith Packard <keithp@keithp.com>
Tue, 10 Jun 2014 17:18:44 +0000 (10:18 -0700)
committerKeith Packard <keithp@keithp.com>
Tue, 10 Jun 2014 17:18:44 +0000 (10:18 -0700)
TeleGPS has no flight state, so add a new 'stateless' state for code
to handle this case differently than any of the existing states

Signed-off-by: Keith Packard <keithp@keithp.com>
altoslib/AltosEepromFile.java
altoslib/AltosEepromHeader.java
altoslib/AltosLib.java
altoslib/AltosState.java

index f59585f8a9f132c55a63fb172f920a7bbf49c136..b7e446ce6a1627fbdd8b6d4637176bfe1f4351a6 100644 (file)
@@ -72,7 +72,8 @@ public class AltosEepromFile extends AltosStateIterable {
                headers = new AltosEepromIterable(AltosEepromHeader.read(input));
 
                start = headers.state();
-               start.set_state(AltosLib.ao_flight_pad);
+               if (start.state != AltosLib.ao_flight_stateless)
+                       start.set_state(AltosLib.ao_flight_pad);
 
                if (start.log_format == AltosLib.MISSING) {
                        if (start.product != null) {
index ea6f5e28bb31db1894b43295855565b826a837f4..839aa06e0fbdac648bb1de80ab60ac24d17f8078 100644 (file)
@@ -56,7 +56,7 @@ public class AltosEepromHeader extends AltosEeprom {
                        state.product = data;
                        break;
                case AltosLib.AO_LOG_LOG_FORMAT:
-                       state.log_format = config_a;
+                       state.set_log_format(config_a);
                        break;
                case AltosLib.AO_LOG_SERIAL_NUMBER:
                        state.set_serial(config_a);
index 7080ebfecf5cfd856c0504edad4ab6c3ed9ff674..69c6d604003d7ff39bacba50b7affb14270c1d73 100644 (file)
@@ -79,6 +79,7 @@ public class AltosLib {
        public static final int ao_flight_main = 7;
        public static final int ao_flight_landed = 8;
        public static final int ao_flight_invalid = 9;
+       public static final int ao_flight_stateless = 10;
 
        /* USB product IDs */
        public final static int vendor_altusmetrum = 0xfffe;
@@ -187,6 +188,7 @@ public class AltosLib {
                string_to_state.put("main", ao_flight_main);
                string_to_state.put("landed", ao_flight_landed);
                string_to_state.put("invalid", ao_flight_invalid);
+               string_to_state.put("stateless", ao_flight_stateless);
                map_initialized = true;
        }
 
@@ -215,6 +217,7 @@ public class AltosLib {
                "main",
                "landed",
                "invalid",
+               "stateless",
        };
 
        private static String[] state_to_string_capital = {
@@ -228,6 +231,7 @@ public class AltosLib {
                "Main",
                "Landed",
                "Invalid",
+               "Stateless",
        };
 
        public static int state(String state) {
index 1d6ee3c8ff81fe9137f04389159356390f19e485..2d75f72e676881b45cbc63b9ec9e13dfb90308b4 100644 (file)
@@ -500,7 +500,7 @@ public class AltosState implements Cloneable {
        class AltosSpeed extends AltosCValue {
 
                boolean can_max() {
-                       return state < AltosLib.ao_flight_fast;
+                       return state < AltosLib.ao_flight_fast || state == AltosLib.ao_flight_stateless;
                }
 
                void set_accel() {
@@ -542,7 +542,7 @@ public class AltosState implements Cloneable {
        class AltosAccel extends AltosCValue {
 
                boolean can_max() {
-                       return state < AltosLib.ao_flight_fast;
+                       return state < AltosLib.ao_flight_fast || state == AltosLib.ao_flight_stateless;
                }
 
                void set_measured(double a, double time) {
@@ -885,9 +885,9 @@ public class AltosState implements Cloneable {
 
                if (gps.locked && gps.nsat >= 4) {
                        /* Track consecutive 'good' gps reports, waiting for 10 of them */
-                       if (state == AltosLib.ao_flight_pad) {
+                       if (state == AltosLib.ao_flight_pad || state == AltosLib.ao_flight_stateless) {
                                set_npad(npad+1);
-                               if (pad_lat != AltosLib.MISSING) {
+                               if (pad_lat != AltosLib.MISSING && (npad < 10 || state == AltosLib.ao_flight_pad)) {
                                        pad_lat = (pad_lat * 31 + gps.lat) / 32;
                                        pad_lon = (pad_lon * 31 + gps.lon) / 32;
                                        gps_ground_altitude.set_filtered(gps.alt, time);
@@ -949,11 +949,24 @@ public class AltosState implements Cloneable {
                                  state <= AltosLib.ao_flight_coast);
                        boost = (AltosLib.ao_flight_boost == state);
                }
-
        }
 
        public void set_device_type(int device_type) {
                this.device_type = device_type;
+               switch (device_type) {
+               case AltosLib.product_telegps:
+                       this.state = AltosLib.ao_flight_stateless;
+                       break;
+               }
+       }
+
+       public void set_log_format(int log_format) {
+               this.log_format = log_format;
+               switch (log_format) {
+               case AltosLib.AO_LOG_FORMAT_TELEGPS:
+                       this.state = AltosLib.ao_flight_stateless;
+                       break;
+               }
        }
 
        public void set_flight_params(int apogee_delay, int main_deploy) {