altoslib: Correct stats for flights without a real landing
authorKeith Packard <keithp@keithp.com>
Sun, 1 May 2016 01:33:25 +0000 (18:33 -0700)
committerKeith Packard <keithp@keithp.com>
Sun, 1 May 2016 01:33:25 +0000 (18:33 -0700)
The landing time was miscomputed when the flight ended without
entering the landed state, as when the recording terminates at
apogee.

This led to an uncomputed average boost accel, so that is now checked
separately from max accel (which is done over the whole flight, not
just boost).

Signed-off-by: Keith Packard <keithp@keithp.com>
altoslib/AltosFlightStats.java
altosuilib/AltosFlightStatsTable.java

index acac5c85ecec8c0ce798f095629fd4e38b68de98..1c7d67e0719d3d7c3a7df5b091423da1b81ceace 100644 (file)
@@ -57,7 +57,7 @@ public class AltosFlightStats {
                }
 
                if (state == null)
-                       return 0;
+                       return AltosLib.MISSING;
 
                double  landed_height = state.height();
 
@@ -65,7 +65,7 @@ public class AltosFlightStats {
 
                boolean above = true;
 
-               double  landed_time = -1000;
+               double  landed_time = AltosLib.MISSING;
 
                for (AltosState s : states) {
                        state = s;
@@ -73,14 +73,12 @@ public class AltosFlightStats {
                        if (state.height() > landed_height + 10) {
                                above = true;
                        } else {
-                               if (above && state.height() < landed_height + 2) {
+                               if (above && Math.abs(state.height() - landed_height) < 2) {
                                        above = false;
                                        landed_time = state.time;
                                }
                        }
                }
-               if (landed_time == -1000)
-                       landed_time = state.time;
                return landed_time;
        }
 
@@ -96,10 +94,8 @@ public class AltosFlightStats {
                                break;
                }
                if (state == null)
-                       return 0;
+                       return AltosLib.MISSING;
 
-               if (boost_time == AltosLib.MISSING)
-                       boost_time = state.time;
                return boost_time;
        }
 
@@ -122,6 +118,13 @@ public class AltosFlightStats {
                has_imu = false;
                has_mag = false;
                has_orient = false;
+
+               for (int s = AltosLib.ao_flight_startup; s <= AltosLib.ao_flight_landed; s++) {
+                       state_count[s] = 0;
+                       state_speed[s] = 0.0;
+                       state_accel[s] = 0.0;
+               }
+
                for (AltosState state : states) {
                        if (serial == AltosLib.MISSING && state.serial != AltosLib.MISSING)
                                serial = state.serial;
@@ -139,10 +142,13 @@ public class AltosFlightStats {
                                has_flight_data = true;
 
                        int state_id = state.state();
-                       if (state.time >= boost_time && state_id < AltosLib.ao_flight_boost)
+                       if (boost_time != AltosLib.MISSING && state.time >= boost_time && state_id < AltosLib.ao_flight_boost) {
                                state_id = AltosLib.ao_flight_boost;
-                       if (state.time >= landed_time && state_id < AltosLib.ao_flight_landed)
+                       }
+                       if (landed_time != AltosLib.MISSING && state.time >= landed_time && state_id < AltosLib.ao_flight_landed) {
                                state_id = AltosLib.ao_flight_landed;
+                       }
+
                        if (state.gps != null && state.gps.locked) {
                                year = state.gps.year;
                                month = state.gps.month;
index 2fb8a1aec5551c040bef1fad91e60a448c781c85..6171f61ac5d3c4ae1b8d8d518146cdc3ff50a85f 100644 (file)
@@ -117,18 +117,18 @@ public class AltosFlightStatsTable extends JComponent implements AltosFontListen
                }
                new FlightStat(layout, y++, "Maximum speed",
                               String.format("%5.0f m/s", stats.max_speed),
-                              String.format("%5.0f mph", AltosConvert.meters_to_mph(stats.max_speed)),
+                              String.format("%5.0f fps", AltosConvert.mps_to_fps(stats.max_speed)),
                               String.format("Mach %4.1f", AltosConvert.meters_to_mach(stats.max_speed)));
-               if (stats.max_acceleration != AltosLib.MISSING) {
+               if (stats.max_acceleration != AltosLib.MISSING)
                        new FlightStat(layout, y++, "Maximum boost acceleration",
                                       String.format("%5.0f m/s²", stats.max_acceleration),
                                       String.format("%5.0f ft/s²", AltosConvert.meters_to_feet(stats.max_acceleration)),
                                       String.format("%5.0f G", AltosConvert.meters_to_g(stats.max_acceleration)));
+               if (stats.state_accel[AltosLib.ao_flight_boost] != AltosLib.MISSING)
                        new FlightStat(layout, y++, "Average boost acceleration",
                                       String.format("%5.0f m/s²", stats.state_accel[AltosLib.ao_flight_boost]),
                                       String.format("%5.0f ft/s²", AltosConvert.meters_to_feet(stats.state_accel[AltosLib.ao_flight_boost])),
                                       String.format("%5.0f G", AltosConvert.meters_to_g(stats.state_accel[AltosLib.ao_flight_boost])));
-               }
                if (stats.state_speed[AltosLib.ao_flight_drogue] != AltosLib.MISSING)
                        new FlightStat(layout, y++, "Drogue descent rate",
                                       String.format("%5.0f m/s", stats.state_speed[AltosLib.ao_flight_drogue]),