X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altoslib%2FAltosFlightStats.java;h=2948ad380e05801a741dae247b245250dfb25a99;hp=1b88cb9fc7e56e7b8b2abf7ae308571837c862ad;hb=2e82051a6aaaccf1e8a242f9c8141e4167e652d2;hpb=c8078d352a7f54a4a97d25af080155d3f875536a diff --git a/altoslib/AltosFlightStats.java b/altoslib/AltosFlightStats.java index 1b88cb9f..2948ad38 100644 --- a/altoslib/AltosFlightStats.java +++ b/altoslib/AltosFlightStats.java @@ -3,7 +3,8 @@ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of @@ -15,7 +16,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_5; +package org.altusmetrum.altoslib_11; import java.io.*; @@ -37,75 +38,82 @@ public class AltosFlightStats { public double pad_lat, pad_lon; public boolean has_flight_data; public boolean has_gps; + public boolean has_gps_sats; + public boolean has_gps_detail; public boolean has_flight_adc; public boolean has_battery; public boolean has_rssi; public boolean has_imu; public boolean has_mag; public boolean has_orient; - public int num_ignitor; + public int num_igniter; - double landed_time(AltosStateIterable states) { - AltosState state = null; + double landed_time(AltosFlightSeries series) { + double landed_state_time = AltosLib.MISSING; - for (AltosState s : states) { - state = s; - if (state.state == AltosLib.ao_flight_landed) + for (AltosTimeValue state : series.state_series) { + if (state.value == AltosLib.ao_flight_landed) { + landed_state_time = state.time; break; + } } - if (state == null) - return 0; + if (landed_state_time == AltosLib.MISSING) + return AltosLib.MISSING; - double landed_height = state.height(); + double landed_height = AltosLib.MISSING; + for (AltosTimeValue height : series.height_series) { + if (height.time >= landed_state_time) { + landed_height = height.value; + break; + } + } - state = null; + if (landed_height == AltosLib.MISSING) + return AltosLib.MISSING; boolean above = true; - double landed_time = -1000; - - for (AltosState s : states) { - state = s; + double landed_time = AltosLib.MISSING; - if (state.height() > landed_height + 10) { + for (AltosTimeValue height : series.height_series) { + if (height.value > landed_height + 10) { above = true; } else { - if (above && state.height() < landed_height + 2) { + if (above && Math.abs(height.value - landed_height) < 2) { above = false; - landed_time = state.time; + landed_time = height.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; + double boost_time(AltosFlightSeries series) { + double boost_time = AltosLib.MISSING; + double boost_state_time = AltosLib.MISSING; - 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) + for (AltosTimeValue state : series.state_series) { + if (state.value >= AltosLib.ao_flight_boost && state.value <= AltosLib.ao_flight_landed) { + boost_state_time = state.time; + break; + } + } + for (AltosTimeValue accel : series.accel_series) { + if (accel.value < 1) + boost_time = accel.time; + if (boost_state_time != AltosLib.MISSING && accel.time >= boost_state_time) 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); + public AltosFlightStats(AltosFlightSeries series) throws InterruptedException, IOException { + AltosCalData cal_data = series.cal_data; + double boost_time = boost_time(series); double end_time = 0; - double landed_time = landed_time(states); + double landed_time = landed_time(series); year = month = day = AltosLib.MISSING; hour = minute = second = AltosLib.MISSING; @@ -113,89 +121,81 @@ public class AltosFlightStats { lat = lon = AltosLib.MISSING; has_flight_data = false; has_gps = false; + has_gps_sats = false; has_flight_adc = false; has_battery = false; has_rssi = false; has_imu = false; has_mag = false; has_orient = 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_battery = true; - if (state.main_voltage != AltosLib.MISSING) - has_flight_adc = true; - if (state.rssi != AltosLib.MISSING) - has_rssi = true; - end_time = state.time; - - if (state.pressure() != AltosLib.MISSING) - has_flight_data = true; - - int state_id = state.state; - if (state.time >= boost_time && state_id < AltosLib.ao_flight_boost) - state_id = AltosLib.ao_flight_boost; - if (state.time >= landed_time && 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; - day = state.gps.day; - hour = state.gps.hour; - minute = state.gps.minute; - second = state.gps.second; - } - max_height = state.max_height(); - max_speed = state.max_speed(); - max_acceleration = state.max_acceleration(); - max_gps_height = state.max_gps_height(); - - if (0 <= state_id && state_id < AltosLib.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]++; + + for (int s = AltosLib.ao_flight_startup; s <= AltosLib.ao_flight_landed; s++) { + state_count[s] = 0; + + if (s == AltosLib.ao_flight_boost) + state_start[s] = boost_time; + else + state_start[s] = series.state_series.time_of(s); + if (s == AltosLib.ao_flight_landed) + state_end[s] = landed_time; + else + state_end[s] = series.state_series.time_of(s+1); + + if (series.speed_series != null) + state_speed[s] = series.speed_series.average(state_start[s], state_end[s]); + + if (series.accel_series != null) + state_accel[s] = series.accel_series.average(state_start[s], state_end[s]); + } + + serial = cal_data.serial; + flight = cal_data.flight; + + has_battery = series.battery_voltage_series != null; + has_flight_adc = series.main_voltage_series != null; + has_rssi = series.rssi_series != null; + has_flight_data = series.pressure_series != null; + + AltosGPS gps = series.cal_data.gps_pad; + + if (gps != null) { + year = gps.year; + month = gps.month; + day = gps.day; + hour = gps.hour; + minute = gps.minute; + second = gps.second; + has_gps = true; + lat = pad_lat = gps.lat; + lon = pad_lon = gps.lon; + for (AltosGPSTimeValue gtv : series.gps_series) { + gps = gtv.gps; + if (gps.locked && gps.nsat >= 4) { + lat = gps.lat; + lon = gps.lon; } - 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; - } - if (state.pad_lat != AltosLib.MISSING) { - pad_lat = state.pad_lat; - pad_lon = state.pad_lon; } - if (state.gps != null && state.gps.locked && state.gps.nsat >= 4) { - lat = state.gps.lat; - lon = state.gps.lon; - has_gps = true; - } - if (state.imu != null) - has_imu = true; - if (state.mag != null) - has_mag = true; - if (state.orient() != AltosLib.MISSING) - has_orient = true; - if (state.ignitor_voltage != null && state.ignitor_voltage.length > num_ignitor) - num_ignitor = state.ignitor_voltage.length; + } - for (int s = AltosLib.ao_flight_startup; s <= AltosLib.ao_flight_landed; s++) { - if (state_count[s] > 0) { - state_speed[s] /= state_count[s]; - state_accel[s] /= state_count[s]; - } else { - state_speed[s] = AltosLib.MISSING; - state_accel[s] = AltosLib.MISSING; - } - if (state_start[s] == 0) - state_start[s] = end_time; - if (state_end[s] == 0) - state_end[s] = end_time; + + max_height = AltosLib.MISSING; + if (series.height_series != null) + max_height = series.height_series.max(); + max_speed = AltosLib.MISSING; + if (series.speed_series != null) { + max_speed = series.speed_series.max(state_start[AltosLib.ao_flight_boost], state_start[AltosLib.ao_flight_drogue]); + if (max_speed == AltosLib.MISSING) + max_speed = series.speed_series.max(); } + max_acceleration = AltosLib.MISSING; + if (series.accel_series != null) { + max_acceleration = series.accel_series.max(state_start[AltosLib.ao_flight_boost], state_start[AltosLib.ao_flight_drogue]); + if (max_acceleration == AltosLib.MISSING) + max_acceleration = series.accel_series.max(); + } + max_gps_height = AltosLib.MISSING; + if (series.gps_height != null) + max_gps_height = series.gps_height.max(); + } }