altoslib: Add new 'stateless' flight state for TeleGPS
[fw/altos] / altoslib / AltosState.java
index 1162e5221be70636fc7faa7d2d8373b4b0c3a21c..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) {
@@ -713,6 +713,7 @@ public class AltosState implements Cloneable {
                gps_ground_altitude = new AltosGpsGroundAltitude();
                gps_ground_speed = new AltosValue();
                gps_ascent_rate = new AltosValue();
+               gps_course = new AltosValue();
 
                speak_tick = AltosLib.MISSING;
                speak_altitude = AltosLib.MISSING;
@@ -842,6 +843,9 @@ public class AltosState implements Cloneable {
 
                gps_altitude.copy(old.gps_altitude);
                gps_ground_altitude.copy(old.gps_ground_altitude);
+               gps_ground_speed.copy(old.gps_ground_speed);
+               gps_ascent_rate.copy(old.gps_ascent_rate);
+               gps_course.copy(old.gps_course);
 
                pad_lat = old.pad_lat;
                pad_lon = old.pad_lon;
@@ -881,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);
@@ -945,18 +949,34 @@ 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_config(int major, int minor, int apogee_delay, int main_deploy, int flight_log_max) {
-               config_major = major;
-               config_minor = minor;
+       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) {
                this.apogee_delay = apogee_delay;
                this.main_deploy = main_deploy;
+       }
+
+       public void set_config(int major, int minor, int flight_log_max) {
+               config_major = major;
+               config_minor = minor;
                this.flight_log_max = flight_log_max;
        }