Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public class ConfigByteLayoutShimmer3{
static let idxBtCommBaudRate = 30
static let idxAnalogAccelCalibration = 31
static let idxMPU9150GyroCalibration = 52
static let idxLSM303DLHCMagCalibration = 73
static let idxLSM303DLHCMagCalibration = 76
//static let idxLSM303DLHCAccelCalibration = 94 //94->114
static let idxConfigSetupByte4 = 128+2;

Expand Down
136 changes: 77 additions & 59 deletions ShimmerBluetooth/ShimmerBluetooth/MagSensor.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,19 @@
import Foundation
public class MagSensor : IMUSensor , SensorProcessing{


public var packetIndexMagX:Int = -1
public var packetIndexMagY:Int = -1
public var packetIndexMagZ:Int = -1
public static let MAGNETOMETER_X = "Magnetometer X"
public static let MAGNETOMETER_Y = "Magnetometer Y"
public static let MAGNETOMETER_Z = "Magnetometer Z"
var magRange = 0
let CALIBRATION_ID = 32
var CALIBRATION_ID = 32
var AlignmentMatrix : [[Double]] = [[]]
var SensitivityMatrix : [[Double]] = [[]]
var OffsetVector : [Double] = []

public func processData(sensorPacket: [UInt8], objectCluster: ObjectCluster) -> ObjectCluster {
let x = Array(sensorPacket[packetIndexMagX..<packetIndexMagX+2])
let y = Array(sensorPacket[packetIndexMagY..<packetIndexMagY+2])
Expand All @@ -45,6 +46,9 @@ public class MagSensor : IMUSensor , SensorProcessing{
}

public override func parseSensorCalibrationDump(bytes: [UInt8]){
if(HardwareVersion == Shimmer3Protocol.HardwareType.Shimmer3R.rawValue){
CALIBRATION_ID = 42
}
var sensorID = Int(bytes[0]) + (Int(bytes[1])<<8)
if bytes[0] == CALIBRATION_ID {
var range = bytes[2]
Expand All @@ -56,77 +60,93 @@ public class MagSensor : IMUSensor , SensorProcessing{

public func setInfoMem(infomem: [UInt8]) {

var enabled = Int(infomem[ConfigByteLayoutShimmer3.idxSensors0]>>5) & 1
var enabled = Int(infomem[ConfigByteLayoutShimmer3.idxSensors0]>>ConfigByteLayoutShimmer3.bitShiftLSM303DLHCMagRange) & 1
if (enabled == 1){
sensorEnabled = true
} else {
} else {
sensorEnabled = false
}

magRange = Int((infomem[8]>>5) & 7)

}

public func setLowPowerMag(enable: Bool, isShimmer3withUpdatedSensors: Bool, isShimmer3Sensor: Bool, samplingRate: Double, infomem: [UInt8])-> [UInt8]{
let LowPowerMagEnabled = enable
var infomemtoupdate = infomem
if(isShimmer3Sensor){
if(HardwareVersion == Shimmer3Protocol.HardwareType.Shimmer3R.rawValue){
if(!LowPowerMagEnabled){
if(isShimmer3withUpdatedSensors){
if(samplingRate >= 100){
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:3)
}else if(samplingRate >= 50){
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:2)
}else if(samplingRate >= 20){
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:1)
}else if(samplingRate >= 10){
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:0)
if(samplingRate <= 10){
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:0)
}else if(samplingRate <= 20){
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:1)
}else if(samplingRate <= 50){
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:2)
}else{
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:3)
}
}else{
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:0)
}
}else {
if(isShimmer3Sensor){
if(!LowPowerMagEnabled){
if(isShimmer3withUpdatedSensors){
if(samplingRate >= 100){
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:3)
}else if(samplingRate >= 50){
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:2)
}else if(samplingRate >= 20){
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:1)
}else if(samplingRate >= 10){
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:0)
}else{
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:0)
}
}else{
if(samplingRate >= 50){
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:6)
}else if(samplingRate >= 20){
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:5)
}else if(samplingRate >= 10){
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:4)
}else{
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:3)
}
}
}else //low power mag for shimmer3 enabled
{
if(isShimmer3withUpdatedSensors){
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:0)
}else{
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:4)
}
}else{
if(samplingRate >= 50){
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:6)
}else if(samplingRate >= 20){
}
}else //Shimmer2
{
if(!LowPowerMagEnabled){
if(samplingRate <= 1){
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:1)
}else if(samplingRate <= 15){
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:4)
}else if(samplingRate <= 30){
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:5)
}else if(samplingRate >= 10){
}else if(samplingRate <= 75){
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:6)
}else{
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:7)
}

}else
{
if(samplingRate >= 10){
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:4)
}else{
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:3)
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:1)
}
}
}else //low power mag for shimmer3 enabled
{
if(isShimmer3withUpdatedSensors){
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:0)
}else{
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:4)
}
}
}else //Shimmer2
{
if(!LowPowerMagEnabled){
if(samplingRate <= 1){
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:1)
}else if(samplingRate <= 15){
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:4)
}else if(samplingRate <= 30){
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:5)
}else if(samplingRate <= 75){
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:6)
}else{
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:7)
}

}else
{
if(samplingRate >= 10){
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:4)
}else{
infomemtoupdate = updateInfoMemMagRate(infomem: infomem, magRate:1)
}
}
}




