From ee49d3c202e1fee14328006e2beb2e774313de2e Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Tue, 27 Dec 2022 21:33:14 -0800 Subject: [PATCH] altoslib: Add TeleMega v6 support New sensor (bmi088) support, plus other changes as needed. Also found some places missing TeleMega-v5 support? Signed-off-by: Keith Packard --- altoslib/AltosConfigData.java | 11 +++++++++++ altoslib/AltosEepromRecordMega.java | 7 +++++++ altoslib/AltosEepromRecordSet.java | 1 + altoslib/AltosIMU.java | 21 +++++++++++++++++++++ altoslib/AltosIdleFetch.java | 6 ++++++ altoslib/AltosLib.java | 4 ++++ altoslib/AltosTelemetry.java | 1 + altoslib/AltosTelemetryStandard.java | 3 +++ altoslib/NewProduct | 2 ++ 9 files changed, 56 insertions(+) diff --git a/altoslib/AltosConfigData.java b/altoslib/AltosConfigData.java index 5797f632..ce34db7f 100644 --- a/altoslib/AltosConfigData.java +++ b/altoslib/AltosConfigData.java @@ -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")) diff --git a/altoslib/AltosEepromRecordMega.java b/altoslib/AltosEepromRecordMega.java index 57de0a41..bf94b676 100644 --- a/altoslib/AltosEepromRecordMega.java +++ b/altoslib/AltosEepromRecordMega.java @@ -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; diff --git a/altoslib/AltosEepromRecordSet.java b/altoslib/AltosEepromRecordSet.java index 3b19ee68..2c2089d7 100644 --- a/altoslib/AltosEepromRecordSet.java +++ b/altoslib/AltosEepromRecordSet.java @@ -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: diff --git a/altoslib/AltosIMU.java b/altoslib/AltosIMU.java index 0ff27c75..87570a79 100644 --- a/altoslib/AltosIMU.java +++ b/altoslib/AltosIMU.java @@ -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; } diff --git a/altoslib/AltosIdleFetch.java b/altoslib/AltosIdleFetch.java index b2552b24..25a36096 100644 --- a/altoslib/AltosIdleFetch.java +++ b/altoslib/AltosIdleFetch.java @@ -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, diff --git a/altoslib/AltosLib.java b/altoslib/AltosLib.java index 47c10cbf..5293badc 100644 --- a/altoslib/AltosLib.java +++ b/altoslib/AltosLib.java @@ -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: diff --git a/altoslib/AltosTelemetry.java b/altoslib/AltosTelemetry.java index 54dd04da..5fa5fc3b 100644 --- a/altoslib/AltosTelemetry.java +++ b/altoslib/AltosTelemetry.java @@ -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; diff --git a/altoslib/AltosTelemetryStandard.java b/altoslib/AltosTelemetryStandard.java index 7f6626db..bea217c8 100644 --- a/altoslib/AltosTelemetryStandard.java +++ b/altoslib/AltosTelemetryStandard.java @@ -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; diff --git a/altoslib/NewProduct b/altoslib/NewProduct index 27d94d11..e502fdff 100644 --- a/altoslib/NewProduct +++ b/altoslib/NewProduct @@ -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 -- 2.30.2