From 62e40f6564773909f93c817b049c68ba21314051 Mon Sep 17 00:00:00 2001 From: Schwifty Date: Sun, 22 Mar 2026 16:57:34 +0000 Subject: [PATCH] fix: slash BLE connection timeouts to match Android optimizations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Port timeout reductions from payfrit-beacon-android PR #5: - Read operation timeout: 15s → 8s - Password retry delay: 0.5s → 0.2s (matches Android's 200→100ms auth delays) - FFE2 reconnect delay: 2.0s → 1.0s (matches Android's cleanup delay reduction) - Final response collection: 2.0s → 1.0s - Disconnect retry backoff: +2.0s → +1.0s base - Post-reconnect resume delay: 1.5s → 0.8s Typical provisioning should feel noticeably snappier, especially on retries and reconnects. Co-Authored-By: Claude Opus 4.6 (1M context) --- PayfritBeacon/BeaconProvisioner.swift | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/PayfritBeacon/BeaconProvisioner.swift b/PayfritBeacon/BeaconProvisioner.swift index 7215149..ee8dbfb 100644 --- a/PayfritBeacon/BeaconProvisioner.swift +++ b/PayfritBeacon/BeaconProvisioner.swift @@ -284,14 +284,14 @@ class BeaconProvisioner: NSObject, ObservableObject { centralManager.connect(resolvedPeripheral, options: nil) - // 15-second timeout for read operations + // 8-second timeout for read operations (was 15s — slashed to match Android) let timeout = DispatchWorkItem { [weak self] in guard let self = self, self.operationMode == .readingConfig else { return } DebugLog.shared.log("BLE: Read timeout reached") self.finishRead() } readTimeout = timeout - DispatchQueue.main.asyncAfter(deadline: .now() + 15, execute: timeout) + DispatchQueue.main.asyncAfter(deadline: .now() + 8, execute: timeout) } // MARK: - State Reset @@ -428,7 +428,7 @@ class BeaconProvisioner: NSObject, ObservableObject { passwordIndex += 1 if passwordIndex < BeaconProvisioner.DXSMART_PASSWORDS.count { DebugLog.shared.log("BLE: Password rejected, trying next (\(passwordIndex + 1)/\(BeaconProvisioner.DXSMART_PASSWORDS.count))") - DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in + DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { [weak self] in self?.authenticate() } } else if operationMode == .readingConfig { @@ -565,7 +565,7 @@ class BeaconProvisioner: NSObject, ObservableObject { disconnectPeripheral() - DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { [weak self] in + DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { [weak self] in guard let self = self, let beacon = self.currentBeacon else { return } guard self.state == .connecting else { return } let resolvedPeripheral = self.resolvePeripheral(beacon) @@ -824,9 +824,9 @@ class BeaconProvisioner: NSObject, ObservableObject { private func sendNextReadQuery() { guard dxReadQueryIndex < dxReadQueries.count else { - DebugLog.shared.log("BLE: All read queries sent, waiting 2s for final responses") + DebugLog.shared.log("BLE: All read queries sent, waiting 1s for final responses") progress = "Collecting responses..." - DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { [weak self] in + DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { [weak self] in guard let self = self, self.operationMode == .readingConfig else { return } self.finishRead() } @@ -1170,7 +1170,7 @@ extension BeaconProvisioner: CBCentralManagerDelegate { } state = .connecting - let delay = Double(disconnectRetryCount) + 2.0 // 3s, 4s, 5s... backoff + let delay = Double(disconnectRetryCount) + 1.0 // 2s, 3s, 4s... backoff (was +2.0) DispatchQueue.main.asyncAfter(deadline: .now() + delay) { [weak self] in guard let self = self, let beacon = self.currentBeacon else { return } guard self.state == .connecting else { return } @@ -1353,8 +1353,8 @@ extension BeaconProvisioner: CBPeripheralDelegate { state = .writing DebugLog.shared.log("BLE: Resuming write from command \(writeIndex + 1)/\(commandQueue.count)") progress = "Resuming config write..." - // 1.5s delay after reconnect for BLE stability - DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) { [weak self] in + // 0.8s delay after reconnect for BLE stability (was 1.5s) + DispatchQueue.main.asyncAfter(deadline: .now() + 0.8) { [weak self] in self?.sendNextCommand() } } else { -- 2.43.0