altos: Shrink ao_cmd_put16, ao_cmd_hex and ao_cmd
[fw/altos] / altosui / AltosRecord.java
index 1160a2736299743e81ae484d878570dadc79aa5a..144b1c3c5a1a94caa847ab4bf8b11655082e0677 100644 (file)
@@ -23,6 +23,17 @@ import java.util.HashMap;
 import java.io.*;
 
 public class AltosRecord {
+       final static int        MISSING = 0x7fffffff;
+
+       static final int        seen_flight = 1;
+       static final int        seen_sensor = 2;
+       static final int        seen_temp_volt = 4;
+       static final int        seen_deploy = 8;
+       static final int        seen_gps_time = 16;
+       static final int        seen_gps_lat = 32;
+       static final int        seen_gps_lon = 64;
+       int                     seen;
+
        int     version;
        String  callsign;
        int     serial;
@@ -31,23 +42,38 @@ public class AltosRecord {
        int     status;
        int     state;
        int     tick;
+
        int     accel;
        int     pres;
        int     temp;
        int     batt;
        int     drogue;
        int     main;
-       int     flight_accel;
+
        int     ground_accel;
-       int     flight_vel;
-       int     flight_pres;
        int     ground_pres;
        int     accel_plus_g;
        int     accel_minus_g;
+
+       double  acceleration;
+       double  speed;
+       double  height;
+
+       int     flight_accel;
+       int     flight_vel;
+       int     flight_pres;
+
        AltosGPS        gps;
 
        double  time;   /* seconds since boost */
 
+       int     device_type;
+       int     config_major;
+       int     config_minor;
+       int     apogee_delay;
+       int     main_deploy;
+       int     flight_log_max;
+       String  firmware_version;
        /*
         * Values for our MP3H6115A pressure sensor
         *
@@ -72,46 +98,82 @@ public class AltosRecord {
        }
 
        public double raw_pressure() {
+               if (pres == MISSING)
+                       return MISSING;
                return barometer_to_pressure(pres);
        }
 
        public double filtered_pressure() {
+               if (flight_pres == MISSING)
+                       return MISSING;
                return barometer_to_pressure(flight_pres);
        }
 
        public double ground_pressure() {
+               if (ground_pres == MISSING)
+                       return MISSING;
                return barometer_to_pressure(ground_pres);
        }
 
-       public double filtered_altitude() {
-               return AltosConvert.pressure_to_altitude(filtered_pressure());
-       }
-
        public double raw_altitude() {
-               return AltosConvert.pressure_to_altitude(raw_pressure());
+               double p = raw_pressure();
+               if (p == MISSING)
+                       return MISSING;
+               return AltosConvert.pressure_to_altitude(p);
        }
 
        public double ground_altitude() {
-               return AltosConvert.pressure_to_altitude(ground_pressure());
+               double p = ground_pressure();
+               if (p == MISSING)
+                       return MISSING;
+               return AltosConvert.pressure_to_altitude(p);
+       }
+
+       public double filtered_altitude() {
+               if (height != MISSING && ground_pres != MISSING)
+                       return height + ground_altitude();
+
+               double  p = filtered_pressure();
+               if (p == MISSING)
+                       return MISSING;
+               return AltosConvert.pressure_to_altitude(p);
        }
 
        public double filtered_height() {
-               return filtered_altitude() - ground_altitude();
+               if (height != MISSING)
+                       return height;
+
+               double f = filtered_altitude();
+               double g = ground_altitude();
+               if (f == MISSING || g == MISSING)
+                       return MISSING;
+               return f - g;
        }
 
        public double raw_height() {
-               return raw_altitude() - ground_altitude();
+               double r = raw_altitude();
+               double g = ground_altitude();
+
+               if (r == MISSING || g == MISSING)
+                       return height;
+               return r - g;
        }
 
        public double battery_voltage() {
+               if (batt == MISSING)
+                       return MISSING;
                return AltosConvert.cc_battery_to_voltage(batt);
        }
 
        public double main_voltage() {
+               if (main == MISSING)
+                       return MISSING;
                return AltosConvert.cc_ignitor_to_voltage(main);
        }
 
        public double drogue_voltage() {
+               if (drogue == MISSING)
+                       return MISSING;
                return AltosConvert.cc_ignitor_to_voltage(drogue);
        }
 
@@ -131,6 +193,8 @@ public class AltosRecord {
        }
 
        public double temperature() {
+               if (temp == MISSING)
+                       return MISSING;
                return thermometer_to_temperature(temp);
        }
 
@@ -139,13 +203,22 @@ public class AltosRecord {
 
                return counts_per_g / 9.80665;
        }
+
        public double acceleration() {
+               if (acceleration != MISSING)
+                       return acceleration;
+
+               if (ground_accel == MISSING || accel == MISSING)
+                       return MISSING;
                return (ground_accel - accel) / accel_counts_per_mss();
        }
 
        public double accel_speed() {
-               double speed = flight_vel / (accel_counts_per_mss() * 100.0);
-               return speed;
+               if (speed != MISSING)
+                       return speed;
+               if (flight_vel == MISSING)
+                       return MISSING;
+               return flight_vel / (accel_counts_per_mss() * 100.0);
        }
 
        public String state() {
@@ -169,6 +242,7 @@ public class AltosRecord {
 
        public AltosRecord(AltosRecord old) {
                version = old.version;
+               seen = old.seen;
                callsign = old.callsign;
                serial = old.serial;
                flight = old.flight;
@@ -189,11 +263,15 @@ public class AltosRecord {
                ground_pres = old.ground_pres;
                accel_plus_g = old.accel_plus_g;
                accel_minus_g = old.accel_minus_g;
+               acceleration = old.acceleration;
+               speed = old.speed;
+               height = old.height;
                gps = new AltosGPS(old.gps);
        }
 
        public AltosRecord() {
                version = 0;
+               seen = 0;
                callsign = "N0CALL";
                serial = 0;
                flight = 0;
@@ -201,12 +279,12 @@ public class AltosRecord {
                status = 0;
                state = Altos.ao_flight_startup;
                tick = 0;
-               accel = 0;
-               pres = 0;
-               temp = 0;
-               batt = 0;
-               drogue = 0;
-               main = 0;
+               accel = MISSING;
+               pres = MISSING;
+               temp = MISSING;
+               batt = MISSING;
+               drogue = MISSING;
+               main = MISSING;
                flight_accel = 0;
                ground_accel = 0;
                flight_vel = 0;
@@ -214,6 +292,9 @@ public class AltosRecord {
                ground_pres = 0;
                accel_plus_g = 0;
                accel_minus_g = 0;
+               acceleration = MISSING;
+               speed = MISSING;
+               height = MISSING;
                gps = new AltosGPS();
        }
 }