* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.AltosLib;
+package org.altusmetrum.altoslib_1;
-import java.lang.*;
-import java.text.*;
-import java.util.HashMap;
-import java.io.*;
-
-public class AltosRecord implements Comparable <AltosRecord> {
- public final static int MISSING = 0x7fffffff;
+public abstract class AltosRecord implements Comparable <AltosRecord>, Cloneable {
public static final int seen_flight = 1;
public static final int seen_sensor = 2;
public static final int seen_gps_lat = 32;
public static final int seen_gps_lon = 64;
public static final int seen_companion = 128;
- public int seen;
+ public int seen;
+
+ public final static int MISSING = 0x7fffffff;
+
+ /* Every AltosRecord implementation provides these fields */
+
public int version;
public String callsign;
public int serial;
public int state;
public int tick;
- public int accel;
- public int pres;
- public int temp;
- public int batt;
- public int drogue;
- public int main;
-
- public int ground_accel;
- public int ground_pres;
- public int accel_plus_g;
- public int accel_minus_g;
-
- public double acceleration;
- public double speed;
- public double height;
-
- public int flight_accel;
- public int flight_vel;
- public int flight_pres;
-
public AltosGPS gps;
- public boolean new_gps;
-
- public AltosIMU imu;
- public AltosMag mag;
+ public boolean new_gps;
public double time; /* seconds since boost */
public AltosRecordCompanion companion;
->>>>>>> 5a249bc... altosui: Complete split out of separate java library
+ /* Telemetry sources have these values recorded from the flight computer */
+ public double kalman_height;
+ public double kalman_speed;
+ public double kalman_acceleration;
+
/*
- * Values for our MP3H6115A pressure sensor
- *
- * From the data sheet:
- *
- * Pressure range: 15-115 kPa
- * Voltage at 115kPa: 2.82
- * Output scale: 27mV/kPa
+ * Abstract methods that convert record data
+ * to standard units:
*
- *
- * 27 mV/kPa * 2047 / 3300 counts/mV = 16.75 counts/kPa
- * 2.82V * 2047 / 3.3 counts/V = 1749 counts/115 kPa
+ * pressure: Pa
+ * voltage: V
+ * acceleration: m/s²
+ * speed: m/s
+ * height: m
+ * temperature: °C
*/
- public static final double counts_per_kPa = 27 * 2047 / 3300;
- public static final double counts_at_101_3kPa = 1674.0;
+ abstract public double pressure();
+ abstract public double ground_pressure();
+ abstract public double acceleration();
- public static double
- barometer_to_pressure(double count)
- {
- return ((count / 16.0) / 2047.0 + 0.095) / 0.009 * 1000.0;
- }
+ public double altitude() {
+ double p = pressure();
- public double raw_pressure() {
- if (pres == MISSING)
- return MISSING;
- return barometer_to_pressure(pres);
- }
-
- public double filtered_pressure() {
- if (flight_pres == MISSING)
- return MISSING;
- return barometer_to_pressure(flight_pres);
- }
-
- public double ground_pressure() {
- if (ground_pres == MISSING)
- return MISSING;
- return barometer_to_pressure(ground_pres);
- }
-
- public double raw_altitude() {
- double p = raw_pressure();
if (p == MISSING)
return MISSING;
return AltosConvert.pressure_to_altitude(p);
}
public double ground_altitude() {
- double p = ground_pressure();
- if (p == MISSING)
- return MISSING;
- return AltosConvert.pressure_to_altitude(p);
- }
-
- public double filtered_altitude() {
- if (height != MISSING && ground_pres != MISSING)
- return height + ground_altitude();
+ double p = ground_pressure();
- double p = filtered_pressure();
if (p == MISSING)
return MISSING;
return AltosConvert.pressure_to_altitude(p);
}
- public double filtered_height() {
- if (height != MISSING)
- return height;
-
- double f = filtered_altitude();
- double g = ground_altitude();
- if (f == MISSING || g == MISSING)
- return MISSING;
- return f - g;
- }
-
- public double raw_height() {
- double r = raw_altitude();
- double g = ground_altitude();
-
- if (r == MISSING || g == MISSING)
- return height;
- return r - g;
- }
-
- public double battery_voltage() {
- if (batt == MISSING)
- return MISSING;
- return AltosConvert.cc_battery_to_voltage(batt);
- }
+ public double height() {
+ double g = ground_altitude();
+ double a = altitude();
- public double main_voltage() {
- if (main == MISSING)
+ if (g == MISSING)
return MISSING;
- return AltosConvert.cc_ignitor_to_voltage(main);
- }
-
- public double drogue_voltage() {
- if (drogue == MISSING)
+ if (a == MISSING)
return MISSING;
- return AltosConvert.cc_ignitor_to_voltage(drogue);
+ return a - g;
}
- /* Value for the CC1111 built-in temperature sensor
- * Output voltage at 0°C = 0.755V
- * Coefficient = 0.00247V/°C
- * Reference voltage = 1.25V
- *
- * temp = ((value / 32767) * 1.25 - 0.755) / 0.00247
- * = (value - 19791.268) / 32768 * 1.25 / 0.00247
- */
-
- public static double
- thermometer_to_temperature(double thermo)
- {
- return (thermo - 19791.268) / 32728.0 * 1.25 / 0.00247;
- }
+ public double battery_voltage() { return MISSING; }
- public double temperature() {
- if (temp == MISSING)
- return MISSING;
- return thermometer_to_temperature(temp);
- }
+ public double main_voltage() { return MISSING; }
- public double accel_counts_per_mss() {
- double counts_per_g = Math.abs(accel_minus_g - accel_plus_g) / 2;
+ public double drogue_voltage() { return MISSING; }
- return counts_per_g / 9.80665;
- }
+ public double temperature() { return MISSING; }
+
+ public AltosIMU imu() { return null; }
- public double acceleration() {
- if (acceleration != MISSING)
- return acceleration;
-
- if (ground_accel == MISSING || accel == MISSING)
- return MISSING;
- return (ground_accel - accel) / accel_counts_per_mss();
- }
-
- public double accel_speed() {
- if (speed != MISSING)
- return speed;
- if (flight_vel == MISSING)
- return MISSING;
- return flight_vel / (accel_counts_per_mss() * 100.0);
- }
+ public AltosMag mag() { return null; }
public String state() {
return AltosLib.state_name(state);
}
- public static String gets(FileInputStream s) throws IOException {
- int c;
- String line = "";
-
- while ((c = s.read()) != -1) {
- if (c == '\r')
- continue;
- if (c == '\n') {
- return line;
- }
- line = line + (char) c;
- }
- return null;
- }
-
public int compareTo(AltosRecord o) {
return tick - o.tick;
}
- public AltosRecord(AltosRecord old) {
- version = old.version;
+ abstract public AltosRecord clone();
+
+ public void copy(AltosRecord old) {
seen = old.seen;
+ version = old.version;
callsign = old.callsign;
serial = old.serial;
flight = old.flight;
status = old.status;
state = old.state;
tick = old.tick;
- accel = old.accel;
- pres = old.pres;
- temp = old.temp;
- batt = old.batt;
- drogue = old.drogue;
- main = old.main;
- flight_accel = old.flight_accel;
- ground_accel = old.ground_accel;
- flight_vel = old.flight_vel;
- flight_pres = old.flight_pres;
- ground_pres = old.ground_pres;
- accel_plus_g = old.accel_plus_g;
- accel_minus_g = old.accel_minus_g;
- acceleration = old.acceleration;
- speed = old.speed;
- height = old.height;
gps = new AltosGPS(old.gps);
- new_gps = false;
+ new_gps = old.new_gps;
companion = old.companion;
- imu = old.imu;
- mag = old.mag;
+ kalman_acceleration = old.kalman_acceleration;
+ kalman_speed = old.kalman_speed;
+ kalman_height = old.kalman_height;
}
public AltosRecord() {
- version = 0;
seen = 0;
+ version = 0;
callsign = "N0CALL";
serial = 0;
flight = 0;
status = 0;
state = AltosLib.ao_flight_startup;
tick = 0;
- accel = MISSING;
- pres = MISSING;
- temp = MISSING;
- batt = MISSING;
- drogue = MISSING;
- main = MISSING;
- flight_accel = 0;
- ground_accel = 0;
- flight_vel = 0;
- flight_pres = 0;
- ground_pres = 0;
- accel_plus_g = 0;
- accel_minus_g = 0;
- acceleration = MISSING;
- speed = MISSING;
- height = MISSING;
gps = new AltosGPS();
new_gps = false;
companion = null;
+
+ kalman_acceleration = MISSING;
+ kalman_speed = MISSING;
+ kalman_height = MISSING;
}
}