Преглед на файлове

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 {
     let from: String
 
-    func fetch() -> AnyPublisher<[BloodGlucose], Never> {
+    func fetch(_ heartbeat: DispatchTimer?) -> AnyPublisher<[BloodGlucose], Never> {
         guard let suiteName = Bundle.main.appGroupSuiteName,
               let sharedDefaults = UserDefaults(suiteName: suiteName)
         else {
             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 {
             return []
         }
 
-        HeartBeatManager.shared.checkCGMBluetoothTransmitter(sharedUserDefaults: sharedDefaults)
+        HeartBeatManager.shared.checkCGMBluetoothTransmitter(sharedUserDefaults: sharedDefaults, heartbeat: heartbeat)
 
         let decoded = try? JSONSerialization.jsonObject(with: sharedData, options: [])
         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
     }
 
-    func fetch() -> AnyPublisher<[BloodGlucose], Never> {
+    func fetch(_: DispatchTimer?) -> AnyPublisher<[BloodGlucose], Never> {
         dexcomManager.transmitter.resumeScanning()
         return Future<[BloodGlucose], Error> { [weak self] promise in
             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 {
             return Just([]).eraseToAnyPublisher()
         }

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

@@ -5,7 +5,7 @@ protocol SourceInfoProvider {
 }
 
 protocol GlucoseSource: SourceInfoProvider {
-    func fetch() -> AnyPublisher<[BloodGlucose], Never>
+    func fetch(_ heartbeat: DispatchTimer?) -> AnyPublisher<[BloodGlucose], Never>
 }
 
 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
     /// - parameters:
     ///     - sharedData : shared User Defaults
-    public func checkCGMBluetoothTransmitter(sharedUserDefaults: UserDefaults) {
+    public func checkCGMBluetoothTransmitter(sharedUserDefaults: UserDefaults, heartbeat: DispatchTimer?) {
         if !initialSetupDone {
             initialSetupDone = true
 
@@ -38,11 +38,11 @@ class HeartBeatManager {
                 .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
-            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 let cgmTransmitterDeviceAddress = sharedData.string(forKey: keyForcgmTransmitterDeviceAddress) {
             // unwrap cgmTransmitter_CBUUID_Service and cgmTransmitter_CBUUID_Receive
@@ -55,7 +55,11 @@ class HeartBeatManager {
                     deviceAddress: cgmTransmitterDeviceAddress,
                     servicesCBUUID: cgmTransmitter_CBUUID_Service,
                     CBUUID_Receive: cgmTransmitter_CBUUID_Receive,
-                    heartbeat: {}
+                    heartbeat: {
+                        if let heartbeatAvailable = heartbeat {
+                            heartbeatAvailable.fire()
+                        }
+                    }
                 )
 
                 return newBluetoothTransmitter

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

@@ -33,7 +33,7 @@ final class BaseLibreTransmitterSource: LibreTransmitterSource, Injectable {
         injectServices(resolver)
     }
 
-    func fetch() -> AnyPublisher<[BloodGlucose], Never> {
+    func fetch(_: DispatchTimer?) -> AnyPublisher<[BloodGlucose], Never> {
         Future<[BloodGlucose], Error> { [weak self] promise in
             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
 
-    func fetch() -> AnyPublisher<[BloodGlucose], Never> {
+    func fetch(_: DispatchTimer?) -> AnyPublisher<[BloodGlucose], Never> {
         guard let medtronic = pumpManager as? MinimedPumpManager else {
             warning(.deviceManager, "Fetch minilink glucose failed: Pump is not Medtronic")
             return Just([]).eraseToAnyPublisher()

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

@@ -16,7 +16,7 @@ final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable {
     @Injected() var deviceDataManager: DeviceDataManager!
 
     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 simulatorSource = GlucoseSimulatorSource()
@@ -57,19 +57,19 @@ final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable {
         timer.publisher
             .receive(on: processQueue)
             .flatMap { date -> AnyPublisher<(Date, Date, [BloodGlucose], [BloodGlucose]), Never> in
-                // debug(.nightscout, "FetchGlucoseManager heartbeat")
+                debug(.nightscout, "FetchGlucoseManager heartbeat")
                 // debug(.nightscout, "Start fetching glucose")
                 self.updateGlucoseSource()
                 return Publishers.CombineLatest4(
                     Just(date),
                     Just(self.glucoseStorage.syncDate()),
-                    self.glucoseSource.fetch(),
-                    self.healthKitManager.fetch()
+                    self.glucoseSource.fetch(self.timer),
+                    self.healthKitManager.fetch(nil)
                 )
                 .eraseToAnyPublisher()
             }
             .sink { date, syncDate, glucose, glucoseFromHealth in
-                //  debug(.nightscout, "SyncDate is \(syncDate)")
+                debug(.nightscout, "SyncDate is \(syncDate)")
                 let allGlucose = glucose + glucoseFromHealth
                 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
             guard let self = self else {
                 promise(.success([]))

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

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