altoslib: Support TeleMega v5.0
[fw/altos] / altoslib / AltosEepromRecordMega.java
index d0da1b7ccf4b48f31f10b4ab9626c036fad08804..57de0a4137406a38b9ca54f9fedd10d8ecc27b1f 100644 (file)
@@ -12,7 +12,7 @@
  * General Public License for more details.
  */
 
-package org.altusmetrum.altoslib_11;
+package org.altusmetrum.altoslib_14;
 
 public class AltosEepromRecordMega extends AltosEepromRecord {
        public static final int record_length = 32;
@@ -31,6 +31,10 @@ public class AltosEepromRecordMega extends AltosEepromRecord {
        private int ground_roll() {
                switch (log_format) {
                case AltosLib.AO_LOG_FORMAT_TELEMEGA:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_3:
+               case AltosLib.AO_LOG_FORMAT_EASYMEGA_2:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_4:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_5:
                        return data32(16);
                case AltosLib.AO_LOG_FORMAT_TELEMEGA_OLD:
                        return data16(14);
@@ -41,6 +45,10 @@ public class AltosEepromRecordMega extends AltosEepromRecord {
        private int ground_pitch() {
                switch (log_format) {
                case AltosLib.AO_LOG_FORMAT_TELEMEGA:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_3:
+               case AltosLib.AO_LOG_FORMAT_EASYMEGA_2:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_4:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_5:
                        return data32(20);
                case AltosLib.AO_LOG_FORMAT_TELEMEGA_OLD:
                        return data16(16);
@@ -51,6 +59,10 @@ public class AltosEepromRecordMega extends AltosEepromRecord {
        private int ground_yaw() {
                switch (log_format) {
                case AltosLib.AO_LOG_FORMAT_TELEMEGA:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_3:
+               case AltosLib.AO_LOG_FORMAT_EASYMEGA_2:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_4:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_5:
                        return data32(24);
                case AltosLib.AO_LOG_FORMAT_TELEMEGA_OLD:
                        return data16(18);
@@ -75,6 +87,193 @@ public class AltosEepromRecordMega extends AltosEepromRecord {
        private int mag_x() { return data16(20); }
        private int mag_z() { return data16(22); }
        private int mag_y() { return data16(24); }
+
+       /* normalized log data */
+       private int norm_accel_along() { return data16(8); }
+       private int norm_accel_across() { return data16(10); }
+       private int norm_accel_through() { return data16(12); }
+       private int norm_gyro_roll() { return data16(14); }
+       private int norm_gyro_pitch() { return data16(16); }
+       private int norm_gyro_yaw() { return data16(18); }
+       private int norm_mag_along() { return data16(20); }
+       private int norm_mag_across() { return data16(22); }
+       private int norm_mag_through() { return data16(24); }
+
+       private int imu_type() {
+               switch (log_format) {
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_OLD:
+                       return AltosIMU.imu_type_telemega_v1_v2;
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_3:
+                       return AltosIMU.imu_type_telemega_v3;
+               case AltosLib.AO_LOG_FORMAT_EASYMEGA_2:
+                       return AltosIMU.imu_type_easymega_v2;
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_4:
+                       return AltosIMU.imu_type_telemega_v4;
+               default:
+                       return AltosLib.MISSING;
+               }
+       }
+
+       private int imu_model() {
+               switch (log_format) {
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_5:
+                       return AltosLib.model_mpu6000;
+               }
+               return AltosLib.MISSING;
+       }
+
+       private boolean sensor_normalized() {
+               switch (log_format) {
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_5:
+                       return true;
+               }
+               return false;
+       }
+
+       private int mag_model() {
+               switch (log_format) {
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_5:
+                       return AltosLib.model_mmc5983;
+               }
+               return AltosLib.MISSING;
+       }
+
+       private int accel_across() {
+               if (sensor_normalized()) {
+                       return norm_accel_across();
+               }
+
+               switch (log_format) {
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_3:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_OLD:
+                       return accel_x();
+               case AltosLib.AO_LOG_FORMAT_EASYMEGA_2:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_4:
+                       return -accel_y();
+               default:
+                       return AltosLib.MISSING;
+               }
+       }
+
+       private int accel_along(){
+               if (sensor_normalized()) {
+                       return norm_accel_along();
+               }
+
+               switch (log_format) {
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_3:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_OLD:
+                       return accel_y();
+               case AltosLib.AO_LOG_FORMAT_EASYMEGA_2:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_4:
+                       return accel_x();
+               default:
+                       return AltosLib.MISSING;
+               }
+       }
+
+       private int accel_through() {
+               if (sensor_normalized()) {
+                       return norm_accel_through();
+               }
+
+               return accel_z();
+       }
+
+       private int gyro_pitch() {
+               if (sensor_normalized()) {
+                       return norm_gyro_pitch();
+               }
+
+               switch (log_format) {
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_3:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_OLD:
+                       return gyro_x();
+               case AltosLib.AO_LOG_FORMAT_EASYMEGA_2:
+                       return -gyro_y();
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_4:
+                       return -gyro_y();
+               default:
+                       return AltosLib.MISSING;
+               }
+       }
+
+       private int gyro_roll() {
+               if (sensor_normalized()) {
+                       return norm_gyro_roll();
+               }
+
+               switch (log_format) {
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_3:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_OLD:
+                       return gyro_y();
+               case AltosLib.AO_LOG_FORMAT_EASYMEGA_2:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_4:
+                       return gyro_x();
+               default:
+                       return AltosLib.MISSING;
+               }
+       }
+
+       private int gyro_yaw() {
+               if (sensor_normalized()) {
+                       return norm_gyro_yaw();
+               }
+
+               return gyro_z();
+       }
+
+       private int mag_across() {
+               if (sensor_normalized()) {
+                       return norm_mag_across();
+               }
+
+               switch (log_format) {
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_3:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_OLD:
+                       return mag_x();
+               case AltosLib.AO_LOG_FORMAT_EASYMEGA_2:
+                       return -mag_y();
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_4:
+                       return mag_y();
+               default:
+                       return AltosLib.MISSING;
+               }
+       }
+
+       private int mag_along() {
+               if (sensor_normalized()) {
+                       return norm_mag_along();
+               }
+
+               switch (log_format) {
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_3:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_OLD:
+                       return mag_y();
+               case AltosLib.AO_LOG_FORMAT_EASYMEGA_2:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_4:
+                       return mag_x();
+               default:
+                       return AltosLib.MISSING;
+               }
+       }
+
+       private int mag_through() {
+               if (sensor_normalized()) {
+                       return norm_mag_through();
+               }
+
+               return mag_z();
+       }
+
+
        private int accel() { return data16(26); }
 
        /* AO_LOG_TEMP_VOLT elements */
@@ -114,14 +313,18 @@ public class AltosEepromRecordMega extends AltosEepromRecord {
 
                AltosGPS        gps;
 
+               cal_data.set_imu_type(imu_type());
+               cal_data.set_imu_model(imu_model());
+               cal_data.set_mag_model(mag_model());
+
                switch (cmd()) {
                case AltosLib.AO_LOG_FLIGHT:
                        cal_data.set_flight(flight());
                        cal_data.set_ground_accel(ground_accel());
                        cal_data.set_ground_pressure(ground_pres());
-                       listener.set_accel_ground(ground_accel_along(),
-                                                 ground_accel_across(),
-                                                 ground_accel_through());
+                       listener.set_accel_ground(cal_data.accel_along(ground_accel_along()),
+                                                 cal_data.accel_across(ground_accel_across()),
+                                                 cal_data.accel_through(ground_accel_through()));
                        cal_data.set_gyro_zero(ground_roll() / 512.0,
                                               ground_pitch() / 512.0,
                                               ground_yaw() / 512.0);
@@ -135,16 +338,16 @@ public class AltosEepromRecordMega extends AltosEepromRecord {
                        listener.set_pressure(pt.pres);
                        listener.set_temperature(pt.temp);
 
-                       int     accel_along = accel_y();
-                       int     accel_across = accel_x();
-                       int     accel_through = accel_z();
-                       int     gyro_roll = gyro_y();
-                       int     gyro_pitch = gyro_x();
-                       int     gyro_yaw = gyro_z();
+                       int     accel_along = accel_along();
+                       int     accel_across = accel_across();
+                       int     accel_through = accel_through();
+                       int     gyro_roll = gyro_roll();
+                       int     gyro_pitch = gyro_pitch();
+                       int     gyro_yaw = gyro_yaw();
 
-                       int     mag_along = mag_y();
-                       int     mag_across = mag_x();
-                       int     mag_through = mag_z();
+                       int     mag_along = mag_along();
+                       int     mag_across = mag_across();
+                       int     mag_through = mag_through();
 
                        if (log_format == AltosLib.AO_LOG_FORMAT_TELEMEGA_OLD)
                                cal_data.check_imu_wrap(gyro_roll, gyro_pitch, gyro_yaw);
@@ -160,16 +363,7 @@ public class AltosEepromRecordMega extends AltosEepromRecord {
                                         cal_data.mag_across(mag_across),
                                         cal_data.mag_through(mag_through));
 
-
-                       final double lsb_per_g = 1920.0/105.5;
-
-                       double acceleration = AltosConvert.acceleration_from_sensor(
-                               accel(),
-                               cal_data.ground_accel,
-                               cal_data.ground_accel + 2 * lsb_per_g,
-                               cal_data.ground_accel);
-
-                       listener.set_acceleration(acceleration);
+                       listener.set_acceleration(cal_data.acceleration(accel()));
                        break;
                case AltosLib.AO_LOG_TEMP_VOLT:
                        listener.set_battery_voltage(AltosConvert.mega_battery_voltage(v_batt()));
@@ -188,7 +382,7 @@ public class AltosEepromRecordMega extends AltosEepromRecord {
                        listener.set_pyro_fired(pyro());
                        break;
                case AltosLib.AO_LOG_GPS_TIME:
-                       gps = cal_data.make_temp_gps(tick(), false);
+                       gps = listener.make_temp_gps(false);
                        gps.lat = latitude() / 1e7;
                        gps.lon = longitude() / 1e7;
 
@@ -231,7 +425,7 @@ public class AltosEepromRecordMega extends AltosEepromRecord {
                        }
                        break;
                case AltosLib.AO_LOG_GPS_SAT:
-                       gps = cal_data.make_temp_gps(tick(), true);
+                       gps = listener.make_temp_gps(true);
 
                        int n = nsat();
                        if (n > max_sat)
@@ -249,12 +443,12 @@ public class AltosEepromRecordMega extends AltosEepromRecord {
                return new AltosEepromRecordMega(eeprom, s);
        }
 
-       public AltosEepromRecordMega(AltosEepromNew eeprom, int start) {
+       public AltosEepromRecordMega(AltosEeprom eeprom, int start) {
                super(eeprom, start, record_length);
                log_format = eeprom.config_data().log_format;
        }
 
-       public AltosEepromRecordMega(AltosEepromNew eeprom) {
+       public AltosEepromRecordMega(AltosEeprom eeprom) {
                this(eeprom, 0);
        }
 }