- 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;
-
- 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);
- 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);
- state = data.state();
- if (state == AltosTelemetry.ao_flight_pad) {
- if (data.gps.gps_locked && data.gps.nsat >= 4) {
+
+ ground_altitude = data.ground_altitude();
+ height = data.altitude() - ground_altitude;
+
+ report_time = System.currentTimeMillis();
+
+ 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;
+
+ 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;
+ 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)
+ 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 == Altos.ao_flight_pad) {
+ if (data.gps != null && data.gps.locked) {