From 9a10994408f7044193428feec14e7962b2e87633 Mon Sep 17 00:00:00 2001 From: Manuel Fernandez Date: Sat, 22 Jul 2023 08:18:06 -0400 Subject: [PATCH] [Feature] Add CBUUID API #32 Support CBUUIDs to be passed to convenience functions. (#32) --- .../Extensions/Peripheral+ReadWrite.swift | 74 +++++++++++++++---- 1 file changed, 60 insertions(+), 14 deletions(-) diff --git a/Sources/Peripheral/Extensions/Peripheral+ReadWrite.swift b/Sources/Peripheral/Extensions/Peripheral+ReadWrite.swift index d86e150..78b7561 100644 --- a/Sources/Peripheral/Extensions/Peripheral+ReadWrite.swift +++ b/Sources/Peripheral/Extensions/Peripheral+ReadWrite.swift @@ -10,10 +10,23 @@ extension Peripheral { public func readValue( forCharacteristicWithUUID characteristicUUID: UUID, ofServiceWithUUID serviceUUID: UUID + ) async throws -> Value? where Value: PeripheralDataConvertible { + try await self.readValue( + forCharacteristicWithCBUUID: CBUUID(nsuuid: characteristicUUID), + ofServiceWithCBUUID: CBUUID(nsuuid: serviceUUID) + ) + } + + /// Reads and parses the value of a characteristic with a given identifier, of a service with a + /// given identifier. + /// - Note: If the service or characteristic has not been discovered, it will attempt to discover it. + public func readValue( + forCharacteristicWithCBUUID characteristicCBUUID: CBUUID, + ofServiceWithCBUUID serviceCBUUID: CBUUID ) async throws -> Value? where Value: PeripheralDataConvertible { guard let characteristic = try await self.findCharacteristic( - uuid: characteristicUUID, - ofServiceWithUUID: serviceUUID + cbuuid: characteristicCBUUID, + ofServiceWithCBUUID: serviceCBUUID ) else { throw BluetoothError.characteristicNotFound } @@ -22,6 +35,7 @@ extension Peripheral { return try characteristic.parsedValue() } + /// Writes and parses the value of a characteristic with a given identifier, of a service with a /// given identifier. @@ -31,10 +45,27 @@ extension Peripheral { forCharacteristicWithUUID characteristicUUID: UUID, ofServiceWithUUID serviceUUID: UUID, type: CBCharacteristicWriteType = .withResponse + ) async throws where Value: PeripheralDataConvertible { + try await self.writeValue( + value, + forCharacteristicWithCBUUID: CBUUID(nsuuid: characteristicUUID), + ofServiceWithCBUUID: CBUUID(nsuuid: serviceUUID), + type: type + ) + } + + /// Writes and parses the value of a characteristic with a given identifier, of a service with a + /// given identifier. + /// - Note: If the service or characteristic has not been discovered, it will attempt to discover it. + public func writeValue( + _ value: Value, + forCharacteristicWithCBUUID characteristicCBUUID: CBUUID, + ofServiceWithCBUUID serviceCBUUID: CBUUID, + type: CBCharacteristicWriteType = .withResponse ) async throws where Value: PeripheralDataConvertible { guard let characteristic = try await self.findCharacteristic( - uuid: characteristicUUID, - ofServiceWithUUID: serviceUUID + cbuuid: characteristicCBUUID, + ofServiceWithCBUUID: serviceCBUUID ) else { throw BluetoothError.characteristicNotFound } @@ -53,10 +84,25 @@ extension Peripheral { _ enabled: Bool, forCharacteristicWithUUID characteristicUUID: UUID, ofServiceWithUUID serviceUUID: UUID + ) async throws { + try await self.setNotifyValue( + enabled, + forCharacteristicWithCBUUID: CBUUID(nsuuid: characteristicUUID), + ofServiceWithCBUUID: CBUUID(nsuuid: serviceUUID) + ) + } + + /// Sets notifications or indications for the value of a characteristic with a given identifier of a service + /// with a given identifier + /// - Note: If the service or characteristic has not been discovered, it will attempt to discover it. + public func setNotifyValue( + _ enabled: Bool, + forCharacteristicWithCBUUID characteristicCBUUID: CBUUID, + ofServiceWithCBUUID serviceCBUUID: CBUUID ) async throws { guard let characteristic = try await self.findCharacteristic( - uuid: characteristicUUID, - ofServiceWithUUID: serviceUUID + cbuuid: characteristicCBUUID, + ofServiceWithCBUUID: serviceCBUUID ) else { throw BluetoothError.characteristicNotFound } @@ -64,15 +110,16 @@ extension Peripheral { try await self.setNotifyValue(enabled, for: characteristic) } + // MARK: Private helpers + private func findCharacteristic( - uuid characteristicUUID: UUID, - ofServiceWithUUID serviceUUID: UUID + cbuuid characteristicCBUUID: CBUUID, + ofServiceWithCBUUID serviceCBUUID: CBUUID ) async throws -> Characteristic? { - guard let service = try await self.findService(uuid: serviceUUID) else { + guard let service = try await self.findService(cbuuid: serviceCBUUID) else { return nil } - let characteristicCBUUID = CBUUID(nsuuid: characteristicUUID) let discoveredCharacteristic: () -> CBCharacteristic? = { service.cbService.characteristics?.first(where: { $0.uuid == characteristicCBUUID }) } @@ -90,17 +137,16 @@ extension Peripheral { return Characteristic(cbCharacteristic) } - private func findService(uuid: UUID) async throws -> Service? { - let cbUUID = CBUUID(nsuuid: uuid) + private func findService(cbuuid: CBUUID) async throws -> Service? { let discoveredService: () -> CBService? = { - self.cbPeripheral.services?.first(where: { $0.uuid == cbUUID }) + self.cbPeripheral.services?.first(where: { $0.uuid == cbuuid }) } if let cbService = discoveredService() { return Service(cbService) } - try await self.discoverServices([cbUUID]) + try await self.discoverServices([cbuuid]) guard let cbService = discoveredService() else { return nil