diff --git a/PayfritBeacon/BeaconProvisioner.swift b/PayfritBeacon/BeaconProvisioner.swift index 7215149..5d2dee0 100644 --- a/PayfritBeacon/BeaconProvisioner.swift +++ b/PayfritBeacon/BeaconProvisioner.swift @@ -365,8 +365,10 @@ class BeaconProvisioner: NSObject, ObservableObject { isTerminating = true DebugLog.shared.log("BLE: Provisioning success!") state = .success - disconnectPeripheral() + // Signal completion BEFORE disconnecting — the disconnect delegate fires + // synchronously and ScanView needs writesCompleted=true before it sees it completion?(.success(macAddress: nil)) + disconnectPeripheral() cleanup() } diff --git a/PayfritBeacon/Provisioners/DXSmartProvisioner.swift b/PayfritBeacon/Provisioners/DXSmartProvisioner.swift index eda53bc..25214f2 100644 --- a/PayfritBeacon/Provisioners/DXSmartProvisioner.swift +++ b/PayfritBeacon/Provisioners/DXSmartProvisioner.swift @@ -173,6 +173,15 @@ final class DXSmartProvisioner: NSObject, BeaconProvisioner { for (index, (name, packet)) in commands.enumerated() { await diagnosticLog?.log("write", "[\(index + 1)/\(commands.count)] \(name) (\(packet.count) bytes)") + // SaveConfig (last command) causes beacon MCU to reboot — it never sends an ACK. + // Fire the BLE write and return immediately; the disconnect is expected. + if name == "SaveConfig" { + peripheral.writeValue(packet, for: writeChar, type: .withResponse) + await diagnosticLog?.log("write", "✅ [\(index + 1)/\(commands.count)] SaveConfig sent — beacon will reboot") + await diagnosticLog?.log("write", "✅ All commands written successfully") + return + } + // Retry each command up to 2 times — beacon BLE stack can be flaky var lastError: Error? for writeAttempt in 1...2 { @@ -193,8 +202,8 @@ final class DXSmartProvisioner: NSObject, BeaconProvisioner { throw lastError } - // 500ms between commands — beacon needs time to process - try await Task.sleep(nanoseconds: 500_000_000) + // 150ms between commands — aggressive speedup (was 300ms, originally 500ms) + try await Task.sleep(nanoseconds: 150_000_000) } } diff --git a/PayfritBeacon/Views/ScanView.swift b/PayfritBeacon/Views/ScanView.swift index 4210268..64d4586 100644 --- a/PayfritBeacon/Views/ScanView.swift +++ b/PayfritBeacon/Views/ScanView.swift @@ -698,7 +698,7 @@ struct ScanView: View { try await provisioner.writeConfig(config) writesCompleted = true - provisioner.disconnect() + // No explicit disconnect needed — succeed() already disconnects try await APIClient.shared.registerBeaconHardware( businessId: business.id,