From 7ed45e6b6d42c6a68ce525017636e70bc36abab7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Bj=C3=B6rkert?= Date: Fri, 17 Jul 2026 23:13:26 +0200 Subject: [PATCH] Restore pump status in Nightscout device status uploads Populate pumpManagerStatus, pumpStatusHighlight, cgmManagerStatus, and lastReservoirValue on the dosing decisions NightscoutService uploads, so the devicestatus pump object (clock, reservoir, model, ...) is no longer omitted. --- Loop/Managers/LoopDataManager.swift | 19 ++++++++++++++++++- LoopTests/Mocks/MockDeliveryDelegate.swift | 6 ++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/Loop/Managers/LoopDataManager.swift b/Loop/Managers/LoopDataManager.swift index 489cd4ee1..393888528 100644 --- a/Loop/Managers/LoopDataManager.swift +++ b/Loop/Managers/LoopDataManager.swift @@ -44,7 +44,10 @@ protocol DeliveryDelegate: AnyObject { var pumpInsulinType: InsulinType? { get } var basalDeliveryState: PumpManagerStatus.BasalDeliveryState? { get } var isPumpConfigured: Bool { get } - + var pumpManagerStatus: PumpManagerStatus? { get } + var pumpStatusHighlight: DeviceStatusHighlight? { get } + var cgmManagerStatus: CGMManagerStatus? { get } + func enact(bolus: Double?, tempBasal: TempBasalRecommendation?, decisionId: UUID?) async throws func enactBolus(units: Double, decisionId: UUID?, activationType: BolusActivationType) async throws func roundBasalRate(unitsPerHour: Double) -> Double @@ -897,6 +900,18 @@ final class LoopDataManager: ObservableObject { } dosingDecision.controllerStatus = UIDevice.current.controllerStatus + + // Device status for the Nightscout devicestatus.pump payload. + dosingDecision.pumpManagerStatus = deliveryDelegate?.pumpManagerStatus + if let pumpStatusHighlight = deliveryDelegate?.pumpStatusHighlight { + dosingDecision.pumpStatusHighlight = StoredDosingDecision.StoredDeviceHighlight( + localizedMessage: pumpStatusHighlight.localizedMessage, + imageName: pumpStatusHighlight.imageName, + state: pumpStatusHighlight.state) + } + dosingDecision.cgmManagerStatus = deliveryDelegate?.cgmManagerStatus + dosingDecision.lastReservoirValue = StoredDosingDecision.LastReservoirValue(doseStore.lastReservoirValue) + self.logger.debug("Manual bolus rec = %{public}@", String(describing: dosingDecision.manualBolusRecommendation)) await self.dosingDecisionStore.storeDosingDecision(dosingDecision) } @@ -1010,6 +1025,8 @@ extension LoopDataManager { settings: StoredDosingDecision.Settings(settingsProvider.settings), scheduleOverride: bolusDosingDecision.scheduleOverride, controllerStatus: UIDevice.current.controllerStatus, + pumpManagerStatus: deliveryDelegate?.pumpManagerStatus, + cgmManagerStatus: deliveryDelegate?.cgmManagerStatus, lastReservoirValue: StoredDosingDecision.LastReservoirValue(doseStore.lastReservoirValue), historicalGlucose: bolusDosingDecision.historicalGlucose, originalCarbEntry: bolusDosingDecision.originalCarbEntry, diff --git a/LoopTests/Mocks/MockDeliveryDelegate.swift b/LoopTests/Mocks/MockDeliveryDelegate.swift index 515170a68..9881a8053 100644 --- a/LoopTests/Mocks/MockDeliveryDelegate.swift +++ b/LoopTests/Mocks/MockDeliveryDelegate.swift @@ -22,6 +22,12 @@ class MockDeliveryDelegate: DeliveryDelegate { var isPumpConfigured: Bool = true + var pumpManagerStatus: PumpManagerStatus? + + var pumpStatusHighlight: DeviceStatusHighlight? + + var cgmManagerStatus: CGMManagerStatus? + var lastEnact: (bolus: Double?, tempBasal: TempBasalRecommendation?) func enact(bolus: Double?, tempBasal: TempBasalRecommendation?, decisionId: UUID?) async throws {