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>
+ return AltosLib.MISSING;
double landed_height = state.height();
double landed_height = state.height();
- double landed_time = -1000;
+ double landed_time = AltosLib.MISSING;
for (AltosState s : states) {
state = s;
for (AltosState s : states) {
state = s;
if (state.height() > landed_height + 10) {
above = true;
} else {
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;
}
}
}
above = false;
landed_time = state.time;
}
}
}
- if (landed_time == -1000)
- landed_time = state.time;
break;
}
if (state == null)
break;
}
if (state == null)
+ return AltosLib.MISSING;
- if (boost_time == AltosLib.MISSING)
- boost_time = state.time;
has_imu = false;
has_mag = false;
has_orient = false;
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;
for (AltosState state : states) {
if (serial == AltosLib.MISSING && state.serial != AltosLib.MISSING)
serial = state.serial;
has_flight_data = true;
int state_id = state.state();
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;
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;
state_id = AltosLib.ao_flight_landed;
if (state.gps != null && state.gps.locked) {
year = state.gps.year;
month = state.gps.month;
if (state.gps != null && state.gps.locked) {
year = state.gps.year;
month = state.gps.month;
}
new FlightStat(layout, y++, "Maximum speed",
String.format("%5.0f m/s", stats.max_speed),
}
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)));
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)));
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])));
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]),
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]),