diff --git a/FreeAPS/Sources/APS/DeviceDataManager.swift b/FreeAPS/Sources/APS/DeviceDataManager.swift index c6d5ca4fa..e1f93923c 100644 --- a/FreeAPS/Sources/APS/DeviceDataManager.swift +++ b/FreeAPS/Sources/APS/DeviceDataManager.swift @@ -415,6 +415,9 @@ extension BaseDeviceDataManager: PumpManagerDelegate { func pumpManagerWillDeactivate(_: PumpManager) { dispatchPrecondition(condition: .onQueue(processQueue)) pumpManager = nil + broadcaster.notify(PumpDeactivatedObserver.self, on: processQueue) { + $0.pumpDeactivatedDidChange() + } } func pumpManager(_: PumpManager, didUpdatePumpRecordsBasalProfileStartEvents _: Bool) {} @@ -628,3 +631,7 @@ protocol PumpReservoirObserver { protocol PumpBatteryObserver { func pumpBatteryDidChange(_ battery: Battery) } + +protocol PumpDeactivatedObserver { + func pumpDeactivatedDidChange() +} diff --git a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift index ca1223eb6..e556905d3 100644 --- a/FreeAPS/Sources/Modules/Home/HomeStateModel.swift +++ b/FreeAPS/Sources/Modules/Home/HomeStateModel.swift @@ -107,6 +107,7 @@ extension Home { broadcaster.register(EnactedSuggestionObserver.self, observer: self) broadcaster.register(PumpBatteryObserver.self, observer: self) broadcaster.register(PumpReservoirObserver.self, observer: self) + broadcaster.register(PumpDeactivatedObserver.self, observer: self) animatedBackground = settingsManager.settings.animatedBackground @@ -169,7 +170,7 @@ extension Home { } else { self.setupBattery() self.setupReservoir() - self.displaypumpStatusHighlightMessage() + self.displayPumpStatusHighlightMessage() } } .store(in: &lifetime) @@ -352,13 +353,14 @@ extension Home { /// Display the eventual status message provided by the manager of the pump /// Only display if state is warning or critical message else return nil - private func displaypumpStatusHighlightMessage() { + private func displayPumpStatusHighlightMessage(_ didDeactivate: Bool = false) { DispatchQueue.main.async { [weak self] in guard let self = self else { return } - if let statusHL = self.provider.deviceManager.pumpManager?.pumpStatusHighlight, - statusHL.state == .warning || statusHL.state == .critical + if let statusHighlight = self.provider.deviceManager.pumpManager?.pumpStatusHighlight, + statusHighlight.state == .warning || statusHighlight.state == .critical, !didDeactivate { - pumpStatusHighlightMessage = (statusHL.state == .warning ? "⚠️\n" : "‼️\n") + statusHL.localizedMessage + pumpStatusHighlightMessage = (statusHighlight.state == .warning ? "⚠️\n" : "‼️\n") + statusHighlight + .localizedMessage } else { pumpStatusHighlightMessage = nil } @@ -395,7 +397,8 @@ extension Home.StateModel: CarbsObserver, EnactedSuggestionObserver, PumpBatteryObserver, - PumpReservoirObserver + PumpReservoirObserver, + PumpDeactivatedObserver { func glucoseDidUpdate(_: [BloodGlucose]) { setupGlucose() @@ -429,7 +432,7 @@ extension Home.StateModel: setupBasals() setupBoluses() setupSuspensions() - displaypumpStatusHighlightMessage() + displayPumpStatusHighlightMessage() } func pumpSettingsDidChange(_: PumpSettings) { @@ -455,12 +458,16 @@ extension Home.StateModel: func pumpBatteryDidChange(_: Battery) { setupBattery() - displaypumpStatusHighlightMessage() + displayPumpStatusHighlightMessage() } func pumpReservoirDidChange(_: Decimal) { setupReservoir() - displaypumpStatusHighlightMessage() + displayPumpStatusHighlightMessage() + } + + func pumpDeactivatedDidChange() { + displayPumpStatusHighlightMessage(true) } } diff --git a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift index 8b87cd08c..6486cb24d 100644 --- a/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift +++ b/FreeAPS/Sources/Modules/NightscoutConfig/NightscoutConfigStateModel.swift @@ -84,6 +84,24 @@ extension NightscoutConfig { return NightscoutAPI(url: url, secret: secret) } + private func getMedianTarget( + lowTargetValue: Decimal, + lowTargetTime: String, + highTarget: [NightscoutTimevalue], + units: GlucoseUnits + ) -> Decimal { + if let idx = highTarget.firstIndex(where: { $0.time == lowTargetTime }) { + let median = (lowTargetValue + highTarget[idx].value) / 2 + switch units { + case .mgdL: + return Decimal(round(Double(median))) + case .mmolL: + return Decimal(round(Double(median) * 10) / 10) + } + } + return lowTargetValue + } + func importSettings() { guard let nightscout = nightscoutAPI else { saveError("Can't access nightscoutAPI") @@ -134,8 +152,10 @@ extension NightscoutConfig { do { let fetchedProfileStore = try jsonDecoder.decode([FetchedNightscoutProfileStore].self, from: data) let loop = fetchedProfileStore.first?.enteredBy.contains("Loop") - guard let fetchedProfile: FetchedNightscoutProfile = fetchedProfileStore.first? - .store[loop! ? "Default" : "default"] + guard let fetchedProfile: FetchedNightscoutProfile = + (fetchedProfileStore.first?.store["default"] != nil) ? + fetchedProfileStore.first?.store["default"] : + fetchedProfileStore.first?.store["Default"] else { error = "\nCan't find the default Nightscout Profile." group.leave() @@ -220,9 +240,15 @@ extension NightscoutConfig { let targets = fetchedProfile.target_low .map { target -> BGTargetEntry in - BGTargetEntry( - low: target.value, - high: target.value, + let median = loop! ? self.getMedianTarget( + lowTargetValue: target.value, + lowTargetTime: target.time, + highTarget: fetchedProfile.target_high, + units: self.units + ) : target.value + return BGTargetEntry( + low: median, + high: median, start: target.time, offset: self.offset(target.time) / 60 ) } diff --git a/OmniBLE b/OmniBLE index 91abd9aba..85fc3c6d4 160000 --- a/OmniBLE +++ b/OmniBLE @@ -1 +1 @@ -Subproject commit 91abd9aba338903cc7bccd3a4c9df5dc4452cc1f +Subproject commit 85fc3c6d4805d580acdf6592b220717b6e842558 diff --git a/OmniKit b/OmniKit index f51fe354e..a80e38b1b 160000 --- a/OmniKit +++ b/OmniKit @@ -1 +1 @@ -Subproject commit f51fe354ea6739ee09de922ed836d6844545b610 +Subproject commit a80e38b1b7f203014b461f8aff8cead2c067e39d