Compare commits

...

7 Commits

Author SHA1 Message Date
Roberto Viola
91989a138b Revert "adding android zwift ride protocol"
This reverts commit e66db6bb8d.
2024-07-31 16:30:37 +02:00
Roberto Viola
cf719a53c0 Merge branch 'master' into SteeringOnZwift 2024-07-31 16:21:43 +02:00
Roberto Viola
e66db6bb8d adding android zwift ride protocol 2024-07-31 16:21:37 +02:00
Roberto Viola
b09e704ee9 i can't understand yet the angle that zwift wants 2024-07-27 16:49:41 +02:00
Roberto Viola
dcf86a4ea4 Merge branch 'master' into SteeringOnZwift 2024-07-27 16:28:24 +02:00
Roberto Viola
fdf1e68986 seems to work! 2024-07-27 15:51:27 +02:00
Roberto Viola
1ff5069d80 it pairs but it doesn't steer 2024-07-27 15:27:05 +02:00
2 changed files with 70 additions and 3 deletions

View File

@@ -27,6 +27,11 @@ let PowerFeatureCharacteristicUUID = CBUUID(string: "0x2A65")
let PowerSensorLocationCharacteristicUUID = CBUUID(string: "0x2A5D")
let PowerMeasurementCharacteristicUUID = CBUUID(string: "0x2A63")
let SterzoServiceUUID = CBUUID(string: "347b0001-7635-408b-8918-8ff3949ce592")
let SterzoWriteUUID = CBUUID(string: "347b0031-7635-408b-8918-8ff3949ce592")
let SterzoNotifyUUID = CBUUID(string: "347b0030-7635-408b-8918-8ff3949ce592")
@objc public class virtualbike_ios_swift: NSObject {
private var peripheralManager: BLEPeripheralManager!

View File

@@ -97,6 +97,10 @@ class BLEPeripheralManagerZwift: NSObject, CBPeripheralManagerDelegate {
private var PowerFeatureCharacteristic: CBMutableCharacteristic!
private var PowerSensorLocationCharacteristic: CBMutableCharacteristic!
private var PowerMeasurementCharacteristic: CBMutableCharacteristic!
private var SterzoService: CBMutableService!
private var SterzoWriteCharacteristic: CBMutableCharacteristic!
private var SterzoNotifyCharacteristic: CBMutableCharacteristic!
public var LastFTMSMessageReceived: Data?
@@ -254,6 +258,26 @@ class BLEPeripheralManagerZwift: NSObject, CBPeripheralManagerDelegate {
PowerMeasurementCharacteristic]
self.peripheralManager.add(PowerService)
// Sterzo
self.SterzoService = CBMutableService(type: SterzoServiceUUID, primary: true)
let SterzoWriteProperties: CBCharacteristicProperties = [.write]
let SterzoWritePermissions: CBAttributePermissions = [.writeable]
self.SterzoWriteCharacteristic = CBMutableCharacteristic(type: SterzoWriteUUID,
properties: SterzoWriteProperties, value: nil,
permissions: SterzoWritePermissions)
let SterzoNotifyProperties: CBCharacteristicProperties = [.notify]
let SterzoNotifyPermissions: CBAttributePermissions = []
self.SterzoNotifyCharacteristic = CBMutableCharacteristic(type: SterzoNotifyUUID,
properties: SterzoNotifyProperties,
value: nil,
permissions: SterzoNotifyPermissions)
SterzoService.characteristics = [SterzoWriteCharacteristic,
SterzoNotifyCharacteristic]
self.peripheralManager.add(SterzoService)
default:
print("Peripheral manager is down")
@@ -323,7 +347,11 @@ class BLEPeripheralManagerZwift: NSObject, CBPeripheralManagerDelegate {
let responseData = Data(bytes: &response, count: 3)
self.peripheralManager.updateValue(responseData, for: self.FitnessMachineControlPointCharacteristic, onSubscribedCentrals: nil)
}
} else if requests.first!.characteristic == self.SterzoWriteCharacteristic {
self.peripheralManager.respond(to: requests.first!, withResult: .success)
print("Responded successfully to a write request")
}
}
func peripheralManager(_ peripheral: CBPeripheralManager, didReceiveRead request: CBATTRequest) {
@@ -466,6 +494,12 @@ class BLEPeripheralManagerZwift: NSObject, CBPeripheralManagerDelegate {
let heartRateData = Data(bytes: &heartRateBPM, count: MemoryLayout.size(ofValue: heartRateBPM))
return heartRateData
}
func float32ToUInt8Array(_ value: Float32) -> [UInt8] {
let bytes = withUnsafeBytes(of: value) { Array($0) }
return bytes.reversed()
}
func calculateIndoorBike() -> Data {
let flags0:UInt8 = 0x64
@@ -477,13 +511,41 @@ class BLEPeripheralManagerZwift: NSObject, CBPeripheralManagerDelegate {
return indoorBikeData
}
static var angle: Float32 = 10
static var angleCount: Int = 0
static var angleToogle: Bool = false
@objc func updateSubscribers() {
if(self.serviceToggle == 3 || garmin_bluetooth_compatibility)
if(self.serviceToggle == 4)
{
BLEPeripheralManagerZwift.angleCount = BLEPeripheralManagerZwift.angleCount + 1
if(BLEPeripheralManagerZwift.angleCount > 10) {
BLEPeripheralManagerZwift.angleCount = 0
if(BLEPeripheralManagerZwift.angleToogle) {
BLEPeripheralManagerZwift.angle = 30
BLEPeripheralManagerZwift.angleToogle = false
} else {
BLEPeripheralManagerZwift.angle = -30;
BLEPeripheralManagerZwift.angleToogle = true
}
} else {
if(!BLEPeripheralManagerZwift.angleToogle) {
BLEPeripheralManagerZwift.angle = BLEPeripheralManagerZwift.angle - 3.3;
} else {
BLEPeripheralManagerZwift.angle = BLEPeripheralManagerZwift.angle + 3.3;
}
}
print("Angle \(BLEPeripheralManagerZwift.angle)")
let sterzoData = Data(bytes: float32ToUInt8Array(BLEPeripheralManagerZwift.angle), count: 4)
let ok = self.peripheralManager.updateValue(sterzoData, for: self.SterzoNotifyCharacteristic, onSubscribedCentrals: nil)
if(ok) {
self.serviceToggle = 0
}
} else if(self.serviceToggle == 3 || garmin_bluetooth_compatibility) {
let powerData = self.calculatePower()
let ok = self.peripheralManager.updateValue(powerData, for: self.PowerMeasurementCharacteristic, onSubscribedCentrals: nil)
if(ok) {
self.serviceToggle = 0
self.serviceToggle = self.serviceToggle + 1
}
} else if(self.serviceToggle == 2) {
let cadenceData = self.calculateCadence()