X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altosui%2FAltosFlightStats.java;h=552210c36adac61f13cc1c4c617903a208b9d8ba;hp=19471e9fa650847b8af2d5406e3036f8db19f4be;hb=1562affc4951e147eba20380ea5be2e9f7152789;hpb=4962bcf1ce15c21a946ea718bd676b901f0f2bd0 diff --git a/altosui/AltosFlightStats.java b/altosui/AltosFlightStats.java index 19471e9f..552210c3 100644 --- a/altosui/AltosFlightStats.java +++ b/altosui/AltosFlightStats.java @@ -17,82 +17,156 @@ package altosui; -import java.awt.*; -import java.awt.event.*; -import javax.swing.*; -import javax.swing.filechooser.FileNameExtensionFilter; -import javax.swing.table.*; import java.io.*; -import java.util.*; -import java.text.*; -import java.util.prefs.*; -import java.util.concurrent.*; +import org.altusmetrum.altoslib_2.*; public class AltosFlightStats { double max_height; double max_speed; double max_acceleration; double[] state_speed = new double[Altos.ao_flight_invalid + 1]; - double[] state_baro_speed = new double[Altos.ao_flight_invalid + 1]; double[] state_accel = new double[Altos.ao_flight_invalid + 1]; int[] state_count = new int[Altos.ao_flight_invalid + 1]; double[] state_start = new double[Altos.ao_flight_invalid + 1]; double[] state_end = new double[Altos.ao_flight_invalid + 1]; + int serial; + int flight; + int year, month, day; + int hour, minute, second; + double lat, lon; + double pad_lat, pad_lon; + boolean has_gps; + boolean has_other_adc; + boolean has_rssi; - public AltosFlightStats(AltosFlightReader reader) throws InterruptedException, IOException { + double landed_time(AltosStateIterable states) { + AltosState state = null; + + for (AltosState s : states) { + state = s; + if (state.state == Altos.ao_flight_landed) + break; + } + + if (state == null) + return 0; + + double landed_height = state.height(); + + state = null; + + boolean above = true; + + double landed_time = -1000; + + for (AltosState s : states) { + state = s; + + if (state.height() > landed_height + 10) { + above = true; + } else { + if (above && state.height() < landed_height + 2) { + above = false; + landed_time = state.time; + } + } + } + if (landed_time == -1000) + landed_time = state.time; + return landed_time; + } + + double boost_time(AltosStateIterable states) { + double boost_time = AltosLib.MISSING; AltosState state = null; - AltosState new_state = null; - double boost_time = -1; - double start_time; - - for (;;) { - try { - AltosRecord record = reader.read(); - if (record == null) - break; - new_state = new AltosState(record, state); - if (state == null) { - start_time = new_state.time; + + for (AltosState s : states) { + state = s; + if (state.acceleration() < 1) + boost_time = state.time; + if (state.state >= AltosLib.ao_flight_boost && state.state <= AltosLib.ao_flight_landed) + break; + } + if (state == null) + return 0; + + if (boost_time == AltosLib.MISSING) + boost_time = state.time; + return boost_time; + } + + + public AltosFlightStats(AltosStateIterable states) throws InterruptedException, IOException { + double boost_time = boost_time(states); + double end_time = 0; + double landed_time = landed_time(states); + + year = month = day = AltosLib.MISSING; + hour = minute = second = AltosLib.MISSING; + serial = flight = AltosLib.MISSING; + lat = lon = AltosLib.MISSING; + has_gps = false; + has_other_adc = false; + has_rssi = false; + for (AltosState state : states) { + if (serial == AltosLib.MISSING && state.serial != AltosLib.MISSING) + serial = state.serial; + if (flight == AltosLib.MISSING && state.flight != AltosLib.MISSING) + flight = state.flight; + if (state.battery_voltage != AltosLib.MISSING) + has_other_adc = true; + if (state.rssi != AltosLib.MISSING) + has_rssi = true; + end_time = state.time; + + int state_id = state.state; + if (state.time >= boost_time && state_id < Altos.ao_flight_boost) + state_id = Altos.ao_flight_boost; + if (state.time >= landed_time && state_id < Altos.ao_flight_landed) + state_id = Altos.ao_flight_landed; + if (state.gps != null && state.gps.locked) { + year = state.gps.year; + month = state.gps.month; + day = state.gps.day; + hour = state.gps.hour; + minute = state.gps.minute; + second = state.gps.second; + } + if (0 <= state_id && state_id < Altos.ao_flight_invalid) { + double acceleration = state.acceleration(); + double speed = state.speed(); + if (acceleration != AltosLib.MISSING && speed != AltosLib.MISSING) { + state_accel[state_id] += acceleration; + state_speed[state_id] += speed; + state_count[state_id]++; } - state = new_state; - if (0 <= state.state && state.state < Altos.ao_flight_invalid) { - if (boost_time == -1 && state.state >= Altos.ao_flight_boost) - boost_time = state.time; - state_accel[state.state] += state.acceleration; - state_speed[state.state] += state.speed; - state_baro_speed[state.state] += state.baro_speed; - state_count[state.state]++; - if (state_start[state.state] == 0.0) - state_start[state.state] = state.time; - if (state_end[state.state] < state.time) - state_end[state.state] = state.time; - max_height = state.max_height; - if (state.max_speed != 0) - max_speed = state.max_speed; - else - max_speed = state.max_baro_speed; - max_acceleration = state.max_acceleration; + if (state_start[state_id] == 0.0) + state_start[state_id] = state.time; + if (state_end[state_id] < state.time) + state_end[state_id] = state.time; + max_height = state.max_height(); + max_speed = state.max_speed(); + max_acceleration = state.max_acceleration(); + } + if (state.gps != null && state.gps.locked && state.gps.nsat >= 4) { + if (state_id <= Altos.ao_flight_pad) { + pad_lat = state.gps.lat; + pad_lon = state.gps.lon; } - } catch (ParseException pp) { - System.out.printf("Parse error: %d \"%s\"\n", pp.getErrorOffset(), pp.getMessage()); - } catch (AltosCRCException ce) { - + lat = state.gps.lat; + lon = state.gps.lon; + has_gps = true; } } for (int s = Altos.ao_flight_startup; s <= Altos.ao_flight_landed; s++) { if (state_count[s] > 0) { state_speed[s] /= state_count[s]; - state_baro_speed[s] /= state_count[s]; state_accel[s] /= state_count[s]; } + if (state_start[s] == 0) + state_start[s] = end_time; + if (state_end[s] == 0) + state_end[s] = end_time; } } - - public AltosFlightStats(AltosRecordIterable iterable, File file) throws InterruptedException, IOException { - this(new AltosReplayReader(iterable.iterator(), file)); - } - - public AltosFlightStats(AltosRecordIterable iterable) throws InterruptedException, IOException { - this(iterable, new File("")); - } }