Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
a05b272
UUID for 3R
JongChern Apr 10, 2025
ff86b99
Update Shimmer3Protocol.swift
JongChern Apr 11, 2025
4b7ac2c
Update BleByteRadio.swift
JongChern Apr 18, 2025
1224362
Update Shimmer3Protocol.swift
JongChern Apr 21, 2025
f3d05cd
Update Shimmer3Protocol.swift
JongChern Apr 22, 2025
26a4a54
ln accel streaming now
JongChern Apr 22, 2025
ffa1997
more fixes, 3r support, updates
MAzalya Apr 29, 2025
6233ca0
tidy up
MAzalya Apr 29, 2025
18761e8
add s3r wr accel sensor support
MAzalya May 7, 2025
ef92995
add 3r gyro sensor support
MAzalya May 9, 2025
3a999d4
add 3r mag sensor support
MAzalya May 13, 2025
d4691de
add 3r mag low power mode
MAzalya May 14, 2025
34d2c23
fix
MAzalya May 14, 2025
16c2ce6
add alt mag 3r sensor support
MAzalya May 26, 2025
617a982
project update
MAzalya May 26, 2025
76145b8
Merge pull request #5 from ShimmerEngineering/DEV-227_MA
jyong15 May 26, 2025
c273fca
swapped mag update
MAzalya May 27, 2025
8bee85b
minor update
MAzalya May 27, 2025
0820119
DEV-227 fix tests
jyong15 May 27, 2025
d496616
Merge pull request #9 from ShimmerEngineering/DEV-243
jyong15 May 27, 2025
8dba496
Merge branch 'DEV-227' into DEV-244
jyong15 May 27, 2025
547453d
Merge pull request #8 from ShimmerEngineering/DEV-244
jyong15 May 27, 2025
2e857ab
minor update
MAzalya May 27, 2025
2c93962
Merge branch 'DEV-227' into DEV-245
MAzalya May 27, 2025
652b50c
merge dev-227
MAzalya May 28, 2025
bf41074
DEV-245 update mag sampling rate logic 3R
jyong15 May 28, 2025
5249d96
Merge pull request #7 from ShimmerEngineering/DEV-245
jyong15 May 29, 2025
5524781
Merge branch 'DEV-227' into DEV-249
jyong15 May 29, 2025
49a078f
Merge pull request #10 from ShimmerEngineering/DEV-249
jyong15 Jun 2, 2025
8d75105
DEV-227 fix unit test
jyong15 Jun 6, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions ShimmerBluetooth/ShimmerBluetooth.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
3AED206D2B0B10960066A0F8 /* ShimmerUtilitiesTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AED206C2B0B10960066A0F8 /* ShimmerUtilitiesTest.swift */; };
3AED20712B0C4BA60066A0F8 /* MagSensor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AED20702B0C4BA60066A0F8 /* MagSensor.swift */; };
3AED20732B0C587B0066A0F8 /* GyroSensor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AED20722B0C587B0066A0F8 /* GyroSensor.swift */; };
92150EF52DE461CE00FEA53B /* AltMagSensor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92150EF42DE461CE00FEA53B /* AltMagSensor.swift */; };
9299E50E2B85054E001EEFE0 /* PressureTempSensor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9299E50D2B85054E001EEFE0 /* PressureTempSensor.swift */; };
9299E5102B850571001EEFE0 /* BattVoltageSensor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9299E50F2B850571001EEFE0 /* BattVoltageSensor.swift */; };
92B1067A2B7DAFBC00AB9952 /* EXGSensor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92B106792B7DAFBC00AB9952 /* EXGSensor.swift */; };
Expand Down Expand Up @@ -84,6 +85,7 @@
3AED206C2B0B10960066A0F8 /* ShimmerUtilitiesTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShimmerUtilitiesTest.swift; sourceTree = "<group>"; };
3AED20702B0C4BA60066A0F8 /* MagSensor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MagSensor.swift; sourceTree = "<group>"; };
3AED20722B0C587B0066A0F8 /* GyroSensor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GyroSensor.swift; sourceTree = "<group>"; };
92150EF42DE461CE00FEA53B /* AltMagSensor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AltMagSensor.swift; sourceTree = "<group>"; };
9299E50D2B85054E001EEFE0 /* PressureTempSensor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PressureTempSensor.swift; sourceTree = "<group>"; };
9299E50F2B850571001EEFE0 /* BattVoltageSensor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BattVoltageSensor.swift; sourceTree = "<group>"; };
92B106792B7DAFBC00AB9952 /* EXGSensor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EXGSensor.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -131,6 +133,7 @@
3A780C872AE12BEB00EAF050 /* ShimmerBluetooth */ = {
isa = PBXGroup;
children = (
92150EF42DE461CE00FEA53B /* AltMagSensor.swift */,
3AEB12F82BCE6F7E00B5F6F1 /* Shimmer3SpeedTestProtocol.swift */,
3A780C882AE12BEB00EAF050 /* ShimmerBluetooth.h */,
3A780C892AE12BEB00EAF050 /* ShimmerBluetooth.docc */,
Expand Down Expand Up @@ -299,6 +302,7 @@
3AB320E62B070830003D94F8 /* Sensor.swift in Sources */,
3A0B4B672B0EE42700786295 /* IMUSensor.swift in Sources */,
3A1CBAD32AE2DD1C00BC1E54 /* BleByteRadio.swift in Sources */,
92150EF52DE461CE00FEA53B /* AltMagSensor.swift in Sources */,
3A7712912AE26805006213A8 /* BLEByteRadioold.swift in Sources */,
3A77128D2AE177A4006213A8 /* ShimmerDevice.swift in Sources */,
3AA359152AF37943008AD334 /* ConfigByteLayoutShimmer3.swift in Sources */,
Expand Down
245 changes: 245 additions & 0 deletions ShimmerBluetooth/ShimmerBluetooth/AltMagSensor.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,245 @@
//
// AltMagSensor.swift
// ShimmerBluetooth
//
// Created by Shimmer Engineering on 26/05/2025.
//

import Foundation

public class AltMagSensor : IMUSensor , SensorProcessing{

public enum Range3R: UInt8 {
case RANGE_4Ga = 0x0
case RANGE_8Ga = 0x1
case RANGE_12Ga = 0x2
case RANGE_16Ga = 0x3

public static func fromValue(_ value : UInt8) -> Range3R? {
switch value{
case 0:
return .RANGE_4Ga
case 1:
return .RANGE_8Ga
case 2:
return .RANGE_12Ga
case 3:
return .RANGE_16Ga
default:
return nil
}
}
}
var Current3RRange = Range3R.RANGE_4Ga

public var packetIndexAltMagX:Int = -1
public var packetIndexAltMagY:Int = -1
public var packetIndexAltMagZ:Int = -1
public static let ALT_MAGNETOMETER_X = "Alt Magnetometer X"
public static let ALT_MAGNETOMETER_Y = "Alt Magnetometer Y"
public static let ALT_MAGNETOMETER_Z = "Alt Magnetometer Z"
var calibBytes_4Ga: [UInt8] = []
var calibBytes_8Ga: [UInt8] = []
var calibBytes_12Ga: [UInt8] = []
var calibBytes_16Ga: [UInt8] = []
var altMagRange = 0
var CALIBRATION_ID = 41
var AlignmentMatrix : [[Double]] = [[]]
var SensitivityMatrix : [[Double]] = [[]]
var OffsetVector : [Double] = []
var AlignmentMatrix_4Ga:[[Double]] = [[]]
var SensitivityMatrix_4Ga:[[Double]] = [[]]
var OffsetVector_4Ga:[Double]=[]
var AlignmentMatrix_8Ga:[[Double]] = [[]]
var SensitivityMatrix_8Ga:[[Double]] = [[]]
var OffsetVector_8Ga:[Double]=[]
var AlignmentMatrix_12Ga:[[Double]] = [[]]
var SensitivityMatrix_12Ga:[[Double]] = [[]]
var OffsetVector_12Ga:[Double]=[]
var AlignmentMatrix_16Ga:[[Double]] = [[]]
var SensitivityMatrix_16Ga:[[Double]] = [[]]
var OffsetVector_16Ga:[Double]=[]

public func get3RRange()->Range3R{
return Current3RRange
}

public func processData(sensorPacket: [UInt8], objectCluster: ObjectCluster) -> ObjectCluster {
let x = Array(sensorPacket[packetIndexAltMagX..<packetIndexAltMagX+2])
let y = Array(sensorPacket[packetIndexAltMagY..<packetIndexAltMagY+2])
let z = Array(sensorPacket[packetIndexAltMagZ..<packetIndexAltMagZ+2])
let rawDataX = Double(ShimmerUtilities.parseSensorData(sensorData: x, dataType: SensorDataType.i16)!)
let rawDataY = Double(ShimmerUtilities.parseSensorData(sensorData: y, dataType: SensorDataType.i16)!)
let rawDataZ = Double(ShimmerUtilities.parseSensorData(sensorData: z, dataType: SensorDataType.i16)!)
if (calibrationEnabled){
let data:[Double] = [rawDataX,rawDataY,rawDataZ]

let(calData)=IMUSensor.calibrateInertialSensorData(data,AlignmentMatrix,SensitivityMatrix,OffsetVector)
objectCluster.addData(sensorName: AltMagSensor.ALT_MAGNETOMETER_X, formatName: SensorFormats.Calibrated.rawValue, unitName: SensorUnits.localflux.rawValue, value: calData![0])
objectCluster.addData(sensorName: AltMagSensor.ALT_MAGNETOMETER_Y, formatName: SensorFormats.Calibrated.rawValue, unitName: SensorUnits.localflux.rawValue, value: calData![1])
objectCluster.addData(sensorName: AltMagSensor.ALT_MAGNETOMETER_Z, formatName: SensorFormats.Calibrated.rawValue, unitName: SensorUnits.localflux.rawValue, value: calData![2])
print("M X : \(calData![0]) , M Y : \(calData![1]), M Z : \(calData![2])")
}
print("MR X : \(rawDataX) , MR Y : \(rawDataY), MR Z : \(rawDataZ)")
objectCluster.addData(sensorName: AltMagSensor.ALT_MAGNETOMETER_X, formatName: SensorFormats.Raw.rawValue, unitName: SensorUnits.localflux.rawValue, value: rawDataX)
objectCluster.addData(sensorName: AltMagSensor.ALT_MAGNETOMETER_Y, formatName: SensorFormats.Raw.rawValue, unitName: SensorUnits.localflux.rawValue, value: rawDataY)
objectCluster.addData(sensorName: AltMagSensor.ALT_MAGNETOMETER_Z, formatName: SensorFormats.Raw.rawValue, unitName: SensorUnits.localflux.rawValue, value: rawDataZ)

return objectCluster
}

public override func parseSensorCalibrationDump(bytes: [UInt8]){
var sensorID = Int(bytes[0]) + (Int(bytes[1])<<8)
if bytes[0] == CALIBRATION_ID {
var range = bytes[2]
var calbytes = bytes
calbytes.removeFirst(12)
if(HardwareVersion == Shimmer3Protocol.HardwareType.Shimmer3.rawValue){
(AlignmentMatrix,SensitivityMatrix,OffsetVector) = parseIMUCalibrationParameters(bytes: calbytes)
}else if(HardwareVersion == Shimmer3Protocol.HardwareType.Shimmer3R.rawValue){
if range==0{
calibBytes_4Ga = calbytes
(AlignmentMatrix_4Ga,SensitivityMatrix_4Ga,OffsetVector_4Ga) = parseIMUCalibrationParameters(bytes: calbytes)
}
if range==1{
calibBytes_8Ga = calbytes
(AlignmentMatrix_8Ga,SensitivityMatrix_8Ga,OffsetVector_8Ga) = parseIMUCalibrationParameters(bytes: calbytes)
}
if range==2{
calibBytes_12Ga = calbytes
(AlignmentMatrix_12Ga,SensitivityMatrix_12Ga,OffsetVector_12Ga) = parseIMUCalibrationParameters(bytes: calbytes)
}
if range==3{
calibBytes_16Ga = calbytes
(AlignmentMatrix_16Ga,SensitivityMatrix_16Ga,OffsetVector_16Ga) = parseIMUCalibrationParameters(bytes: calbytes)
}
}
}
}

public func setInfoMem(infomem: [UInt8]) {

var enabled = Int(infomem[ConfigByteLayoutShimmer3.idxSensors2]>>ConfigByteLayoutShimmer3.bitShiftLSM303DLHCMagRange) & 1
if (enabled == 1){
sensorEnabled = true
} else {
sensorEnabled = false
}
altMagRange = (Int(infomem[ConfigByteLayoutShimmer3.idxConfigSetupByte2] >> ConfigByteLayoutShimmer3.bitShiftLSM303DLHCMagRange) & ConfigByteLayoutShimmer3.maskLSM303DLHCMagRange)

if(HardwareVersion == Shimmer3Protocol.HardwareType.Shimmer3R.rawValue){
if (altMagRange == 0){
Current3RRange = Range3R.RANGE_4Ga
AlignmentMatrix = AlignmentMatrix_4Ga
SensitivityMatrix = SensitivityMatrix_4Ga
OffsetVector = OffsetVector_4Ga
}
if (altMagRange == 1){
Current3RRange = Range3R.RANGE_8Ga
AlignmentMatrix = AlignmentMatrix_8Ga
SensitivityMatrix = SensitivityMatrix_8Ga
OffsetVector = OffsetVector_8Ga
}
if (altMagRange == 2){
Current3RRange = Range3R.RANGE_12Ga
AlignmentMatrix = AlignmentMatrix_12Ga
SensitivityMatrix = SensitivityMatrix_12Ga
OffsetVector = OffsetVector_12Ga
}
if (altMagRange == 3){
Current3RRange = Range3R.RANGE_16Ga
AlignmentMatrix = AlignmentMatrix_16Ga
SensitivityMatrix = SensitivityMatrix_16Ga
OffsetVector = OffsetVector_16Ga
}
}
}

public func setLowPowerAltMag(enable: Bool, isShimmer3withUpdatedSensors: Bool, isShimmer3Sensor: Bool, samplingRate: Double, infomem: [UInt8])-> [UInt8]{
let LowPowerMagEnabled = enable
var infomemtoupdate = infomem
if(HardwareVersion == Shimmer3Protocol.HardwareType.Shimmer3R.rawValue){
if(!LowPowerMagEnabled){
if(samplingRate > 560){
infomemtoupdate = updateInfoMemAltMagRate(infomem: infomem, magRate:0x01)
}else if(samplingRate > 300){
infomemtoupdate = updateInfoMemAltMagRate(infomem: infomem, magRate:0x11)
}else if(samplingRate > 155){
infomemtoupdate = updateInfoMemAltMagRate(infomem: infomem, magRate:0x21)
}else if(samplingRate > 100){
infomemtoupdate = updateInfoMemAltMagRate(infomem: infomem, magRate:0x31)
}else if(samplingRate > 50){
infomemtoupdate = updateInfoMemAltMagRate(infomem: infomem, magRate:0x31)
}else if(samplingRate > 20){
infomemtoupdate = updateInfoMemAltMagRate(infomem: infomem, magRate:0x3E)
}else if(samplingRate > 10){
infomemtoupdate = updateInfoMemAltMagRate(infomem: infomem, magRate:0x3A)
}else{
infomemtoupdate = updateInfoMemAltMagRate(infomem: infomem, magRate:0x08)
}
}else{
infomemtoupdate = updateInfoMemAltMagRate(infomem: infomem, magRate:0x08)
}
}
return infomemtoupdate

}

public func updateInfoMem3RAltMagRange(infomem: [UInt8],range: Range3R) -> [UInt8]{
var infomemtoupdate = infomem
print("oriinfomem: \(infomemtoupdate)")
var altMagRange = 0
var calibBytes = calibBytes_4Ga
if (range == Range3R.RANGE_4Ga){
altMagRange = 0
calibBytes = calibBytes_4Ga
}else if (range == Range3R.RANGE_8Ga){
altMagRange = 1
calibBytes = calibBytes_8Ga
} else if (range == Range3R.RANGE_12Ga){
altMagRange = 2
calibBytes = calibBytes_12Ga
} else if (range == Range3R.RANGE_16Ga){
altMagRange = 3
calibBytes = calibBytes_16Ga
}

infomemtoupdate.replaceSubrange(
ConfigByteLayoutShimmer3.idxLIS3MDLAltMagCalibration..<ConfigByteLayoutShimmer3.idxLIS3MDLAltMagCalibration + ConfigByteLayoutShimmer3.lengthGeneralCalibrationBytes,
with: calibBytes[0..<ConfigByteLayoutShimmer3.lengthGeneralCalibrationBytes])

let orivalue = infomemtoupdate[ConfigByteLayoutShimmer3.idxConfigSetupByte2]
let value = infomemtoupdate[ConfigByteLayoutShimmer3.idxConfigSetupByte2] & ~UInt8(ConfigByteLayoutShimmer3.maskLSM303DLHCMagRange<<ConfigByteLayoutShimmer3.bitShiftLSM303DLHCMagRange)
let range = UInt8(altMagRange<<ConfigByteLayoutShimmer3.bitShiftLSM303DLHCMagRange)

print("orivalue range: \(orivalue)")
print("value: \(value)")
print("range: \(range)")

infomemtoupdate[ConfigByteLayoutShimmer3.idxConfigSetupByte2] = value | range
print("updatedinfomem: \(infomemtoupdate)")

return infomemtoupdate
}


public func updateInfoMemAltMagRate(infomem: [UInt8],magRate: UInt8) -> [UInt8]{
var infomemtoupdate = infomem

print("oriinfomem : \(infomemtoupdate)")

let orivalue = infomemtoupdate[ConfigByteLayoutShimmer3.idxConfigSetupByte2]
let value = infomemtoupdate[ConfigByteLayoutShimmer3.idxConfigSetupByte2] & ~UInt8(ConfigByteLayoutShimmer3.maskLSM303DLHCMagSamplingRate<<ConfigByteLayoutShimmer3.bitShiftLSM303DLHCMagSamplingRate)
let range = UInt8(magRate<<ConfigByteLayoutShimmer3.bitShiftLSM303DLHCMagSamplingRate)

print("orivalue range : \(orivalue)")
print("value : \(value)")
print("range : \(range)")

infomemtoupdate[ConfigByteLayoutShimmer3.idxConfigSetupByte2] = value | range

return infomemtoupdate
}
}


15 changes: 13 additions & 2 deletions ShimmerBluetooth/ShimmerBluetooth/BleByteRadio.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ public class BleByteRadio : NSObject, ByteCommunication {
var RBL_CHAR_TX_UUID = "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
private var bluetoothManager: BluetoothManager?
public static let VERISENSE = "Verisense"
public static let SHIMMER = "Shimmer"
public static let SHIMMER3 = "Shimmer3"
public static let SHIMMER3R = "Shimmer3R"
private var continuation: CheckedContinuation<Bool?, Never>?
public static let VERISENSE_RBL_SERVICE_UUID = "6E400001-B5A3-F393-E0A9-E50E24DCCA9E"
public static let VERISENSE_RBL_CHAR_RX_UUID = "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"
Expand All @@ -17,6 +18,12 @@ public class BleByteRadio : NSObject, ByteCommunication {
public static let SHIMMER3_RBL_SERVICE_UUID = "49535343-FE7D-4AE5-8FA9-9FAFD205E455"
public static let SHIMMER3_RBL_CHAR_RX_UUID = "49535343-1E4D-4BD9-BA61-23C647249616"
public static let SHIMMER3_RBL_CHAR_TX_UUID = "49535343-8841-43F4-A8D4-ECBE34729BB3"

public static let SHIMMER3R_RBL_SERVICE_UUID = "65333333-A115-11E2-9E9A-0800200CA100"
public static let SHIMMER3R_RBL_CHAR_RX_UUID = "65333333-A115-11E2-9E9A-0800200CA102"
public static let SHIMMER3R_RBL_CHAR_TX_UUID = "65333333-A115-11E2-9E9A-0800200CA101"


public var deviceName: String?
public var delegate: ByteCommunicationDelegate?

Expand All @@ -38,7 +45,11 @@ public class BleByteRadio : NSObject, ByteCommunication {
RBL_SERVICE_UUID = BleByteRadio.VERISENSE_RBL_SERVICE_UUID
RBL_CHAR_RX_UUID = BleByteRadio.VERISENSE_RBL_CHAR_RX_UUID
RBL_CHAR_TX_UUID = BleByteRadio.VERISENSE_RBL_CHAR_TX_UUID
} else if let isActive = self.activePeripheral?.name?.contains(BleByteRadio.SHIMMER), isActive {
} else if let isActive = self.activePeripheral?.name?.contains(BleByteRadio.SHIMMER3R), isActive {
RBL_SERVICE_UUID = BleByteRadio.SHIMMER3R_RBL_SERVICE_UUID
RBL_CHAR_RX_UUID = BleByteRadio.SHIMMER3R_RBL_CHAR_RX_UUID
RBL_CHAR_TX_UUID = BleByteRadio.SHIMMER3R_RBL_CHAR_TX_UUID
} else if let isActive = self.activePeripheral?.name?.contains(BleByteRadio.SHIMMER3), isActive {
RBL_SERVICE_UUID = BleByteRadio.SHIMMER3_RBL_SERVICE_UUID
RBL_CHAR_RX_UUID = BleByteRadio.SHIMMER3_RBL_CHAR_RX_UUID
RBL_CHAR_TX_UUID = BleByteRadio.SHIMMER3_RBL_CHAR_TX_UUID
Expand Down
20 changes: 18 additions & 2 deletions ShimmerBluetooth/ShimmerBluetooth/ConfigByteLayoutShimmer3.swift
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,12 @@ public class ConfigByteLayoutShimmer3{
static let idxBtCommBaudRate = 30
static let idxAnalogAccelCalibration = 31
static let idxMPU9150GyroCalibration = 52
static let idxLSM303DLHCMagCalibration = 73
static let idxLSM303DLHCAccelCalibration = 94 //94->114
static let idxLSM303DLHCMagCalibration = 76
static let idxLIS3MDLAltMagCalibration = 285

//static let idxLSM303DLHCAccelCalibration = 94 //94->114
static let idxConfigSetupByte4 = 128+2;

static let idxSDExperimentConfig0 = 128+89;
static let idxSDExperimentConfig1 = 128+90;

Expand All @@ -51,6 +55,9 @@ public class ConfigByteLayoutShimmer3{
static let bitShiftMPU9150GyroRange = 0;
static let maskMPU9150GyroRange = 0x03;

static let bitShiftLSM6DSVyroRangeMSB = 2;
static let maskLSM6DSVyroRangeMSB = 0x01;

static let bitShiftMPU9150AccelGyroSamplingRate = 0;
static let maskMPU9150AccelGyroSamplingRate = 0xFF;

Expand All @@ -63,12 +70,21 @@ public class ConfigByteLayoutShimmer3{
static let bitShiftLSM303DLHCMagRange = 5;
static let maskLSM303DLHCMagRange = 0x07;

static let bitShiftMPU9150AccelRange = 6;
static let maskMPU9150AccelRange = 0x03;

static let bitShiftLSM303DLHCMagSamplingRate = 2;
static let maskLSM303DLHCMagSamplingRate = 0x07;

static let bitShiftLSM303DLHCAccelSamplingRate = 4;
static let maskLSM303DLHCAccelSamplingRate = 0x0F;

static let idxLSM6DSVAccelCalibration = 34;
static let idxGyroCalibration = 55;
static let idxLSM303DLHCAccelCalibration = 97;

static let lengthGeneralCalibrationBytes = 21;

static let bitShiftRTCError = 4;
static let maskRTCError = 1;
}
Loading