altoslib: Add TeleMega v6 support
authorKeith Packard <keithp@keithp.com>
Wed, 28 Dec 2022 05:33:14 +0000 (21:33 -0800)
committerKeith Packard <keithp@keithp.com>
Wed, 28 Dec 2022 05:33:14 +0000 (21:33 -0800)
New sensor (bmi088) support, plus other changes as needed. Also found
some places missing TeleMega-v5 support?

Signed-off-by: Keith Packard <keithp@keithp.com>
altoslib/AltosConfigData.java
altoslib/AltosEepromRecordMega.java
altoslib/AltosEepromRecordSet.java
altoslib/AltosIMU.java
altoslib/AltosIdleFetch.java
altoslib/AltosLib.java
altoslib/AltosTelemetry.java
altoslib/AltosTelemetryStandard.java
altoslib/NewProduct

index 5797f6325c64071226ccdb256eb059d1f90242b3..ce34db7fd67ccc06b01dcb9a25c61dadba3421dc 100644 (file)
@@ -217,8 +217,11 @@ public class AltosConfigData {
                                return 4095 - value;
                        /* fall through */
                case AltosLib.AO_LOG_FORMAT_TELEMEGA_4:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_5:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_6:
                case AltosLib.AO_LOG_FORMAT_EASYMEGA_2:
                case AltosLib.AO_LOG_FORMAT_EASYMOTOR:
+                       /* ADXL375 */
                        return -value;
                default:
                        if (product.startsWith("EasyTimer-"))
@@ -670,6 +673,10 @@ public class AltosConfigData {
                                return true;
                        if (product.startsWith("TeleMega-v4"))
                                return true;
+                       if (product.startsWith("TeleMega-v5"))
+                               return true;
+                       if (product.startsWith("TeleMega-v6"))
+                               return true;
                        if (product.startsWith("EasyMotor-v2"))
                                return true;
                        if (product.startsWith("EasyMotor-v3"))
@@ -688,6 +695,10 @@ public class AltosConfigData {
                                return AltosAdxl375.X_AXIS;
                        if (product.startsWith("TeleMega-v4"))
                                return AltosAdxl375.X_AXIS;
+                       if (product.startsWith("TeleMega-v5"))
+                               return AltosAdxl375.X_AXIS;
+                       if (product.startsWith("TeleMega-v6"))
+                               return AltosAdxl375.X_AXIS;
                        if (product.startsWith("EasyMotor-v2"))
                                return AltosAdxl375.X_AXIS;
                        if (product.startsWith("EasyMotor-v3"))
index 57de0a4137406a38b9ca54f9fedd10d8ecc27b1f..bf94b676c4bf795738effd637d54350f93375223 100644 (file)
@@ -35,6 +35,7 @@ public class AltosEepromRecordMega extends AltosEepromRecord {
                case AltosLib.AO_LOG_FORMAT_EASYMEGA_2:
                case AltosLib.AO_LOG_FORMAT_TELEMEGA_4:
                case AltosLib.AO_LOG_FORMAT_TELEMEGA_5:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_6:
                        return data32(16);
                case AltosLib.AO_LOG_FORMAT_TELEMEGA_OLD:
                        return data16(14);
@@ -49,6 +50,7 @@ public class AltosEepromRecordMega extends AltosEepromRecord {
                case AltosLib.AO_LOG_FORMAT_EASYMEGA_2:
                case AltosLib.AO_LOG_FORMAT_TELEMEGA_4:
                case AltosLib.AO_LOG_FORMAT_TELEMEGA_5:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_6:
                        return data32(20);
                case AltosLib.AO_LOG_FORMAT_TELEMEGA_OLD:
                        return data16(16);
@@ -63,6 +65,7 @@ public class AltosEepromRecordMega extends AltosEepromRecord {
                case AltosLib.AO_LOG_FORMAT_EASYMEGA_2:
                case AltosLib.AO_LOG_FORMAT_TELEMEGA_4:
                case AltosLib.AO_LOG_FORMAT_TELEMEGA_5:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_6:
                        return data32(24);
                case AltosLib.AO_LOG_FORMAT_TELEMEGA_OLD:
                        return data16(18);
@@ -119,6 +122,8 @@ public class AltosEepromRecordMega extends AltosEepromRecord {
                switch (log_format) {
                case AltosLib.AO_LOG_FORMAT_TELEMEGA_5:
                        return AltosLib.model_mpu6000;
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_6:
+                       return AltosLib.model_bmi088;
                }
                return AltosLib.MISSING;
        }
@@ -126,6 +131,7 @@ public class AltosEepromRecordMega extends AltosEepromRecord {
        private boolean sensor_normalized() {
                switch (log_format) {
                case AltosLib.AO_LOG_FORMAT_TELEMEGA_5:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_6:
                        return true;
                }
                return false;
@@ -134,6 +140,7 @@ public class AltosEepromRecordMega extends AltosEepromRecord {
        private int mag_model() {
                switch (log_format) {
                case AltosLib.AO_LOG_FORMAT_TELEMEGA_5:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_6:
                        return AltosLib.model_mmc5983;
                }
                return AltosLib.MISSING;
index 3b19ee682ff9b633884c45fdf33584f5447affa6..2c2089d7ebb90d42a5e583fb2f2ca08d4385fc2a 100644 (file)
@@ -87,6 +87,7 @@ public class AltosEepromRecordSet implements AltosRecordSet {
                case AltosLib.AO_LOG_FORMAT_EASYMEGA_2:
                case AltosLib.AO_LOG_FORMAT_TELEMEGA_4:
                case AltosLib.AO_LOG_FORMAT_TELEMEGA_5:
+               case AltosLib.AO_LOG_FORMAT_TELEMEGA_6:
                        record = new AltosEepromRecordMega(eeprom);
                        break;
                case AltosLib.AO_LOG_FORMAT_TELEMETRUM:
index 0ff27c75421618a49753afdd7538af45da7bbcd6..87570a79a5458ec580198c714f56d3c92c39e78a 100644 (file)
@@ -52,6 +52,7 @@ public class AltosIMU implements Cloneable {
        public static final double      counts_per_g_mpu = 2048.0;
        public static final double      counts_per_g_bmx = 2048.0;
        public static final double      counts_per_g_adxl = 20.5;
+       public static final double      counts_per_g_bmi088 = 1365.0;
 
        private static double counts_per_g(int imu_type, int imu_model) {
                switch (imu_model) {
@@ -62,6 +63,8 @@ public class AltosIMU implements Cloneable {
                        return counts_per_g_adxl;
                case AltosLib.model_bmx160:
                        return counts_per_g_bmx;
+               case AltosLib.model_bmi088:
+                       return counts_per_g_bmi088;
                }
 
                switch (imu_type) {
@@ -93,6 +96,7 @@ public class AltosIMU implements Cloneable {
        public static final double      GYRO_FULLSCALE_DEGREES_BMX = 2000.0;
        public static final double      GYRO_COUNTS_BMX = 32767.0;
        public static final double      counts_per_degree_bmx = GYRO_COUNTS_BMX / GYRO_FULLSCALE_DEGREES_BMX;
+       public static final double      counts_per_degree_bmi088 = 16.384;
 
        private static double counts_per_degree(int imu_type, int imu_model) {
                switch (imu_model) {
@@ -101,6 +105,8 @@ public class AltosIMU implements Cloneable {
                        return counts_per_degree_mpu;
                case AltosLib.model_bmx160:
                        return counts_per_degree_bmx;
+               case AltosLib.model_bmi088:
+                       return counts_per_degree_bmi088;
                }
 
                switch (imu_type) {
@@ -185,6 +191,21 @@ public class AltosIMU implements Cloneable {
                        }
                        return true;
                }
+               if (line.startsWith("BMI088:")) {
+                       String[] items = line.split("\\s+");
+
+                       imu_model = AltosLib.model_bmi088;
+
+                       if (items.length >= 7) {
+                               accel_along = Integer.parseInt(items[1]);
+                               accel_across = Integer.parseInt(items[2]);
+                               accel_through = Integer.parseInt(items[3]);
+                               gyro_roll = Integer.parseInt(items[4]);
+                               gyro_pitch = Integer.parseInt(items[5]);
+                               gyro_yaw = Integer.parseInt(items[6]);
+                       }
+                       return true;
+               }
 
                return false;
        }
index b2552b24bdf73d561378585808c8c8660c61621f..25a36096f6d98b275dcf2810a990b384fd02a19a 100644 (file)
@@ -224,6 +224,12 @@ public class AltosIdleFetch implements AltosDataProvider {
                               AltosIdler.idle_ms5607,
                               AltosIdler.idle_imu, AltosIdler.idle_mag,
                               AltosIdler.idle_sensor_mega),
+               new AltosIdler("TeleMega-v6",
+                              AltosIdler.idle_gps,
+                              AltosIdler.idle_adxl375,
+                              AltosIdler.idle_ms5607,
+                              AltosIdler.idle_imu, AltosIdler.idle_mag,
+                              AltosIdler.idle_sensor_mega),
                new AltosIdler("EasyMega-v1",
                               AltosIdler.idle_mma655x,
                               AltosIdler.idle_ms5607,
index 47c10cbf2fdac279f9a9cfe4b4607c221d691421..5293badce58eee47e6fb109741e7caced1e2be04 100644 (file)
@@ -386,6 +386,7 @@ public class AltosLib {
        public static final int AO_LOG_FORMAT_TELEMEGA_4 = 19;
        public static final int AO_LOG_FORMAT_EASYMOTOR = 20;
        public static final int AO_LOG_FORMAT_TELEMEGA_5 = 21;
+       public static final int AO_LOG_FORMAT_TELEMEGA_6 = 22;
        public static final int AO_LOG_FORMAT_NONE = 127;
 
        public static final int model_mpu6000 = 0;
@@ -394,6 +395,7 @@ public class AltosLib {
        public static final int model_bmx160 = 3;
        public static final int model_hmc5883 = 4;
        public static final int model_mmc5983 = 5;
+       public static final int model_bmi088 = 6;
 
        public static boolean isspace(int c) {
                switch (c) {
@@ -663,6 +665,8 @@ public class AltosLib {
                        return product_easymotor;
                case AO_LOG_FORMAT_TELEMEGA_5:
                        return product_telemega;
+               case AO_LOG_FORMAT_TELEMEGA_6:
+                       return product_telemega;
                case AO_LOG_FORMAT_NONE:
                        return product_altusmetrum;
                default:
index 54dd04dac4c2695f006f4b73528a47d556ac98f4..5fa5fc3bbb9955676dfa96c3391ace005bccd808 100644 (file)
@@ -82,6 +82,7 @@ public abstract class AltosTelemetry implements AltosDataProvider {
        final static int packet_type_mini3 = 0x11;
        final static int packet_type_mega_sensor_bmx160 = 0x12;
        final static int packet_type_mega_norm_mpu6000_mmc5983 = 0x13;
+       final static int packet_type_mega_norm_bmi088_mmc5983 = 0x14;
 
        static AltosTelemetry parse_hex(String hex)  throws ParseException, AltosCRCException {
                AltosTelemetry  telem = null;
index 7f6626dbf286074c4ae6782a8f6032c3c63ef904..bea217c82dcbe10ad00497df323018a226ec5536 100644 (file)
@@ -99,6 +99,9 @@ public abstract class AltosTelemetryStandard extends AltosTelemetry {
                case packet_type_mega_norm_mpu6000_mmc5983:
                        telem = new AltosTelemetryMegaNorm(bytes, AltosLib.model_mpu6000, AltosLib.model_mmc5983);
                        break;
+               case packet_type_mega_norm_bmi088_mmc5983:
+                       telem = new AltosTelemetryMegaNorm(bytes, AltosLib.model_bmi088, AltosLib.model_mmc5983);
+                       break;
                default:
                        telem = new AltosTelemetryRaw(bytes);
                        break;
index 27d94d11a0d0b0e9209c4f79fd54dd27050fe3eb..e502fdfff0d0ea29a2de3efd0437268383283726 100644 (file)
@@ -9,6 +9,8 @@ altoslib/
        Declare new USB ids
        Declare new Product name
        Add item to product_name function
+       Add entry in product_id_from_log_format
+       Declare new sensor model
 
  2. AltosIdleFetch.java