X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=ao-tools%2Faltosui%2FAltosState.java;h=aacddfdf5ee3f80e66f13e6be85d8f1b11fe071a;hp=da465c75d8a8b01dc993502747ece147c793796f;hb=9cc48698ec14c34d437baad7b6540edc31e9741c;hpb=65079f84ea64220fa928c3ad96652fed159bf74b diff --git a/ao-tools/altosui/AltosState.java b/ao-tools/altosui/AltosState.java index da465c75..aacddfdf 100644 --- a/ao-tools/altosui/AltosState.java +++ b/ao-tools/altosui/AltosState.java @@ -26,12 +26,14 @@ import altosui.AltosGPS; public class AltosState { AltosTelemetry data; - AltosTelemetry prev_data; /* derived data */ double report_time; + double time_change; + int tick; + int state; boolean ascent; /* going up? */ @@ -50,15 +52,10 @@ public class AltosState { double max_speed; AltosGPS gps; - AltosGPSTracking gps_tracking; - boolean gps_valid; double pad_lat; double pad_lon; double pad_alt; - double pad_lat_total; - double pad_lon_total; - double pad_alt_total; int npad; int prev_npad; @@ -75,30 +72,18 @@ public class AltosState { return System.currentTimeMillis() / 1000.0; } - public AltosState (AltosTelemetry cur, AltosTelemetry prev, int prev_npad) { - int i; - double new_height; - double height_change; - double time_change; + void init (AltosTelemetry cur, AltosState prev_state) { + int i; + AltosTelemetry prev; double accel_counts_per_mss; - int tick_count; data = cur; - prev_data = prev; - npad = prev_npad; - tick_count = data.tick; - if (tick_count < prev_data.tick) - tick_count += 65536; - time_change = (tick_count - prev_data.tick) / 100.0; + + ground_altitude = AltosConvert.cc_barometer_to_altitude(data.ground_pres); + height = AltosConvert.cc_barometer_to_altitude(data.flight_pres) - ground_altitude; report_time = aoview_time(); - ground_altitude = AltosConvert.cc_pressure_to_altitude(data.ground_pres); - new_height = AltosConvert.cc_pressure_to_altitude(data.flight_pres) - ground_altitude; - height_change = new_height - height; - height = new_height; - if (time_change > 0) - baro_speed = (baro_speed * 3 + (height_change / time_change)) / 4.0; 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); @@ -106,17 +91,46 @@ public class AltosState { 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); + tick = data.tick; state = data.state(); + + if (prev_state != null) { + + /* Preserve any existing gps data */ + npad = prev_state.npad; + gps = prev_state.gps; + pad_lat = prev_state.pad_lat; + pad_lon = prev_state.pad_lon; + pad_alt = prev_state.pad_alt; + + /* make sure the clock is monotonic */ + while (tick < prev_state.tick) + tick += 65536; + + time_change = (tick - prev_state.tick) / 100.0; + + /* compute barometric speed */ + + double height_change = height - prev_state.height; + if (time_change > 0) + baro_speed = (prev_state.baro_speed * 3 + (height_change / time_change)) / 4.0; + else + baro_speed = prev_state.baro_speed; + } else { + npad = 0; + gps = null; + baro_speed = 0; + time_change = 0; + } + if (state == AltosTelemetry.ao_flight_pad) { - if (data.gps.gps_locked && data.gps.nsat >= 4) { + if (data.gps != null && data.gps.gps_locked && data.gps.nsat >= 4) { npad++; - pad_lat_total += data.gps.lat; - pad_lon_total += data.gps.lon; - pad_alt_total += data.gps.alt; if (npad > 1) { - pad_lat = (pad_lat * 31 + data.gps.lat) / 32.0; - pad_lon = (pad_lon * 31 + data.gps.lon) / 32.0; - pad_alt = (pad_alt * 31 + data.gps.alt) / 32.0; + /* filter pad position */ + pad_lat = (pad_lat * 31.0 + data.gps.lat) / 32.0; + pad_lon = (pad_lon * 31.0 + data.gps.lon) / 32.0; + pad_alt = (pad_alt * 31.0 + data.gps.alt) / 32.0; } else { pad_lat = data.gps.lat; pad_lon = data.gps.lon; @@ -135,12 +149,10 @@ public class AltosState { if (height > max_height) max_height = height; - gps.gps_locked = data.gps.gps_locked; - gps.gps_connected = data.gps.gps_connected; - if (data.gps.gps_locked) { - gps = data.gps; - gps_valid = true; - if (npad > 0) + if (data.gps != null) { + if (gps == null || !gps.gps_locked || data.gps.gps_locked) + gps = data.gps; + if (npad > 0 && gps.gps_locked) from_pad = new AltosGreatCircle(pad_lat, pad_lon, gps.lat, gps.lon); } if (npad > 0) { @@ -151,16 +163,10 @@ public class AltosState { } public AltosState(AltosTelemetry cur) { - this(cur, cur, 0); + init(cur, null); } public AltosState (AltosTelemetry cur, AltosState prev) { - this(cur, prev.data, prev.npad); - if (gps == null) { - gps = prev.gps; - gps_valid = prev.gps_valid; - } - if (gps_tracking == null) - gps_tracking = prev.gps_tracking; + init(cur, prev); } }