diff options
Diffstat (limited to 'micropeak/MicroStats.java')
-rw-r--r-- | micropeak/MicroStats.java | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/micropeak/MicroStats.java b/micropeak/MicroStats.java new file mode 100644 index 00000000..90e9dd1f --- /dev/null +++ b/micropeak/MicroStats.java @@ -0,0 +1,167 @@ +/* + * 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 org.altusmetrum.micropeak; + +import java.io.*; +import org.altusmetrum.AltosLib.*; +import org.altusmetrum.altosuilib.*; + +public class MicroStats { + double coast_height; + double coast_time; + + double apogee_height; + double apogee_time; + + double landed_height; + double landed_time; + + double max_speed; + double max_accel; + + MicroData data; + + void find_landing() { + landed_height = 0; + + for (MicroDataPoint point : data.points()) { + landed_height = point.height; + landed_time = point.time; + } + + boolean above = false; + for (MicroDataPoint point : data.points()) { + if (point.height > landed_height + 10) { + above = true; + } else { + if (above && point.height < landed_height + 2) { + above = false; + landed_time = point.time; + } + } + } + } + + void find_apogee() { + apogee_height = data.apogee_height(); + double searched_apogee = 0; + apogee_time = 0; + + /* This just finds the apogee time -- we've recorded the + * peak altitude separately in eeprom, and that could + * have occurred after the eeprom was full. + */ + for (MicroDataPoint point : data.points()) { + if (point.height > searched_apogee) { + searched_apogee = point.height; + apogee_time = point.time; + } + } + } + + void find_coast() { + coast_height = 0; + coast_time = 0; + + for (MicroDataPoint point : data.points()) { + if (point.accel < -9.8) + break; + coast_time = point.time; + coast_height = point.height; + } + } + + void find_max_speed() { + max_speed = 0; + for (MicroDataPoint point : data.points()) { + if (point.time > apogee_time) + break; + if (point.speed > max_speed) + max_speed = point.speed; + } + } + + void find_max_accel() { + max_accel = 0; + for (MicroDataPoint point : data.points()) { + if (point.time > apogee_time) + break; + if (point.accel > max_accel) + max_accel = point.accel; + } + } + + double boost_duration() { + return coast_time; + } + + double boost_height() { + return coast_height; + } + + double boost_speed() { + return coast_height / coast_time; + } + + double boost_accel() { + return boost_speed() / boost_duration(); + } + + double coast_duration() { + return apogee_time - coast_time; + } + + double coast_height() { + return apogee_height - coast_height; + } + + double coast_speed() { + return coast_height() / coast_duration(); + } + + double coast_accel() { + return coast_speed() / coast_duration(); + } + + double descent_duration() { + return landed_time - apogee_time; + } + + double descent_height() { + return apogee_height - landed_height; + } + + double descent_speed() { + return descent_height() / descent_duration(); + } + + public MicroStats(MicroData data) { + + this.data = data; + + find_coast(); + find_apogee(); + find_landing(); + find_max_speed(); + find_max_accel(); + } + + public MicroStats() { + this(new MicroData()); + } +} |