*/
/*
- * Track flight state from telemetry data stream
+ * Track flight state from telemetry or eeprom data stream
*/
package altosui;
-import altosui.AltosTelemetry;
+import altosui.AltosRecord;
import altosui.AltosGPS;
public class AltosState {
- AltosTelemetry data;
+ AltosRecord data;
/* derived data */
- double report_time;
+ long report_time;
double time_change;
int tick;
double pad_lat;
double pad_lon;
double pad_alt;
+
+ static final int MIN_PAD_SAMPLES = 10;
+
int npad;
- int prev_npad;
+ int gps_waiting;
+ boolean gps_ready;
AltosGreatCircle from_pad;
+ double elevation; /* from pad */
+ double range; /* total distance */
double gps_height;
int speak_tick;
double speak_altitude;
- static double
- aoview_time()
- {
- return System.currentTimeMillis() / 1000.0;
- }
- void init (AltosTelemetry cur, AltosState prev_state) {
+ void init (AltosRecord cur, AltosState prev_state) {
int i;
- AltosTelemetry prev;
- double accel_counts_per_mss;
+ AltosRecord prev;
data = cur;
- ground_altitude = AltosConvert.cc_barometer_to_altitude(data.ground_pres);
- height = AltosConvert.cc_barometer_to_altitude(data.flight_pres) - ground_altitude;
+ ground_altitude = data.ground_altitude();
+ height = data.altitude() - ground_altitude;
- report_time = aoview_time();
+ report_time = System.currentTimeMillis();
- accel_counts_per_mss = ((data.accel_minus_g - data.accel_plus_g) / 2.0) / 9.80665;
- acceleration = (data.ground_accel - data.flight_accel) / accel_counts_per_mss;
- speed = data.flight_vel / (accel_counts_per_mss * 100.0);
- temperature = AltosConvert.cc_thermometer_to_temperature(data.temp);
- drogue_sense = AltosConvert.cc_ignitor_to_voltage(data.drogue);
- main_sense = AltosConvert.cc_ignitor_to_voltage(data.main);
- battery = AltosConvert.cc_battery_to_voltage(data.batt);
+ acceleration = data.acceleration();
+ speed = data.accel_speed();
+ temperature = data.temperature();
+ drogue_sense = data.drogue_voltage();
+ main_sense = data.main_voltage();
+ battery = data.battery_voltage();
tick = data.tick;
- state = data.state();
+ state = data.state;
if (prev_state != null) {
pad_lat = prev_state.pad_lat;
pad_lon = prev_state.pad_lon;
pad_alt = prev_state.pad_alt;
+ max_height = prev_state.max_height;
+ max_acceleration = prev_state.max_acceleration;
+ max_speed = prev_state.max_speed;
/* make sure the clock is monotonic */
while (tick < prev_state.tick)
time_change = 0;
}
- if (state == AltosTelemetry.ao_flight_pad) {
- if (data.gps != null && data.gps.gps_locked && data.gps.nsat >= 4) {
+ if (state == Altos.ao_flight_pad) {
+ if (data.gps != null && data.gps.locked) {
npad++;
if (npad > 1) {
/* filter pad position */
pad_lon = data.gps.lon;
pad_alt = data.gps.alt;
}
+ } else {
+ npad = 0;
}
}
- ascent = (AltosTelemetry.ao_flight_boost <= state &&
- state <= AltosTelemetry.ao_flight_coast);
+
+ gps_waiting = MIN_PAD_SAMPLES - npad;
+ if (gps_waiting < 0)
+ gps_waiting = 0;
+
+ gps_ready = gps_waiting == 0;
+
+ ascent = (Altos.ao_flight_boost <= state &&
+ state <= Altos.ao_flight_coast);
/* Only look at accelerometer data on the way up */
if (ascent && acceleration > max_acceleration)
if (height > max_height)
max_height = height;
if (data.gps != null) {
- if (gps == null || !gps.gps_locked || data.gps.gps_locked)
+ if (gps == null || !gps.locked || data.gps.locked)
gps = data.gps;
- if (npad > 0 && gps.gps_locked)
+ if (npad > 0 && gps.locked) {
from_pad = new AltosGreatCircle(pad_lat, pad_lon, gps.lat, gps.lon);
+ }
}
+ elevation = 0;
+ range = -1;
if (npad > 0) {
gps_height = gps.alt - pad_alt;
+ if (from_pad != null) {
+ elevation = Math.atan2(height, from_pad.distance) * 180 / Math.PI;
+ range = Math.sqrt(height * height + from_pad.distance * from_pad.distance);
+ }
} else {
gps_height = 0;
}
}
- public AltosState(AltosTelemetry cur) {
+ public AltosState(AltosRecord cur) {
init(cur, null);
}
- public AltosState (AltosTelemetry cur, AltosState prev) {
+ public AltosState (AltosRecord cur, AltosState prev) {
init(cur, prev);
}
}