Quellcode durchsuchen

Merge branch 'core-data-sync-trio' of github.com:dnzxy/Open-iAPS into fix-watch

Deniz Cengiz vor 1 Jahr
Ursprung
Commit
27c64a0d1f

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

@@ -95,6 +95,47 @@ final class BaseDeviceDataManager: DeviceDataManager, Injectable {
                     }
                     pumpExpiresAtDate.send(endTime)
                 }
+                if let simulatorPump = pumpManager as? MockPumpManager {
+                    pumpDisplayState.value = PumpDisplayState(name: simulatorPump.localizedTitle, image: simulatorPump.smallImage)
+                    pumpName.send(simulatorPump.localizedTitle)
+                    storage.save(Decimal(simulatorPump.pumpReservoirCapacity), as: OpenAPS.Monitor.reservoir)
+                    DispatchQueue.main.async {
+                        self.broadcaster.notify(PumpReservoirObserver.self, on: .main) {
+                            $0.pumpReservoirDidChange(Decimal(simulatorPump.state.reservoirUnitsRemaining))
+                        }
+                    }
+                    let batteryPercent = Int((simulatorPump.state.pumpBatteryChargeRemaining ?? 1) * 100)
+                    let battery = Battery(
+                        percent: batteryPercent,
+                        voltage: nil,
+                        string: batteryPercent >= 10 ? .normal : .low,
+                        display: simulatorPump.state.pumpBatteryChargeRemaining != nil
+                    )
+                    Task {
+                        await self.privateContext.perform {
+                            let saveBatteryToCoreData = OpenAPS_Battery(context: self.privateContext)
+                            saveBatteryToCoreData.id = UUID()
+                            saveBatteryToCoreData.date = Date()
+                            saveBatteryToCoreData.percent = Int16(batteryPercent)
+                            saveBatteryToCoreData.voltage = nil
+                            saveBatteryToCoreData.status = batteryPercent >= 10 ? BatteryState.normal.rawValue : BatteryState
+                                .low.rawValue
+                            saveBatteryToCoreData.display = simulatorPump.state.pumpBatteryChargeRemaining != nil
+
+                            do {
+                                guard self.privateContext.hasChanges else { return }
+                                try self.privateContext.save()
+                            } catch {
+                                print(error.localizedDescription)
+                            }
+                        }
+                    }
+                    DispatchQueue.main.async {
+                        self.broadcaster.notify(PumpBatteryObserver.self, on: .main) {
+                            $0.pumpBatteryDidChange(battery)
+                        }
+                    }
+                }
             } else {
                 pumpDisplayState.value = nil
                 pumpExpiresAtDate.send(nil)
@@ -334,7 +375,6 @@ extension BaseDeviceDataManager: PumpManagerDelegate {
             settingsManager.updateInsulinCurve(status.insulinType)
         }
 
-        let batteryPercent = Int((status.pumpBatteryChargeRemaining ?? 1) * 100)
         broadcaster.notify(PumpTimeZoneObserver.self, on: processQueue) {
             $0.pumpTimeZoneDidChange(status.timeZone)
         }
@@ -403,6 +443,12 @@ extension BaseDeviceDataManager: PumpManagerDelegate {
                 storage.save(startTime, as: OpenAPS.Monitor.podAge)
             }
         }
