Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,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.sensors.lis2dw12.SensorLIS2DW12;
import com.shimmerresearch.verisense.sensors.SensorLSM6DS3;
//import com.shimmerresearch.verisense.sensors.SensorLIS2DW12;
Expand Down Expand Up @@ -727,6 +728,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;
Expand Down Expand Up @@ -894,7 +898,10 @@ 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_3R(SensorLSM6DSV.LABEL_SENSOR_TILE.LOW_NOISE_ACCEL),
WIDE_RANGE_ACCEL(SensorLSM303.LABEL_SENSOR_TILE.WIDE_RANGE_ACCEL),
GYRO(SensorLSM6DSV.LABEL_SENSOR_TILE.GYRO),
GYRO_3R(SensorMPU9X50.LABEL_SENSOR_TILE.GYRO),
WIDE_RANGE_ACCEL_3R(SensorLIS2DW12.LABEL_SENSOR_TILE.WIDE_RANGE_ACCEL),
GYRO(SensorMPU9X50.LABEL_SENSOR_TILE.GYRO),
MAG(SensorLSM303.LABEL_SENSOR_TILE.MAG),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,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;
Expand Down Expand Up @@ -658,6 +659,9 @@ public String toString() {
// Shimmer3R - WR Accel
private SensorLIS2DW12 mSensorLIS2DW12 = new SensorLIS2DW12(this);

// Shimmer3r - Accel LN & Gyro
private SensorLSM6DSV mSensorLSM6DSV = new SensorLSM6DSV(this);

// ---------- ECG/EMG start ---------------
protected double OffsetECGRALL=2060;
protected double GainECGRALL=175;
Expand Down Expand Up @@ -945,18 +949,26 @@ 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);
accelCalibratedData=UtilCalibration.calibrateInertialSensorData(tempData, getCurrentCalibDetailsAccelLn());
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;
Expand Down Expand Up @@ -1087,16 +1099,26 @@ else if (isShimmerGen3()) {
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());
calibratedData[iGyroX]=gyroCalibratedData[0];
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;
Expand Down Expand Up @@ -4983,6 +5005,7 @@ else if(isSupportedNewImuSensors()){
mSensorMpu9x50 = new SensorMPU9250(this);
addSensorClass(mSensorMpu9x50);
}

