         let semaphore = self.semaphore(for: peripheral)
         await semaphore.wait()
         defer { semaphore.signal() }
+        self.log("Will discover services for \(peripheral)")
         let serviceUUIDs = services.isEmpty ? nil : services.map { CBUUID($0) }
         return try await withCheckedThrowingContinuation { [weak self] continuation in
             guard let self = self else { return }

        let semaphore = self.semaphore(for: characteristic.peripheral)
        await semaphore.wait()
        defer { semaphore.signal() }
        return try await withCheckedThrowingContinuation { [weak self] continuation in
            guard let self = self else { return }
            self.async {

    }
    
    public func disconnect(_ peripheral: Peripheral) {
        self.log("Will disconnect \(peripheral)")
        self.async { [weak self] in
            guard let self = self else { return }
            // get CoreBluetooth objects from cache
            guard let peripheralObject = self.cache.peripherals[peripheral] else {
                return
            }
            
            self.centralManager.cancelPeripheralConnection(peripheralObject)
        }
    }
    
    public func disconnectAll() {
        self.log("Will disconnect all")
        self.async { [weak self] in
            guard let self = self else { return }
            // get CoreBluetooth objects from cache
