X-Git-Url: https://git.gag.com/?a=blobdiff_plain;ds=sidebyside;f=altoslib%2FAltosFlightSeries.java;h=b7434a5c4d92a313704a598f7c926593c2649e97;hb=f26cfe417c6977cf1e7e75a4f050e25f64d41859;hp=0e260fb4bb63063a9aa7c4dca58c7b83cddf0c24;hpb=e8794ab1d512418e312a1a779777119e20dc8c38;p=fw%2Faltos diff --git a/altoslib/AltosFlightSeries.java b/altoslib/AltosFlightSeries.java index 0e260fb4..b7434a5c 100644 --- a/altoslib/AltosFlightSeries.java +++ b/altoslib/AltosFlightSeries.java @@ -16,124 +16,261 @@ package org.altusmetrum.altoslib_11; import java.util.*; -public class AltosFlightSeries extends AltosFlightListener { +public class AltosFlightSeries extends AltosDataListener { - int flight; + public ArrayList series; - int tick; - int boost_tick; + public int[] indices() { + int[] indices = new int[series.size()]; + for (int i = 0; i < indices.length; i++) + indices[i] = 0; + return indices; + } - AltosGPS temp_gps; - int temp_gps_sat_tick; + private double time(int id, int index) { + AltosTimeSeries s = series.get(id); + if (index < s.values.size()) + return s.values.get(index).time; + return Double.POSITIVE_INFINITY; + } - AltosMs5607 ms5607; + public boolean step_indices(int[] indices) { + double min_next = time(0, indices[0]+1); - public ArrayList series; + for (int i = 1; i < indices.length; i++) { + double next = time(i, indices[i]+1); + if (next < min_next) + min_next = next; + } - /* AltosEepromRecord */ - public void set_boost_tick(int boost_tick) { - if (boost_tick != AltosLib.MISSING) - this.boost_tick = boost_tick; - } + if (min_next == Double.POSITIVE_INFINITY) + return false; - public void set_tick(int tick) { - if (tick != AltosLib.MISSING) - this.tick = tick; + for (int i = 0; i < indices.length; i++) { + double t = time(i, indices[i] + 1); + + if (t <= min_next) + indices[i]++; + } + return true; } - public double time() { - if (tick == AltosLib.MISSING) - return AltosLib.MISSING; - return tick / 100.0; + public double time(int[] indices) { + double max = time(0, indices[0]); + + for (int i = 1; i < indices.length; i++) { + double t = time(i, indices[i]); + if (t >= max) + max = t; + } + return max; } - public double boost_time() { - if (boost_tick == AltosLib.MISSING) - return AltosLib.MISSING; - return boost_tick / 100.0; + public double value(String name, int[] indices) { + for (int i = 0; i < indices.length; i++) { + AltosTimeSeries s = series.get(i); + if (s.label.equals(name)) + return s.values.get(indices[i]).value; + } + return AltosLib.MISSING; } public AltosTimeSeries make_series(String label, AltosUnits units) { return new AltosTimeSeries(label, units); } + public void add_series(AltosTimeSeries s) { + series.add(s); + } + public AltosTimeSeries add_series(String label, AltosUnits units) { - System.out.printf("add series %s\n", label); AltosTimeSeries s = make_series(label, units); - series.add(s); + add_series(s); return s; } - /* AltosEepromRecordFull */ + public void remove_series(AltosTimeSeries s) { + series.remove(s); + } + + public boolean has_series(String label) { + for (AltosTimeSeries s : series) + if (s.label.equals(label)) + return true; + return false; + } AltosTimeSeries state_series; public static final String state_name = "State"; public void set_state(int state) { + this.state = state; if (state_series == null) - state_series = add_series(state_name, null); + state_series = add_series(state_name, AltosConvert.state_name); + else if ((int) state_series.get(state_series.size()-1).value == state) + return; state_series.add(time(), state); } - public void set_flight(int flight) { - if (flight != AltosLib.MISSING) - this.flight = flight; - } - public int flight() { - return flight; - } - AltosTimeSeries accel_series; - double accel_plus_g, accel_minus_g; - public static final String accel_name = "Accel"; - public void set_accel(double accel) { - if (accel_series == null) + public void set_acceleration(double acceleration) { + if (accel_series == null) { + System.out.printf("set acceleration %g\n", acceleration); accel_series = add_series(accel_name, AltosConvert.accel); - double counts_per_g = (accel_minus_g - accel_plus_g) / 2.0; - double counts_per_mss = counts_per_g / 9.80665; - double mss = (accel_plus_g - accel) / counts_per_mss; - - accel_series.add(time(), mss); + } + accel_series.add(time(), acceleration); } + private void compute_accel() { + if (accel_series != null) + return; - public void set_accel_g(double accel_plus_g, double accel_minus_g) { - this.accel_plus_g = accel_plus_g; - this.accel_minus_g = accel_minus_g; + if (speed_series != null) { + AltosTimeSeries temp_series = make_series(accel_name, AltosConvert.accel); + speed_series.differentiate(temp_series); + accel_series = add_series(accel_name, AltosConvert.accel); + temp_series.filter(accel_series, 0.25); + } } - public void set_config_data(AltosConfigData config_data) { -// if (config_data.callsign != null) -// set_callsign(config_data.callsign); - if (config_data.accel_cal_plus != AltosLib.MISSING && - config_data.accel_cal_minus != AltosLib.MISSING) - set_accel_g(config_data.accel_cal_plus, config_data.accel_cal_minus); -// if (config_data.product != null) -// set_product(config_data.product); -// if (config_data.log_format != AltosLib.MISSING) -// set_log_format(config_data.log_format); -// if (config_data.serial != AltosLib.MISSING) -// set_serial(config_data.serial); - AltosMs5607 ms5607 = new AltosMs5607(config_data); - if (ms5607.valid_config()) - this.ms5607 = ms5607; + public void set_received_time(long received_time) { } - public void set_ground_accel(double ground_accel) { + AltosTimeSeries rssi_series; + + public static final String rssi_name = "RSSI"; + + AltosTimeSeries status_series; + + public static final String status_name = "Status"; + + public void set_rssi(int rssi, int status) { + if (rssi_series == null) + rssi_series = add_series(rssi_name, null); + rssi_series.add(time(), rssi); + if (status_series == null) + status_series = add_series(status_name, null); + status_series.add(time(), status); } AltosTimeSeries pressure_series; public static final String pressure_name = "Pressure"; + AltosTimeSeries altitude_series; + + public static final String altitude_name = "Altitude"; + + AltosTimeSeries height_series; + + public static final String height_name = "Height"; + public void set_pressure(double pa) { if (pressure_series == null) pressure_series = add_series(pressure_name, AltosConvert.pressure); pressure_series.add(time(), pa); + if (altitude_series == null) + altitude_series = add_series(altitude_name, AltosConvert.height); + + double altitude = AltosConvert.pressure_to_altitude(pa); + altitude_series.add(time(), altitude); + } + + private void compute_height(double ground_altitude) { + if (height_series == null) { + height_series = add_series(height_name, AltosConvert.height); + for (AltosTimeValue alt : altitude_series) + height_series.add(alt.time, alt.value - ground_altitude); + } + } + + AltosTimeSeries speed_series; + + public static final String speed_name = "Speed"; + + private void compute_speed() { + if (speed_series != null) { + System.out.printf("speed series already made\n"); + return; + } + + AltosTimeSeries alt_speed_series = null; + AltosTimeSeries accel_speed_series = null; + + if (altitude_series != null) { + AltosTimeSeries temp_series = make_series(speed_name, AltosConvert.speed); + altitude_series.differentiate(temp_series); + + alt_speed_series = make_series(speed_name, AltosConvert.speed); + temp_series.filter(alt_speed_series, 10.0); + } else { + System.out.printf("no altitude series\n"); + } + if (accel_series != null) { + AltosTimeSeries temp_series = make_series(speed_name, AltosConvert.speed); + accel_series.integrate(temp_series); + + accel_speed_series = make_series(speed_name, AltosConvert.speed); + temp_series.filter(accel_speed_series, 0.1); + } else { + System.out.printf("no accel series\n"); + } + + if (alt_speed_series != null && accel_speed_series != null) { + double apogee_time = AltosLib.MISSING; + if (state_series != null) { + for (AltosTimeValue d : state_series) { + if (d.value >= AltosLib.ao_flight_drogue){ + apogee_time = d.time; + break; + } + } + } + if (apogee_time == AltosLib.MISSING) { + speed_series = alt_speed_series; + } else { + speed_series = make_series(speed_name, AltosConvert.speed); + for (AltosTimeValue d : accel_speed_series) { + if (d.time <= apogee_time) + speed_series.add(d); + } + for (AltosTimeValue d : alt_speed_series) { + if (d.time > apogee_time) + speed_series.add(d); + } + + } + } else if (alt_speed_series != null) { + speed_series = alt_speed_series; + } else if (accel_speed_series != null) { + speed_series = accel_speed_series; + } + if (speed_series != null) { + add_series(speed_series); + System.out.printf("speed series for %s set to %s\n", this.toString(), speed_series.toString()); + } else + System.out.printf("didn't manage to make speed series\n"); + } + + AltosTimeSeries kalman_height_series, kalman_speed_series, kalman_accel_series; + + public static final String kalman_height_name = "Kalman Height"; + public static final String kalman_speed_name = "Kalman Speed"; + public static final String kalman_accel_name = "Kalman Accel"; + + public void set_kalman(double height, double speed, double acceleration) { + if (kalman_height_series == null) { + kalman_height_series = add_series(kalman_height_name, AltosConvert.height); + kalman_speed_series = add_series(kalman_speed_name, AltosConvert.speed); + kalman_accel_series = add_series(kalman_accel_name, AltosConvert.accel); + } + kalman_height_series.add(time(), height); + kalman_speed_series.add(time(), speed); + kalman_accel_series.add(time(), acceleration); } AltosTimeSeries thrust_series; @@ -146,114 +283,159 @@ public class AltosFlightSeries extends AltosFlightListener { thrust_series.add(time(), N); } + AltosTimeSeries temperature_series; + + public static final String temperature_name = "Temperature"; + public void set_temperature(double deg_c) { + if (temperature_series == null) + temperature_series = add_series(temperature_name, AltosConvert.temperature); + temperature_series.add(time(), deg_c); } - public void set_battery_voltage(double volts) { + AltosTimeSeries battery_voltage_series; + + public static final String battery_voltage_name = "Battery Voltage"; + + public void set_battery_voltage(double volts) { + if (volts == AltosLib.MISSING) + return; + if (battery_voltage_series == null) + battery_voltage_series = add_series(battery_voltage_name, AltosConvert.voltage); + battery_voltage_series.add(time(), volts); } - public void set_apogee_voltage(double volts) { + AltosTimeSeries apogee_voltage_series; + + public static final String apogee_voltage_name = "Apogee Voltage"; + + public void set_apogee_voltage(double volts) { + if (volts == AltosLib.MISSING) + return; + if (apogee_voltage_series == null) + apogee_voltage_series = add_series(apogee_voltage_name, AltosConvert.voltage); + apogee_voltage_series.add(time(), volts); } - public void set_main_voltage(double volts) { + AltosTimeSeries main_voltage_series; + + public static final String main_voltage_name = "Main Voltage"; + + public void set_main_voltage(double volts) { + if (volts == AltosLib.MISSING) + return; + if (main_voltage_series == null) + main_voltage_series = add_series(main_voltage_name, AltosConvert.voltage); + main_voltage_series.add(time(), volts); } AltosTimeSeries sats_in_view; AltosTimeSeries sats_in_soln; AltosTimeSeries gps_altitude; + AltosTimeSeries gps_height; AltosTimeSeries gps_ground_speed; AltosTimeSeries gps_ascent_rate; AltosTimeSeries gps_course; AltosTimeSeries gps_speed; + public ArrayList gps_series; + public static final String sats_in_view_name = "Satellites in view"; public static final String sats_in_soln_name = "Satellites in solution"; public static final String gps_altitude_name = "GPS Altitude"; + public static final String gps_height_name = "GPS Height"; + public static final String gps_ground_speed_name = "GPS Ground Speed"; + public static final String gps_ascent_rate_name = "GPS Ascent Rate"; + public static final String gps_course_name = "GPS Course"; + public static final String gps_speed_name = "GPS Speed"; - public void set_temp_gps() { - if (sats_in_view == null) { - sats_in_view = add_series("Satellites in view", null); - sats_in_soln = add_series("Satellites in solution", null); - gps_altitude = add_series("GPS Altitude", AltosConvert.height); - gps_ground_speed = add_series("GPS Ground Speed", AltosConvert.speed); - gps_ascent_rate = add_series("GPS Ascent Rate", AltosConvert.speed); - gps_course = add_series("GPS Course", null); - gps_speed = add_series("GPS Speed", null); - } - - /* XXX capture GPS data */ - super.set_temp_gps(); - } - - public boolean gps_pending() { - return temp_gps != null; - } + public void set_gps(AltosGPS gps) { + if (gps_series == null) + gps_series = new ArrayList(); + gps_series.add(new AltosGPSTimeValue(time(), gps)); - public AltosGPS make_temp_gps(boolean sats) { - if (temp_gps == null) { - temp_gps = new AltosGPS(); + if (sats_in_view == null) { + sats_in_view = add_series(sats_in_view_name, null); + sats_in_soln = add_series(sats_in_soln_name, null); + gps_altitude = add_series(gps_altitude_name, AltosConvert.height); + gps_height = add_series(gps_height_name, AltosConvert.height); + gps_ground_speed = add_series(gps_ground_speed_name, AltosConvert.speed); + gps_ascent_rate = add_series(gps_ascent_rate_name, AltosConvert.speed); + gps_course = add_series(gps_course_name, null); + gps_speed = add_series(gps_speed_name, null); } - if (sats) { - if (tick != temp_gps_sat_tick) - temp_gps.cc_gps_sat = null; - temp_gps_sat_tick = tick; + if (gps.cc_gps_sat != null) + sats_in_view.add(time(), gps.cc_gps_sat.length); + if (gps.locked) { + sats_in_soln.add(time(), gps.nsat); + if (gps.alt != AltosLib.MISSING) { + gps_altitude.add(time(), gps.alt); + if (cal_data.gps_ground_altitude != AltosLib.MISSING) + gps_height.add(time(), gps.alt - cal_data.gps_ground_altitude); + } + if (gps.ground_speed != AltosLib.MISSING) + gps_ground_speed.add(time(), gps.ground_speed); + if (gps.climb_rate != AltosLib.MISSING) + gps_ascent_rate.add(time(), gps.climb_rate); + if (gps.course != AltosLib.MISSING) + gps_course.add(time(), gps.course); + if (gps.ground_speed != AltosLib.MISSING && gps.climb_rate != AltosLib.MISSING) + gps_speed.add(time(), Math.sqrt(gps.ground_speed * gps.ground_speed + + gps.climb_rate * gps.climb_rate)); } - return temp_gps; } - public void set_ground_pressure(double ground_pressure) { + public static final String accel_across_name = "Accel Across"; + public static final String accel_along_name = "Accel Along"; + public static final String accel_through_name = "Accel Through"; + + public void set_accel(double along, double across, double through) { } public void set_accel_ground(double along, double across, double through) { } - public void set_gyro_zero(double roll, double pitch, double yaw) { + public void set_gyro(double roll, double pitch, double yaw) { } - public void set_ms5607(int pres_val, int temp_val) { - if (ms5607 != null) { - ms5607.set(pres_val, temp_val); - - set_pressure(ms5607.pa); - set_temperature(ms5607.cc / 100.0); - } + public void set_mag(double along, double across, double through) { } - public void check_imu_wrap(AltosIMU imu) { - } + public void set_orient(double new_orient) { } - public void set_imu(AltosIMU imu) { + public void set_pyro_voltage(double volts) { } - public void set_mag(AltosMag mag) { + public void set_ignitor_voltage(double[] voltage) { } - public void set_pyro_voltage(double volts) { + public void set_pyro_fired(int pyro_mask) { } - public void set_ignitor_voltage(double[] voltage) { + public void set_companion(AltosCompanion companion) { } - public void set_pyro_fired(int pyro_mask) { + public void fill_in() { + System.out.printf("fill in %s\n", this.toString()); + compute_speed(); + compute_accel(); + if (cal_data.ground_altitude != AltosLib.MISSING) + compute_height(cal_data.ground_altitude); } public void init() { - flight = AltosLib.MISSING; - tick = AltosLib.MISSING; - boost_tick = AltosLib.MISSING; - temp_gps_sat_tick = AltosLib.MISSING; + time = AltosLib.MISSING; series = new ArrayList(); } - public void copy(AltosFlightSeries old) { - super.copy(old); - } - public AltosTimeSeries[] series() { + fill_in(); return series.toArray(new AltosTimeSeries[0]); } - public AltosFlightSeries() { + public AltosFlightSeries(AltosCalData cal_data) { + super(cal_data); + System.out.printf("new flight series %s\n", this.toString()); init(); } }