diff --git a/Meshtastic/Helpers/BLEManager.swift b/Meshtastic/Helpers/BLEManager.swift index 5ced286b..d6837dde 100644 --- a/Meshtastic/Helpers/BLEManager.swift +++ b/Meshtastic/Helpers/BLEManager.swift @@ -29,7 +29,10 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph @Published var connectedPeripheral: Peripheral! @Published var lastConnectionError: String + @Published var minimumVersion = "1.3.42" @Published var connectedVersion: String + @Published var invalidVersion = false + @Published var preferredPeripheral = false @Published var isSwitchedOn: Bool = false @Published var isScanning: Bool = false @@ -41,6 +44,8 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph var timeoutTimer: Timer? var timeoutTimerCount = 0 + var configTimeoutTimer: Timer? + var positionTimer: Timer? let broadcastNodeNum: UInt32 = 4294967295 @@ -102,7 +107,7 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph if isSwitchedOn { centralManager.scanForPeripherals(withServices: [meshtasticServiceCBUUID], options: nil) - self.isScanning = self.centralManager.isScanning + isScanning = centralManager.isScanning print("✅ Scanning Started") } @@ -114,7 +119,7 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph if centralManager.isScanning { self.centralManager.stopScan() - self.isScanning = self.centralManager.isScanning + isScanning = centralManager.isScanning print("🛑 Stopped Scanning") } } @@ -155,6 +160,20 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph if meshLoggingEnabled { MeshLogger.log("🚨 BLE Connecting 2 Second Timeout Timer Fired \(timeoutTimerCount) Time(s): \(name)") } } } + + // MARK: BLE Connect functions + /// The action after the timeout-timer has fired + /// + /// - Parameters: + /// - timer: The time that fired the event + /// + @objc func configTimeoutTimerFired(timer: Timer) { + + self.lastConnectionError = "🚨 Update your firmware" + self.connectedVersion = "1.2.65" + self.invalidVersion = true + self.timeoutTimer!.invalidate() + } // Connect to a specific peripheral func connectTo(peripheral: CBPeripheral) { @@ -170,7 +189,6 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph self.disconnectPeripheral() } - self.connectedVersion = "0.0.0" self.centralManager?.connect(peripheral) // Invalidate any existing timer @@ -192,6 +210,8 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph guard let connectedPeripheral = connectedPeripheral else { return } self.centralManager?.cancelPeripheralConnection(connectedPeripheral.peripheral) self.isConnected = false + self.invalidVersion = false + self.connectedVersion = "0.0.0" } // Called each time a peripheral is discovered @@ -416,10 +436,45 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph } } if (![FROMNUM_characteristic, FROMNUM_characteristic, TORADIO_characteristic].contains(nil)) { + sendWantConfig() + + self.configTimeoutTimer = Timer.scheduledTimer(timeInterval: TimeInterval(7), target: self, selector: #selector(configTimeoutTimerFired), userInfo: context, repeats: false) + RunLoop.current.add(self.configTimeoutTimer!, forMode: .common) } } + func requestDeviceMetadata() { + guard (connectedPeripheral!.peripheral.state == CBPeripheralState.connected) else { return } + + MeshLogger.log("â„šī¸ Requesting Device Metadata for \(connectedPeripheral!.peripheral.name ?? "Unknown")") + + var adminPacket = AdminMessage() + adminPacket.getDeviceMetadataRequest = 0 + + var meshPacket: MeshPacket = MeshPacket() + meshPacket.id = UInt32.random(in: UInt32(UInt8.max)..