Explorar el Código

PumpDisplayState

Ivan Valkou hace 5 años
padre
commit
46c4325a91

+ 4 - 0
FreeAPS.xcodeproj/project.pbxproj

@@ -128,6 +128,7 @@
 		38B4F3CB25E502E200E76A18 /* WeakObjectSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38B4F3C925E502E100E76A18 /* WeakObjectSet.swift */; };
 		38B4F3CD25E5031100E76A18 /* Broadcaster.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38B4F3CC25E5031100E76A18 /* Broadcaster.swift */; };
 		38B4F3CF25E5041600E76A18 /* APSContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38B4F3CE25E5041600E76A18 /* APSContainer.swift */; };
+		38BF021725E7CBBC00579895 /* PumpManagerExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38BF021625E7CBBC00579895 /* PumpManagerExtensions.swift */; };
 		38FE826A25CC82DB001FF17A /* NetworkService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38FE826925CC82DB001FF17A /* NetworkService.swift */; };
 		38FE826D25CC8461001FF17A /* NightscoutAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38FE826C25CC8461001FF17A /* NightscoutAPI.swift */; };
 		45252C95D220E796FDB3B022 /* ConfigEditorDataFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F8A87AA037BD079BA3528BA /* ConfigEditorDataFlow.swift */; };
@@ -599,6 +600,7 @@
 		38B4F3C925E502E100E76A18 /* WeakObjectSet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WeakObjectSet.swift; sourceTree = "<group>"; };
 		38B4F3CC25E5031100E76A18 /* Broadcaster.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Broadcaster.swift; sourceTree = "<group>"; };
 		38B4F3CE25E5041600E76A18 /* APSContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APSContainer.swift; sourceTree = "<group>"; };
+		38BF021625E7CBBC00579895 /* PumpManagerExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PumpManagerExtensions.swift; sourceTree = "<group>"; };
 		38FE826925CC82DB001FF17A /* NetworkService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkService.swift; sourceTree = "<group>"; };
 		38FE826C25CC8461001FF17A /* NightscoutAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NightscoutAPI.swift; sourceTree = "<group>"; };
 		3BF768BD6264FF7D71D66767 /* NightscoutConfigProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NightscoutConfigProvider.swift; sourceTree = "<group>"; };
@@ -1049,6 +1051,7 @@
 			isa = PBXGroup;
 			children = (
 				38A5049125DD9C4000C5B9E8 /* UserDefaultsExtensions.swift */,
+				38BF021625E7CBBC00579895 /* PumpManagerExtensions.swift */,
 			);
 			path = Extensions;
 			sourceTree = "<group>";
@@ -1573,6 +1576,7 @@
 				3811DE6D25C9D62600A708ED /* OnboardingRootView.swift in Sources */,
 				3811DE3025C9D49500A708ED /* HomeViewModel.swift in Sources */,
 				3811DF0525CAA62600A708ED /* DependeciesContainer.swift in Sources */,
+				38BF021725E7CBBC00579895 /* PumpManagerExtensions.swift in Sources */,
 				3811DF1025CAAAE200A708ED /* BaseAPSManager.swift in Sources */,
 				3811DE0A25C9D32F00A708ED /* BaseModuleBuilder.swift in Sources */,
 				3811DE1725C9D40400A708ED /* Screen.swift in Sources */,

+ 2 - 0
FreeAPS/Sources/APS/APSManager.swift

@@ -1,6 +1,8 @@
+import Combine
 import LoopKitUI
 
 protocol APSManager {
     func runTest()
     func setPumpManager(_: PumpManagerUI)
+    var pumpDisplayState: CurrentValueSubject<PumpDisplayState?, Never> { get }
 }

+ 10 - 32
FreeAPS/Sources/APS/BaseAPSManager.swift

@@ -29,13 +29,23 @@ final class BaseAPSManager: APSManager, Injectable {
         didSet {
             pumpManager?.pumpManagerDelegate = self
             UserDefaults.standard.pumpManagerRawValue = pumpManager?.rawValue
+            if let pumpManager = pumpManager {
+                pumpDisplayState.value = PumpDisplayState(name: pumpManager.localizedTitle, image: pumpManager.smallImage)
+            } else {
+                pumpDisplayState.value = nil
+            }
         }
     }
 
+    let pumpDisplayState = CurrentValueSubject<PumpDisplayState?, Never>(nil)
+
     init(resolver: Resolver) {
         injectServices(resolver)
         openAPS = OpenAPS(storage: resolver.resolve(FileStorage.self)!)
+        setupPumpManager()
+    }
 
