riceman89
riceman89

Reputation: 189

Swift Sensortag 2.0 Write Bits to BLE

Pretty basic question here:

I'm currently trying to control a sensortag 2.0 via Swift 3.0.

I'm trying to simultaneously turn on the acc, gyro, and magnetometer.

According to Texas Instruments documentation, the following applies for the IMU:

Axis enable bits:gyro-z=0,gyro-y,gyro-x,acc-z=3,acc-y,acc-x,mag=6 Range: bit 8,9

I have written "0x023F" in the following manner, which turns on the gyro and the accelerometer with great success.

                let value = OperationDataHolder(data:[0x023F])
                var parameter = 0x023F
                let data = NSData(bytes: &parameter, length: 2)
                self.sensorTagPeripheral.writeValue(data as Data, for: thisCharacteristic, type: CBCharacteristicWriteType.withResponse)

However, I'm not able to figure out the value to write to turn turn on all 3 units simultaneously. Would someone be able to provide me with this value?

Thanks!

Upvotes: 1

Views: 117

Answers (2)

Josh Homann
Josh Homann

Reputation: 16327

Building on peters answer, the swifty way to do this is with an option set, which is admittedly more work up front, but much more readable than hex:

    struct SensorOptions: OptionSet {
        let rawValue: Int32
        static let gyroZ = SensorOptions(rawValue: 1 << 0)
        static let gyroY = SensorOptions(rawValue: 1 << 1)
        static let gyroX = SensorOptions(rawValue: 1 << 2)
        static let accZ  = SensorOptions(rawValue: 1 << 3)
        static let accY  = SensorOptions(rawValue: 1 << 4)
        static let accX  = SensorOptions(rawValue: 1 << 5)
        static let mag   = SensorOptions(rawValue: 1 << 6)
        static let wakeOnMotion = SensorOptions(rawValue: 1 << 7)
        static let accelerometerRange1 = SensorOptions(rawValue: 1 << 8)
        static let accelerometerRange2 = SensorOptions(rawValue: 1 << 9)
    }

    let options: SensorOptions = [.gyroZ, .gyroY, .gyroX, .accZ, .accY, .accX, .mag, .accelerometerRange2]
    var parameter = options.rawValue
    let data = NSData(bytes: &parameter, length: 2)
    self.sensorTagPeripheral.writeValue(data as Data, for: thisCharacteristic, type: CBCharacteristicWriteType.withResponse)

Also if you don't like the option set swift has binary literals so you can write var parameter = 0b1001111111 in your code instead of 0x027F

Upvotes: 1

Peter S
Peter S

Reputation: 54

When you convert the current value you are using (0x023F) to binary, you get 0b1000111111. Each of the bits represents the on/off (on=1/off=0) state of a given sensor component.

If you read the binary number from right to left, and map each bit by referencing the table below, you will see that the gyro z/y/x and accelerometer z/y/x are all enabled. If you want to enable the magnetometer, simply change 'bit 6' to a '1' and convert that binary number to a hexadecimal number.

So, Google says: 0b1001111111 is 0x027F in hexadecimal

Mapping:
bit 0 => gyro z-axis
bit 1 => gyro y-axis
bit 2 => gyro x-axis
bit 3 => acc z-axis
bit 4 => acc y-axis
bit 5 => acc x-axis
bit 6 => mag (enables all axes)
bit 7 => Wake-on-motion enable
bits 8 & 9 => Accelerometer range
bits 10-15 => not used

For more info about the mapping (i.e. what bits 8 & 9 do), see the Sensor Tag Wiki Page

Upvotes: 2

Related Questions