Я пытаюсь создать приложение для iOS, которое считывает датчик частоты вращения педалей (Wahoo Fitness Cadence).Это характеристика Bluetooth 0x2A5B (измерение CSC) .В этом примере каденция - это скорость вращения педалей на велосипеде.
Я использую приведенный ниже код в Swift для считывания характеристики с датчика: Версия 1:
private func cadence(from characteristic: CBCharacteristic) -> Int {
guard let characteristicData = characteristic.value else {return -1 }
let byteArray = [UInt8](characteristicData)
print(byteArray)
let firstBitValue = byteArray[1] & 0x01 //set bit 1 (not 0)
if firstBitValue == 1 { //IF crank revolution data is present, 1==true
return Int(byteArray[2])
} else {
return 0
}
}
Когда я печатаю byteArray, я получаю «[2, 1, 0, 152, 11]».«2» и «0» никогда не меняются.позиция «1» увеличивается и никогда не уменьшается.Позиции «152» и «11» кажутся совершенно случайными и никогда не меняются на 0. Они также не меняются, когда кривошип полностью останавливается.Читая документацию, я ожидал, что «11» будет последним временем запуска.Но, похоже, он не меняется, несмотря на то, как медленно я вращаю сенсор.
Как я могу использовать эти данные для получения частоты вращения сенсора?
После работы с помощью Пола я внес измененияк коду и в конечном итоге в результате ниже:
Версия 2
func cadence(from characteristic:CBCharacteristic, previousRotations:Int = 0) -> (rpm:Double, rotations:Int)? {
guard let characteristicData = characteristic.value else {
return nil
}
let byteArray = [UInt8](characteristicData)
if byteArray[0] & 0x02 == 2 {
// contains cadence data
let rotations = (Int(byteArray[2]) << 8) + Int(byteArray[1])
var deltaRotations = rotations - previousRotations
if deltaRotations < 0 {
deltaRotations += 65535
}
let timeInt = (Int(byteArray[4]) << 8) + Int(byteArray[3])
let timeMins = Double(timeInt) / 1024.0 / 60.0
let rpm = Double(deltaRotations) / timeMins
return (rpm:rpm, rotations: rotations)
}
return nil
}
Возвращаемые обороты в настоящее время ниже ожидаемых значений, около 53 является самым высокими 3 является самым низким.Эти значения сравниваются с приложением разработчика датчика, которое показывает около 50-70 об / мин.
Версия 3:
func cadence(from characteristic:CBCharacteristic, previousTime: Int=0, previousRotations:Int = 0) -> (rpm:Double, time: Int, rotations:Int)? {
guard let characteristicData = characteristic.value else {
return nil
}
let byteArray = [UInt8](characteristicData)
if byteArray[0] & 0x02 == 2 {
// contains cadence data
let rotations = Int(byteArray[2])<<8 + Int(byteArray[1])
var deltaRotations = rotations - previousRotations
if deltaRotations < 0 {
deltaRotations += 65535
}
let timeInt = Int(byteArray[4])<<8 + Int(byteArray[3])
var timeDelta = timeInt - previousTime
if (timeDelta < 0) {
timeDelta += 65535
}
let timeMins = Double(timeDelta) / 1024.0 / 60
let rpm = Double(deltaRotations) / timeMins
return (rpm:rpm, time: timeInt, rotations: rotations)
}
return nil
}