@@ -9,18 +9,17 @@ import SwiftUI
99import CoreData
1010import CoreBluetooth
1111
12+ struct CharacteristicIdentifier {
13+ static let modelNumber = CBUUID ( string: " 2A24 " )
14+ static let serial = CBUUID ( string: " 2A25 " )
15+ static let firmware = CBUUID ( string: " 2A26 " )
16+ static let hardwareRevision = CBUUID ( string: " 2A27 " )
17+ static let softwareRevision = CBUUID ( string: " 2A28 " )
18+ static let manufacturer = CBUUID ( string: " 2A29 " )
19+ static let blefsVersion = CBUUID ( string: " adaf0100-4669-6c65-5472-616e73666572 " )
20+ }
21+
1222class DeviceManager : ObservableObject {
13- struct cbuuid {
14- let modelNumber = CBUUID ( string: " 2A24 " )
15- let serial = CBUUID ( string: " 2A25 " )
16- let firmware = CBUUID ( string: " 2A26 " )
17- let hardwareRevision = CBUUID ( string: " 2A27 " )
18- let softwareRevision = CBUUID ( string: " 2A28 " )
19- let manufacturer = CBUUID ( string: " 2A29 " )
20- let blefsVersion = CBUUID ( string: " adaf0100-4669-6c65-5472-616e73666572 " )
21- }
22- let cbuuids = cbuuid ( )
23-
2423 let persistenceController = PersistenceController . shared
2524 let bleManager = BLEManager . shared
2625
@@ -61,9 +60,9 @@ class DeviceManager: ObservableObject {
6160 @Published var settings = Settings ( )
6261 @Published var watches = [ Device] ( )
6362
64- // Get persisted settings, before settings.dat has loaded
65- func getSettings ( ) {
66- guard let device = bleManager . pairedDevice else { return }
63+ // Update persisted settings, before settings.dat has loaded
64+ func setSettings ( _ device : Device ? = nil ) {
65+ let device = device ?? fetchDevice ( ) !
6766
6867 DispatchQueue . main. async {
6968 self . settings = Settings (
@@ -88,19 +87,20 @@ class DeviceManager: ObservableObject {
8887 func fetchDevice( with uuid: String ? = nil ) -> Device ? {
8988 guard let id = uuid ?? bleManager. pairedDeviceID else { return nil }
9089
90+ let context = persistenceController. container. viewContext
9191 let fetchRequest : NSFetchRequest < Device > = Device . fetchRequest ( )
9292 fetchRequest. predicate = NSPredicate ( format: " uuid == %@ " , id)
9393
9494 do {
95- let existingDevices = try persistenceController . container . viewContext . fetch ( fetchRequest)
95+ let existingDevices = try context . fetch ( fetchRequest)
9696
9797 // There's already a paired watch
9898 if let existingDevice = existingDevices. first {
99+ setSettings ( existingDevice)
99100 return existingDevice
100101 }
101102
102103 // There's not already a paired watch, create a new object to save
103- let context = persistenceController. container. newBackgroundContext ( )
104104 let newDevice = Device ( context: context)
105105 context. perform {
106106 newDevice. uuid = id
@@ -120,6 +120,8 @@ class DeviceManager: ObservableObject {
120120 }
121121 }
122122
123+ setSettings ( newDevice)
124+
123125 return newDevice
124126 } catch {
125127 log ( " Error fetching or saving device: \( error) " , caller: " DeviceManager " )
@@ -133,7 +135,7 @@ class DeviceManager: ObservableObject {
133135 let context = persistenceController. container. viewContext
134136
135137 // MARK: - Crash
136- // Crashes happening when creating watch face objects from the viewContext
138+ // Crashes occasionally happening when creating watch face objects from the viewContext
137139 context. perform {
138140 device. brightLevel = Int16 ( settings. brightLevel. rawValue)
139141 device. chimesOption = Int16 ( settings. chimesOption. rawValue)
@@ -164,12 +166,13 @@ class DeviceManager: ObservableObject {
164166 log ( " Error saving settings: \( error. localizedDescription) " , caller: " DeviceManager - updateSettings " )
165167 }
166168 }
167- getSettings ( )
169+
170+ // We've gotten the settings from the watch, now set our variables
171+ setSettings ( device)
168172 }
169173
170- func updateName( name: String , for device: Device ) {
171- guard let uuid = device. uuid else { return }
172- guard let device = fetchDevice ( with: uuid) else { return }
174+ func updateName( name: String , for id: String ) {
175+ guard let device = fetchDevice ( with: id) else { return }
173176
174177 device. name = name
175178
@@ -196,49 +199,63 @@ class DeviceManager: ObservableObject {
196199 func fetchAllDevices( ) {
197200 let fetchRequest : NSFetchRequest < Device > = Device . fetchRequest ( )
198201
199- do {
200- self . watches = try self . persistenceController. container. viewContext. fetch ( fetchRequest)
201- } catch {
202- log ( " Error fetching devices: \( error. localizedDescription) " , caller: " DeviceManager " )
202+ DispatchQueue . main. async {
203+ do {
204+ self . watches = try self . persistenceController. container. viewContext. fetch ( fetchRequest)
205+ } catch {
206+ log ( " Error fetching devices: \( error. localizedDescription) " , caller: " DeviceManager " )
207+ }
203208 }
204209 }
205210}
206211
207212extension DeviceManager {
208213 func updateInfo( characteristic: CBCharacteristic ) {
209214 guard let value = characteristic. value else { return }
210- guard bleManager. pairedDevice != nil else { return }
211-
212- bleManager. pairedDevice. bleUUID = characteristic. uuid. uuidString
213-
214- switch characteristic. uuid {
215- case cbuuids. modelNumber:
216- bleManager. pairedDevice. modelNumber = String ( data: value, encoding: . utf8) ?? " "
217- case cbuuids. serial:
218- bleManager. pairedDevice. serial = String ( data: value, encoding: . utf8) ?? " "
219- case cbuuids. firmware:
220- bleManager. pairedDevice. firmware = String ( data: value, encoding: . utf8) ?? " "
221- case cbuuids. hardwareRevision:
222- bleManager. pairedDevice. hardwareRevision = String ( data: value, encoding: . utf8) ?? " "
223- case cbuuids. softwareRevision:
224- bleManager. pairedDevice. softwareRevision = String ( data: value, encoding: . utf8) ?? " "
225- case cbuuids. manufacturer:
226- bleManager. pairedDevice. manufacturer = String ( data: value, encoding: . utf8) ?? " "
227- case cbuuids. blefsVersion:
228- let byteArray = [ UInt8] ( value)
229- if byteArray. count >= 2 {
230- bleManager. pairedDevice. blefsVersion = " \( Int ( byteArray [ 1 ] ) ) \( Int ( byteArray [ 0 ] ) ) "
231- } else {
232- bleManager. pairedDevice. blefsVersion = " 00 " // or some fallback
215+ guard let objectID = bleManager. pairedDevice? . objectID else { return }
216+
217+ let context = persistenceController. container. viewContext
218+
219+ context. perform {
220+ do {
221+ guard let device = try context. existingObject ( with: objectID) as? Device else { return }
222+
223+ device. bleUUID = characteristic. uuid. uuidString
224+
225+ switch characteristic. uuid {
226+ case CharacteristicIdentifier . modelNumber:
227+ device. modelNumber = String ( data: value, encoding: . utf8) ?? " "
228+ case CharacteristicIdentifier . serial:
229+ device. serial = String ( data: value, encoding: . utf8) ?? " "
230+ case CharacteristicIdentifier . firmware:
231+ device. firmware = String ( data: value, encoding: . utf8) ?? " "
232+ case CharacteristicIdentifier . hardwareRevision:
233+ device. hardwareRevision = String ( data: value, encoding: . utf8) ?? " "
234+ case CharacteristicIdentifier . softwareRevision:
235+ device. softwareRevision = String ( data: value, encoding: . utf8) ?? " "
236+ case CharacteristicIdentifier . manufacturer:
237+ device. manufacturer = String ( data: value, encoding: . utf8) ?? " "
238+ case CharacteristicIdentifier . blefsVersion:
239+ let byteArray = [ UInt8] ( value)
240+ if byteArray. count >= 2 {
241+ device. blefsVersion = " \( Int ( byteArray [ 1 ] ) ) \( Int ( byteArray [ 0 ] ) ) "
242+ } else {
243+ device. blefsVersion = " 00 "
244+ }
245+ default :
246+ break
247+ }
248+
249+ try context. save ( )
250+ } catch {
251+ log ( " Failed to update paired device: \( error) " , caller: " DeviceManager " , target: . ble)
233252 }
234- default :
235- break
236253 }
237254 }
238255
239256 func readInfoCharacteristics( characteristic: CBCharacteristic , peripheral: CBPeripheral ) {
240257 switch characteristic. uuid {
241- case cbuuids . modelNumber, cbuuids . serial, cbuuids . firmware, cbuuids . hardwareRevision, cbuuids . softwareRevision, cbuuids . manufacturer, cbuuids . blefsVersion: peripheral. readValue ( for: characteristic)
258+ case CharacteristicIdentifier . modelNumber, CharacteristicIdentifier . serial, CharacteristicIdentifier . firmware, CharacteristicIdentifier . hardwareRevision, CharacteristicIdentifier . softwareRevision, CharacteristicIdentifier . manufacturer, CharacteristicIdentifier . blefsVersion: peripheral. readValue ( for: characteristic)
242259 default :
243260 break
244261 }
0 commit comments