+
+        if let simulatorPump = pumpManager as? MockPumpManager {
+            broadcaster.notify(PumpReservoirObserver.self, on: processQueue) {
+                $0.pumpReservoirDidChange(Decimal(simulatorPump.state.reservoirUnitsRemaining))
+            }
+        }
     }
 
     func pumpManagerWillDeactivate(_: PumpManager) {

+ 10 - 0
FreeAPS/Sources/Modules/Home/HomeStateModel.swift

@@ -79,6 +79,7 @@ extension Home {
         @Published var isOverrideCancelled: Bool = false
         @Published var preprocessedData: [(id: UUID, forecast: Forecast, forecastValue: ForecastValue)] = []
         @Published var pumpStatusHighlightMessage: String? = nil
+        @Published var cgmAvailable: Bool = false
 
         let context = CoreDataStack.shared.newTaskContext()
         let viewContext = CoreDataStack.shared.persistentContainer.viewContext
@@ -126,6 +127,7 @@ extension Home {
             displayYgridLines = settingsManager.settings.yGridLines
             thresholdLines = settingsManager.settings.rulerMarks
             tins = settingsManager.settings.tins
+            cgmAvailable = fetchGlucoseManager.cgmGlucoseSourceType != CGMType.none
 
             broadcaster.register(GlucoseObserver.self, observer: self)
             broadcaster.register(DeterminationObserver.self, observer: self)
@@ -197,6 +199,7 @@ extension Home {
                     } else {
                         self.setupReservoir()
                         self.displayPumpStatusHighlightMessage()
+                        self.setupBatteryArray()
                     }
                 }
                 .store(in: &lifetime)
@@ -434,6 +437,7 @@ extension Home.StateModel:
     PumpTimeZoneObserver,
     PumpDeactivatedObserver
 {
+    // TODO: still needed?
     func glucoseDidUpdate(_: [BloodGlucose]) {
 //        setupGlucose()
     }
@@ -456,14 +460,19 @@ extension Home.StateModel:
         displayYgridLines = settingsManager.settings.yGridLines
         thresholdLines = settingsManager.settings.rulerMarks
         tins = settingsManager.settings.tins
+        cgmAvailable = (fetchGlucoseManager.cgmGlucoseSourceType != CGMType.none)
+        displayPumpStatusHighlightMessage()
+        setupBatteryArray()
     }
 
+    // TODO: is this ever really triggered? react to MOC changes?
     func pumpHistoryDidUpdate(_: [PumpHistoryEvent]) {
         displayPumpStatusHighlightMessage()
     }
 
     func pumpSettingsDidChange(_: PumpSettings) {
         setupPumpSettings()
+        setupBatteryArray()
     }
 
     func basalProfileDidChange(_: [BasalProfileEntry]) {
@@ -481,6 +490,7 @@ extension Home.StateModel:
 
     func pumpDeactivatedDidChange() {
         displayPumpStatusHighlightMessage(true)
+        batteryFromPersistence = []
     }
 
     func pumpTimeZoneDidChange(_: TimeZone) {

+ 3 - 1
FreeAPS/Sources/Modules/Home/View/Chart/MainChartView.swift

@@ -521,10 +521,12 @@ extension MainChartView {
         ForEach(state.preprocessedData, id: \.id) { tuple in
             let forecastValue = tuple.forecastValue
             let forecast = tuple.forecast
+            let valueAsDecimal = Decimal(forecastValue.value)
+            let displayValue = units == .mmolL ? valueAsDecimal.asMmolL : valueAsDecimal
 
             LineMark(
                 x: .value("Time", timeForIndex(forecastValue.index)),
-                y: .value("Value", Int(forecastValue.value))
+                y: .value("Value", displayValue)
             )
             .foregroundStyle(by: .value("Predictions", forecast.type ?? ""))
         }

+ 71 - 56
FreeAPS/Sources/Modules/Home/View/Header/CurrentGlucoseView.swift

@@ -7,6 +7,8 @@ struct CurrentGlucoseView: View {
     @Binding var alarm: GlucoseAlarm?
     @Binding var lowGlucose: Decimal
     @Binding var highGlucose: Decimal
+    @Binding var cgmAvailable: Bool
+
     var glucose: [GlucoseStored]
     var manualGlucose: [GlucoseStored]
 
@@ -74,69 +76,82 @@ struct CurrentGlucoseView: View {
     var body: some View {
         let triangleColor = Color(red: 0.262745098, green: 0.7333333333, blue: 0.9137254902)
 
-        ZStack {
-            TrendShape(gradient: angularGradient, color: triangleColor)
-                .rotationEffect(.degrees(rotationDegrees))
+        if cgmAvailable {
+            ZStack {
+                TrendShape(gradient: angularGradient, color: triangleColor)
+                    .rotationEffect(.degrees(rotationDegrees))
+
+                VStack(alignment: .center) {
+                    HStack {
+                        if let glucoseValue = combinedGlucoseValues.first?.glucose {
+                            let displayGlucose = convertGlucose(glucoseValue, to: units)
+                            Text(
+                                glucoseValue == 400 ? "HIGH" :
+                                    glucoseFormatter.string(from: NSNumber(value: displayGlucose)) ?? "--"
+                            )
+                            .font(.system(size: 40, weight: .bold, design: .rounded))
+                            .foregroundColor(alarm == nil ? colourGlucoseText : .loopRed)
+                        } else {
+                            Text("--")
+                                .font(.system(size: 40, weight: .bold, design: .rounded))
+                                .foregroundColor(.secondary)
+                        }
+                    }
+                    HStack {
+                        let minutesAgo = -1 * (combinedGlucoseValues.first?.date?.timeIntervalSinceNow ?? 0) / 60
+                        let text = timaAgoFormatter.string(for: Double(minutesAgo)) ?? ""
+                        Text(
+                            minutesAgo <= 1 ? "< 1 " + NSLocalizedString("min", comment: "Short form for minutes") : (
+                                text + " " +
+                                    NSLocalizedString("min", comment: "Short form for minutes") + " "
+                            )
+                        )
+                        .font(.caption2).foregroundColor(colorScheme == .dark ? Color.white.opacity(0.9) : Color.secondary)
 
-            VStack(alignment: .center) {
-                HStack {
-                    if let glucoseValue = combinedGlucoseValues.first?.glucose {
-                        let displayGlucose = convertGlucose(glucoseValue, to: units)
                         Text(
-                            glucoseValue == 400 ? "HIGH" :
-                                glucoseFormatter.string(from: NSNumber(value: displayGlucose)) ?? "--"
+                            delta
                         )
-                        .font(.system(size: 40, weight: .bold, design: .rounded))
-                        .foregroundColor(alarm == nil ? colourGlucoseText : .loopRed)
-                    } else {
-                        Text("--")
-                            .font(.system(size: 40, weight: .bold, design: .rounded))
-                            .foregroundColor(.secondary)
-                    }
+                        .font(.caption2).foregroundColor(colorScheme == .dark ? Color.white.opacity(0.9) : Color.secondary)
+                    }.frame(alignment: .top)
                 }
-                HStack {
-                    let minutesAgo = -1 * (combinedGlucoseValues.first?.date?.timeIntervalSinceNow ?? 0) / 60
-                    let text = timaAgoFormatter.string(for: Double(minutesAgo)) ?? ""
-                    Text(
-                        minutesAgo <= 1 ? "< 1 " + NSLocalizedString("min", comment: "Short form for minutes") : (
-                            text + " " +
-                                NSLocalizedString("min", comment: "Short form for minutes") + " "
-                        )
-                    )
-                    .font(.caption2).foregroundColor(colorScheme == .dark ? Color.white.opacity(0.9) : Color.secondary)
-
-                    Text(
-                        delta
-                    )
-                    .font(.caption2).foregroundColor(colorScheme == .dark ? Color.white.opacity(0.9) : Color.secondary)
-                }.frame(alignment: .top)
             }
-        }
-        .onChange(of: combinedGlucoseValues.first?.directionEnum) { newDirection in
-            withAnimation {
-                switch newDirection {
-                case .doubleUp,
-                     .singleUp,
-                     .tripleUp:
-                    rotationDegrees = -90
-                case .fortyFiveUp:
-                    rotationDegrees = -45
-                case .flat:
-                    rotationDegrees = 0
-                case .fortyFiveDown:
-                    rotationDegrees = 45
-                case .doubleDown,
-                     .singleDown,
-                     .tripleDown:
-                    rotationDegrees = 90
-                case nil,
-                     .notComputable,
-                     .rateOutOfRange:
-                    rotationDegrees = 0
-                default:
-                    rotationDegrees = 0
+            .onChange(of: combinedGlucoseValues.first?.directionEnum) { newDirection in
+                withAnimation {
+                    switch newDirection {
+                    case .doubleUp,
+                         .singleUp,
+                         .tripleUp:
+                        rotationDegrees = -90
+                    case .fortyFiveUp:
+                        rotationDegrees = -45
+                    case .flat:
+                        rotationDegrees = 0
+                    case .fortyFiveDown:
+                        rotationDegrees = 45
+                    case .doubleDown,
+                         .singleDown,
+                         .tripleDown:
+                        rotationDegrees = 90
+                    case nil,
+                         .notComputable,
+                         .rateOutOfRange:
+                        rotationDegrees = 0
+                    default:
+                        rotationDegrees = 0
+                    }
                 }
             }
+        } else {
+            VStack(alignment: .center, spacing: 12) {
+                HStack
+                    {
+                        // no cgm defined so display a generic CGM
+                        Image(systemName: "sensor.tag.radiowaves.forward.fill").font(.body).imageScale(.large)
+                    }
+                HStack {
+                    Text("Add CGM").font(.caption).bold()
+                }
+            }.frame(alignment: .top)
         }
     }
 

+ 2 - 2
FreeAPS/Sources/Modules/Home/View/Header/PumpView.swift

@@ -8,7 +8,7 @@ struct PumpView: View {
     @Binding var timerDate: Date
     @Binding var timeZone: TimeZone?
     @Binding var pumpStatusHighlightMessage: String?
-    var battery: [OpenAPS_Battery]
+    @Binding var battery: [OpenAPS_Battery]
 
     @Environment(\.colorScheme) var colorScheme
 
@@ -86,7 +86,7 @@ struct PumpView: View {
                     }
                 }
 
-                if (battery.first?.display) != nil, expiresAtDate == nil {
+                if (battery.first?.display) != nil, let shouldBatteryDisplay = battery.first?.display, shouldBatteryDisplay {
                     HStack {
                         Image(systemName: "battery.100")
                             .font(.system(size: 16))

+ 11 - 14
FreeAPS/Sources/Modules/Home/View/HomeRootView.swift

@@ -160,24 +160,17 @@ extension Home {
                 alarm: $state.alarm,
                 lowGlucose: $state.lowGlucose,
                 highGlucose: $state.highGlucose,
+                cgmAvailable: $state.cgmAvailable,
                 glucose: state.glucoseFromPersistence,
                 manualGlucose: state.manualGlucoseFromPersistence
             ).scaleEffect(0.9)
                 .onTapGesture {
-                    if state.alarm == nil {
-                        state.openCGM()
-                    } else {
-                        state.showModal(for: .snooze)
-                    }
+                    state.openCGM()
                 }
                 .onLongPressGesture {
                     let impactHeavy = UIImpactFeedbackGenerator(style: .heavy)
                     impactHeavy.impactOccurred()
-                    if state.alarm == nil {
-                        state.showModal(for: .snooze)
-                    } else {
-                        state.openCGM()
-                    }
+                    state.showModal(for: .snooze)
                 }
         }
 
@@ -189,11 +182,9 @@ extension Home {
                 timerDate: $state.timerDate,
                 timeZone: $state.timeZone,
                 pumpStatusHighlightMessage: $state.pumpStatusHighlightMessage,
-                battery: state.batteryFromPersistence
+                battery: $state.batteryFromPersistence
             ).onTapGesture {
-                if state.pumpDisplayState != nil {
-                    state.setupPump = true
-                }
+                state.setupPump = true
             }
         }
 
@@ -488,6 +479,12 @@ extension Home {
                             .foregroundColor(.insulinTintColor)
                         Text(tempBasalString)
                             .font(.system(size: 16, weight: .bold, design: .rounded))
+                    } else {
+                        Image(systemName: "drop.circle")
+                            .font(.system(size: 16))
+                            .foregroundColor(.insulinTintColor)
+                        Text("No Data")
+                            .font(.system(size: 16, weight: .bold, design: .rounded))
                     }
                 }
                 if !state.tins {

+ 2 - 2
Trio.xcworkspace/xcshareddata/swiftpm/Package.resolved

@@ -1,5 +1,5 @@
 {
-  "originHash" : "59ac7eba66375d6eb406e758cb0b9964f4b3b0ae45c5665596f00384c32262b9",
+  "originHash" : "f5c836c216c4ca7d356e3777e58d6d4f9502b03f3974891349eb775f4c4cf750",
   "pins" : [
     {
       "identity" : "cryptoswift",
@@ -49,7 +49,7 @@
     {
       "identity" : "swiftcharts",
       "kind" : "remoteSourceControl",
-      "location" : "https://github.com/ivanschuetz/SwiftCharts.git",
+      "location" : "https://github.com/ivanschuetz/SwiftCharts",
       "state" : {
         "branch" : "master",
         "revision" : "c354c1945bb35a1f01b665b22474f6db28cba4a2"