altoslib: Ignore extra AO_LOG_FLIGHT records from TeleGPS
[fw/altos] / altoslib / AltosState.java
index 2d75f72e676881b45cbc63b9ec9e13dfb90308b4..5fce15c43865e63b43447db93f59faf725f838f7 100644 (file)
@@ -19,7 +19,7 @@
  * Track flight state from telemetry or eeprom data stream
  */
 
-package org.altusmetrum.altoslib_4;
+package org.altusmetrum.altoslib_5;
 
 public class AltosState implements Cloneable {
 
@@ -271,6 +271,7 @@ public class AltosState implements Cloneable {
        public int      state;
        public int      flight;
        public int      serial;
+       public int      altitude_32;
        public int      receiver_serial;
        public boolean  landed;
        public boolean  ascent; /* going up? */
@@ -392,6 +393,7 @@ public class AltosState implements Cloneable {
        private AltosValue              gps_ground_speed;
        private AltosValue              gps_ascent_rate;
        private AltosValue              gps_course;
+       private AltosValue              gps_speed;
 
        public double altitude() {
                double a = altitude.value();
@@ -427,14 +429,30 @@ public class AltosState implements Cloneable {
                return gps_ground_speed.value();
        }
 
+       public double max_gps_ground_speed() {
+               return gps_ground_speed.max();
+       }
+
        public double gps_ascent_rate() {
                return gps_ascent_rate.value();
        }
 
+       public double max_gps_ascent_rate() {
+               return gps_ascent_rate.max();
+       }
+
        public double gps_course() {
                return gps_course.value();
        }
 
+       public double gps_speed() {
+               return gps_speed.value();
+       }
+
+       public double max_gps_speed() {
+               return gps_speed.max();
+       }
+
        class AltosPressure extends AltosValue {
                void set(double p, double time) {
                        super.set(p, time);
@@ -455,11 +473,7 @@ public class AltosState implements Cloneable {
                pressure.set(p, time);
        }
 
-       public double height() {
-               double k = kalman_height.value();
-               if (k != AltosLib.MISSING)
-                       return k;
-
+       public double baro_height() {
                double a = altitude();
                double g = ground_altitude();
                if (a != AltosLib.MISSING && g != AltosLib.MISSING)
@@ -467,6 +481,18 @@ public class AltosState implements Cloneable {
                return AltosLib.MISSING;
        }
 
+       public double height() {
+               double k = kalman_height.value();
+               if (k != AltosLib.MISSING)
+                       return k;
+
+               double b = baro_height();
+               if (b != AltosLib.MISSING)
+                       return b;
+
+               return gps_height();
+       }
+
        public double max_height() {
                double  k = kalman_height.max();
                if (k != AltosLib.MISSING)
@@ -476,7 +502,7 @@ public class AltosState implements Cloneable {
                double g = ground_altitude();
                if (a != AltosLib.MISSING && g != AltosLib.MISSING)
                        return a - g;
-               return AltosLib.MISSING;
+               return max_gps_height();
        }
 
        public double gps_height() {
@@ -529,14 +555,26 @@ public class AltosState implements Cloneable {
                double v = kalman_speed.value();
                if (v != AltosLib.MISSING)
                        return v;
-               return speed.value();
+               v = speed.value();
+               if (v != AltosLib.MISSING)
+                       return v;
+               v = gps_speed();
+               if (v != AltosLib.MISSING)
+                       return v;
+               return AltosLib.MISSING;
        }
 
        public double max_speed() {
                double v = kalman_speed.max();
                if (v != AltosLib.MISSING)
                        return v;
-               return speed.max();
+               v = speed.max();
+               if (v != AltosLib.MISSING)
+                       return v;
+               v = max_gps_speed();
+               if (v != AltosLib.MISSING)
+                       return v;
+               return AltosLib.MISSING;
        }
 
        class AltosAccel extends AltosCValue {
@@ -712,6 +750,7 @@ public class AltosState implements Cloneable {
                gps_altitude = new AltosGpsAltitude();
                gps_ground_altitude = new AltosGpsGroundAltitude();
                gps_ground_speed = new AltosValue();
+               gps_speed = new AltosValue();
                gps_ascent_rate = new AltosValue();
                gps_course = new AltosValue();
 
@@ -719,6 +758,7 @@ public class AltosState implements Cloneable {
                speak_altitude = AltosLib.MISSING;
 
                callsign = null;
+               firmware_version = null;
 
                accel_plus_g = AltosLib.MISSING;
                accel_minus_g = AltosLib.MISSING;
@@ -731,6 +771,7 @@ public class AltosState implements Cloneable {
                product = null;
                serial = AltosLib.MISSING;
                receiver_serial = AltosLib.MISSING;
+               altitude_32 = AltosLib.MISSING;
 
                baro = null;
                companion = null;
@@ -846,6 +887,7 @@ public class AltosState implements Cloneable {
                gps_ground_speed.copy(old.gps_ground_speed);
                gps_ascent_rate.copy(old.gps_ascent_rate);
                gps_course.copy(old.gps_course);
+               gps_speed.copy(old.gps_speed);
 
                pad_lat = old.pad_lat;
                pad_lon = old.pad_lon;
@@ -855,6 +897,7 @@ public class AltosState implements Cloneable {
                speak_altitude = old.speak_altitude;
 
                callsign = old.callsign;
+               firmware_version = old.firmware_version;
 
                accel_plus_g = old.accel_plus_g;
                accel_minus_g = old.accel_minus_g;
@@ -866,6 +909,7 @@ public class AltosState implements Cloneable {
                product = old.product;
                serial = old.serial;
                receiver_serial = old.receiver_serial;
+               altitude_32 = old.altitude_32;
 
                baro = old.baro;
                companion = old.companion;
@@ -877,8 +921,8 @@ public class AltosState implements Cloneable {
        }
 
        void update_gps() {
-               elevation = 0;
-               range = -1;
+               elevation = AltosLib.MISSING;
+               range = AltosLib.MISSING;
 
                if (gps == null)
                        return;
@@ -903,6 +947,9 @@ public class AltosState implements Cloneable {
                                gps_ascent_rate.set(gps.climb_rate, time);
                        if (gps.ground_speed != AltosLib.MISSING)
                                gps_ground_speed.set(gps.ground_speed, time);
+                       if (gps.climb_rate != AltosLib.MISSING && gps.ground_speed != AltosLib.MISSING)
+                               gps_speed.set(Math.sqrt(gps.ground_speed * gps.ground_speed +
+                                                       gps.climb_rate * gps.climb_rate), time);
                        if (gps.course != AltosLib.MISSING)
                                gps_course.set(gps.course, time);
                }
@@ -988,15 +1035,27 @@ public class AltosState implements Cloneable {
                firmware_version = version;
        }
 
+       public int compare_version(String other_version) {
+               if (firmware_version == null)
+                       return AltosLib.MISSING;
+               return AltosLib.compare_version(firmware_version, other_version);
+       }
+
+       private void re_init() {
+               int bt = boost_tick;
+               int rs = receiver_serial;
+               init();
+               boost_tick = bt;
+               receiver_serial = rs;
+       }
+
        public void set_flight(int flight) {
 
                /* When the flight changes, reset the state */
-               if (flight != AltosLib.MISSING && flight != 0) {
+               if (flight != AltosLib.MISSING) {
                        if (this.flight != AltosLib.MISSING &&
                            this.flight != flight) {
-                               int bt = boost_tick;
-                               init();
-                               boost_tick = bt;
+                               re_init();
                        }
                        this.flight = flight;
                }
@@ -1007,9 +1066,7 @@ public class AltosState implements Cloneable {
                if (serial != AltosLib.MISSING) {
                        if (this.serial != AltosLib.MISSING &&
                            this.serial != serial) {
-                               int bt = boost_tick;
-                               init();
-                               boost_tick = bt;
+                               re_init();
                        }
                        this.serial = serial;
                }
@@ -1020,6 +1077,15 @@ public class AltosState implements Cloneable {
                        receiver_serial = serial;
        }
 
+       public boolean altitude_32() {
+               return altitude_32 == 1;
+       }
+
+       public void set_altitude_32(int altitude_32) {
+               if (altitude_32 != AltosLib.MISSING)
+                       this.altitude_32 = altitude_32;
+       }
+
        public int rssi() {
                if (rssi == AltosLib.MISSING)
                        return 0;