+    private func setupPumpManager() {
         if let pumpManagerRawValue = UserDefaults.standard.pumpManagerRawValue {
             pumpManager = pumpManagerFromRawValue(pumpManagerRawValue)
         }
@@ -167,35 +177,3 @@ extension BaseAPSManager: AlertPresenter {
 
     func retractAlert(identifier _: Alert.Identifier) {}
 }
-
-extension PumpManager {
-    var rawValue: [String: Any] {
-        [
-            "managerIdentifier": type(of: self).managerIdentifier,
-            "state": rawState
-        ]
-    }
-}
-
-func PumpManagerFromRawValue(_ rawValue: [String: Any], rileyLinkDeviceProvider: RileyLinkDeviceProvider) -> PumpManager? {
-    guard let managerIdentifier = rawValue["managerIdentifier"] as? String,
-          let rawState = rawValue["state"] as? PumpManager.RawStateValue
-    else {
-        return nil
-    }
-
-    switch managerIdentifier {
-    case MinimedPumpManager.managerIdentifier:
-        guard let state = MinimedPumpManagerState(rawValue: rawState) else {
-            return nil
-        }
-        return MinimedPumpManager(state: state, rileyLinkDeviceProvider: rileyLinkDeviceProvider)
-    case OmnipodPumpManager.managerIdentifier:
-        guard let state = OmnipodPumpManagerState(rawValue: rawState) else {
-            return nil
-        }
-        return OmnipodPumpManager(state: state, rileyLinkDeviceProvider: rileyLinkDeviceProvider)
-    default:
-        return nil
-    }
-}

+ 29 - 0
FreeAPS/Sources/APS/Extensions/PumpManagerExtensions.swift

@@ -0,0 +1,29 @@
+import LoopKit
+import LoopKitUI
+
+extension PumpManager {
+    var rawValue: [String: Any] {
+        [
+            "managerIdentifier": type(of: self).managerIdentifier,
+            "state": rawState
+        ]
+    }
+}
+
+extension PumpManagerUI {
+    static func setupViewController() -> PumpManagerSetupViewController & UIViewController & CompletionNotifying {
+        setupViewController(
+            insulinTintColor: .accentColor,
+            guidanceColors: GuidanceColors(acceptable: .green, warning: .orange, critical: .red),
+            allowedInsulinTypes: [.apidra, .humalog, .novolog, .fiasp]
+        )
+    }
+
+    func settingsViewController() -> UIViewController {
+        settingsViewController(
+            insulinTintColor: .accentColor,
+            guidanceColors: GuidanceColors(acceptable: .green, warning: .orange, critical: .red),
+            allowedInsulinTypes: [.apidra, .humalog, .novolog, .fiasp]
+        )
+    }
+}

+ 6 - 0
FreeAPS/Sources/Modules/PumpConfig/PumpConfigDataFlow.swift

@@ -23,6 +23,12 @@ enum PumpConfig {
     }
 }
 
+struct PumpDisplayState {
+    let name: String
+    let image: UIImage?
+}
+
 protocol PumpConfigProvider: Provider {
     func setPumpManager(_: PumpManagerUI)
+    var pumpDisplayState: AnyPublisher<PumpDisplayState?, Never> { get }
 }

+ 4 - 0
FreeAPS/Sources/Modules/PumpConfig/PumpConfigProvider.swift

@@ -9,5 +9,9 @@ extension PumpConfig {
         func setPumpManager(_ manager: PumpManagerUI) {
             apsManager.setPumpManager(manager)
         }
+
+        var pumpDisplayState: AnyPublisher<PumpDisplayState?, Never> {
+            apsManager.pumpDisplayState.eraseToAnyPublisher()
+        }
     }
 }

+ 7 - 1
FreeAPS/Sources/Modules/PumpConfig/PumpConfigViewModel.swift

@@ -5,8 +5,14 @@ extension PumpConfig {
     class ViewModel<Provider>: BaseViewModel<Provider>, ObservableObject where Provider: PumpConfigProvider {
         @Published var setupPump = false
         private(set) var setupPumpType: PumpType = .minimed
+        @Published var pumpState: PumpDisplayState?
 
-        override func subscribe() {}
+        override func subscribe() {
+            provider.pumpDisplayState
+                .receive(on: DispatchQueue.main)
+                .assign(to: \.pumpState, on: self)
+                .store(in: &lifetime)
+        }
 
         func addPump(_ type: PumpType) {
             setupPump = true

+ 9 - 2
FreeAPS/Sources/Modules/PumpConfig/View/PumpConfigRootView.swift

@@ -7,8 +7,15 @@ extension PumpConfig {
         var body: some View {
             Form {
                 Section(header: Text("Pump")) {
-                    Button("Add Medtronic") { viewModel.addPump(.minimed) }
-                    Button("Add Omnipod") { viewModel.addPump(.omnipod) }
+                    if let pumpState = viewModel.pumpState {
+                        HStack {
+                            Image(uiImage: pumpState.image ?? UIImage()).padding()
+                            Text(pumpState.name)
+                        }
+                    } else {
+                        Button("Add Medtronic") { viewModel.addPump(.minimed) }
+                        Button("Add Omnipod") { viewModel.addPump(.omnipod) }
+                    }
                 }
             }
             .toolbar { ToolbarItem(placement: .principal) { Text("Pump Config") } }

+ 2 - 10
FreeAPS/Sources/Modules/PumpConfig/View/PumpSetupView.swift

@@ -22,17 +22,9 @@ extension PumpConfig {
 
             switch pumpType {
             case .minimed:
-                setupViewController = MinimedPumpManager.setupViewController(
-                    insulinTintColor: .accentColor,
-                    guidanceColors: GuidanceColors(acceptable: .green, warning: .orange, critical: .red),
-                    allowedInsulinTypes: [.apidra, .fiasp, .humalog, .novolog]
-                )
+                setupViewController = MinimedPumpManager.setupViewController()
             case .omnipod:
-                setupViewController = OmnipodPumpManager.setupViewController(
-                    insulinTintColor: .accentColor,
-                    guidanceColors: GuidanceColors(acceptable: .green, warning: .orange, critical: .red),
-                    allowedInsulinTypes: [.apidra, .fiasp, .humalog, .novolog]
-                )
+                setupViewController = OmnipodPumpManager.setupViewController()
             }
 
             setupViewController.setupDelegate = setupDelegate