Преглед изворни кода

add heartbeat closure

(cherry picked from commit 8b133c1df490944632fe7cd3f1b27d73e91e026a)
avouspierre пре 3 година
родитељ
комит
036f03e24c

+ 4 - 4
FreeAPS/Sources/APS/CGM/AppGroupSource.swift

@@ -5,22 +5,22 @@ import LibreTransmitter
 struct AppGroupSource: GlucoseSource {
 struct AppGroupSource: GlucoseSource {
     let from: String
     let from: String
 
 
-    func fetch() -> AnyPublisher<[BloodGlucose], Never> {
+    func fetch(_ heartbeat: DispatchTimer?) -> AnyPublisher<[BloodGlucose], Never> {
         guard let suiteName = Bundle.main.appGroupSuiteName,
         guard let suiteName = Bundle.main.appGroupSuiteName,
               let sharedDefaults = UserDefaults(suiteName: suiteName)
               let sharedDefaults = UserDefaults(suiteName: suiteName)
         else {
         else {
             return Just([]).eraseToAnyPublisher()
             return Just([]).eraseToAnyPublisher()
         }
         }
 
 
-        return Just(fetchLastBGs(60, sharedDefaults)).eraseToAnyPublisher()
+        return Just(fetchLastBGs(60, sharedDefaults, heartbeat)).eraseToAnyPublisher()
     }
     }
 
 
-    private func fetchLastBGs(_ count: Int, _ sharedDefaults: UserDefaults) -> [BloodGlucose] {
+    private func fetchLastBGs(_ count: Int, _ sharedDefaults: UserDefaults, _ heartbeat: DispatchTimer?) -> [BloodGlucose] {
         guard let sharedData = sharedDefaults.data(forKey: "latestReadings") else {
         guard let sharedData = sharedDefaults.data(forKey: "latestReadings") else {
             return []
             return []
         }
         }
 
 
-        HeartBeatManager.shared.checkCGMBluetoothTransmitter(sharedUserDefaults: sharedDefaults)
+        HeartBeatManager.shared.checkCGMBluetoothTransmitter(sharedUserDefaults: sharedDefaults, heartbeat: heartbeat)
 
 
         let decoded = try? JSONSerialization.jsonObject(with: sharedData, options: [])
         let decoded = try? JSONSerialization.jsonObject(with: sharedData, options: [])
         guard let sgvs = decoded as? [AnyObject] else {
         guard let sgvs = decoded as? [AnyObject] else {

+ 1 - 1
FreeAPS/Sources/APS/CGM/DexcomSource.swift

@@ -19,7 +19,7 @@ final class DexcomSource: GlucoseSource {
         dexcomManager.transmitter.ID
         dexcomManager.transmitter.ID
     }
     }
 
 
-    func fetch() -> AnyPublisher<[BloodGlucose], Never> {
+    func fetch(_: DispatchTimer?) -> AnyPublisher<[BloodGlucose], Never> {
         dexcomManager.transmitter.resumeScanning()
         dexcomManager.transmitter.resumeScanning()
         return Future<[BloodGlucose], Error> { [weak self] promise in
         return Future<[BloodGlucose], Error> { [weak self] promise in
             self?.promise = promise
             self?.promise = promise

+ 1 - 1
FreeAPS/Sources/APS/CGM/GlucoseSimulatorSource.swift

@@ -63,7 +63,7 @@ final class GlucoseSimulatorSource: GlucoseSource {
         }
         }
     }
     }
 
 
-    func fetch() -> AnyPublisher<[BloodGlucose], Never> {
+    func fetch(_: DispatchTimer?) -> AnyPublisher<[BloodGlucose], Never> {
         guard canGenerateNewValues else {
         guard canGenerateNewValues else {
             return Just([]).eraseToAnyPublisher()
             return Just([]).eraseToAnyPublisher()
         }
         }

+ 1 - 1
FreeAPS/Sources/APS/CGM/GlucoseSource.swift

@@ -5,7 +5,7 @@ protocol SourceInfoProvider {
 }
 }
 
 
 protocol GlucoseSource: SourceInfoProvider {
 protocol GlucoseSource: SourceInfoProvider {
-    func fetch() -> AnyPublisher<[BloodGlucose], Never>
+    func fetch(_ heartbeat: DispatchTimer?) -> AnyPublisher<[BloodGlucose], Never>
 }
 }
 
 
 extension GlucoseSource {
 extension GlucoseSource {

+ 8 - 4
FreeAPS/Sources/APS/CGM/HeartBeatManager.swift

@@ -22,7 +22,7 @@ class HeartBeatManager {
     /// verifies if local copy of cgmTransmitterDeviceAddress  is different than the one stored in shared User Defaults
     /// verifies if local copy of cgmTransmitterDeviceAddress  is different than the one stored in shared User Defaults
     /// - parameters:
     /// - parameters:
     ///     - sharedData : shared User Defaults
     ///     - sharedData : shared User Defaults
-    public func checkCGMBluetoothTransmitter(sharedUserDefaults: UserDefaults) {
+    public func checkCGMBluetoothTransmitter(sharedUserDefaults: UserDefaults, heartbeat: DispatchTimer?) {
         if !initialSetupDone {
         if !initialSetupDone {
             initialSetupDone = true
             initialSetupDone = true
 
 
@@ -38,11 +38,11 @@ class HeartBeatManager {
                 .string(forKey: keyForcgmTransmitterDeviceAddress)
                 .string(forKey: keyForcgmTransmitterDeviceAddress)
 
 
             // assign new bluetoothTransmitter. If return value is nil, and if it was not nil before, and if it was currently connected then it will disconnect automatically, because there's no other reference to it, hence deinit will be called
             // assign new bluetoothTransmitter. If return value is nil, and if it was not nil before, and if it was currently connected then it will disconnect automatically, because there's no other reference to it, hence deinit will be called
-            bluetoothTransmitter = setupBluetoothTransmitter(sharedData: sharedUserDefaults)
+            bluetoothTransmitter = setupBluetoothTransmitter(sharedData: sharedUserDefaults, heartbeat: heartbeat)
         }
         }
     }
     }
 
 
-    private func setupBluetoothTransmitter(sharedData: UserDefaults) -> BluetoothTransmitter? {
+    private func setupBluetoothTransmitter(sharedData: UserDefaults, heartbeat: DispatchTimer?) -> BluetoothTransmitter? {
         // if sharedUserDefaults.cgmTransmitterDeviceAddress is not nil then, create a new bluetoothTranmsitter instance
         // if sharedUserDefaults.cgmTransmitterDeviceAddress is not nil then, create a new bluetoothTranmsitter instance
         if let cgmTransmitterDeviceAddress = sharedData.string(forKey: keyForcgmTransmitterDeviceAddress) {
         if let cgmTransmitterDeviceAddress = sharedData.string(forKey: keyForcgmTransmitterDeviceAddress) {
             // unwrap cgmTransmitter_CBUUID_Service and cgmTransmitter_CBUUID_Receive
             // unwrap cgmTransmitter_CBUUID_Service and cgmTransmitter_CBUUID_Receive
@@ -55,7 +55,11 @@ class HeartBeatManager {
                     deviceAddress: cgmTransmitterDeviceAddress,
                     deviceAddress: cgmTransmitterDeviceAddress,
                     servicesCBUUID: cgmTransmitter_CBUUID_Service,
                     servicesCBUUID: cgmTransmitter_CBUUID_Service,
                     CBUUID_Receive: cgmTransmitter_CBUUID_Receive,
                     CBUUID_Receive: cgmTransmitter_CBUUID_Receive,
-                    heartbeat: {}
+                    heartbeat: {
+                        if let heartbeatAvailable = heartbeat {
+                            heartbeatAvailable.fire()
+                        }
+                    }
                 )
                 )
 
 
                 return newBluetoothTransmitter
                 return newBluetoothTransmitter

+ 1 - 1
FreeAPS/Sources/APS/CGM/LibreTransmitterSource.swift

@@ -33,7 +33,7 @@ final class BaseLibreTransmitterSource: LibreTransmitterSource, Injectable {
         injectServices(resolver)
         injectServices(resolver)
     }
     }
 
 
-    func fetch() -> AnyPublisher<[BloodGlucose], Never> {
+    func fetch(_: DispatchTimer?) -> AnyPublisher<[BloodGlucose], Never> {
         Future<[BloodGlucose], Error> { [weak self] promise in
         Future<[BloodGlucose], Error> { [weak self] promise in
             self?.promise = promise
             self?.promise = promise
         }
         }

+ 1 - 1
FreeAPS/Sources/APS/DeviceDataManager.swift

@@ -204,7 +204,7 @@ final class BaseDeviceDataManager: DeviceDataManager, Injectable {
 
 
     @Persisted(key: "BaseDeviceDataManager.lastFetchGlucoseDate") private var lastFetchGlucoseDate: Date = .distantPast
     @Persisted(key: "BaseDeviceDataManager.lastFetchGlucoseDate") private var lastFetchGlucoseDate: Date = .distantPast
 
 
-    func fetch() -> AnyPublisher<[BloodGlucose], Never> {
+    func fetch(_: DispatchTimer?) -> AnyPublisher<[BloodGlucose], Never> {
         guard let medtronic = pumpManager as? MinimedPumpManager else {
         guard let medtronic = pumpManager as? MinimedPumpManager else {
             warning(.deviceManager, "Fetch minilink glucose failed: Pump is not Medtronic")
             warning(.deviceManager, "Fetch minilink glucose failed: Pump is not Medtronic")
             return Just([]).eraseToAnyPublisher()
             return Just([]).eraseToAnyPublisher()

+ 5 - 5
FreeAPS/Sources/APS/FetchGlucoseManager.swift

@@ -16,7 +16,7 @@ final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable {
     @Injected() var deviceDataManager: DeviceDataManager!
     @Injected() var deviceDataManager: DeviceDataManager!
 
 
     private var lifetime = Lifetime()
     private var lifetime = Lifetime()
-    private let timer = DispatchTimer(timeInterval: TimeInterval(1.0))
+    private let timer = DispatchTimer(timeInterval: 1.minutes.timeInterval)
 
 
     private lazy var dexcomSource = DexcomSource()
     private lazy var dexcomSource = DexcomSource()
     private lazy var simulatorSource = GlucoseSimulatorSource()
     private lazy var simulatorSource = GlucoseSimulatorSource()
@@ -57,19 +57,19 @@ final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable {
         timer.publisher
         timer.publisher
             .receive(on: processQueue)
             .receive(on: processQueue)
             .flatMap { date -> AnyPublisher<(Date, Date, [BloodGlucose], [BloodGlucose]), Never> in
             .flatMap { date -> AnyPublisher<(Date, Date, [BloodGlucose], [BloodGlucose]), Never> in
-                // debug(.nightscout, "FetchGlucoseManager heartbeat")
+                debug(.nightscout, "FetchGlucoseManager heartbeat")
                 // debug(.nightscout, "Start fetching glucose")
                 // debug(.nightscout, "Start fetching glucose")
                 self.updateGlucoseSource()
                 self.updateGlucoseSource()
                 return Publishers.CombineLatest4(
                 return Publishers.CombineLatest4(
                     Just(date),
                     Just(date),
                     Just(self.glucoseStorage.syncDate()),
                     Just(self.glucoseStorage.syncDate()),
-                    self.glucoseSource.fetch(),
-                    self.healthKitManager.fetch()
+                    self.glucoseSource.fetch(self.timer),
+                    self.healthKitManager.fetch(nil)
                 )
                 )
                 .eraseToAnyPublisher()
                 .eraseToAnyPublisher()
             }
             }
             .sink { date, syncDate, glucose, glucoseFromHealth in
             .sink { date, syncDate, glucose, glucoseFromHealth in
-                //  debug(.nightscout, "SyncDate is \(syncDate)")
+                debug(.nightscout, "SyncDate is \(syncDate)")
                 let allGlucose = glucose + glucoseFromHealth
                 let allGlucose = glucose + glucoseFromHealth
                 guard allGlucose.isNotEmpty else { return }
                 guard allGlucose.isNotEmpty else { return }
 
 

+ 1 - 1
FreeAPS/Sources/Services/HealthKit/HealthKitManager.swift

@@ -287,7 +287,7 @@ final class BaseHealthKitManager: HealthKitManager, Injectable {
         )
         )
     }
     }
 
 
-    func fetch() -> AnyPublisher<[BloodGlucose], Never> {
+    func fetch(_: DispatchTimer?) -> AnyPublisher<[BloodGlucose], Never> {
         Future { [weak self] promise in
         Future { [weak self] promise in
             guard let self = self else {
             guard let self = self else {
                 promise(.success([]))
                 promise(.success([]))

+ 1 - 1
FreeAPS/Sources/Services/Network/NightscoutManager.swift

@@ -122,7 +122,7 @@ final class BaseNightscoutManager: NightscoutManager, Injectable {
             .eraseToAnyPublisher()
             .eraseToAnyPublisher()
     }
     }
 
 
-    func fetch() -> AnyPublisher<[BloodGlucose], Never> {
+    func fetch(_: DispatchTimer?) -> AnyPublisher<[BloodGlucose], Never> {
         fetchGlucose(since: glucoseStorage.syncDate())
         fetchGlucose(since: glucoseStorage.syncDate())
     }
     }