else{
mSensorBMPX80 = new SensorBMP180(this);
addSensorClass(mSensorBMPX80);
Expand All @@ -4996,13 +5019,17 @@ else if(isSupportedNewImuSensors()){
mSensorMpu9x50 = new SensorMPU9150(this);
addSensorClass(mSensorMpu9x50);
}

} else if(isShimmerGen3R()){
mSensorBMPX80 = new SensorBMP390(this);
addSensorClass(mSensorBMPX80);

mSensorLSM303 = new SensorLSM303AH(this);
addSensorClass(mSensorLSM303);

mSensorLSM6DSV = new SensorLSM6DSV(this);
addSensorClass(mSensorLSM6DSV);

mSensorLIS2DW12 = new SensorLIS2DW12(this);
addSensorClass(mSensorLIS2DW12);

Expand Down Expand Up @@ -6153,9 +6180,12 @@ protected CalibDetailsKinematic getCurrentCalibDetailsMag() {
protected CalibDetailsKinematic getCurrentCalibDetailsAccelLn() {
if(isShimmerGen2()){
return mSensorMMA736x.getCurrentCalibDetailsAccelLn();
} else {
} else if (isShimmerGen3()){
return mSensorKionixAccel.getCurrentCalibDetailsAccelLn();
} else if (isShimmerGen3R()){
return mSensorLSM6DSV.getCurrentCalibDetailsAccelLn();
}
return null;
}

@Override
Expand All @@ -6171,9 +6201,10 @@ public void setMapOfSensorCalibrationAll(TreeMap<Integer, TreeMap<Integer, Calib
public void updateCurrentAccelLnCalibInUse(){
if(isShimmerGen2()){
mSensorMMA736x.updateCurrentAccelCalibInUse();
}
else{
} else if (isShimmerGen3()){
mSensorKionixAccel.updateCurrentAccelLnCalibInUse();
} else if (isShimmerGen3R()) {
mSensorLSM6DSV.updateCurrentAccelLnCalibInUse();
}
}

Expand Down Expand Up @@ -8226,18 +8257,24 @@ public int getSamplingDividerLsm303dlhcAccel() {
public byte[] getGyroCalRawParams(){
if(isShimmerGen2()){
return mSensorShimmer2Gyro.mCurrentCalibDetailsGyro.generateCalParamByteArray();
} else {
} else if (isShimmerGen3()){
return mSensorMpu9x50.mCurrentCalibDetailsGyro.generateCalParamByteArray();
} else if (isShimmerGen3R()) {
return mSensorLSM6DSV.mCurrentCalibDetailsGyro.generateCalParamByteArray();
}
return null;
}

public void updateCurrentGyroCalibInUse(){
if(isShimmerGen2()){
if (isShimmerGen2()){
mSensorShimmer2Gyro.updateCurrentCalibInUse();
}
else{
else if (isShimmerGen3()){
mSensorMpu9x50.updateCurrentGyroCalibInUse();
}
else if (isShimmerGen3R()) {
mSensorLSM6DSV.updateCurrentGyroCalibInUse();
}
}

/**
Expand Down Expand Up @@ -8287,11 +8324,14 @@ private OnTheFlyGyroOffsetCal getOnTheFlyCalGyro(){
}

public CalibDetailsKinematic getCurrentCalibDetailsGyro() {
if(isShimmerGen2()){
if (isShimmerGen2()){
return mSensorShimmer2Gyro.getCurrentCalibDetailsGyro();
} else {
} else if (isShimmerGen3()){
return mSensorMpu9x50.getCurrentCalibDetailsGyro();
} else if (isShimmerGen3R()) {
return mSensorLSM6DSV.getCurrentCalibDetailsGyro();
}
return null;
}

/**
Expand Down Expand Up @@ -8392,6 +8432,14 @@ public int getMPU9X50GyroAccelRate() {
public void setMPU9150GyroAccelRate(int rate) {
mSensorMpu9x50.setMPU9X50GyroAccelRate(rate);
}

public int getLSM6DSVGyroAccelRate() {
return mSensorLSM6DSV.getLSM6DSVGyroAccelRate();
}

public void setLSM6DSVGyroAccelRate(int rate) {
mSensorLSM6DSV.setLSM6DSVGyroAccelRate(rate);
}

/**
* @return the mMPU9150MotCalCfg
Expand Down Expand Up @@ -8449,16 +8497,21 @@ public int getMPU9X50AccelRange() {
public int getGyroRange(){
if(isShimmerGen2()){
return mSensorShimmer2Gyro.getGyroRange();
} else {
} else if (isShimmerGen3()) {
return mSensorMpu9x50.getGyroRange();
} else if (isShimmerGen3R()) {
return mSensorLSM6DSV.getGyroRange();
}
return (Integer) null;
}

public void setGyroRange(int newRange) {
if(isShimmerGen2()){
mSensorShimmer2Gyro.setGyroRange(newRange);
} else {
} else if (isShimmerGen3()){
mSensorMpu9x50.setGyroRange(newRange);
} else if (isShimmerGen3R()){
mSensorLSM6DSV.setGyroRange(newRange);
}
}

Expand All @@ -8467,6 +8520,12 @@ protected void setMPU9150GyroRange(int i){
mSensorMpu9x50.setMPU9150GyroRange(i);
}
}

protected void setLSM6DSVGyroRange(int i){
if(mSensorLSM6DSV!=null){
mSensorLSM6DSV.setLSM6DSVGyroRange(i);
}
}

/**
* @param mMPU9150MPLSamplingRate the mMPU9150MPLSamplingRate to set
Expand Down Expand Up @@ -8724,7 +8783,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(){
Expand Down Expand Up @@ -8754,6 +8819,9 @@ protected void setLowPowerGyro(boolean enable){
else if(mShimmerVerObject.isShimmerGen3()){
mSensorMpu9x50.setLowPowerGyro(enable);
}
else if(mShimmerVerObject.isShimmerGen3R()) {
mSensorLSM6DSV.setLowPowerGyro(enable);
}
}

/**
Expand All @@ -8770,6 +8838,9 @@ public boolean checkLowPowerGyro() {
else if(mShimmerVerObject.isShimmerGen3()){
return mSensorMpu9x50.checkLowPowerGyro();
}
else if (mShimmerVerObject.isShimmerGen3R()) {
return mSensorLSM6DSV.checkLowPowerGyro();
}
return false;
}

Expand All @@ -8780,6 +8851,9 @@ public int getLowPowerGyroEnabled() {
else if(mShimmerVerObject.isShimmerGen3()){
return mSensorMpu9x50.getLowPowerGyroEnabled();
}
else if (mShimmerVerObject.isShimmerGen3R()) {
return mSensorLSM6DSV.getLowPowerGyroEnabled();
}
return 0;
}

Expand Down Expand Up @@ -10065,8 +10139,10 @@ protected void determineCalibrationParamsForIMU(){
mSensorLSM303.updateIsUsingDefaultWRAccelParam();
mSensorLSM303.updateIsUsingDefaultMagParam();
mSensorMpu9x50.updateIsUsingDefaultGyroParam();
} else if(isShimmerGen3R()) {
mSensorLIS2DW12.updateIsUsingDefaultWRAccelParam();
} else if (isShimmerGen3R()) {
mSensorLSM6DSV.updateIsUsingDefaultLNAccelParam();
mSensorLSM6DSV.updateIsUsingDefaultGyroParam();
mSensorLIS2DW12.updateIsUsingDefaultWRAccelParam();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ public enum SENSORS{
MAX86150("MAX86150"),
MAX86916("MAX86916"),
BIOZ("MAX30001"),
LSM6DSV("LSM6DSV");
BMP390("BMP390");

private final String text;
Expand Down
Loading