diff options
Diffstat (limited to 'altosui/AltosFlightStats.java')
-rw-r--r-- | altosui/AltosFlightStats.java | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/altosui/AltosFlightStats.java b/altosui/AltosFlightStats.java new file mode 100644 index 00000000..e38142f0 --- /dev/null +++ b/altosui/AltosFlightStats.java @@ -0,0 +1,95 @@ +/* + * Copyright © 2011 Keith Packard <keithp@keithp.com> + * + * 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. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +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.*; + +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]; + + public AltosFlightStats(AltosFlightReader reader) throws InterruptedException, IOException { + 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; + } + 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; + max_speed = state.max_speed; + max_acceleration = state.max_acceleration; + } + } catch (ParseException pp) { + System.out.printf("Parse error: %d \"%s\"\n", pp.getErrorOffset(), pp.getMessage()); + } catch (AltosCRCException ce) { + + } + } + 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]; + } + } + } + + public AltosFlightStats(AltosRecordIterable iterable, String filename) throws InterruptedException, IOException { + this(new AltosReplayReader(iterable.iterator(), filename)); + } + + public AltosFlightStats(AltosRecordIterable iterable) throws InterruptedException, IOException { + this(iterable, ""); + } +} |