return infomemtoupdate
}
Expand All @@ -138,16 +158,14 @@ public class MagSensor : IMUSensor , SensorProcessing{

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

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

infomemtoupdate[ConfigByteLayoutShimmer3.idxConfigSetupByte2] = value | range
infomemtoupdate[ConfigByteLayoutShimmer3.idxConfigSetupByte2] = value | rate

return infomemtoupdate
}


}
2 changes: 2 additions & 0 deletions ShimmerBluetooth/ShimmerBluetooth/Shimmer3Protocol.swift
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,7 @@ public class Shimmer3Protocol : NSObject, ShimmerProtocol {
battVoltageSensor = BattVoltageSensor()
} else if(REV_HW_MAJOR==HardwareType.Shimmer3R.rawValue){
lnAccelSensor = LNAccelSensor(hwid: REV_HW_MAJOR)
magSensor = MagSensor(hwid: REV_HW_MAJOR)
gyroSensor = GyroSensor(hwid: REV_HW_MAJOR)
wrAccelSensor = WRAccelSensor(hwid: REV_HW_MAJOR)
timeSensor = TimeSensor()
Expand Down Expand Up @@ -351,6 +352,7 @@ public class Shimmer3Protocol : NSObject, ShimmerProtocol {
} else if (REV_HW_MAJOR==HardwareType.Shimmer3R.rawValue){
timeSensor.setInfoMem(infomem: infoMem)
lnAccelSensor.setInfoMem(infomem: infoMem)
magSensor.setInfoMem(infomem: infoMem)
gyroSensor.setInfoMem(infomem: infoMem)
wrAccelSensor.setInfoMem(infomem: infoMem)
}
Expand Down
10 changes: 10 additions & 0 deletions ShimmerExamplePlot/ShimmerExamplePlot/ContentView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,14 @@ struct ContentView: View {
}
}
})
Button("WriteInfoMem Mag Shimmer3R",action:{ Task {
do {
await viewModel.sendInfoMemS3RMag()
} catch {
print("Error: \(error)")
}
}
})

Button("WriteInfoMem Gyro Shimmer3R",action:{ Task {
do {
Expand Down Expand Up @@ -351,6 +359,7 @@ struct ContentView: View {
// Update the ViewModel's wrRangeIndex property
viewModel.lnAccelRangeIndex = newValue
}

Picker("Select Gyro Range", selection: $viewModel.gyroRange3RIndex) {
ForEach(0..<viewModel.gyroRange3R.count, id: \.self) { index in
Text(viewModel.gyroRange3R[index])
Expand All @@ -360,6 +369,7 @@ struct ContentView: View {
// Update the ViewModel's wrRangeIndex property
viewModel.gyroRange3RIndex = newValue
}

Button("WriteInfoMem Shimmer3R",action:{ Task {
do {
await viewModel.sendS3RInfoMemConfigUpdate()
Expand Down
11 changes: 11 additions & 0 deletions ShimmerExamplePlot/ShimmerExamplePlot/ViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,17 @@ class ViewModel: NSObject, ObservableObject {
refreshUISettings()
}

func sendInfoMemS3RMag() async{
let infommag:[UInt8] = [
0x80, 0x02, 0x01, 0x20, 0x00, 0x00, 0x02, 0x00, 0x21, 0x08, 0x00, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x88, 0x06, 0x88, 0x06, 0x88, 0x9C, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x88, 0x2C, 0x88, 0x2C, 0x88, 0x9C, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x9B, 0x02, 0x9B, 0x02, 0x9B, 0x9C, 0x00, 0x00, 0x00, 0x9C, 0x00, 0x00, 0x00, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x87, 0x06, 0x87, 0x06, 0x87, 0x00, 0x9C, 0x00, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x9B, 0x02, 0x9B, 0x02, 0x9B, 0x9C, 0x00, 0x00, 0x00, 0x9C, 0x00, 0x00, 0x00, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x68, 0x69, 0x6D, 0x6D, 0x65, 0x72, 0x5F, 0x44, 0x37, 0x45, 0x30, 0x33, 0x52, 0x5F, 0x31, 0x37, 0x35, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x68, 0x35, 0x5F, 0xBA, 0x01, 0x01, 0x31, 0x01, 0x00, 0x36, 0x01, 0x00, 0x00, 0xE8, 0xDD, 0x50, 0xBB, 0xD7, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x0A, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x64, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x9C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x5D, 0x0D, 0x5D, 0x0D, 0x5D, 0x64, 0x00, 0x00, 0x00, 0x9C, 0x00, 0x00, 0x00, 0x9C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00]
await shimmer3Protocol?.writeShimmer3InfoMem(infoMem: infommag)
refreshUISettings()
}

func sendInfoMemS3RGyro() async{
let infomlnacc:[UInt8] = [
0x80,0x02,0x01,0x40,0x00,0x00,0x02,0x05,0x21,0xC8,0x00,0x80,0x10,0x00,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x80,0x10,0x00,0x00,0x00,0x00,0x00,0x02,0x01,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD1,0x00,0xD1,0x00,0xD1,0x9C,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x9C,0x00,0x00,0x00,0x00,0x00,0x00,0x2C,0x88,0x2C,0x88,0x2C,0x88,0x9C,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x9C,0x00,0x00,0x00,0x00,0x00,0x00,0x0D,0x5D,0x0D,0x5D,0x0D,0x5D,0x64,0x00,0x00,0x00,0x9C,0x00,0x00,0x00,0x9C,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x87,0x06,0x87,0x06,0x87,0x00,0x9C,0x00,0x9C,0x00,0x00,0x00,0x00,0x9C,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
Expand Down