From 659b9706baa206d5b5d130453dc4a801c141283d Mon Sep 17 00:00:00 2001 From: Danesh Mariapan <161300025+dmariapan-shimmer@users.noreply.github.com> Date: Wed, 23 Oct 2024 13:05:57 +0800 Subject: [PATCH 1/8] Added & Initialized SensorLSM6DSV Class --- .../shimmerresearch/driver/ShimmerObject.java | 16 + .../sensors/AbstractSensor.java | 4 +- .../sensors/lsm6dsv/SensorLSM6DSV.java | 505 ++++++++++++++++++ 3 files changed, 524 insertions(+), 1 deletion(-) create mode 100644 ShimmerDriver/src/main/java/com/shimmerresearch/sensors/lsm6dsv/SensorLSM6DSV.java diff --git a/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java b/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java index 6ad12308e..37cd107ee 100644 --- a/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java +++ b/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java @@ -79,6 +79,7 @@ import com.shimmerresearch.sensors.lsm303.SensorLSM303; import com.shimmerresearch.sensors.lsm303.SensorLSM303AH; import com.shimmerresearch.sensors.lsm303.SensorLSM303DLHC; +import com.shimmerresearch.sensors.lsm6dsv.SensorLSM6DSV; import com.shimmerresearch.sensors.mpu9x50.SensorMPU9150; import com.shimmerresearch.sensors.mpu9x50.SensorMPU9250; import com.shimmerresearch.sensors.mpu9x50.SensorMPU9X50; @@ -650,6 +651,9 @@ public String toString() { // Shimmer3 - Pressure/Temperature private SensorBMPX80 mSensorBMPX80 = new SensorBMP180(this); + // Shimmer3r - Accel LN + private SensorLSM6DSV mSensorLSM6DSV = new SensorLSM6DSV(this); + // ---------- ECG/EMG start --------------- protected double OffsetECGRALL=2060; protected double GainECGRALL=175; @@ -4951,6 +4955,10 @@ else if(isSupportedNewImuSensors()){ mSensorMpu9x50 = new SensorMPU9250(this); addSensorClass(mSensorMpu9x50); + + // Added + mSensorLSM6DSV = new SensorLSM6DSV(this); + addSensorClass(mSensorLSM6DSV); } else{ mSensorBMPX80 = new SensorBMP180(this); @@ -4964,6 +4972,10 @@ else if(isSupportedNewImuSensors()){ mSensorMpu9x50 = new SensorMPU9150(this); addSensorClass(mSensorMpu9x50); + + // Added + mSensorLSM6DSV = new SensorLSM6DSV(this); + addSensorClass(mSensorLSM6DSV); } } else if(isShimmerGen3R()){ mSensorBMPX80 = new SensorBMP280(this); @@ -4977,6 +4989,10 @@ else if(isSupportedNewImuSensors()){ mSensorMpu9x50 = new SensorMPU9250(this); addSensorClass(mSensorMpu9x50); + + // Added + mSensorLSM6DSV = new SensorLSM6DSV(this); + addSensorClass(mSensorLSM6DSV); } } diff --git a/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/AbstractSensor.java b/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/AbstractSensor.java index 4de76ce22..0fab7e1a2 100644 --- a/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/AbstractSensor.java +++ b/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/AbstractSensor.java @@ -62,7 +62,9 @@ public enum SENSORS{ LSM6DS3("LSM6DS3"), MAX86150("MAX86150"), MAX86916("MAX86916"), - BIOZ("MAX30001"); + BIOZ("MAX30001"), + //Added + LSM6DSV("LSM6DSV"); private final String text; diff --git a/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/lsm6dsv/SensorLSM6DSV.java b/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/lsm6dsv/SensorLSM6DSV.java new file mode 100644 index 000000000..4520475a4 --- /dev/null +++ b/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/lsm6dsv/SensorLSM6DSV.java @@ -0,0 +1,505 @@ +package com.shimmerresearch.sensors.lsm6dsv; + +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import com.shimmerresearch.bluetooth.BtCommandDetails; +import com.shimmerresearch.driver.Configuration.CHANNEL_UNITS; +import com.shimmerresearch.driver.Configuration.COMMUNICATION_TYPE; +import com.shimmerresearch.driver.Configuration.Shimmer3.CompatibilityInfoForMaps; +import com.shimmerresearch.driver.calibration.CalibDetails; +import com.shimmerresearch.driver.calibration.CalibDetailsKinematic; +import com.shimmerresearch.driver.calibration.CalibDetails.CALIB_READ_SOURCE; +import com.shimmerresearch.driver.Configuration; +import com.shimmerresearch.driver.ObjectCluster; +import com.shimmerresearch.driver.ShimmerDevice; +import com.shimmerresearch.driverUtilities.ChannelDetails; +import com.shimmerresearch.driverUtilities.ConfigOptionDetailsSensor; +import com.shimmerresearch.driverUtilities.ConfigOptionObject; +import com.shimmerresearch.driverUtilities.SensorDetails; +import com.shimmerresearch.driverUtilities.SensorDetailsRef; +import com.shimmerresearch.driverUtilities.SensorGroupingDetails; +import com.shimmerresearch.driverUtilities.ShimmerVerObject; +import com.shimmerresearch.driverUtilities.UtilShimmer; +import com.shimmerresearch.driverUtilities.ChannelDetails.CHANNEL_DATA_ENDIAN; +import com.shimmerresearch.driverUtilities.ChannelDetails.CHANNEL_DATA_TYPE; +import com.shimmerresearch.driverUtilities.ChannelDetails.CHANNEL_TYPE; +import com.shimmerresearch.sensors.AbstractSensor; +import com.shimmerresearch.sensors.AbstractSensor.SENSORS; +import com.shimmerresearch.sensors.kionix.SensorKionixAccel; +import com.shimmerresearch.sensors.kionix.SensorKionixKXTC92050; +import com.shimmerresearch.sensors.kionix.SensorKionixAccel.GuiLabelSensors; +import com.shimmerresearch.sensors.kionix.SensorKionixAccel.ObjectClusterSensorName; +import com.shimmerresearch.sensors.kionix.SensorKionixKXTC92050.DatabaseChannelHandles; +import com.shimmerresearch.sensors.kionix.SensorKionixKXTC92050.DatabaseConfigHandle; +import com.shimmerresearch.sensors.lsm303.SensorLSM303; +import com.shimmerresearch.sensors.lsm303.SensorLSM303AH; +import com.shimmerresearch.sensors.ActionSetting; + +public class SensorLSM6DSV extends AbstractSensor{ + + + //--------- Sensor specific variables start -------------- + public static final double[][] AlignmentMatrixLowNoiseAccelShimmer3r = {{-1,0,0},{0,1,0},{0,0,-1}}; + public static final double[][] OffsetVectorLowNoiseAccelShimmer3r = {{0},{0},{0}}; + + public static final double[][] SensitivityMatrixLowNoiseAccel2gShimmer3r = {{1672,0,0},{0,1672,0},{0,0,1672}}; + public static final double[][] SensitivityMatrixLowNoiseAccel4gShimmer3r = {{836,0,0},{0,836,0},{0,0,836}}; + public static final double[][] SensitivityMatrixLowNoiseAccel8gShimmer3r = {{418,0,0},{0,418,0},{0,0,418}}; + public static final double[][] SensitivityMatrixLowNoiseAccel16gShimmer3r = {{209,0,0},{0,209,0},{0,0,209}}; + + private static final int LN_ACCEL_RANGE_VALUE_2G = 0; + private static final String LN_ACCEL_RANGE_STRING_2G = UtilShimmer.UNICODE_PLUS_MINUS + " 2g" ; + private static final int LN_ACCEL_RANGE_VALUE_4G = 1; + private static final String LN_ACCEL_RANGE_STRING_4G = UtilShimmer.UNICODE_PLUS_MINUS + " 4g" ; + private static final int LN_ACCEL_RANGE_VALUE_8G = 2; + private static final String LN_ACCEL_RANGE_STRING_8G = UtilShimmer.UNICODE_PLUS_MINUS + " 8g" ; + private static final int LN_ACCEL_RANGE_VALUE_16G = 3; + private static final String LN_ACCEL_RANGE_STRING_16G = UtilShimmer.UNICODE_PLUS_MINUS + " 16g" ; + + private CalibDetailsKinematic calibDetailsAccelLn2g = new CalibDetailsKinematic( + LN_ACCEL_RANGE_VALUE_2G, LN_ACCEL_RANGE_STRING_2G, + AlignmentMatrixLowNoiseAccelShimmer3r, SensitivityMatrixLowNoiseAccel2gShimmer3r, OffsetVectorLowNoiseAccelShimmer3r); + public CalibDetailsKinematic mCurrentCalibDetailsAccelLn2g = calibDetailsAccelLn2g; + + private CalibDetailsKinematic calibDetailsAccelLn4g = new CalibDetailsKinematic( + LN_ACCEL_RANGE_VALUE_4G, LN_ACCEL_RANGE_STRING_4G, + AlignmentMatrixLowNoiseAccelShimmer3r, SensitivityMatrixLowNoiseAccel4gShimmer3r, OffsetVectorLowNoiseAccelShimmer3r); + public CalibDetailsKinematic mCurrentCalibDetailsAccelLn4g = calibDetailsAccelLn4g; + + private CalibDetailsKinematic calibDetailsAccelLn8g = new CalibDetailsKinematic( + LN_ACCEL_RANGE_VALUE_8G, LN_ACCEL_RANGE_STRING_8G, + AlignmentMatrixLowNoiseAccelShimmer3r, SensitivityMatrixLowNoiseAccel8gShimmer3r, OffsetVectorLowNoiseAccelShimmer3r); + public CalibDetailsKinematic mCurrentCalibDetailsAccelLn8g = calibDetailsAccelLn8g; + + private CalibDetailsKinematic calibDetailsAccelLn16g = new CalibDetailsKinematic( + LN_ACCEL_RANGE_VALUE_16G, LN_ACCEL_RANGE_STRING_16G, + AlignmentMatrixLowNoiseAccelShimmer3r, SensitivityMatrixLowNoiseAccel16gShimmer3r, OffsetVectorLowNoiseAccelShimmer3r); + public CalibDetailsKinematic mCurrentCalibDetailsAccelLn16g = calibDetailsAccelLn16g; + + public static class DatabaseChannelHandles{ + public static final String LN_ACC_X = "LSM6DSV_X"; + public static final String LN_ACC_Y = "LSM6DSV_X"; + public static final String LN_ACC_Z = "LSM6DSV_X"; + } + public static final class DatabaseConfigHandle{ + public static final String LN_ACC_CALIB_TIME = "LSM6DSV_Acc_Calib_Time"; + public static final String LN_ACC_OFFSET_X = "LSM6DSV_Acc_Offset_X"; + public static final String LN_ACC_OFFSET_Y = "LSM6DSV_Acc_Offset_Y"; + public static final String LN_ACC_OFFSET_Z = "LSM6DSV_Acc_Offset_Z"; + public static final String LN_ACC_GAIN_X = "LSM6DSV_Acc_Gain_X"; + public static final String LN_ACC_GAIN_Y = "LSM6DSV_Acc_Gain_Y"; + public static final String LN_ACC_GAIN_Z = "LSM6DSV_Acc_Gain_Z"; + public static final String LN_ACC_ALIGN_XX = "LSM6DSV_Acc_Align_XX"; + public static final String LN_ACC_ALIGN_XY = "LSM6DSV_Acc_Align_XY"; + public static final String LN_ACC_ALIGN_XZ = "LSM6DSV_Acc_Align_XZ"; + public static final String LN_ACC_ALIGN_YX = "LSM6DSV_Acc_Align_YX"; + public static final String LN_ACC_ALIGN_YY = "LSM6DSV_Acc_Align_YY"; + public static final String LN_ACC_ALIGN_YZ = "LSM6DSV_Acc_Align_YZ"; + public static final String LN_ACC_ALIGN_ZX = "LSM6DSV_Acc_Align_ZX"; + public static final String LN_ACC_ALIGN_ZY = "LSM6DSV_Acc_Align_ZY"; + public static final String LN_ACC_ALIGN_ZZ = "LSM6DSV_Acc_Align_ZZ"; + + public static final List LIST_OF_CALIB_HANDLES_LN_ACC = Arrays.asList( + DatabaseConfigHandle.LN_ACC_OFFSET_X, DatabaseConfigHandle.LN_ACC_OFFSET_Y, DatabaseConfigHandle.LN_ACC_OFFSET_Z, + DatabaseConfigHandle.LN_ACC_GAIN_X, DatabaseConfigHandle.LN_ACC_GAIN_Y, DatabaseConfigHandle.LN_ACC_GAIN_Z, + DatabaseConfigHandle.LN_ACC_ALIGN_XX, DatabaseConfigHandle.LN_ACC_ALIGN_XY, DatabaseConfigHandle.LN_ACC_ALIGN_XZ, + DatabaseConfigHandle.LN_ACC_ALIGN_YX, DatabaseConfigHandle.LN_ACC_ALIGN_YY, DatabaseConfigHandle.LN_ACC_ALIGN_YZ, + DatabaseConfigHandle.LN_ACC_ALIGN_ZX, DatabaseConfigHandle.LN_ACC_ALIGN_ZY, DatabaseConfigHandle.LN_ACC_ALIGN_ZZ); + } + + public static class ObjectClusterSensorName{ + public static String ACCEL_LN_X = "Accel_LN_X"; + public static String ACCEL_LN_Y = "Accel_LN_Y"; + public static String ACCEL_LN_Z = "Accel_LN_Z"; + } + + public CalibDetailsKinematic mCurrentCalibDetailsAccelLn = null; + + public class GuiLabelSensors{ + public static final String ACCEL_LN = "Low-Noise Accelerometer"; + } + + public class LABEL_SENSOR_TILE{ + public static final String LOW_NOISE_ACCEL = GuiLabelSensors.ACCEL_LN; + } + //--------- Sensor specific variables end -------------- + + + + //--------- Configuration options start -------------- + public static final Integer[] ListofLSM6DSVAccelRangeConfigValues={0,1,2,3}; + + public static final String[] ListofLSM6DSVGyroRate={"Power-down","1.875Hz","7.5Hz","12.0Hz","30.0Hz","60.0Hz","120.0Hz","240.0Hz","480.0Hz","960.0Hz","1920.0Hz","3840.0Hz","7680.0Hz"}; + public static final Integer[] ListofLSM6DSVGyroRateConfigValues={0,1,2,3,4,5,6,7,8,9,10,11,12,13}; + +// public static final String[] ListofLSM303AHAccelRateLpm={"Power-down","1.0Hz","12.5Hz","25.0Hz","50.0Hz","100.0Hz","200.0Hz","400.0Hz","800.0Hz"}; +// public static final Integer[] ListofLSM303AHAccelRateLpmConfigValues={0,8,9,10,11,12,13,14,15}; +// +// public static final ConfigOptionDetailsSensor configOptionAccelRange = new ConfigOptionDetailsSensor( +// SensorLSM303.GuiLabelConfig.LSM303_ACCEL_RANGE, +// SensorLSM303AH.DatabaseConfigHandle.WR_ACC_RANGE, +// ListofLSM303AccelRange, +// ListofLSM303AccelRangeConfigValues, +// ConfigOptionDetailsSensor.GUI_COMPONENT_TYPE.COMBOBOX, +// CompatibilityInfoForMaps.listOfCompatibleVersionInfoLSM303AH); +// +// public static final ConfigOptionDetailsSensor configOptionAccelRate = new ConfigOptionDetailsSensor( +// SensorLSM303.GuiLabelConfig.LSM303_ACCEL_RATE, +// SensorLSM303AH.DatabaseConfigHandle.WR_ACC_RATE, +// ListofLSM303AHAccelRateHr, +// ListofLSM303AHAccelRateHrConfigValues, +// ConfigOptionDetailsSensor.GUI_COMPONENT_TYPE.COMBOBOX, +// CompatibilityInfoForMaps.listOfCompatibleVersionInfoLSM303AH, +// Arrays.asList( +// new ConfigOptionObject(ConfigOptionDetailsSensor.VALUE_INDEXES.LSM303_ACCEL_RATE.IS_LPM, +// ListofLSM303AHAccelRateLpm, +// ListofLSM303AHAccelRateLpmConfigValues))); +// +// public static final String[] ListofLSM303AHMagRate={"10.0Hz","20.0Hz","50.0Hz","100.0Hz"}; +// public static final Integer[] ListofLSM303AHMagRateConfigValues={0,1,2,3}; +// +// public static final String[] ListofLSM303AHMagRange={"+/- 49.152Ga"}; +// public static final Integer[] ListofLSM303AHMagRangeConfigValues={0}; +// +// public static final ConfigOptionDetailsSensor configOptionMagRange = new ConfigOptionDetailsSensor( +// SensorLSM303.GuiLabelConfig.LSM303_MAG_RANGE, +// SensorLSM303AH.DatabaseConfigHandle.MAG_RANGE, +// ListofLSM303AHMagRange, +// ListofLSM303AHMagRangeConfigValues, +// ConfigOptionDetailsSensor.GUI_COMPONENT_TYPE.COMBOBOX, +// CompatibilityInfoForMaps.listOfCompatibleVersionInfoLSM303AH); +// +// public static final ConfigOptionDetailsSensor configOptionMagRate = new ConfigOptionDetailsSensor( +// SensorLSM303.GuiLabelConfig.LSM303_MAG_RATE, +// SensorLSM303AH.DatabaseConfigHandle.MAG_RATE, +// ListofLSM303AHMagRate, +// ListofLSM303AHMagRateConfigValues, +// ConfigOptionDetailsSensor.GUI_COMPONENT_TYPE.COMBOBOX, +// CompatibilityInfoForMaps.listOfCompatibleVersionInfoLSM303AH); +// +// public static final ConfigOptionDetailsSensor configOptionAccelLpm = new ConfigOptionDetailsSensor( +// SensorLSM303.GuiLabelConfig.LSM303_ACCEL_LPM, +// SensorLSM303AH.DatabaseConfigHandle.WR_ACC_LPM, +// ConfigOptionDetailsSensor.GUI_COMPONENT_TYPE.CHECKBOX); + //--------- Configuration options end -------------- + + + + //--------- Sensor info start -------------- + public static final SensorDetailsRef sensorLSM6DSV = new SensorDetailsRef( + 0x80, //== Configuration.Shimmer3.SensorBitmap.SENSOR_A_ACCEL will be: SensorBitmap.SENSOR_A_ACCEL, // To Be Changed + 0x80, //== Configuration.Shimmer3.SensorBitmap.SENSOR_A_ACCEL will be: SensorBitmap.SENSOR_A_ACCEL, + GuiLabelSensors.ACCEL_LN, + CompatibilityInfoForMaps.listOfCompatibleVersionInfoKionixKXTC92050, + null, + Arrays.asList(SensorLSM6DSV.ObjectClusterSensorName.ACCEL_LN_X, + SensorLSM6DSV.ObjectClusterSensorName.ACCEL_LN_Y, + SensorLSM6DSV.ObjectClusterSensorName.ACCEL_LN_Z)); + + public static final Map mSensorMapRef; + static { + Map aMap = new LinkedHashMap(); + aMap.put(Configuration.Shimmer3.SENSOR_ID.SHIMMER_ANALOG_ACCEL, SensorLSM6DSV.sensorLSM6DSV); + + mSensorMapRef = Collections.unmodifiableMap(aMap); + } + //--------- Sensor info end -------------- + + + + //--------- Channel info start -------------- // To Be Changed + public static final ChannelDetails channelAccelX = new ChannelDetails( + ObjectClusterSensorName.ACCEL_LN_X, + ObjectClusterSensorName.ACCEL_LN_X, + DatabaseChannelHandles.LN_ACC_X, +// CHANNEL_DATA_TYPE.INT16, 2, CHANNEL_DATA_ENDIAN.LSB, + CHANNEL_DATA_TYPE.UINT12, 2, CHANNEL_DATA_ENDIAN.LSB, + CHANNEL_UNITS.METER_PER_SECOND_SQUARE, + Arrays.asList(CHANNEL_TYPE.CAL, CHANNEL_TYPE.UNCAL), + 0x00); + + + public static final ChannelDetails channelAccelY = new ChannelDetails( + ObjectClusterSensorName.ACCEL_LN_Y, + ObjectClusterSensorName.ACCEL_LN_Y, + DatabaseChannelHandles.LN_ACC_Y, +// CHANNEL_DATA_TYPE.INT16, 2, CHANNEL_DATA_ENDIAN.LSB, + CHANNEL_DATA_TYPE.UINT12, 2, CHANNEL_DATA_ENDIAN.LSB, + CHANNEL_UNITS.METER_PER_SECOND_SQUARE, + Arrays.asList(CHANNEL_TYPE.CAL, CHANNEL_TYPE.UNCAL), + 0x01); + + + public static final ChannelDetails channelAccelZ = new ChannelDetails( + ObjectClusterSensorName.ACCEL_LN_Z, + ObjectClusterSensorName.ACCEL_LN_Z, + DatabaseChannelHandles.LN_ACC_Z, +// CHANNEL_DATA_TYPE.INT16, 2, CHANNEL_DATA_ENDIAN.LSB, + CHANNEL_DATA_TYPE.UINT12, 2, CHANNEL_DATA_ENDIAN.LSB, + CHANNEL_UNITS.METER_PER_SECOND_SQUARE, + Arrays.asList(CHANNEL_TYPE.CAL, CHANNEL_TYPE.UNCAL), + 0x02); + + + public static final Map mChannelMapRef; + static { + Map aMap = new LinkedHashMap(); + aMap.put(SensorLSM6DSV.ObjectClusterSensorName.ACCEL_LN_X, SensorLSM6DSV.channelAccelX); + aMap.put(SensorLSM6DSV.ObjectClusterSensorName.ACCEL_LN_Y, SensorLSM6DSV.channelAccelY); + aMap.put(SensorLSM6DSV.ObjectClusterSensorName.ACCEL_LN_Z, SensorLSM6DSV.channelAccelZ); + mChannelMapRef = Collections.unmodifiableMap(aMap); + } + //--------- Channel info end -------------- + + public static final SensorGroupingDetails sensorGroupLnAccelLSM6DSV = new SensorGroupingDetails( + SensorLSM6DSV.LABEL_SENSOR_TILE.LOW_NOISE_ACCEL, + Arrays.asList(Configuration.Shimmer3.SENSOR_ID.SHIMMER_ANALOG_ACCEL), + CompatibilityInfoForMaps.listOfCompatibleVersionInfoKionixKXTC92050); + + + + //--------- Bluetooth commands start -------------- + public static final byte SET_LN_ACCEL_CALIBRATION_COMMAND = (byte) 0x11; + public static final byte LN_ACCEL_CALIBRATION_RESPONSE = (byte) 0x12; + public static final byte GET_LN_ACCEL_CALIBRATION_COMMAND = (byte) 0x13; + + public static final byte SET_ALT_ACCEL_RANGE_COMMAND = (byte) 0x4F; + public static final byte ALT_ACCEL_RANGE_RESPONSE = (byte) 0x50; + public static final byte GET_ALT_ACCEL_RANGE_COMMAND = (byte) 0x51; + + //--------- Bluetooth commands end -------------- + + + + //--------- Sensor specific methods start -------------- + private byte[] generateCalParamAnalogAccel(){ + return mCurrentCalibDetailsAccelLn.generateCalParamByteArray(); + } + + public void parseCalibParamFromPacketAccelAnalog(byte[] bufferCalibrationParameters, CALIB_READ_SOURCE calibReadSource) { + mCurrentCalibDetailsAccelLn.parseCalParamByteArray(bufferCalibrationParameters, calibReadSource); + } + + private void setDefaultCalibrationShimmer3LowNoiseAccel() { + mCurrentCalibDetailsAccelLn.resetToDefaultParameters(); + } + + public String getSensorName(){ + return mSensorName; + } + + public boolean isUsingDefaultLNAccelParam(){ + return mCurrentCalibDetailsAccelLn.isUsingDefaultParameters(); + } + + public double[][] getAlignmentMatrixAccel(){ + return mCurrentCalibDetailsAccelLn.getValidAlignmentMatrix(); + } + + public double[][] getSensitivityMatrixAccel(){ + return mCurrentCalibDetailsAccelLn.getValidSensitivityMatrix(); + } + + public double[][] getOffsetVectorMatrixAccel(){ + return mCurrentCalibDetailsAccelLn.getValidOffsetVector(); + } + + public void updateCurrentAccelLnCalibInUse(){ + mCurrentCalibDetailsAccelLn = getCurrentCalibDetailsAccelLn(); + } + + public CalibDetailsKinematic getCurrentCalibDetailsAccelLn(){ + CalibDetails calibPerSensor = getCalibForSensor(Configuration.Shimmer3.SENSOR_ID.SHIMMER_ANALOG_ACCEL, LN_ACCEL_RANGE_VALUE_2G); + if(calibPerSensor!=null){ + return (CalibDetailsKinematic) calibPerSensor; + } + return null; + } +// +// /** +// * Converts the Analog Accel calibration variables from Shimmer Object +// * into a byte array for sending to the Shimmer. +// * +// * @return the bytes array containing the Analog Accel Calibration +// */ +// public byte[] generateCalParamByteArrayAccelLn(){ +// return getCurrentCalibDetailsAccelLn().generateCalParamByteArray(); +// } + + //--------- Sensor specific methods end -------------- + + + + // Constructors for Class START ------------------------------------------ +// public SensorLSM6DSV(SENSORS sensorType) { +// super(sensorType); +// // TODO Auto-generated constructor stub +// } +// +// public SensorLSM6DSV(SENSORS sensorType, ShimmerVerObject svo) { +// super(sensorType, svo); +// } +// +// public SensorLSM6DSV(SENSORS sensorType, ShimmerDevice shimmerDevice) { +// super(sensorType, shimmerDevice); +// } + + public SensorLSM6DSV() { + super(SENSORS.LSM6DSV); + initialise(); + } + + public SensorLSM6DSV(ShimmerVerObject shimmerVerObject) { + super(SENSORS.LSM6DSV, shimmerVerObject); + initialise(); + } + + public SensorLSM6DSV(ShimmerDevice shimmerDevice) { + super(SENSORS.LSM6DSV, shimmerDevice); + initialise(); + } + // Constructors for Class END ------------------------------------------ + + + + @Override + public void generateSensorMap() { + // TODO Auto-generated method stub + super.createLocalSensorMapWithCustomParser(mSensorMapRef, mChannelMapRef); + } + + @Override + public LinkedHashMap generateConfigMap() { + LinkedHashMap mapOfConfig = new LinkedHashMap(); + super.addCalibDetailsToDbMap(mapOfConfig, + getCurrentCalibDetailsAccelLn(), + SensorLSM6DSV.DatabaseConfigHandle.LIST_OF_CALIB_HANDLES_LN_ACC, + SensorLSM6DSV.DatabaseConfigHandle.LN_ACC_CALIB_TIME); + return mapOfConfig; + } + + @Override + public void parseConfigMap(LinkedHashMap mapOfConfigPerShimmer) { + //Analog Accel Calibration Configuration + parseCalibDetailsKinematicFromDb(mapOfConfigPerShimmer, + Configuration.Shimmer3.SENSOR_ID.SHIMMER_ANALOG_ACCEL, + 0, + SensorLSM6DSV.DatabaseConfigHandle.LIST_OF_CALIB_HANDLES_LN_ACC, + SensorLSM6DSV.DatabaseConfigHandle.LN_ACC_CALIB_TIME); + } + + @Override + public void generateConfigOptionsMap() { + // TODO Auto-generated method stub + + } + + @Override + public void generateSensorGroupMapping() { + mSensorGroupingMap = new LinkedHashMap(); + mSensorGroupingMap.put(Configuration.Shimmer3.LABEL_SENSOR_TILE.LOW_NOISE_ACCEL.ordinal(), sensorGroupLnAccelLSM6DSV); + super.updateSensorGroupingMap(); + } + + @Override + public ObjectCluster processDataCustom(SensorDetails sensorDetails, byte[] rawData, COMMUNICATION_TYPE commType, + ObjectCluster objectCluster, boolean isTimeSyncEnabled, double pctimeStampMs) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void checkShimmerConfigBeforeConfiguring() { + // TODO Auto-generated method stub + + } + + @Override + public void configBytesGenerate(ShimmerDevice shimmerDevice, byte[] configBytes, COMMUNICATION_TYPE commType) { + // TODO Auto-generated method stub + + } + + @Override + public void configBytesParse(ShimmerDevice shimmerDevice, byte[] configBytes, COMMUNICATION_TYPE commType) { + // TODO Auto-generated method stub + + } + + @Override + public Object setConfigValueUsingConfigLabel(Integer sensorId, String configLabel, Object valueToSet) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Object getConfigValueUsingConfigLabel(Integer sensorId, String configLabel) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void setSensorSamplingRate(double samplingRateHz) { + // TODO Auto-generated method stub + + } + + @Override + public boolean setDefaultConfigForSensor(int sensorId, boolean isSensorEnabled) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean checkConfigOptionValues(String stringKey) { + // TODO Auto-generated method stub + return false; + } + + @Override + public Object getSettings(String componentName, COMMUNICATION_TYPE commType) { + // TODO Auto-generated method stub + return null; + } + + @Override + public ActionSetting setSettings(String componentName, Object valueToSet, COMMUNICATION_TYPE commType) { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean processResponse(int responseCommand, Object parsedResponse, COMMUNICATION_TYPE commType) { + // TODO Auto-generated method stub + return false; + } + + + + //--------- Optional methods to override in Sensor Class start -------- + @Override + public void initialise() { + super.initialise(); + + updateCurrentAccelLnCalibInUse(); + } + + @Override + public void generateCalibMap() { + super.generateCalibMap(); + + TreeMap calibMapAccelLn = new TreeMap(); + calibMapAccelLn.put(calibDetailsAccelLn2g.mRangeValue, calibDetailsAccelLn2g); + + setCalibrationMapPerSensor(Configuration.Shimmer3.SENSOR_ID.SHIMMER_ANALOG_ACCEL, calibMapAccelLn); + + updateCurrentAccelLnCalibInUse(); + } + //--------- Optional methods to override in Sensor Class end -------- + +} \ No newline at end of file From 3fdc125e7fdffaf033486d4bebfb0776c8bac17d Mon Sep 17 00:00:00 2001 From: Danesh Mariapan <161300025+dmariapan-shimmer@users.noreply.github.com> Date: Wed, 23 Oct 2024 13:35:57 +0800 Subject: [PATCH 2/8] Remove LSM6DSV sensor class unless ShimmerGen3R --- .../java/com/shimmerresearch/driver/ShimmerObject.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java b/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java index 37cd107ee..4e9ba166e 100644 --- a/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java +++ b/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java @@ -4955,11 +4955,8 @@ else if(isSupportedNewImuSensors()){ mSensorMpu9x50 = new SensorMPU9250(this); addSensorClass(mSensorMpu9x50); - - // Added - mSensorLSM6DSV = new SensorLSM6DSV(this); - addSensorClass(mSensorLSM6DSV); } + else{ mSensorBMPX80 = new SensorBMP180(this); addSensorClass(mSensorBMPX80); @@ -4972,11 +4969,8 @@ else if(isSupportedNewImuSensors()){ mSensorMpu9x50 = new SensorMPU9150(this); addSensorClass(mSensorMpu9x50); - - // Added - mSensorLSM6DSV = new SensorLSM6DSV(this); - addSensorClass(mSensorLSM6DSV); } + } else if(isShimmerGen3R()){ mSensorBMPX80 = new SensorBMP280(this); addSensorClass(mSensorBMPX80); From 7a78535d990f77d32fbd0e00a13c45c788941891 Mon Sep 17 00:00:00 2001 From: Danesh Mariapan <161300025+dmariapan-shimmer@users.noreply.github.com> Date: Thu, 24 Oct 2024 14:52:56 +0800 Subject: [PATCH 3/8] Updates & Added Gyro Sensor Details --- .../shimmerresearch/driver/ShimmerObject.java | 8 +- .../sensors/lsm6dsv/SensorLSM6DSV.java | 255 +++++++++++++++++- 2 files changed, 256 insertions(+), 7 deletions(-) diff --git a/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java b/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java index 4e9ba166e..38d72877d 100644 --- a/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java +++ b/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java @@ -4978,13 +4978,9 @@ else if(isSupportedNewImuSensors()){ mSensorLSM303 = new SensorLSM303AH(this); addSensorClass(mSensorLSM303); - mSensorKionixAccel = new SensorKionixKXTC92050(this); - addSensorClass(mSensorKionixAccel); - mSensorMpu9x50 = new SensorMPU9250(this); addSensorClass(mSensorMpu9x50); - // Added mSensorLSM6DSV = new SensorLSM6DSV(this); addSensorClass(mSensorLSM6DSV); } @@ -6123,8 +6119,10 @@ protected CalibDetailsKinematic getCurrentCalibDetailsMag() { protected CalibDetailsKinematic getCurrentCalibDetailsAccelLn() { if(isShimmerGen2()){ return mSensorMMA736x.getCurrentCalibDetailsAccelLn(); - } else { + } else if (isShimmerGen3()){ return mSensorKionixAccel.getCurrentCalibDetailsAccelLn(); + } else { + return mSensorLSM6DSV.getCurrentCalibDetailsAccelLn(); } } diff --git a/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/lsm6dsv/SensorLSM6DSV.java b/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/lsm6dsv/SensorLSM6DSV.java index 4520475a4..9a6df0aee 100644 --- a/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/lsm6dsv/SensorLSM6DSV.java +++ b/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/lsm6dsv/SensorLSM6DSV.java @@ -7,6 +7,8 @@ import java.util.Map; import java.util.TreeMap; +import org.apache.commons.lang3.ArrayUtils; + import com.shimmerresearch.bluetooth.BtCommandDetails; import com.shimmerresearch.driver.Configuration.CHANNEL_UNITS; import com.shimmerresearch.driver.Configuration.COMMUNICATION_TYPE; @@ -14,6 +16,7 @@ import com.shimmerresearch.driver.calibration.CalibDetails; import com.shimmerresearch.driver.calibration.CalibDetailsKinematic; import com.shimmerresearch.driver.calibration.CalibDetails.CALIB_READ_SOURCE; +import com.shimmerresearch.driver.calibration.CalibDetailsKinematic.CALIBRATION_SCALE_FACTOR; import com.shimmerresearch.driver.Configuration; import com.shimmerresearch.driver.ObjectCluster; import com.shimmerresearch.driver.ShimmerDevice; @@ -38,12 +41,17 @@ import com.shimmerresearch.sensors.kionix.SensorKionixKXTC92050.DatabaseConfigHandle; import com.shimmerresearch.sensors.lsm303.SensorLSM303; import com.shimmerresearch.sensors.lsm303.SensorLSM303AH; +import com.shimmerresearch.sensors.mpu9x50.SensorMPU9250; +import com.shimmerresearch.sensors.mpu9x50.SensorMPU9X50; +import com.shimmerresearch.sensors.mpu9x50.SensorMPU9X50.GuiLabelConfig; import com.shimmerresearch.sensors.ActionSetting; public class SensorLSM6DSV extends AbstractSensor{ //--------- Sensor specific variables start -------------- + + // LN ACCEL public static final double[][] AlignmentMatrixLowNoiseAccelShimmer3r = {{-1,0,0},{0,1,0},{0,0,-1}}; public static final double[][] OffsetVectorLowNoiseAccelShimmer3r = {{0},{0},{0}}; @@ -80,11 +88,80 @@ public class SensorLSM6DSV extends AbstractSensor{ LN_ACCEL_RANGE_VALUE_16G, LN_ACCEL_RANGE_STRING_16G, AlignmentMatrixLowNoiseAccelShimmer3r, SensitivityMatrixLowNoiseAccel16gShimmer3r, OffsetVectorLowNoiseAccelShimmer3r); public CalibDetailsKinematic mCurrentCalibDetailsAccelLn16g = calibDetailsAccelLn16g; + + // GYRO + private int mGyroRange = 1; + protected int mLSM6DSVGyroAccelRate=0; + protected int mSensorIdGyro = -1; + + public static final double[][] AlignmentMatrixGyroShimmer3r = {{-1,0,0},{0,1,0},{0,0,-1}}; + public static final double[][] OffsetVectorGyroShimmer3r = {{0},{0},{0}}; + public static final double[][] SensitivityMatrixGyro125dpsShimmer3r = {{229,0,0},{0,229,0},{0,0,229}}; + public static final double[][] SensitivityMatrixGyro250dpsShimmer3r = {{114,0,0},{0,114,0},{0,0,114}}; + public static final double[][] SensitivityMatrixGyro500dpsShimmer3r = {{57,0,0},{0,57,0},{0,0,57}}; + public static final double[][] SensitivityMatrixGyro1000dpsShimmer3r = {{29,0,0},{0,29,0},{0,0,29}}; + public static final double[][] SensitivityMatrixGyro2000dpsShimmer3r = {{14,0,0},{0,14,0},{0,0,14}}; + public static final double[][] SensitivityMatrixGyro4000dpsShimmer3r = {{7,0,0},{0,7,0},{0,0,7}}; + + private CalibDetailsKinematic calibDetailsGyro125 = new CalibDetailsKinematic( + ListofLSM6DSVGyroRangeConfigValues[0], + ListofGyroRange[0], + AlignmentMatrixGyroShimmer3r, + SensitivityMatrixGyro125dpsShimmer3r, + OffsetVectorGyroShimmer3r, + CALIBRATION_SCALE_FACTOR.ONE_HUNDRED); + + private CalibDetailsKinematic calibDetailsGyro250 = new CalibDetailsKinematic( + ListofLSM6DSVGyroRangeConfigValues[1], + ListofGyroRange[1], + AlignmentMatrixGyroShimmer3r, + SensitivityMatrixGyro250dpsShimmer3r, + OffsetVectorGyroShimmer3r, + CALIBRATION_SCALE_FACTOR.ONE_HUNDRED); + + private CalibDetailsKinematic calibDetailsGyro500 = new CalibDetailsKinematic( + ListofLSM6DSVGyroRangeConfigValues[2], + ListofGyroRange[2], + AlignmentMatrixGyroShimmer3r, + SensitivityMatrixGyro500dpsShimmer3r, + OffsetVectorGyroShimmer3r, + CALIBRATION_SCALE_FACTOR.ONE_HUNDRED); + + private CalibDetailsKinematic calibDetailsGyro1000 = new CalibDetailsKinematic( + ListofLSM6DSVGyroRangeConfigValues[3], + ListofGyroRange[3], + AlignmentMatrixGyroShimmer3r, + SensitivityMatrixGyro1000dpsShimmer3r, + OffsetVectorGyroShimmer3r, + CALIBRATION_SCALE_FACTOR.ONE_HUNDRED); + + private CalibDetailsKinematic calibDetailsGyro2000 = new CalibDetailsKinematic( + ListofLSM6DSVGyroRangeConfigValues[4], + ListofGyroRange[4], + AlignmentMatrixGyroShimmer3r, + SensitivityMatrixGyro2000dpsShimmer3r, + OffsetVectorGyroShimmer3r, + CALIBRATION_SCALE_FACTOR.ONE_HUNDRED); + + private CalibDetailsKinematic calibDetailsGyro4000 = new CalibDetailsKinematic( + ListofLSM6DSVGyroRangeConfigValues[5], + ListofGyroRange[5], + AlignmentMatrixGyroShimmer3r, + SensitivityMatrixGyro4000dpsShimmer3r, + OffsetVectorGyroShimmer3r, + CALIBRATION_SCALE_FACTOR.ONE_HUNDRED); + + public CalibDetailsKinematic mCurrentCalibDetailsGyro = calibDetailsGyro250; + public static class DatabaseChannelHandles{ public static final String LN_ACC_X = "LSM6DSV_X"; public static final String LN_ACC_Y = "LSM6DSV_X"; public static final String LN_ACC_Z = "LSM6DSV_X"; + + public static final String GYRO_X = "LSM6DSV_GYRO_X"; + public static final String GYRO_Y = "LSM6DSV_GYRO_Y"; + public static final String GYRO_Z = "LSM6DSV_GYRO_Z"; } public static final class DatabaseConfigHandle{ public static final String LN_ACC_CALIB_TIME = "LSM6DSV_Acc_Calib_Time"; @@ -110,18 +187,61 @@ public static final class DatabaseConfigHandle{ DatabaseConfigHandle.LN_ACC_ALIGN_XX, DatabaseConfigHandle.LN_ACC_ALIGN_XY, DatabaseConfigHandle.LN_ACC_ALIGN_XZ, DatabaseConfigHandle.LN_ACC_ALIGN_YX, DatabaseConfigHandle.LN_ACC_ALIGN_YY, DatabaseConfigHandle.LN_ACC_ALIGN_YZ, DatabaseConfigHandle.LN_ACC_ALIGN_ZX, DatabaseConfigHandle.LN_ACC_ALIGN_ZY, DatabaseConfigHandle.LN_ACC_ALIGN_ZZ); + + + public static final String GYRO_RATE = "LSM6DSV_Gyro_Rate"; + public static final String GYRO_RANGE = "LSM6DSV_Gyro_Range"; + public static final String GYRO_CALIB_TIME = "LSM6DSV_Gyro_Calib_Time"; + + public static final String GYRO_OFFSET_X = "LSM6DSV_Gyro_Offset_X"; + public static final String GYRO_OFFSET_Y = "LSM6DSV_Gyro_Offset_Y"; + public static final String GYRO_OFFSET_Z = "LSM6DSV_Gyro_Offset_Z"; + public static final String GYRO_GAIN_X = "LSM6DSV_Gyro_Gain_X"; + public static final String GYRO_GAIN_Y = "LSM6DSV_Gyro_Gain_Y"; + public static final String GYRO_GAIN_Z = "LSM6DSV_Gyro_Gain_Z"; + public static final String GYRO_ALIGN_XX = "LSM6DSV_Gyro_Align_XX"; + public static final String GYRO_ALIGN_XY = "LSM6DSV_Gyro_Align_XY"; + public static final String GYRO_ALIGN_XZ = "LSM6DSV_Gyro_Align_XZ"; + public static final String GYRO_ALIGN_YX = "LSM6DSV_Gyro_Align_YX"; + public static final String GYRO_ALIGN_YY = "LSM6DSV_Gyro_Align_YY"; + public static final String GYRO_ALIGN_YZ = "LSM6DSV_Gyro_Align_YZ"; + public static final String GYRO_ALIGN_ZX = "LSM6DSV_Gyro_Align_ZX"; + public static final String GYRO_ALIGN_ZY = "LSM6DSV_Gyro_Align_ZY"; + public static final String GYRO_ALIGN_ZZ = "LSM6DSV_Gyro_Align_ZZ"; + + public static final List LIST_OF_CALIB_HANDLES_GYRO = Arrays.asList( + DatabaseConfigHandle.GYRO_OFFSET_X, DatabaseConfigHandle.GYRO_OFFSET_Y, DatabaseConfigHandle.GYRO_OFFSET_Z, + DatabaseConfigHandle.GYRO_GAIN_X, DatabaseConfigHandle.GYRO_GAIN_Y, DatabaseConfigHandle.GYRO_GAIN_Z, + DatabaseConfigHandle.GYRO_ALIGN_XX, DatabaseConfigHandle.GYRO_ALIGN_XY, DatabaseConfigHandle.GYRO_ALIGN_XZ, + DatabaseConfigHandle.GYRO_ALIGN_YX, DatabaseConfigHandle.GYRO_ALIGN_YY, DatabaseConfigHandle.GYRO_ALIGN_YZ, + DatabaseConfigHandle.GYRO_ALIGN_ZX, DatabaseConfigHandle.GYRO_ALIGN_ZY, DatabaseConfigHandle.GYRO_ALIGN_ZZ); + } + + public class GuiLabelConfig{ + public static final String LSM6DSV_ACCEL_DEFAULT_CALIB = "Low Noise Accel Default Calibration"; + public static final String LSM6DSV_ACCEL_VALID_CALIB = "Low Noise Accel Valid Calibration"; + public static final String LSM6DSV_ACCEL_CALIB_PARAM = "Low Noise Accel Calibration Details"; + + public static final String LSM6DSV_GYRO_RANGE = "Gyro Range"; + public static final String LSM6DSV_GYRO_RATE = "Gyro Sampling Rate"; + public static final String LSM6DSV_GYRO_RATE_HZ = "Gyro Sampling Rate Hertz"; } public static class ObjectClusterSensorName{ public static String ACCEL_LN_X = "Accel_LN_X"; public static String ACCEL_LN_Y = "Accel_LN_Y"; public static String ACCEL_LN_Z = "Accel_LN_Z"; + + public static String GYRO_X = "Gyro_X"; + public static String GYRO_Y = "Gyro_Y"; + public static String GYRO_Z = "Gyro_Z"; } public CalibDetailsKinematic mCurrentCalibDetailsAccelLn = null; public class GuiLabelSensors{ public static final String ACCEL_LN = "Low-Noise Accelerometer"; + public static final String GYRO = "Gyroscope"; } public class LABEL_SENSOR_TILE{ @@ -132,6 +252,7 @@ public class LABEL_SENSOR_TILE{ //--------- Configuration options start -------------- + // ACCEL_LN public static final Integer[] ListofLSM6DSVAccelRangeConfigValues={0,1,2,3}; public static final String[] ListofLSM6DSVGyroRate={"Power-down","1.875Hz","7.5Hz","12.0Hz","30.0Hz","60.0Hz","120.0Hz","240.0Hz","480.0Hz","960.0Hz","1920.0Hz","3840.0Hz","7680.0Hz"}; @@ -186,6 +307,10 @@ public class LABEL_SENSOR_TILE{ // SensorLSM303.GuiLabelConfig.LSM303_ACCEL_LPM, // SensorLSM303AH.DatabaseConfigHandle.WR_ACC_LPM, // ConfigOptionDetailsSensor.GUI_COMPONENT_TYPE.CHECKBOX); + + // GYRO + public static final String[] ListofGyroRange = {"+/- 125dps","+/- 250dps","+/- 500dps","+/- 1000dps","+/- 2000dps","+/- 4000dps"}; + public static final Integer[] ListofLSM6DSVGyroRangeConfigValues = {0,1,2,3,4,5}; //--------- Configuration options end -------------- @@ -201,10 +326,23 @@ public class LABEL_SENSOR_TILE{ SensorLSM6DSV.ObjectClusterSensorName.ACCEL_LN_Y, SensorLSM6DSV.ObjectClusterSensorName.ACCEL_LN_Z)); + public static final SensorDetailsRef sensorLSM6DSVGyroRef = new SensorDetailsRef(0x40<<(0*8), 0x40<<(0*8), GuiLabelSensors.GYRO, + CompatibilityInfoForMaps.listOfCompatibleVersionInfoMPU9250, + Arrays.asList(Configuration.Shimmer3.SENSOR_ID.SHIMMER_MPU9X50_MPL_GYRO), + Arrays.asList( + GuiLabelConfig.LSM6DSV_GYRO_RANGE, + GuiLabelConfig.LSM6DSV_GYRO_RATE), + Arrays.asList( + ObjectClusterSensorName.GYRO_X, + ObjectClusterSensorName.GYRO_Y, + ObjectClusterSensorName.GYRO_Z), + false); + public static final Map mSensorMapRef; static { Map aMap = new LinkedHashMap(); aMap.put(Configuration.Shimmer3.SENSOR_ID.SHIMMER_ANALOG_ACCEL, SensorLSM6DSV.sensorLSM6DSV); + aMap.put(Configuration.Shimmer3.SENSOR_ID.SHIMMER_MPU9X50_GYRO, SensorLSM6DSV.sensorLSM6DSVGyroRef); mSensorMapRef = Collections.unmodifiableMap(aMap); } @@ -213,6 +351,7 @@ public class LABEL_SENSOR_TILE{ //--------- Channel info start -------------- // To Be Changed + // LN ACCEL public static final ChannelDetails channelAccelX = new ChannelDetails( ObjectClusterSensorName.ACCEL_LN_X, ObjectClusterSensorName.ACCEL_LN_X, @@ -223,7 +362,6 @@ public class LABEL_SENSOR_TILE{ Arrays.asList(CHANNEL_TYPE.CAL, CHANNEL_TYPE.UNCAL), 0x00); - public static final ChannelDetails channelAccelY = new ChannelDetails( ObjectClusterSensorName.ACCEL_LN_Y, ObjectClusterSensorName.ACCEL_LN_Y, @@ -234,7 +372,6 @@ public class LABEL_SENSOR_TILE{ Arrays.asList(CHANNEL_TYPE.CAL, CHANNEL_TYPE.UNCAL), 0x01); - public static final ChannelDetails channelAccelZ = new ChannelDetails( ObjectClusterSensorName.ACCEL_LN_Z, ObjectClusterSensorName.ACCEL_LN_Z, @@ -245,6 +382,33 @@ public class LABEL_SENSOR_TILE{ Arrays.asList(CHANNEL_TYPE.CAL, CHANNEL_TYPE.UNCAL), 0x02); + // GYRO + public static final ChannelDetails channelGyroX = new ChannelDetails( + ObjectClusterSensorName.GYRO_X, + ObjectClusterSensorName.GYRO_X, + DatabaseChannelHandles.GYRO_X, + CHANNEL_DATA_TYPE.INT16, 2, CHANNEL_DATA_ENDIAN.MSB, + CHANNEL_UNITS.DEGREES_PER_SECOND, + Arrays.asList(CHANNEL_TYPE.CAL, CHANNEL_TYPE.UNCAL), + 0x0A); + + public static final ChannelDetails channelGyroY = new ChannelDetails( + ObjectClusterSensorName.GYRO_Y, + ObjectClusterSensorName.GYRO_Y, + DatabaseChannelHandles.GYRO_Y, + CHANNEL_DATA_TYPE.INT16, 2, CHANNEL_DATA_ENDIAN.MSB, + CHANNEL_UNITS.DEGREES_PER_SECOND, + Arrays.asList(CHANNEL_TYPE.CAL, CHANNEL_TYPE.UNCAL), + 0x0B); + + public static final ChannelDetails channelGyroZ = new ChannelDetails( + ObjectClusterSensorName.GYRO_Z, + ObjectClusterSensorName.GYRO_Z, + DatabaseChannelHandles.GYRO_Z, + CHANNEL_DATA_TYPE.INT16, 2, CHANNEL_DATA_ENDIAN.MSB, + CHANNEL_UNITS.DEGREES_PER_SECOND, + Arrays.asList(CHANNEL_TYPE.CAL, CHANNEL_TYPE.UNCAL), + 0x0C); public static final Map mChannelMapRef; static { @@ -252,6 +416,10 @@ public class LABEL_SENSOR_TILE{ aMap.put(SensorLSM6DSV.ObjectClusterSensorName.ACCEL_LN_X, SensorLSM6DSV.channelAccelX); aMap.put(SensorLSM6DSV.ObjectClusterSensorName.ACCEL_LN_Y, SensorLSM6DSV.channelAccelY); aMap.put(SensorLSM6DSV.ObjectClusterSensorName.ACCEL_LN_Z, SensorLSM6DSV.channelAccelZ); + + aMap.put(ObjectClusterSensorName.GYRO_X, SensorLSM6DSV.channelGyroX); + aMap.put(ObjectClusterSensorName.GYRO_Y, SensorLSM6DSV.channelGyroY); + aMap.put(ObjectClusterSensorName.GYRO_Z, SensorLSM6DSV.channelGyroZ); mChannelMapRef = Collections.unmodifiableMap(aMap); } //--------- Channel info end -------------- @@ -366,6 +534,61 @@ public SensorLSM6DSV(ShimmerDevice shimmerDevice) { // Constructors for Class END ------------------------------------------ + // GYRO Methods ---------------------------------------------------------- + public int getGyroRange(){ + return mGyroRange; + } + + public int getLSM6DSVGyroAccelRate() { + return mLSM6DSVGyroAccelRate; + } + + public CalibDetailsKinematic getCurrentCalibDetailsGyro(){ + return mCurrentCalibDetailsGyro; + } + + public void setLSM6DSVGyroAccelRate(int rate) { + mLSM6DSVGyroAccelRate = rate; + } + + public void setGyroRange(int gyroRange){ + setLSM6DSVGyroRange(gyroRange); + } + + public void setLSM6DSVGyroRange(int i){ + if(ArrayUtils.contains(ListofLSM6DSVGyroRangeConfigValues, i)){ +// //Gyro rate can not be set to 250dps when DMP is on +// if((checkIfAnyMplChannelEnabled()) && (i==0)){ +// i=1; +// } + + if(checkIfAnyMplChannelEnabled()){ + i=3; // 2000dps + } + + mGyroRange = i; + updateCurrentGyroCalibInUse(); + } + } + + public boolean checkIfAnyMplChannelEnabled(){ + if(mShimmerVerObject.isSupportedMpl()){ + if(mSensorMap.keySet().size()>0){ + for(int key:SensorMPU9X50.mListOfMplChannels){ +// for(int key:mListOfMplChannels){ + if(isSensorEnabled(key)) { + return true; + } + } + } + } + return false; + } + // GYRO Methods end ------------------------------------------------------ + + + + @Override public void generateSensorMap() { @@ -376,10 +599,20 @@ public void generateSensorMap() { @Override public LinkedHashMap generateConfigMap() { LinkedHashMap mapOfConfig = new LinkedHashMap(); + + mapOfConfig.put(SensorMPU9250.DatabaseConfigHandle.GYRO_RANGE, getGyroRange()); + mapOfConfig.put(SensorMPU9250.DatabaseConfigHandle.GYRO_RATE, getLSM6DSVGyroAccelRate()); + super.addCalibDetailsToDbMap(mapOfConfig, getCurrentCalibDetailsAccelLn(), SensorLSM6DSV.DatabaseConfigHandle.LIST_OF_CALIB_HANDLES_LN_ACC, SensorLSM6DSV.DatabaseConfigHandle.LN_ACC_CALIB_TIME); + + super.addCalibDetailsToDbMap(mapOfConfig, + getCurrentCalibDetailsGyro(), + DatabaseConfigHandle.LIST_OF_CALIB_HANDLES_GYRO, + DatabaseConfigHandle.GYRO_CALIB_TIME); + return mapOfConfig; } @@ -391,6 +624,20 @@ public void parseConfigMap(LinkedHashMap mapOfConfigPerShimmer) 0, SensorLSM6DSV.DatabaseConfigHandle.LIST_OF_CALIB_HANDLES_LN_ACC, SensorLSM6DSV.DatabaseConfigHandle.LN_ACC_CALIB_TIME); + + if(mapOfConfigPerShimmer.containsKey(DatabaseConfigHandle.GYRO_RATE)){ + setLSM6DSVGyroAccelRate(((Double) mapOfConfigPerShimmer.get(DatabaseConfigHandle.GYRO_RATE)).intValue()); + } + if(mapOfConfigPerShimmer.containsKey(DatabaseConfigHandle.GYRO_RANGE)){ + setGyroRange(((Double) mapOfConfigPerShimmer.get(DatabaseConfigHandle.GYRO_RANGE)).intValue()); + } + + //Gyroscope Calibration Configuration + parseCalibDetailsKinematicFromDb(mapOfConfigPerShimmer, + mSensorIdGyro, + getGyroRange(), + SensorLSM6DSV.DatabaseConfigHandle.LIST_OF_CALIB_HANDLES_GYRO, + SensorLSM6DSV.DatabaseConfigHandle.GYRO_CALIB_TIME); } @Override @@ -502,4 +749,8 @@ public void generateCalibMap() { } //--------- Optional methods to override in Sensor Class end -------- + public void updateCurrentGyroCalibInUse(){ + mCurrentCalibDetailsGyro = getCurrentCalibDetailsIfKinematic(mSensorIdGyro, getGyroRange()); + } + } \ No newline at end of file From 44604e87250113530c779d15b0708bd110e39fb1 Mon Sep 17 00:00:00 2001 From: Danesh Mariapan <161300025+dmariapan-shimmer@users.noreply.github.com> Date: Fri, 25 Oct 2024 15:06:31 +0800 Subject: [PATCH 4/8] Updates Made Accel_LN and Gyro --- .../shimmerresearch/driver/Configuration.java | 31 ++- .../shimmerresearch/driver/ShimmerObject.java | 3 +- .../sensors/lsm6dsv/SensorLSM6DSV.java | 190 ++++++++++-------- 3 files changed, 133 insertions(+), 91 deletions(-) diff --git a/ShimmerDriver/src/main/java/com/shimmerresearch/driver/Configuration.java b/ShimmerDriver/src/main/java/com/shimmerresearch/driver/Configuration.java index a26d23f27..24a3a4153 100644 --- a/ShimmerDriver/src/main/java/com/shimmerresearch/driver/Configuration.java +++ b/ShimmerDriver/src/main/java/com/shimmerresearch/driver/Configuration.java @@ -87,6 +87,7 @@ import com.shimmerresearch.sensors.lsm303.SensorLSM303DLHC; import com.shimmerresearch.sensors.mpu9x50.SensorMPU9150; import com.shimmerresearch.sensors.mpu9x50.SensorMPU9X50; +import com.shimmerresearch.sensors.lsm6dsv.SensorLSM6DSV; import com.shimmerresearch.verisense.sensors.SensorLSM6DS3; import com.shimmerresearch.verisense.sensors.SensorLIS2DW12; import com.shimmerresearch.verisense.sensors.SensorBattVoltageVerisense; @@ -721,6 +722,9 @@ public class SENSOR_ID{ //public static final int SHIMMER_LSM303DLHC_TEMPERATURE = 26; // not yet implemented //public static final int SHIMMER_MPU9150_MPL_TEMPERATURE = 1<<17; // same as SENSOR_SHIMMER3_MPU9150_TEMP + public static final int SHIMMER_LSM6DSV_ACCEL_LN = 37; + public static final int SHIMMER_LSM6DSV_GYRO = 38; + public static final int SHIMMER_MPU9X50_MPL_QUAT_6DOF = 50; public static final int SHIMMER_MPU9X50_MPL_QUAT_9DOF = 51; public static final int SHIMMER_MPU9X50_MPL_EULER_6DOF = 52; @@ -887,9 +891,11 @@ public class GuiLabelConfig{ */ public enum LABEL_SENSOR_TILE{ STREAMING_PROPERTIES(SensorShimmerClock.LABEL_SENSOR_TILE.STREAMING_PROPERTIES), - LOW_NOISE_ACCEL(SensorKionixAccel.LABEL_SENSOR_TILE.LOW_NOISE_ACCEL), +// LOW_NOISE_ACCEL(SensorKionixAccel.LABEL_SENSOR_TILE.LOW_NOISE_ACCEL), + LOW_NOISE_ACCEL(SensorLSM6DSV.LABEL_SENSOR_TILE.LOW_NOISE_ACCEL), WIDE_RANGE_ACCEL(SensorLSM303.LABEL_SENSOR_TILE.WIDE_RANGE_ACCEL), - GYRO(SensorMPU9X50.LABEL_SENSOR_TILE.GYRO), +// GYRO(SensorMPU9X50.LABEL_SENSOR_TILE.GYRO), + GYRO(SensorLSM6DSV.LABEL_SENSOR_TILE.GYRO), MAG(SensorLSM303.LABEL_SENSOR_TILE.MAG), PRESSURE_TEMPERATURE_BMP180(SensorBMP180.LABEL_SENSOR_TILE.PRESSURE_TEMPERATURE), PRESSURE_TEMPERATURE_BMP280(SensorBMP280.LABEL_SENSOR_TILE.PRESSURE_TEMPERATURE), @@ -1421,6 +1427,17 @@ public static class CompatibilityInfoForMaps{ svoProto3MiniNewImuSdLog, svoProto3MiniNewImuLogAndStream, svoProto3DeluxeNewImuSdLog, svoProto3DeluxeNewImuLogAndStream, svoShimmer4Stock); + + // Added LSM6DSV Gyro + public static final List listOfCompatibleVersionInfoLSM6DSVGyro = Arrays.asList( + svoNewImuSdLog, svoNewImuLogAndStream, svoShimmer3RLogAndStream, + svoNewImuAnyExpBrdSdLog, svoNewImuAnyExpBrdLogAndStream, + svoGsrUnifiedNewImuSdLog, svoGsrUnifiedNewImuLogAndStream, + svoExgUnifiedNewImuSdLog, svoExgUnifiedNewImuLogAndStream, + svoBrAmpUnifiedNewImuSdLog, svoBrAmpUnifiedNewImuLogAndStream, + svoProto3MiniNewImuSdLog, svoProto3MiniNewImuLogAndStream, + svoProto3DeluxeNewImuSdLog, svoProto3DeluxeNewImuLogAndStream, + svoShimmer4Stock); public static final List listOfCompatibleVersionInfoLSM303AH = Arrays.asList( svoNewImuSdLog, svoNewImuLogAndStream, svoShimmer3RLogAndStream, @@ -1444,6 +1461,16 @@ public static class CompatibilityInfoForMaps{ svoBrAmpUnifiedNewImuSdLog, svoBrAmpUnifiedNewImuLogAndStream, svoProto3MiniNewImuSdLog, svoProto3MiniNewImuLogAndStream, svoProto3DeluxeNewImuSdLog, svoProto3DeluxeNewImuLogAndStream); + + // Added LSM6DSV Accel + public static final List listOfCompatibleVersionInfoLSM6DSVAccel = Arrays.asList( + svoNewImuSdLog, svoNewImuLogAndStream, svoShimmer3RLogAndStream, + svoNewImuAnyExpBrdSdLog, svoNewImuAnyExpBrdLogAndStream, + svoGsrUnifiedNewImuSdLog, svoGsrUnifiedNewImuLogAndStream, + svoExgUnifiedNewImuSdLog, svoExgUnifiedNewImuLogAndStream, + svoBrAmpUnifiedNewImuSdLog, svoBrAmpUnifiedNewImuLogAndStream, + svoProto3MiniNewImuSdLog, svoProto3MiniNewImuLogAndStream, + svoProto3DeluxeNewImuSdLog, svoProto3DeluxeNewImuLogAndStream); public static final List listOfCompatibleVersionInfoBrAmp = Arrays.asList( svoBrAmpSdLog, svoBrAmpBtStream, svoBrAmpLogAndStream, diff --git a/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java b/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java index 38d72877d..591f9184d 100644 --- a/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java +++ b/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java @@ -6121,9 +6121,10 @@ protected CalibDetailsKinematic getCurrentCalibDetailsAccelLn() { return mSensorMMA736x.getCurrentCalibDetailsAccelLn(); } else if (isShimmerGen3()){ return mSensorKionixAccel.getCurrentCalibDetailsAccelLn(); - } else { + } else if (isShimmerGen3R()){ return mSensorLSM6DSV.getCurrentCalibDetailsAccelLn(); } + return null; } @Override diff --git a/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/lsm6dsv/SensorLSM6DSV.java b/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/lsm6dsv/SensorLSM6DSV.java index 9a6df0aee..14ec33771 100644 --- a/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/lsm6dsv/SensorLSM6DSV.java +++ b/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/lsm6dsv/SensorLSM6DSV.java @@ -44,6 +44,7 @@ import com.shimmerresearch.sensors.mpu9x50.SensorMPU9250; import com.shimmerresearch.sensors.mpu9x50.SensorMPU9X50; import com.shimmerresearch.sensors.mpu9x50.SensorMPU9X50.GuiLabelConfig; +import com.shimmerresearch.sensors.mpu9x50.SensorMPU9X50.LABEL_SENSOR_TILE; import com.shimmerresearch.sensors.ActionSetting; public class SensorLSM6DSV extends AbstractSensor{ @@ -163,6 +164,7 @@ public static class DatabaseChannelHandles{ public static final String GYRO_Y = "LSM6DSV_GYRO_Y"; public static final String GYRO_Z = "LSM6DSV_GYRO_Z"; } + public static final class DatabaseConfigHandle{ public static final String LN_ACC_CALIB_TIME = "LSM6DSV_Acc_Calib_Time"; public static final String LN_ACC_OFFSET_X = "LSM6DSV_Acc_Offset_X"; @@ -225,6 +227,7 @@ public class GuiLabelConfig{ public static final String LSM6DSV_GYRO_RANGE = "Gyro Range"; public static final String LSM6DSV_GYRO_RATE = "Gyro Sampling Rate"; public static final String LSM6DSV_GYRO_RATE_HZ = "Gyro Sampling Rate Hertz"; + public static final String LSM6DSV_GYRO_LPM = "Gyro Low-Power Mode"; } public static class ObjectClusterSensorName{ @@ -246,6 +249,8 @@ public class GuiLabelSensors{ public class LABEL_SENSOR_TILE{ public static final String LOW_NOISE_ACCEL = GuiLabelSensors.ACCEL_LN; + public static final String GYRO = GuiLabelSensors.GYRO; + } //--------- Sensor specific variables end -------------- @@ -254,63 +259,33 @@ public class LABEL_SENSOR_TILE{ //--------- Configuration options start -------------- // ACCEL_LN public static final Integer[] ListofLSM6DSVAccelRangeConfigValues={0,1,2,3}; - public static final String[] ListofLSM6DSVGyroRate={"Power-down","1.875Hz","7.5Hz","12.0Hz","30.0Hz","60.0Hz","120.0Hz","240.0Hz","480.0Hz","960.0Hz","1920.0Hz","3840.0Hz","7680.0Hz"}; public static final Integer[] ListofLSM6DSVGyroRateConfigValues={0,1,2,3,4,5,6,7,8,9,10,11,12,13}; - -// public static final String[] ListofLSM303AHAccelRateLpm={"Power-down","1.0Hz","12.5Hz","25.0Hz","50.0Hz","100.0Hz","200.0Hz","400.0Hz","800.0Hz"}; -// public static final Integer[] ListofLSM303AHAccelRateLpmConfigValues={0,8,9,10,11,12,13,14,15}; -// -// public static final ConfigOptionDetailsSensor configOptionAccelRange = new ConfigOptionDetailsSensor( -// SensorLSM303.GuiLabelConfig.LSM303_ACCEL_RANGE, -// SensorLSM303AH.DatabaseConfigHandle.WR_ACC_RANGE, -// ListofLSM303AccelRange, -// ListofLSM303AccelRangeConfigValues, -// ConfigOptionDetailsSensor.GUI_COMPONENT_TYPE.COMBOBOX, -// CompatibilityInfoForMaps.listOfCompatibleVersionInfoLSM303AH); -// -// public static final ConfigOptionDetailsSensor configOptionAccelRate = new ConfigOptionDetailsSensor( -// SensorLSM303.GuiLabelConfig.LSM303_ACCEL_RATE, -// SensorLSM303AH.DatabaseConfigHandle.WR_ACC_RATE, -// ListofLSM303AHAccelRateHr, -// ListofLSM303AHAccelRateHrConfigValues, -// ConfigOptionDetailsSensor.GUI_COMPONENT_TYPE.COMBOBOX, -// CompatibilityInfoForMaps.listOfCompatibleVersionInfoLSM303AH, -// Arrays.asList( -// new ConfigOptionObject(ConfigOptionDetailsSensor.VALUE_INDEXES.LSM303_ACCEL_RATE.IS_LPM, -// ListofLSM303AHAccelRateLpm, -// ListofLSM303AHAccelRateLpmConfigValues))); -// -// public static final String[] ListofLSM303AHMagRate={"10.0Hz","20.0Hz","50.0Hz","100.0Hz"}; -// public static final Integer[] ListofLSM303AHMagRateConfigValues={0,1,2,3}; -// -// public static final String[] ListofLSM303AHMagRange={"+/- 49.152Ga"}; -// public static final Integer[] ListofLSM303AHMagRangeConfigValues={0}; -// -// public static final ConfigOptionDetailsSensor configOptionMagRange = new ConfigOptionDetailsSensor( -// SensorLSM303.GuiLabelConfig.LSM303_MAG_RANGE, -// SensorLSM303AH.DatabaseConfigHandle.MAG_RANGE, -// ListofLSM303AHMagRange, -// ListofLSM303AHMagRangeConfigValues, -// ConfigOptionDetailsSensor.GUI_COMPONENT_TYPE.COMBOBOX, -// CompatibilityInfoForMaps.listOfCompatibleVersionInfoLSM303AH); -// -// public static final ConfigOptionDetailsSensor configOptionMagRate = new ConfigOptionDetailsSensor( -// SensorLSM303.GuiLabelConfig.LSM303_MAG_RATE, -// SensorLSM303AH.DatabaseConfigHandle.MAG_RATE, -// ListofLSM303AHMagRate, -// ListofLSM303AHMagRateConfigValues, -// ConfigOptionDetailsSensor.GUI_COMPONENT_TYPE.COMBOBOX, -// CompatibilityInfoForMaps.listOfCompatibleVersionInfoLSM303AH); -// -// public static final ConfigOptionDetailsSensor configOptionAccelLpm = new ConfigOptionDetailsSensor( -// SensorLSM303.GuiLabelConfig.LSM303_ACCEL_LPM, -// SensorLSM303AH.DatabaseConfigHandle.WR_ACC_LPM, -// ConfigOptionDetailsSensor.GUI_COMPONENT_TYPE.CHECKBOX); // GYRO public static final String[] ListofGyroRange = {"+/- 125dps","+/- 250dps","+/- 500dps","+/- 1000dps","+/- 2000dps","+/- 4000dps"}; public static final Integer[] ListofLSM6DSVGyroRangeConfigValues = {0,1,2,3,4,5}; + + public static final ConfigOptionDetailsSensor configOptionLSM6DSVGyroRange = new ConfigOptionDetailsSensor( + SensorLSM6DSV.GuiLabelConfig.LSM6DSV_GYRO_RANGE, + SensorLSM6DSV.DatabaseConfigHandle.GYRO_RANGE, + ListofGyroRange, + ListofLSM6DSVGyroRangeConfigValues, + ConfigOptionDetailsSensor.GUI_COMPONENT_TYPE.COMBOBOX, + CompatibilityInfoForMaps.listOfCompatibleVersionInfoAnyExpBoardStandardFW); + + //General Config + public static final ConfigOptionDetailsSensor configOptionLSM6DSVGyroRate = new ConfigOptionDetailsSensor( + SensorLSM6DSV.GuiLabelConfig.LSM6DSV_GYRO_RATE, + SensorLSM6DSV.DatabaseConfigHandle.GYRO_RATE, + ConfigOptionDetailsSensor.GUI_COMPONENT_TYPE.TEXTFIELD, + CompatibilityInfoForMaps.listOfCompatibleVersionInfoAnyExpBoardStandardFW); + + public static final ConfigOptionDetailsSensor configOptionLSM6DSVGyroLpm = new ConfigOptionDetailsSensor( + SensorLSM6DSV.GuiLabelConfig.LSM6DSV_GYRO_LPM, + null, + ConfigOptionDetailsSensor.GUI_COMPONENT_TYPE.CHECKBOX, + CompatibilityInfoForMaps.listOfCompatibleVersionInfoAnyExpBoardStandardFW); //--------- Configuration options end -------------- @@ -320,7 +295,7 @@ public class LABEL_SENSOR_TILE{ 0x80, //== Configuration.Shimmer3.SensorBitmap.SENSOR_A_ACCEL will be: SensorBitmap.SENSOR_A_ACCEL, // To Be Changed 0x80, //== Configuration.Shimmer3.SensorBitmap.SENSOR_A_ACCEL will be: SensorBitmap.SENSOR_A_ACCEL, GuiLabelSensors.ACCEL_LN, - CompatibilityInfoForMaps.listOfCompatibleVersionInfoKionixKXTC92050, + CompatibilityInfoForMaps.listOfCompatibleVersionInfoLSM6DSVAccel, null, Arrays.asList(SensorLSM6DSV.ObjectClusterSensorName.ACCEL_LN_X, SensorLSM6DSV.ObjectClusterSensorName.ACCEL_LN_Y, @@ -328,7 +303,7 @@ public class LABEL_SENSOR_TILE{ public static final SensorDetailsRef sensorLSM6DSVGyroRef = new SensorDetailsRef(0x40<<(0*8), 0x40<<(0*8), GuiLabelSensors.GYRO, CompatibilityInfoForMaps.listOfCompatibleVersionInfoMPU9250, - Arrays.asList(Configuration.Shimmer3.SENSOR_ID.SHIMMER_MPU9X50_MPL_GYRO), + Arrays.asList(Configuration.Shimmer3.SENSOR_ID.SHIMMER_LSM6DSV_GYRO), Arrays.asList( GuiLabelConfig.LSM6DSV_GYRO_RANGE, GuiLabelConfig.LSM6DSV_GYRO_RATE), @@ -341,8 +316,8 @@ public class LABEL_SENSOR_TILE{ public static final Map mSensorMapRef; static { Map aMap = new LinkedHashMap(); - aMap.put(Configuration.Shimmer3.SENSOR_ID.SHIMMER_ANALOG_ACCEL, SensorLSM6DSV.sensorLSM6DSV); - aMap.put(Configuration.Shimmer3.SENSOR_ID.SHIMMER_MPU9X50_GYRO, SensorLSM6DSV.sensorLSM6DSVGyroRef); + aMap.put(Configuration.Shimmer3.SENSOR_ID.SHIMMER_LSM6DSV_ACCEL_LN, SensorLSM6DSV.sensorLSM6DSV); + aMap.put(Configuration.Shimmer3.SENSOR_ID.SHIMMER_LSM6DSV_GYRO, SensorLSM6DSV.sensorLSM6DSVGyroRef); mSensorMapRef = Collections.unmodifiableMap(aMap); } @@ -426,12 +401,13 @@ public class LABEL_SENSOR_TILE{ public static final SensorGroupingDetails sensorGroupLnAccelLSM6DSV = new SensorGroupingDetails( SensorLSM6DSV.LABEL_SENSOR_TILE.LOW_NOISE_ACCEL, - Arrays.asList(Configuration.Shimmer3.SENSOR_ID.SHIMMER_ANALOG_ACCEL), - CompatibilityInfoForMaps.listOfCompatibleVersionInfoKionixKXTC92050); + Arrays.asList(Configuration.Shimmer3.SENSOR_ID.SHIMMER_LSM6DSV_ACCEL_LN), + CompatibilityInfoForMaps.listOfCompatibleVersionInfoLSM6DSVAccel); //--------- Bluetooth commands start -------------- + // ACCEL_LN public static final byte SET_LN_ACCEL_CALIBRATION_COMMAND = (byte) 0x11; public static final byte LN_ACCEL_CALIBRATION_RESPONSE = (byte) 0x12; public static final byte GET_LN_ACCEL_CALIBRATION_COMMAND = (byte) 0x13; @@ -439,7 +415,41 @@ public class LABEL_SENSOR_TILE{ public static final byte SET_ALT_ACCEL_RANGE_COMMAND = (byte) 0x4F; public static final byte ALT_ACCEL_RANGE_RESPONSE = (byte) 0x50; public static final byte GET_ALT_ACCEL_RANGE_COMMAND = (byte) 0x51; - + + //GYRO + public static final byte SET_GYRO_CALIBRATION_COMMAND = (byte) 0x14; + public static final byte GYRO_CALIBRATION_RESPONSE = (byte) 0x15; + public static final byte GET_GYRO_CALIBRATION_COMMAND = (byte) 0x16; + public static final byte SET_LSM6DSV_GYRO_RANGE_COMMAND = (byte) 0x49; + public static final byte LSM6DSV_GYRO_RANGE_RESPONSE = (byte) 0x4A; + public static final byte GET_LSM6DSV_GYRO_RANGE_COMMAND = (byte) 0x4B; + public static final byte SET_LSM6DSV_SAMPLING_RATE_COMMAND = (byte) 0x4C; + public static final byte LSM6DSV_SAMPLING_RATE_RESPONSE = (byte) 0x4D; + public static final byte GET_LSM6DSV_SAMPLING_RATE_COMMAND = (byte) 0x4E; + + public static final Map mBtGetCommandMap; + static { + Map aMap = new LinkedHashMap(); + + aMap.put(GET_LN_ACCEL_CALIBRATION_COMMAND, new BtCommandDetails(GET_LN_ACCEL_CALIBRATION_COMMAND,"GET_LN_ACCEL_CALIBRATION_COMMAND",LN_ACCEL_CALIBRATION_RESPONSE)); + + aMap.put(GET_GYRO_CALIBRATION_COMMAND, new BtCommandDetails(GET_GYRO_CALIBRATION_COMMAND, "GET_GYRO CALIBRATION_COMMAND", GYRO_CALIBRATION_RESPONSE)); + aMap.put(GET_LSM6DSV_GYRO_RANGE_COMMAND, new BtCommandDetails(GET_LSM6DSV_GYRO_RANGE_COMMAND, "GET_LSM6DSV GYRO RANGE_COMMAND", LSM6DSV_GYRO_RANGE_RESPONSE)); + aMap.put(GET_LSM6DSV_SAMPLING_RATE_COMMAND, new BtCommandDetails(GET_LSM6DSV_SAMPLING_RATE_COMMAND, "GET_LSM6DSV_SAMPLING_RATE_COMMAND", LSM6DSV_SAMPLING_RATE_RESPONSE)); + mBtGetCommandMap = Collections.unmodifiableMap(aMap); + } + + public static final Map mBtSetCommandMap; + static { + Map aMap = new LinkedHashMap(); + + aMap.put(SET_LN_ACCEL_CALIBRATION_COMMAND, new BtCommandDetails(SET_LN_ACCEL_CALIBRATION_COMMAND, "SET_LN_ACCEL_CALIBRATION_COMMAND")); + + aMap.put(SET_GYRO_CALIBRATION_COMMAND, new BtCommandDetails(SET_GYRO_CALIBRATION_COMMAND, "SET_GYRO_CALIBRATION_COMMAND")); + aMap.put(SET_LSM6DSV_GYRO_RANGE_COMMAND, new BtCommandDetails(SET_LSM6DSV_GYRO_RANGE_COMMAND, "SET_LSM6DSV_GYRO_RANGE_COMMAND")); + aMap.put(SET_LSM6DSV_SAMPLING_RATE_COMMAND, new BtCommandDetails(SET_LSM6DSV_SAMPLING_RATE_COMMAND, "SET_LSM6DSV_SAMPLING_RATE_COMMAND")); + mBtSetCommandMap = Collections.unmodifiableMap(aMap); + } //--------- Bluetooth commands end -------------- @@ -482,41 +492,17 @@ public void updateCurrentAccelLnCalibInUse(){ } public CalibDetailsKinematic getCurrentCalibDetailsAccelLn(){ - CalibDetails calibPerSensor = getCalibForSensor(Configuration.Shimmer3.SENSOR_ID.SHIMMER_ANALOG_ACCEL, LN_ACCEL_RANGE_VALUE_2G); + CalibDetails calibPerSensor = getCalibForSensor(Configuration.Shimmer3.SENSOR_ID.SHIMMER_LSM6DSV_ACCEL_LN, LN_ACCEL_RANGE_VALUE_2G); if(calibPerSensor!=null){ return (CalibDetailsKinematic) calibPerSensor; } return null; } -// -// /** -// * Converts the Analog Accel calibration variables from Shimmer Object -// * into a byte array for sending to the Shimmer. -// * -// * @return the bytes array containing the Analog Accel Calibration -// */ -// public byte[] generateCalParamByteArrayAccelLn(){ -// return getCurrentCalibDetailsAccelLn().generateCalParamByteArray(); -// } - //--------- Sensor specific methods end -------------- // Constructors for Class START ------------------------------------------ -// public SensorLSM6DSV(SENSORS sensorType) { -// super(sensorType); -// // TODO Auto-generated constructor stub -// } -// -// public SensorLSM6DSV(SENSORS sensorType, ShimmerVerObject svo) { -// super(sensorType, svo); -// } -// -// public SensorLSM6DSV(SENSORS sensorType, ShimmerDevice shimmerDevice) { -// super(sensorType, shimmerDevice); -// } - public SensorLSM6DSV() { super(SENSORS.LSM6DSV); initialise(); @@ -534,6 +520,7 @@ public SensorLSM6DSV(ShimmerDevice shimmerDevice) { // Constructors for Class END ------------------------------------------ + // GYRO Methods ---------------------------------------------------------- public int getGyroRange(){ return mGyroRange; @@ -588,8 +575,6 @@ public boolean checkIfAnyMplChannelEnabled(){ - - @Override public void generateSensorMap() { // TODO Auto-generated method stub @@ -642,14 +627,25 @@ public void parseConfigMap(LinkedHashMap mapOfConfigPerShimmer) @Override public void generateConfigOptionsMap() { - // TODO Auto-generated method stub - + // No Configuration Needed for Accel + + // For Gyro + mConfigOptionsMap.clear(); + addConfigOption(configOptionLSM6DSVGyroRange); + //General Config + addConfigOption(configOptionLSM6DSVGyroRate); + addConfigOption(configOptionLSM6DSVGyroLpm); } @Override public void generateSensorGroupMapping() { mSensorGroupingMap = new LinkedHashMap(); mSensorGroupingMap.put(Configuration.Shimmer3.LABEL_SENSOR_TILE.LOW_NOISE_ACCEL.ordinal(), sensorGroupLnAccelLSM6DSV); + mSensorGroupingMap.put(Configuration.Shimmer3.LABEL_SENSOR_TILE.GYRO.ordinal(), new SensorGroupingDetails( + LABEL_SENSOR_TILE.GYRO, + Arrays.asList(mSensorIdGyro), + CompatibilityInfoForMaps.listOfCompatibleVersionInfoLSM6DSVGyro)); + super.updateSensorGroupingMap(); } @@ -731,24 +727,42 @@ public boolean processResponse(int responseCommand, Object parsedResponse, COMMU //--------- Optional methods to override in Sensor Class start -------- @Override public void initialise() { + mSensorIdGyro = Configuration.Shimmer3.SENSOR_ID.SHIMMER_LSM6DSV_GYRO; + super.initialise(); updateCurrentAccelLnCalibInUse(); + setCalibSensitivityScaleFactor(mSensorIdGyro, CALIBRATION_SCALE_FACTOR.ONE_HUNDRED); + updateCurrentGyroCalibInUse(); } @Override public void generateCalibMap() { super.generateCalibMap(); + // ACCEL_LN TreeMap calibMapAccelLn = new TreeMap(); calibMapAccelLn.put(calibDetailsAccelLn2g.mRangeValue, calibDetailsAccelLn2g); - setCalibrationMapPerSensor(Configuration.Shimmer3.SENSOR_ID.SHIMMER_ANALOG_ACCEL, calibMapAccelLn); + setCalibrationMapPerSensor(Configuration.Shimmer3.SENSOR_ID.SHIMMER_LSM6DSV_ACCEL_LN, calibMapAccelLn); updateCurrentAccelLnCalibInUse(); + + // GYRO + TreeMap calibMapGyro = new TreeMap(); + calibMapGyro.put(calibDetailsGyro125.mRangeValue, calibDetailsGyro125); + calibMapGyro.put(calibDetailsGyro250.mRangeValue, calibDetailsGyro250); + calibMapGyro.put(calibDetailsGyro500.mRangeValue, calibDetailsGyro500); + calibMapGyro.put(calibDetailsGyro1000.mRangeValue, calibDetailsGyro1000); + calibMapGyro.put(calibDetailsGyro2000.mRangeValue, calibDetailsGyro2000); + calibMapGyro.put(calibDetailsGyro4000.mRangeValue, calibDetailsGyro4000); + + mCalibMap.put(mSensorIdGyro, calibMapGyro); + updateCurrentGyroCalibInUse(); } //--------- Optional methods to override in Sensor Class end -------- + public void updateCurrentGyroCalibInUse(){ mCurrentCalibDetailsGyro = getCurrentCalibDetailsIfKinematic(mSensorIdGyro, getGyroRange()); } From 714da0f8a9fa5f74347877dde9d760d1717a6153 Mon Sep 17 00:00:00 2001 From: Danesh Mariapan <161300025+dmariapan-shimmer@users.noreply.github.com> Date: Mon, 28 Oct 2024 13:48:26 +0800 Subject: [PATCH 5/8] CompatibilityInfoForMaps Update --- .../shimmerresearch/driver/Configuration.java | 21 ------------------- .../sensors/lsm6dsv/SensorLSM6DSV.java | 6 +++--- 2 files changed, 3 insertions(+), 24 deletions(-) diff --git a/ShimmerDriver/src/main/java/com/shimmerresearch/driver/Configuration.java b/ShimmerDriver/src/main/java/com/shimmerresearch/driver/Configuration.java index 24a3a4153..d7e502347 100644 --- a/ShimmerDriver/src/main/java/com/shimmerresearch/driver/Configuration.java +++ b/ShimmerDriver/src/main/java/com/shimmerresearch/driver/Configuration.java @@ -1427,17 +1427,6 @@ public static class CompatibilityInfoForMaps{ svoProto3MiniNewImuSdLog, svoProto3MiniNewImuLogAndStream, svoProto3DeluxeNewImuSdLog, svoProto3DeluxeNewImuLogAndStream, svoShimmer4Stock); - - // Added LSM6DSV Gyro - public static final List listOfCompatibleVersionInfoLSM6DSVGyro = Arrays.asList( - svoNewImuSdLog, svoNewImuLogAndStream, svoShimmer3RLogAndStream, - svoNewImuAnyExpBrdSdLog, svoNewImuAnyExpBrdLogAndStream, - svoGsrUnifiedNewImuSdLog, svoGsrUnifiedNewImuLogAndStream, - svoExgUnifiedNewImuSdLog, svoExgUnifiedNewImuLogAndStream, - svoBrAmpUnifiedNewImuSdLog, svoBrAmpUnifiedNewImuLogAndStream, - svoProto3MiniNewImuSdLog, svoProto3MiniNewImuLogAndStream, - svoProto3DeluxeNewImuSdLog, svoProto3DeluxeNewImuLogAndStream, - svoShimmer4Stock); public static final List listOfCompatibleVersionInfoLSM303AH = Arrays.asList( svoNewImuSdLog, svoNewImuLogAndStream, svoShimmer3RLogAndStream, @@ -1461,16 +1450,6 @@ public static class CompatibilityInfoForMaps{ svoBrAmpUnifiedNewImuSdLog, svoBrAmpUnifiedNewImuLogAndStream, svoProto3MiniNewImuSdLog, svoProto3MiniNewImuLogAndStream, svoProto3DeluxeNewImuSdLog, svoProto3DeluxeNewImuLogAndStream); - - // Added LSM6DSV Accel - public static final List listOfCompatibleVersionInfoLSM6DSVAccel = Arrays.asList( - svoNewImuSdLog, svoNewImuLogAndStream, svoShimmer3RLogAndStream, - svoNewImuAnyExpBrdSdLog, svoNewImuAnyExpBrdLogAndStream, - svoGsrUnifiedNewImuSdLog, svoGsrUnifiedNewImuLogAndStream, - svoExgUnifiedNewImuSdLog, svoExgUnifiedNewImuLogAndStream, - svoBrAmpUnifiedNewImuSdLog, svoBrAmpUnifiedNewImuLogAndStream, - svoProto3MiniNewImuSdLog, svoProto3MiniNewImuLogAndStream, - svoProto3DeluxeNewImuSdLog, svoProto3DeluxeNewImuLogAndStream); public static final List listOfCompatibleVersionInfoBrAmp = Arrays.asList( svoBrAmpSdLog, svoBrAmpBtStream, svoBrAmpLogAndStream, diff --git a/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/lsm6dsv/SensorLSM6DSV.java b/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/lsm6dsv/SensorLSM6DSV.java index 14ec33771..ed09d87fc 100644 --- a/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/lsm6dsv/SensorLSM6DSV.java +++ b/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/lsm6dsv/SensorLSM6DSV.java @@ -295,7 +295,7 @@ public class LABEL_SENSOR_TILE{ 0x80, //== Configuration.Shimmer3.SensorBitmap.SENSOR_A_ACCEL will be: SensorBitmap.SENSOR_A_ACCEL, // To Be Changed 0x80, //== Configuration.Shimmer3.SensorBitmap.SENSOR_A_ACCEL will be: SensorBitmap.SENSOR_A_ACCEL, GuiLabelSensors.ACCEL_LN, - CompatibilityInfoForMaps.listOfCompatibleVersionInfoLSM6DSVAccel, + CompatibilityInfoForMaps.listOfCompatibleVersionInfoKionixKXTC92050, null, Arrays.asList(SensorLSM6DSV.ObjectClusterSensorName.ACCEL_LN_X, SensorLSM6DSV.ObjectClusterSensorName.ACCEL_LN_Y, @@ -402,7 +402,7 @@ public class LABEL_SENSOR_TILE{ public static final SensorGroupingDetails sensorGroupLnAccelLSM6DSV = new SensorGroupingDetails( SensorLSM6DSV.LABEL_SENSOR_TILE.LOW_NOISE_ACCEL, Arrays.asList(Configuration.Shimmer3.SENSOR_ID.SHIMMER_LSM6DSV_ACCEL_LN), - CompatibilityInfoForMaps.listOfCompatibleVersionInfoLSM6DSVAccel); + CompatibilityInfoForMaps.listOfCompatibleVersionInfoKionixKXTC92050); @@ -644,7 +644,7 @@ public void generateSensorGroupMapping() { mSensorGroupingMap.put(Configuration.Shimmer3.LABEL_SENSOR_TILE.GYRO.ordinal(), new SensorGroupingDetails( LABEL_SENSOR_TILE.GYRO, Arrays.asList(mSensorIdGyro), - CompatibilityInfoForMaps.listOfCompatibleVersionInfoLSM6DSVGyro)); + CompatibilityInfoForMaps.listOfCompatibleVersionInfoMPU9250)); super.updateSensorGroupingMap(); } From f207aa5c95996a4b4f29b820ac81920f42a29bac Mon Sep 17 00:00:00 2001 From: Danesh Mariapan <161300025+dmariapan-shimmer@users.noreply.github.com> Date: Mon, 28 Oct 2024 14:37:21 +0800 Subject: [PATCH 6/8] Updated Sensor Class --- .../shimmerresearch/driver/Configuration.java | 6 ++--- .../shimmerresearch/driver/ShimmerObject.java | 3 --- .../sensors/AbstractSensor.java | 1 - .../sensors/lsm6dsv/SensorLSM6DSV.java | 24 +++++++++---------- 4 files changed, 14 insertions(+), 20 deletions(-) diff --git a/ShimmerDriver/src/main/java/com/shimmerresearch/driver/Configuration.java b/ShimmerDriver/src/main/java/com/shimmerresearch/driver/Configuration.java index d22952e24..6462a2cee 100644 --- a/ShimmerDriver/src/main/java/com/shimmerresearch/driver/Configuration.java +++ b/ShimmerDriver/src/main/java/com/shimmerresearch/driver/Configuration.java @@ -891,11 +891,11 @@ public class GuiLabelConfig{ */ public enum LABEL_SENSOR_TILE{ STREAMING_PROPERTIES(SensorShimmerClock.LABEL_SENSOR_TILE.STREAMING_PROPERTIES), -// LOW_NOISE_ACCEL(SensorKionixAccel.LABEL_SENSOR_TILE.LOW_NOISE_ACCEL), - LOW_NOISE_ACCEL(SensorLSM6DSV.LABEL_SENSOR_TILE.LOW_NOISE_ACCEL), + LOW_NOISE_ACCEL(SensorKionixAccel.LABEL_SENSOR_TILE.LOW_NOISE_ACCEL), + LOW_NOISE_ACCEL_3R(SensorLSM6DSV.LABEL_SENSOR_TILE.LOW_NOISE_ACCEL), WIDE_RANGE_ACCEL(SensorLSM303.LABEL_SENSOR_TILE.WIDE_RANGE_ACCEL), -// GYRO(SensorMPU9X50.LABEL_SENSOR_TILE.GYRO), GYRO(SensorLSM6DSV.LABEL_SENSOR_TILE.GYRO), + GYRO_3R(SensorMPU9X50.LABEL_SENSOR_TILE.GYRO), MAG(SensorLSM303.LABEL_SENSOR_TILE.MAG), PRESSURE_TEMPERATURE_BMP180(SensorBMP180.LABEL_SENSOR_TILE.PRESSURE_TEMPERATURE), PRESSURE_TEMPERATURE_BMP280(SensorBMP280.LABEL_SENSOR_TILE.PRESSURE_TEMPERATURE), diff --git a/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java b/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java index 591f9184d..d5c7b62b9 100644 --- a/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java +++ b/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java @@ -4977,9 +4977,6 @@ else if(isSupportedNewImuSensors()){ mSensorLSM303 = new SensorLSM303AH(this); addSensorClass(mSensorLSM303); - - mSensorMpu9x50 = new SensorMPU9250(this); - addSensorClass(mSensorMpu9x50); mSensorLSM6DSV = new SensorLSM6DSV(this); addSensorClass(mSensorLSM6DSV); diff --git a/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/AbstractSensor.java b/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/AbstractSensor.java index 0fab7e1a2..3b45c9a3a 100644 --- a/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/AbstractSensor.java +++ b/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/AbstractSensor.java @@ -63,7 +63,6 @@ public enum SENSORS{ MAX86150("MAX86150"), MAX86916("MAX86916"), BIOZ("MAX30001"), - //Added LSM6DSV("LSM6DSV"); private final String text; diff --git a/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/lsm6dsv/SensorLSM6DSV.java b/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/lsm6dsv/SensorLSM6DSV.java index ed09d87fc..959b1d029 100644 --- a/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/lsm6dsv/SensorLSM6DSV.java +++ b/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/lsm6dsv/SensorLSM6DSV.java @@ -157,8 +157,8 @@ public class SensorLSM6DSV extends AbstractSensor{ public static class DatabaseChannelHandles{ public static final String LN_ACC_X = "LSM6DSV_X"; - public static final String LN_ACC_Y = "LSM6DSV_X"; - public static final String LN_ACC_Z = "LSM6DSV_X"; + public static final String LN_ACC_Y = "LSM6DSV_Y"; + public static final String LN_ACC_Z = "LSM6DSV_Z"; public static final String GYRO_X = "LSM6DSV_GYRO_X"; public static final String GYRO_Y = "LSM6DSV_GYRO_Y"; @@ -256,15 +256,13 @@ public class LABEL_SENSOR_TILE{ - //--------- Configuration options start -------------- - // ACCEL_LN - public static final Integer[] ListofLSM6DSVAccelRangeConfigValues={0,1,2,3}; - public static final String[] ListofLSM6DSVGyroRate={"Power-down","1.875Hz","7.5Hz","12.0Hz","30.0Hz","60.0Hz","120.0Hz","240.0Hz","480.0Hz","960.0Hz","1920.0Hz","3840.0Hz","7680.0Hz"}; - public static final Integer[] ListofLSM6DSVGyroRateConfigValues={0,1,2,3,4,5,6,7,8,9,10,11,12,13}; + //--------- Configuration options start -------------- // GYRO public static final String[] ListofGyroRange = {"+/- 125dps","+/- 250dps","+/- 500dps","+/- 1000dps","+/- 2000dps","+/- 4000dps"}; public static final Integer[] ListofLSM6DSVGyroRangeConfigValues = {0,1,2,3,4,5}; + public static final String[] ListofLSM6DSVGyroRate={"Power-down","1.875Hz","7.5Hz","12.0Hz","30.0Hz","60.0Hz","120.0Hz","240.0Hz","480.0Hz","960.0Hz","1920.0Hz","3840.0Hz","7680.0Hz"}; + public static final Integer[] ListofLSM6DSVGyroRateConfigValues={0,1,2,3,4,5,6,7,8,9,10,11,12,13}; public static final ConfigOptionDetailsSensor configOptionLSM6DSVGyroRange = new ConfigOptionDetailsSensor( SensorLSM6DSV.GuiLabelConfig.LSM6DSV_GYRO_RANGE, @@ -295,14 +293,14 @@ public class LABEL_SENSOR_TILE{ 0x80, //== Configuration.Shimmer3.SensorBitmap.SENSOR_A_ACCEL will be: SensorBitmap.SENSOR_A_ACCEL, // To Be Changed 0x80, //== Configuration.Shimmer3.SensorBitmap.SENSOR_A_ACCEL will be: SensorBitmap.SENSOR_A_ACCEL, GuiLabelSensors.ACCEL_LN, - CompatibilityInfoForMaps.listOfCompatibleVersionInfoKionixKXTC92050, + CompatibilityInfoForMaps.listOfCompatibleVersionInfoLSM6DSV, null, Arrays.asList(SensorLSM6DSV.ObjectClusterSensorName.ACCEL_LN_X, SensorLSM6DSV.ObjectClusterSensorName.ACCEL_LN_Y, SensorLSM6DSV.ObjectClusterSensorName.ACCEL_LN_Z)); public static final SensorDetailsRef sensorLSM6DSVGyroRef = new SensorDetailsRef(0x40<<(0*8), 0x40<<(0*8), GuiLabelSensors.GYRO, - CompatibilityInfoForMaps.listOfCompatibleVersionInfoMPU9250, + CompatibilityInfoForMaps.listOfCompatibleVersionInfoLSM6DSV, Arrays.asList(Configuration.Shimmer3.SENSOR_ID.SHIMMER_LSM6DSV_GYRO), Arrays.asList( GuiLabelConfig.LSM6DSV_GYRO_RANGE, @@ -402,7 +400,7 @@ public class LABEL_SENSOR_TILE{ public static final SensorGroupingDetails sensorGroupLnAccelLSM6DSV = new SensorGroupingDetails( SensorLSM6DSV.LABEL_SENSOR_TILE.LOW_NOISE_ACCEL, Arrays.asList(Configuration.Shimmer3.SENSOR_ID.SHIMMER_LSM6DSV_ACCEL_LN), - CompatibilityInfoForMaps.listOfCompatibleVersionInfoKionixKXTC92050); + CompatibilityInfoForMaps.listOfCompatibleVersionInfoLSM6DSV); @@ -640,11 +638,11 @@ public void generateConfigOptionsMap() { @Override public void generateSensorGroupMapping() { mSensorGroupingMap = new LinkedHashMap(); - mSensorGroupingMap.put(Configuration.Shimmer3.LABEL_SENSOR_TILE.LOW_NOISE_ACCEL.ordinal(), sensorGroupLnAccelLSM6DSV); - mSensorGroupingMap.put(Configuration.Shimmer3.LABEL_SENSOR_TILE.GYRO.ordinal(), new SensorGroupingDetails( + mSensorGroupingMap.put(Configuration.Shimmer3.LABEL_SENSOR_TILE.LOW_NOISE_ACCEL_3R.ordinal(), sensorGroupLnAccelLSM6DSV); + mSensorGroupingMap.put(Configuration.Shimmer3.LABEL_SENSOR_TILE.GYRO_3R.ordinal(), new SensorGroupingDetails( LABEL_SENSOR_TILE.GYRO, Arrays.asList(mSensorIdGyro), - CompatibilityInfoForMaps.listOfCompatibleVersionInfoMPU9250)); + CompatibilityInfoForMaps.listOfCompatibleVersionInfoLSM6DSV)); super.updateSensorGroupingMap(); } From b4a83321d8fda2ceb79cf9c9d8c29b8b1dd8f22c Mon Sep 17 00:00:00 2001 From: Danesh Mariapan <161300025+dmariapan-shimmer@users.noreply.github.com> Date: Tue, 29 Oct 2024 14:16:40 +0800 Subject: [PATCH 7/8] Updates for ShimmerObject for LSM6DSV LN Accel & Gyro --- .../shimmerresearch/driver/ShimmerObject.java | 84 +++++++++++++++---- .../sensors/lsm6dsv/SensorLSM6DSV.java | 17 +++- 2 files changed, 80 insertions(+), 21 deletions(-) diff --git a/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java b/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java index d5c7b62b9..aa6f9a0fc 100644 --- a/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java +++ b/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java @@ -941,7 +941,7 @@ public ObjectCluster buildMsg(byte[] newPacket, COMMUNICATION_TYPE fwType, boole uncalibratedDataUnits[iAccelY]=CHANNEL_UNITS.NO_UNITS; uncalibratedDataUnits[iAccelZ]=CHANNEL_UNITS.NO_UNITS; - + if (mEnableCalibration){ double[] accelCalibratedData; // accelCalibratedData=UtilCalibration.calibrateInertialSensorData(tempData, mAlignmentMatrixAnalogAccel, mSensitivityMatrixAnalogAccel, mOffsetVectorAnalogAccel); @@ -949,10 +949,18 @@ public ObjectCluster buildMsg(byte[] newPacket, COMMUNICATION_TYPE fwType, boole calibratedData[iAccelX]=accelCalibratedData[0]; calibratedData[iAccelY]=accelCalibratedData[1]; calibratedData[iAccelZ]=accelCalibratedData[2]; - - objectCluster.addDataToMap(Shimmer3.ObjectClusterSensorName.ACCEL_LN_X,CHANNEL_TYPE.CAL.toString(),CHANNEL_UNITS.ACCEL_CAL_UNIT,accelCalibratedData[0],mSensorKionixAccel.mIsUsingDefaultLNAccelParam); - objectCluster.addDataToMap(Shimmer3.ObjectClusterSensorName.ACCEL_LN_Y,CHANNEL_TYPE.CAL.toString(),CHANNEL_UNITS.ACCEL_CAL_UNIT,accelCalibratedData[1],mSensorKionixAccel.mIsUsingDefaultLNAccelParam); - objectCluster.addDataToMap(Shimmer3.ObjectClusterSensorName.ACCEL_LN_Z,CHANNEL_TYPE.CAL.toString(),CHANNEL_UNITS.ACCEL_CAL_UNIT,accelCalibratedData[2],mSensorKionixAccel.mIsUsingDefaultLNAccelParam); + + if (isShimmerGen3R()) { + objectCluster.addDataToMap(Shimmer3.ObjectClusterSensorName.ACCEL_LN_X, CHANNEL_TYPE.CAL.toString(), CHANNEL_UNITS.ACCEL_CAL_UNIT, accelCalibratedData[0], mSensorLSM6DSV.mIsUsingDefaultLNAccelParam); + objectCluster.addDataToMap(Shimmer3.ObjectClusterSensorName.ACCEL_LN_Y, CHANNEL_TYPE.CAL.toString(), CHANNEL_UNITS.ACCEL_CAL_UNIT, accelCalibratedData[1], mSensorLSM6DSV.mIsUsingDefaultLNAccelParam); + objectCluster.addDataToMap(Shimmer3.ObjectClusterSensorName.ACCEL_LN_Z, CHANNEL_TYPE.CAL.toString(), CHANNEL_UNITS.ACCEL_CAL_UNIT, accelCalibratedData[2], mSensorLSM6DSV.mIsUsingDefaultLNAccelParam); + } + else if (isShimmerGen3()) { + objectCluster.addDataToMap(Shimmer3.ObjectClusterSensorName.ACCEL_LN_X,CHANNEL_TYPE.CAL.toString(),CHANNEL_UNITS.ACCEL_CAL_UNIT,accelCalibratedData[0],mSensorKionixAccel.mIsUsingDefaultLNAccelParam); + objectCluster.addDataToMap(Shimmer3.ObjectClusterSensorName.ACCEL_LN_Y,CHANNEL_TYPE.CAL.toString(),CHANNEL_UNITS.ACCEL_CAL_UNIT,accelCalibratedData[1],mSensorKionixAccel.mIsUsingDefaultLNAccelParam); + objectCluster.addDataToMap(Shimmer3.ObjectClusterSensorName.ACCEL_LN_Z,CHANNEL_TYPE.CAL.toString(),CHANNEL_UNITS.ACCEL_CAL_UNIT,accelCalibratedData[2],mSensorKionixAccel.mIsUsingDefaultLNAccelParam); + } + calibratedDataUnits[iAccelX] = CHANNEL_UNITS.ACCEL_CAL_UNIT; calibratedDataUnits[iAccelY] = CHANNEL_UNITS.ACCEL_CAL_UNIT; calibratedDataUnits[iAccelZ] = CHANNEL_UNITS.ACCEL_CAL_UNIT; @@ -1075,6 +1083,8 @@ public ObjectCluster buildMsg(byte[] newPacket, COMMUNICATION_TYPE fwType, boole uncalibratedDataUnits[iGyroX]=CHANNEL_UNITS.NO_UNITS; uncalibratedDataUnits[iGyroY]=CHANNEL_UNITS.NO_UNITS; uncalibratedDataUnits[iGyroZ]=CHANNEL_UNITS.NO_UNITS; + + if (mEnableCalibration){ // double[] gyroCalibratedData=UtilCalibration.calibrateInertialSensorData(tempData, mAlignmentMatrixGyroscope, mSensitivityMatrixGyroscope, mOffsetVectorGyroscope); double[] gyroCalibratedData=UtilCalibration.calibrateInertialSensorData(tempData, getCurrentCalibDetailsGyro()); @@ -1082,9 +1092,17 @@ public ObjectCluster buildMsg(byte[] newPacket, COMMUNICATION_TYPE fwType, boole calibratedData[iGyroY]=gyroCalibratedData[1]; calibratedData[iGyroZ]=gyroCalibratedData[2]; - objectCluster.addDataToMap(Shimmer3.ObjectClusterSensorName.GYRO_X,CHANNEL_TYPE.CAL.toString(),CHANNEL_UNITS.GYRO_CAL_UNIT,gyroCalibratedData[0], mSensorMpu9x50.mIsUsingDefaultGyroParam); - objectCluster.addDataToMap(Shimmer3.ObjectClusterSensorName.GYRO_Y,CHANNEL_TYPE.CAL.toString(),CHANNEL_UNITS.GYRO_CAL_UNIT,gyroCalibratedData[1], mSensorMpu9x50.mIsUsingDefaultGyroParam); - objectCluster.addDataToMap(Shimmer3.ObjectClusterSensorName.GYRO_Z,CHANNEL_TYPE.CAL.toString(),CHANNEL_UNITS.GYRO_CAL_UNIT,gyroCalibratedData[2], mSensorMpu9x50.mIsUsingDefaultGyroParam); + if (isShimmerGen3R()) { + objectCluster.addDataToMap(Shimmer3.ObjectClusterSensorName.GYRO_X,CHANNEL_TYPE.CAL.toString(),CHANNEL_UNITS.GYRO_CAL_UNIT,gyroCalibratedData[0], mSensorLSM6DSV.mIsUsingDefaultGyroParam); + objectCluster.addDataToMap(Shimmer3.ObjectClusterSensorName.GYRO_Y,CHANNEL_TYPE.CAL.toString(),CHANNEL_UNITS.GYRO_CAL_UNIT,gyroCalibratedData[1], mSensorLSM6DSV.mIsUsingDefaultGyroParam); + objectCluster.addDataToMap(Shimmer3.ObjectClusterSensorName.GYRO_Z,CHANNEL_TYPE.CAL.toString(),CHANNEL_UNITS.GYRO_CAL_UNIT,gyroCalibratedData[2], mSensorLSM6DSV.mIsUsingDefaultGyroParam); + } + else if (isShimmerGen3()) { + objectCluster.addDataToMap(Shimmer3.ObjectClusterSensorName.GYRO_X,CHANNEL_TYPE.CAL.toString(),CHANNEL_UNITS.GYRO_CAL_UNIT,gyroCalibratedData[0], mSensorMpu9x50.mIsUsingDefaultGyroParam); + objectCluster.addDataToMap(Shimmer3.ObjectClusterSensorName.GYRO_Y,CHANNEL_TYPE.CAL.toString(),CHANNEL_UNITS.GYRO_CAL_UNIT,gyroCalibratedData[1], mSensorMpu9x50.mIsUsingDefaultGyroParam); + objectCluster.addDataToMap(Shimmer3.ObjectClusterSensorName.GYRO_Z,CHANNEL_TYPE.CAL.toString(),CHANNEL_UNITS.GYRO_CAL_UNIT,gyroCalibratedData[2], mSensorMpu9x50.mIsUsingDefaultGyroParam); + } + gyroscope.x=gyroCalibratedData[0]*Math.PI/180; gyroscope.y=gyroCalibratedData[1]*Math.PI/180; gyroscope.z=gyroCalibratedData[2]*Math.PI/180; @@ -6137,9 +6155,10 @@ public void setMapOfSensorCalibrationAll(TreeMap Date: Wed, 30 Oct 2024 14:10:11 +0800 Subject: [PATCH 8/8] Additional Gyro Options - Low-Power Mode --- .../shimmerresearch/driver/ShimmerObject.java | 19 ++- .../sensors/lsm6dsv/SensorLSM6DSV.java | 119 ++++++++++++++++++ 2 files changed, 136 insertions(+), 2 deletions(-) diff --git a/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java b/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java index aa6f9a0fc..3867cd7a4 100644 --- a/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java +++ b/ShimmerDriver/src/main/java/com/shimmerresearch/driver/ShimmerObject.java @@ -651,7 +651,7 @@ public String toString() { // Shimmer3 - Pressure/Temperature private SensorBMPX80 mSensorBMPX80 = new SensorBMP180(this); - // Shimmer3r - Accel LN + // Shimmer3r - Accel LN & Gyro private SensorLSM6DSV mSensorLSM6DSV = new SensorLSM6DSV(this); // ---------- ECG/EMG start --------------- @@ -8637,7 +8637,13 @@ public double[][] getAlignmentMatrixMPLGyro(){ } public boolean isLowPowerGyroEnabled() { - return mSensorMpu9x50.isLowPowerGyroEnabled(); + if (isShimmerGen3()) { + return mSensorMpu9x50.isLowPowerGyroEnabled(); + } + else if (isShimmerGen3R()) { + return mSensorLSM6DSV.isLowPowerGyroEnabled(); + } + return (Boolean) null; } public boolean isUsingDefaultGyroParam(){ @@ -8667,6 +8673,9 @@ protected void setLowPowerGyro(boolean enable){ else if(mShimmerVerObject.isShimmerGen3()){ mSensorMpu9x50.setLowPowerGyro(enable); } + else if(mShimmerVerObject.isShimmerGen3R()) { + mSensorLSM6DSV.setLowPowerGyro(enable); + } } /** @@ -8683,6 +8692,9 @@ public boolean checkLowPowerGyro() { else if(mShimmerVerObject.isShimmerGen3()){ return mSensorMpu9x50.checkLowPowerGyro(); } + else if (mShimmerVerObject.isShimmerGen3R()) { + return mSensorLSM6DSV.checkLowPowerGyro(); + } return false; } @@ -8693,6 +8705,9 @@ public int getLowPowerGyroEnabled() { else if(mShimmerVerObject.isShimmerGen3()){ return mSensorMpu9x50.getLowPowerGyroEnabled(); } + else if (mShimmerVerObject.isShimmerGen3R()) { + return mSensorLSM6DSV.getLowPowerGyroEnabled(); + } return 0; } diff --git a/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/lsm6dsv/SensorLSM6DSV.java b/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/lsm6dsv/SensorLSM6DSV.java index 6a57232f5..dcca66f79 100644 --- a/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/lsm6dsv/SensorLSM6DSV.java +++ b/ShimmerDriver/src/main/java/com/shimmerresearch/sensors/lsm6dsv/SensorLSM6DSV.java @@ -97,6 +97,10 @@ public class SensorLSM6DSV extends AbstractSensor{ protected int mLSM6DSVGyroAccelRate=0; protected int mSensorIdGyro = -1; + protected boolean mLowPowerGyro = false; + private boolean debugGyroRate = false; + protected int mLSM6DSVLPF = 0; + public static final double[][] AlignmentMatrixGyroShimmer3r = {{-1,0,0},{0,1,0},{0,0,-1}}; public static final double[][] OffsetVectorGyroShimmer3r = {{0},{0},{0}}; public static final double[][] SensitivityMatrixGyro125dpsShimmer3r = {{229,0,0},{0,229,0},{0,0,229}}; @@ -571,6 +575,121 @@ public boolean checkIfAnyMplChannelEnabled(){ } return false; } + + public boolean checkIfAMpuGyroOrAccelEnabled(){ + if(isSensorEnabled(mSensorIdGyro)) { + return true; + } +// if(isSensorEnabled(mSensorIdAccel)) { +// return true; +// } +// if(mSensorMap.get(SENSOR_ID.SHIMMER_MPU9150_MAG) != null) { +// if(mSensorMap.get(SENSOR_ID.SHIMMER_MPU9150_MAG).mIsEnabled) { +// return true; +// } +// } + return false; + } + + /** + * Computes next higher available sensor sampling rate setting based on + * passed in "freq" variable and dependent on whether low-power mode is set. + * + * @param freq + * @return int the rate configuration setting for the respective sensor + */ + public int setLSM6DSVGyroAccelRateFromFreq(double freq) { + if(debugGyroRate && mShimmerDevice!=null){ + System.out.println("Gyro Rate change from freq:\t" + mShimmerDevice.getMacId() + "\t" + freq); + } + + boolean setFreq = false; + // Check if channel is enabled + if(checkIfAnyMplChannelEnabled()){ + setFreq = true; + } + else if(checkIfAMpuGyroOrAccelEnabled()){ + setFreq = true; + } + + if(setFreq){ + // Gyroscope Output Rate = 8kHz when the DLPF (Digital Low-pass filter) is disabled (DLPF_CFG = 0 or 7), and 1kHz when the DLPF is enabled + double numerator = 1000; + if(mLSM6DSVLPF == 0) { + numerator = 8000; + } + + if (!mLowPowerGyro){ + if(freq<4) { + freq = 4; + } + else if(freq>numerator) { + freq = numerator; + } + int result = (int) Math.floor(((numerator / freq) - 1)); + if(result>255) { + result = 255; + } + setLSM6DSVGyroAccelRate(result); + + } + else { + setLSM6DSVGyroAccelRate(0xFF); // Dec. = 255, Freq. = 31.25Hz (or 3.92Hz when LPF enabled) + } + } + else { + setLSM6DSVGyroAccelRate(0xFF); // Dec. = 255, Freq. = 31.25Hz (or 3.92Hz when LPF enabled) + } + return getLSM6DSVGyroAccelRate(); + } + + /** + * This enables the low-power gyro option. When not enabled the sampling + * rate of the gyro is set to the closest supported value to the actual + * sampling rate that it can achieve. + * + * @param enable + */ + public void setLowPowerGyro(boolean enable){ + if(!checkIfAnyMplChannelEnabled()) { + mLowPowerGyro = enable; + } + else{ + mLowPowerGyro = false; + } + + if(debugGyroRate && mShimmerDevice!=null){ + System.out.println("Gyro Rate change from freq:\t" + mShimmerDevice.getMacId() + "\tsetLowPowerGyro\t" + mShimmerDevice.getSamplingRateShimmer()); + } + if(mShimmerDevice!=null){ + setLSM6DSVGyroAccelRateFromFreq(getSamplingRateShimmer()); + } + } + + /** + * Checks to see if the MPU9150 gyro is in low power mode. As determined by + * the sensor's sampling rate being set to the lowest possible value and not + * related to any specific configuration bytes sent to the Shimmer/MPU9150. + * + * @return boolean, true if low-power mode enabled + */ + public boolean checkLowPowerGyro() { + if(mLSM6DSVGyroAccelRate == 0xFF) { + mLowPowerGyro = true; + } + else { + mLowPowerGyro = false; + } + return mLowPowerGyro; + } + + public int getLowPowerGyroEnabled() { + return mLowPowerGyro? 1:0; + } + + public boolean isLowPowerGyroEnabled() { + return mLowPowerGyro; + } // GYRO Methods end ------------------------------------------------------