+ if (gps.lat != 0 && gps.lon != 0 &&
+ pad_lat != AltosLib.MISSING &&
+ pad_lon != AltosLib.MISSING)
+ {
+ double h = height();
+
+ if (h == AltosLib.MISSING)
+ h = 0;
+ from_pad = new AltosGreatCircle(pad_lat, pad_lon, 0, gps.lat, gps.lon, h);
+ elevation = from_pad.elevation;
+ distance = from_pad.distance;
+ range = from_pad.range;
+ }
+ }
+
+ public String state_name() {
+ return AltosLib.state_name(state());
+ }
+
+ public void set_state(int state) {
+ super.set_state(state);
+ ascent = (AltosLib.ao_flight_boost <= state() &&
+ state() <= AltosLib.ao_flight_coast);
+ boost = (AltosLib.ao_flight_boost == state());
+ }
+
+ public int rssi() {
+ if (rssi == AltosLib.MISSING)
+ return 0;
+ return rssi;
+ }
+
+ public void set_rssi(int rssi, int status) {
+ if (rssi != AltosLib.MISSING) {
+ this.rssi = rssi;
+ this.status = status;
+ }
+ }
+
+ public void set_received_time(long ms) {
+ received_time = ms;
+ }
+
+ public void set_gps(AltosGPS gps) {
+ super.set_gps(gps);
+ if (gps != null) {
+ this.gps = gps;
+ update_gps();
+ set |= set_gps;
+ }
+ }
+
+ public AltosRotation rotation;
+
+ public double accel_ground_along, accel_ground_across, accel_ground_through;
+
+ void update_pad_rotation() {
+ if (cal_data().pad_orientation != AltosLib.MISSING && accel_ground_along != AltosLib.MISSING) {
+ rotation = new AltosRotation(AltosIMU.convert_accel(accel_ground_across - cal_data().accel_zero_across),
+ AltosIMU.convert_accel(accel_ground_through - cal_data().accel_zero_through),
+ AltosIMU.convert_accel(accel_ground_along - cal_data().accel_zero_along),
+ cal_data().pad_orientation);
+ orient.set_computed(rotation.tilt(), time);
+ }
+ }
+
+ public void set_accel_ground(double ground_along, double ground_across, double ground_through) {
+ accel_ground_along = ground_along;
+ accel_ground_across = ground_across;
+ accel_ground_through = ground_through;
+ update_pad_rotation();
+ }
+
+ public double last_imu_time;
+
+ private void update_orient() {
+ if (last_imu_time != AltosLib.MISSING) {
+ double t = time - last_imu_time;
+
+ if (t > 0 && gyro_pitch != AltosLib.MISSING && rotation != null) {
+ double pitch = AltosConvert.degrees_to_radians(gyro_pitch) * t;
+ double yaw = AltosConvert.degrees_to_radians(gyro_yaw) * t;
+ double roll = AltosConvert.degrees_to_radians(gyro_roll) * t;
+
+ rotation.rotate(pitch, yaw, roll);
+ orient.set_computed(rotation.tilt(), time);
+ }
+ }
+ last_imu_time = time;
+ }
+
+ private double gyro_roll, gyro_pitch, gyro_yaw;
+
+ public void set_gyro(double roll, double pitch, double yaw) {
+ gyro_roll = roll;
+ gyro_pitch = pitch;
+ gyro_yaw = yaw;
+ update_orient();
+ }
+
+ private double accel_along, accel_across, accel_through;
+
+ public void set_accel(double along, double across, double through) {
+ accel_along = along;
+ accel_across = across;
+ accel_through = through;
+ update_orient();
+ }
+
+ public double accel_along() {
+ return accel_along;
+ }
+
+ public double accel_across() {
+ return accel_across;
+ }
+
+ public double accel_through() {
+ return accel_through;
+ }
+
+ public double gyro_roll() {
+ return gyro_roll;
+ }
+
+ public double gyro_pitch() {
+ return gyro_pitch;
+ }
+
+ public double gyro_yaw() {
+ return gyro_yaw;
+ }
+
+ private double mag_along, mag_across, mag_through;
+
+ public void set_mag(double along, double across, double through) {
+ mag_along = along;
+ mag_across = across;
+ mag_through = through;
+ }
+
+ public double mag_along() {
+ return mag_along;
+ }
+
+ public double mag_across() {
+ return mag_across;
+ }
+
+ public double mag_through() {
+ return mag_through;
+ }
+
+ public void set_companion(AltosCompanion companion) {
+ this.companion = companion;
+ }
+
+ public void set_acceleration(double acceleration) {
+ if (acceleration != AltosLib.MISSING) {
+ this.acceleration.set_measured(acceleration, time);
+ set |= set_data;
+ }
+ }
+
+ public void set_temperature(double temperature) {
+ if (temperature != AltosLib.MISSING) {
+ this.temperature = temperature;
+ set |= set_data;
+ }
+ }
+
+ public void set_battery_voltage(double battery_voltage) {
+ if (battery_voltage != AltosLib.MISSING) {
+ this.battery_voltage = battery_voltage;
+ set |= set_data;
+ }
+ }
+
+ public void set_pyro_voltage(double pyro_voltage) {
+ if (pyro_voltage != AltosLib.MISSING) {
+ this.pyro_voltage = pyro_voltage;
+ set |= set_data;
+ }
+ }
+
+ public void set_apogee_voltage(double apogee_voltage) {
+ if (apogee_voltage != AltosLib.MISSING) {
+ this.apogee_voltage = apogee_voltage;
+ set |= set_data;
+ }
+ }
+
+ public void set_main_voltage(double main_voltage) {
+ if (main_voltage != AltosLib.MISSING) {
+ this.main_voltage = main_voltage;
+ set |= set_data;
+ }
+ }
+
+ public void set_igniter_voltage(double[] voltage) {
+ this.igniter_voltage = voltage;