Browse Source

Merge branch 'avouspierre/cgm_heartbeat' into Test_heartbeat

Fix bad merge.
Jon B.M 3 years ago
parent
commit
054ac2e076

+ 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 - 37
FreeAPS/Sources/APS/FetchGlucoseManager.swift

@@ -1,6 +1,5 @@
 import Combine
 import Combine
 import Foundation
 import Foundation
-import SpriteKit
 import SwiftDate
 import SwiftDate
 import Swinject
 import Swinject
 
 
@@ -8,9 +7,6 @@ protocol FetchGlucoseManager: SourceInfoProvider {}
 
 
 final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable {
 final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable {
     private let processQueue = DispatchQueue(label: "BaseGlucoseManager.processQueue")
     private let processQueue = DispatchQueue(label: "BaseGlucoseManager.processQueue")
-
-    private let notificationCenter = Foundation.NotificationCenter.default
-
     @Injected() var glucoseStorage: GlucoseStorage!
     @Injected() var glucoseStorage: GlucoseStorage!
     @Injected() var nightscoutManager: NightscoutManager!
     @Injected() var nightscoutManager: NightscoutManager!
     @Injected() var apsManager: APSManager!
     @Injected() var apsManager: APSManager!
@@ -20,9 +16,7 @@ final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable {
     @Injected() var deviceDataManager: DeviceDataManager!
     @Injected() var deviceDataManager: DeviceDataManager!
 
 
     private var lifetime = Lifetime()
     private var lifetime = Lifetime()
-
-    /// timer to fetch glucose, initially set to 1 minute. If app goes to background it will be changed to 1 second
-    private var timer = DispatchTimer(timeInterval: TimeInterval(minutes: 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()
@@ -31,36 +25,10 @@ final class BaseFetchGlucoseManager: FetchGlucoseManager, Injectable {
         injectServices(resolver)
         injectServices(resolver)
         updateGlucoseSource()
         updateGlucoseSource()
         subscribe()
         subscribe()
-
-        notificationCenter.addObserver(
-            self,
-            selector: #selector(didEnterBackground(_:)),
-            name: UIApplication.didEnterBackgroundNotification,
-            object: nil
-        )
-
-        notificationCenter.addObserver(
-            self,
-            selector: #selector(willEnterForeground(_:)),
-            name: UIApplication.willEnterForegroundNotification,
-            object: nil
-        )
     }
     }
 
 
     var glucoseSource: GlucoseSource!
     var glucoseSource: GlucoseSource!
 
 
-    /// change timer to 1 second
-    @objc private func didEnterBackground(_: Notification) {
-        timer = DispatchTimer(timeInterval: TimeInterval(1.0))
-        subscribe()
-    }
-
-    /// change timer to 1 minute
-    @objc private func willEnterForeground(_: Notification) {
-        timer = DispatchTimer(timeInterval: TimeInterval(minutes: 1.0))
-        subscribe()
-    }
-
     private func updateGlucoseSource() {
     private func updateGlucoseSource() {
         switch settingsManager.settings.cgm {
         switch settingsManager.settings.cgm {
         case .xdrip:
         case .xdrip:
@@ -89,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())
     }
     }