Skip to content

Commit

Permalink
[Feature] Add CBUUID API #32
Browse files Browse the repository at this point in the history
Support CBUUIDs to be passed to convenience functions. (#32)
  • Loading branch information
manolofdez authored Jul 22, 2023
1 parent d97d209 commit 9a10994
Showing 1 changed file with 60 additions and 14 deletions.
74 changes: 60 additions & 14 deletions Sources/Peripheral/Extensions/Peripheral+ReadWrite.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,23 @@ extension Peripheral {
public func readValue<Value>(
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<Value>(
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
}
Expand All @@ -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.
Expand All @@ -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: 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
}
Expand All @@ -53,26 +84,42 @@ 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
}

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 })
}
Expand All @@ -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
Expand Down

0 comments on commit 9a10994

Please sign in to comment.