X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=altoslib%2FAltosState.java;h=2fc13b446882c56511450a92da9ee530f30b4e00;hb=0d044af0c5025a63026d05adcab68f265f179668;hp=2d75f72e676881b45cbc63b9ec9e13dfb90308b4;hpb=ff13cf1359e1f4ae33b16a5867fd364993566b65;p=fw%2Faltos diff --git a/altoslib/AltosState.java b/altoslib/AltosState.java index 2d75f72e..2fc13b44 100644 --- a/altoslib/AltosState.java +++ b/altoslib/AltosState.java @@ -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 { @@ -392,6 +392,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 +428,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); @@ -464,7 +481,7 @@ public class AltosState implements Cloneable { double g = ground_altitude(); if (a != AltosLib.MISSING && g != AltosLib.MISSING) return a - g; - return AltosLib.MISSING; + return gps_height(); } public double max_height() { @@ -476,7 +493,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 +546,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 +741,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 +749,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; @@ -846,6 +877,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 +887,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; @@ -877,8 +910,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 +936,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 +1024,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 +1055,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; }