Explorar el Código

setup pump a new way

Ivan Valkou hace 5 años
padre
commit
9a7de746f7

+ 1 - 13
FreeAPS.xcodeproj/project.pbxproj

@@ -98,7 +98,6 @@
 		38A504A625DD9FDA00C5B9E8 /* OmniKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 38B17B2625DD6BBE005CAE3D /* OmniKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 		38A504A725DD9FDA00C5B9E8 /* OmniKitUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 38B17B2A25DD6BBE005CAE3D /* OmniKitUI.framework */; };
 		38A504A825DD9FDA00C5B9E8 /* OmniKitUI.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 38B17B2A25DD6BBE005CAE3D /* OmniKitUI.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
-		38B17B6325DD8B5B005CAE3D /* DeviceDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38B17B6225DD8B5B005CAE3D /* DeviceDataManager.swift */; };
 		38B17B6625DD90E0005CAE3D /* SwiftDate in Frameworks */ = {isa = PBXBuildFile; productRef = 38B17B6525DD90E0005CAE3D /* SwiftDate */; };
 		38B17B8625DD93BA005CAE3D /* LoopKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 38B17AD125DD6A40005CAE3D /* LoopKit.framework */; };
 		38B17B8725DD93BA005CAE3D /* LoopKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 38B17AD125DD6A40005CAE3D /* LoopKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
@@ -593,7 +592,6 @@
 		38B17AC025DD6A40005CAE3D /* LoopKit.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = LoopKit.xcodeproj; path = LoopKit/LoopKit.xcodeproj; sourceTree = "<group>"; };
 		38B17AF025DD6AE6005CAE3D /* MKRingProgressView.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = MKRingProgressView.xcodeproj; path = MKRingProgressView/MKRingProgressView.xcodeproj; sourceTree = "<group>"; };
 		38B17AF925DD6BBD005CAE3D /* RileyLink.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RileyLink.xcodeproj; path = rileylink_ios/RileyLink.xcodeproj; sourceTree = "<group>"; };
-		38B17B6225DD8B5B005CAE3D /* DeviceDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceDataManager.swift; sourceTree = "<group>"; };
 		38B4F3AE25E2979F00E76A18 /* IndexedCollection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IndexedCollection.swift; sourceTree = "<group>"; };
 		38B4F3C225E2A20B00E76A18 /* PumpSetupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PumpSetupView.swift; sourceTree = "<group>"; };
 		38B4F3C525E5017E00E76A18 /* NotificationCenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NotificationCenter.swift; sourceTree = "<group>"; };
@@ -976,8 +974,8 @@
 			children = (
 				3811DF0B25CAAABD00A708ED /* APSManager.swift */,
 				3811DF0F25CAAAE200A708ED /* BaseAPSManager.swift */,
+				38A504F625DDA0E200C5B9E8 /* Extensions */,
 				388E5A5825B6F0070019842D /* OpenAPS */,
-				38B17B5F25DD6E38005CAE3D /* RileyLink */,
 			);
 			path = APS;
 			sourceTree = "<group>";
@@ -1125,15 +1123,6 @@
 			name = Products;
 			sourceTree = "<group>";
 		};
-		38B17B5F25DD6E38005CAE3D /* RileyLink */ = {
-			isa = PBXGroup;
-			children = (
-				38A504F625DDA0E200C5B9E8 /* Extensions */,
-				38B17B6225DD8B5B005CAE3D /* DeviceDataManager.swift */,
-			);
-			path = RileyLink;
-			sourceTree = "<group>";
-		};
 		38B17B8525DD93BA005CAE3D /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
@@ -1625,7 +1614,6 @@
 				3811DEAE25C9D88300A708ED /* Cache.swift in Sources */,
 				3811DEAD25C9D88300A708ED /* UserDefaults+Cache.swift in Sources */,
 				3811DE2225C9D48300A708ED /* MainProvider.swift in Sources */,
-				38B17B6325DD8B5B005CAE3D /* DeviceDataManager.swift in Sources */,
 				3811DE0C25C9D32F00A708ED /* BaseProvider.swift in Sources */,
 				3811DE5C25C9D4D500A708ED /* Formatters.swift in Sources */,
 				3811DEC525C9D99900A708ED /* StorageContainer.swift in Sources */,

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

@@ -1,28 +1,6 @@
-import Combine
 import LoopKitUI
-import RileyLinkBLEKit
 
-class RileyDisplayState: ObservableObject, Identifiable {
-    let id: UUID
-    let name: String
-    let rssi: Int?
-    var connected: Bool {
-        didSet { didChangeConnection(connected) }
-    }
-
-    let didChangeConnection: (Bool) -> Void
-
-    init(id: UUID, name: String, rssi: Int?, connected: Bool, didChangeConnection: @escaping (Bool) -> Void) {
-        self.id = id
-        self.name = name
-        self.rssi = rssi
-        self.connected = connected
-        self.didChangeConnection = didChangeConnection
-    }
-}
-
-protocol APSManager: PumpManagerSetupViewControllerDelegate {
-    var rileyDisplayStates: CurrentValueSubject<[RileyDisplayState], Never> { get }
-    var deviceProvider: RileyLinkDeviceProvider { get }
+protocol APSManager {
     func runTest()
+    func setPumpManager(_: PumpManagerUI)
 }

+ 157 - 84
FreeAPS/Sources/APS/BaseAPSManager.swift

@@ -1,128 +1,201 @@
 import Combine
+import Foundation
 import LoopKit
 import LoopKitUI
 import MinimedKit
+import MinimedKitUI
+import NightscoutUploadKit
+import OmniKit
 import RileyLinkBLEKit
 import RileyLinkKit
+import RileyLinkKitUI
+import SwiftDate
 import Swinject
+import UserNotifications
+
+private let staticPumpManagers: [PumpManagerUI.Type] = [
+    MinimedPumpManager.self,
+    OmnipodPumpManager.self
+]
+
+private let staticPumpManagersByIdentifier: [String: PumpManagerUI.Type] = staticPumpManagers.reduce(into: [:]) { map, Type in
+    map[Type.managerIdentifier] = Type
+}
 
 final class BaseAPSManager: APSManager, Injectable {
     private var openAPS: OpenAPS!
-    @Injected() private var deviceDataManager: DeviceDataManager!
-    @Injected() private var notificationCenter: NotificationCenter!
-
-    let rileyDisplayStates = CurrentValueSubject<[RileyDisplayState], Never>([])
 
-    var deviceProvider: RileyLinkDeviceProvider {
-        deviceDataManager.rileyLinkConnectionManager.deviceProvider
+    var pumpManager: PumpManagerUI? {
+        didSet {
+            pumpManager?.pumpManagerDelegate = self
+            UserDefaults.standard.pumpManagerRawValue = pumpManager?.rawValue
+        }
     }
 
-    private var pumpManager: PumpManagerUI? { deviceDataManager.pumpManager }
+    init(resolver: Resolver) {
+        injectServices(resolver)
+        openAPS = OpenAPS(storage: resolver.resolve(FileStorage.self)!)
 
-    private(set) var devices: [RileyLinkDevice] = [] {
-        didSet {
-            print("Devices: \(devices)")
-            updateDisplayStates()
+        if let pumpManagerRawValue = UserDefaults.standard.pumpManagerRawValue {
+            pumpManager = pumpManagerFromRawValue(pumpManagerRawValue)
         }
     }
 
-    private var deviceRSSI: [UUID: Int] = [:] {
-        didSet {
-            print("RSSI: \(deviceRSSI)")
-            updateDisplayStates()
-        }
+    func runTest() {
+        openAPS.test()
     }
 
-    private(set) var rileyLinkPumpManager: RileyLinkPumpManager!
+    func setPumpManager(_ manager: PumpManagerUI) {
+        pumpManager = manager
+    }
 
-    private var rssiFetchTimer: Timer? {
-        willSet {
-            rssiFetchTimer?.invalidate()
+    private func pumpManagerFromRawValue(_ rawValue: [String: Any]) -> PumpManagerUI? {
+        guard let rawState = rawValue["state"] as? PumpManager.RawStateValue,
+              let Manager = pumpManagerTypeFromRawValue(rawValue)
+        else {
+            return nil
         }
+
+        return Manager.init(rawState: rawState) as? PumpManagerUI
     }
 
-    init(resolver: Resolver) {
-        injectServices(resolver)
-        openAPS = OpenAPS(storage: resolver.resolve(FileStorage.self)!)
-        rileyLinkPumpManager = RileyLinkPumpManager(
-            rileyLinkDeviceProvider: deviceDataManager.rileyLinkConnectionManager.deviceProvider,
-            rileyLinkConnectionManager: deviceDataManager.rileyLinkConnectionManager
-        )
-        registerNotifications()
-        reloadDevices()
-        rssiFetchTimer = Timer.scheduledTimer(
-            timeInterval: 3,
-            target: self,
-            selector: #selector(updateRSSI),
-            userInfo: nil,
-            repeats: true
-        )
-        updateRSSI()
-    }
-
-    private func updateDisplayStates() {
-        rileyDisplayStates.value = devices.map { device in
-            let connected = rileyLinkPumpManager.rileyLinkConnectionManager?
-                .shouldConnect(to: device.peripheralIdentifier.uuidString) ?? false
-            return RileyDisplayState(
-                id: device.peripheralIdentifier,
-                name: device.name ?? "unknown",
-                rssi: self.deviceRSSI[device.peripheralIdentifier],
-                connected: connected
-            ) { [weak self] connect in
-                if connect {
-                    self?.rileyLinkPumpManager.connectToRileyLink(device)
-                } else {
-                    self?.rileyLinkPumpManager.disconnectFromRileyLink(device)
-                }
-            }
+    private func pumpManagerTypeFromRawValue(_ rawValue: [String: Any]) -> PumpManager.Type? {
+        guard let managerIdentifier = rawValue["managerIdentifier"] as? String else {
+            return nil
         }
+
+        return staticPumpManagersByIdentifier[managerIdentifier]
     }
+}
 
-    private func registerNotifications() {
-        notificationCenter.addObserver(
-            self,
-            selector: #selector(reloadDevices),
-            name: .ManagerDevicesDidChange,
-            object: rileyLinkPumpManager.rileyLinkDeviceProvider
-        )
+extension BaseAPSManager: PumpManagerDelegate {
+    func pumpManager(_: PumpManager, didAdjustPumpClockBy _: TimeInterval) {
+//        log.debug("didAdjustPumpClockBy %@", adjustment)
+    }
 
-        for name in [.DeviceConnectionStateDidChange, .DeviceRSSIDidChange, .DeviceNameDidChange] as [Notification.Name] {
-            notificationCenter.addObserver(self, selector: #selector(deviceDidUpdate(_:)), name: name, object: nil)
-        }
+    func pumpManagerDidUpdateState(_ pumpManager: PumpManager) {
+        UserDefaults.standard.pumpManagerRawValue = pumpManager.rawValue
+    }
+
+    func pumpManagerBLEHeartbeatDidFire(_: PumpManager) {}
+
+    func pumpManagerMustProvideBLEHeartbeat(_: PumpManager) -> Bool {
+        true
+    }
+
+    func pumpManager(_: PumpManager, didUpdate _: PumpManagerStatus, oldStatus _: PumpManagerStatus) {}
+
+    func pumpManagerWillDeactivate(_: PumpManager) {
+        pumpManager = nil
+    }
+
+    func pumpManager(_: PumpManager, didUpdatePumpRecordsBasalProfileStartEvents _: Bool) {}
+
+    func pumpManager(_: PumpManager, didError _: PumpManagerError) {
+//        log.error("pumpManager didError %@", String(describing: error))
+    }
+
+    func pumpManager(
+        _: PumpManager,
+        hasNewPumpEvents _: [NewPumpEvent],
+        lastReconciliation _: Date?,
+        completion _: @escaping (_ error: Error?) -> Void
+    ) {}
+
+    func pumpManager(
+        _: PumpManager,
+        didReadReservoirValue _: Double,
+        at _: Date,
+        completion _: @escaping (Result<
+            (newValue: ReservoirValue, lastValue: ReservoirValue?, areStoredValuesContinuous: Bool),
+            Error
+        >) -> Void
+    ) {}
+
+    func pumpManagerRecommendsLoop(_: PumpManager) {}
+
+    func startDateToFilterNewPumpEvents(for _: PumpManager) -> Date {
+        Date().addingTimeInterval(-2.hours.timeInterval)
     }
+}
 
-    @objc private func reloadDevices() {
-        rileyLinkPumpManager.rileyLinkDeviceProvider.getDevices { devices in
-            DispatchQueue.main.async { [weak self] in
-                self?.devices = devices
-            }
+// MARK: - DeviceManagerDelegate
+
+extension BaseAPSManager: DeviceManagerDelegate {
+    func scheduleNotification(
+        for _: DeviceManager,
+        identifier: String,
+        content: UNNotificationContent,
+        trigger: UNNotificationTrigger?
+    ) {
+        let request = UNNotificationRequest(
+            identifier: identifier,
+            content: content,
+            trigger: trigger
+        )
+
+        DispatchQueue.main.async {
+            UNUserNotificationCenter.current().add(request)
         }
     }
 
-    @objc private func deviceDidUpdate(_ note: Notification) {
+    func clearNotification(for _: DeviceManager, identifier: String) {
         DispatchQueue.main.async {
-            if let device = note.object as? RileyLinkDevice {
-                if let rssi = note.userInfo?[RileyLinkDevice.notificationRSSIKey] as? Int {
-                    self.deviceRSSI[device.peripheralIdentifier] = rssi
-                }
-            }
+            UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: [identifier])
         }
     }
 
-    @objc public func updateRSSI() {
-        for device in devices {
-            device.readRSSI()
+    func removeNotificationRequests(for _: DeviceManager, identifiers: [String]) {
+        DispatchQueue.main.async {
+            UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: identifiers)
         }
     }
 
-    func runTest() {
-        openAPS.test()
+    func deviceManager(
+        _: DeviceManager,
+        logEventForDeviceIdentifier _: String?,
+        type _: DeviceLogEntryType,
+        message _: String,
+        completion _: ((Error?) -> Void)?
+    ) {}
+}
+
+// MARK: - AlertPresenter
+
+extension BaseAPSManager: AlertPresenter {
+    func issueAlert(_: Alert) {}
+
+    func retractAlert(identifier _: Alert.Identifier) {}
+}
+
+extension PumpManager {
+    var rawValue: [String: Any] {
+        [
+            "managerIdentifier": type(of: self).managerIdentifier,
+            "state": rawState
+        ]
     }
 }
 
-extension BaseAPSManager: PumpManagerSetupViewControllerDelegate {
-    func pumpManagerSetupViewController(_: PumpManagerSetupViewController, didSetUpPumpManager pumpManager: PumpManagerUI) {
-        deviceDataManager.pumpManager = pumpManager
+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
     }
 }

FreeAPS/Sources/APS/RileyLink/Extensions/UserDefaultsExtensions.swift → FreeAPS/Sources/APS/Extensions/UserDefaultsExtensions.swift


+ 0 - 209
FreeAPS/Sources/APS/RileyLink/DeviceDataManager.swift

@@ -1,209 +0,0 @@
-import Foundation
-import LoopKit
-import LoopKitUI
-import MinimedKit
-import MinimedKitUI
-import NightscoutUploadKit
-import OmniKit
-import RileyLinkBLEKit
-import RileyLinkKit
-import RileyLinkKitUI
-import SwiftDate
-import UserNotifications
-
-protocol DeviceDataManager {
-    var rileyLinkConnectionManager: RileyLinkConnectionManager! { get }
-    var pumpManager: PumpManagerUI? { get set }
-}
-
-final class BaseDeviceManager: DeviceDataManager {
-    private(set) var rileyLinkConnectionManager: RileyLinkConnectionManager!
-
-    var pumpManager: PumpManagerUI? {
-        didSet {
-            pumpManager?.pumpManagerDelegate = self
-            UserDefaults.standard.pumpManagerRawValue = pumpManager?.rawValue
-        }
-    }
-
-    @Persisted(key: "BaseDeviceManager.connectionState") var connectionState: RileyLinkConnectionManagerState? = nil
-
-    init() {
-        if let state = connectionState {
-            rileyLinkConnectionManager = RileyLinkConnectionManager(state: state)
-        } else {
-            rileyLinkConnectionManager = RileyLinkConnectionManager(autoConnectIDs: [])
-        }
-
-        rileyLinkConnectionManager.delegate = self
-        rileyLinkConnectionManager.setScanningEnabled(true)
-
-        if let pumpManagerRawValue = UserDefaults.standard.pumpManagerRawValue {
-            pumpManager = PumpManagerFromRawValue(
-                pumpManagerRawValue,
-                rileyLinkDeviceProvider: rileyLinkConnectionManager.deviceProvider
-            ) as? PumpManagerUI
-            pumpManager?.pumpManagerDelegate = self
-        }
-    }
-}
-
-extension BaseDeviceManager: RileyLinkConnectionManagerDelegate {
-    func rileyLinkConnectionManager(_: RileyLinkConnectionManager, didChange state: RileyLinkConnectionManagerState)
-    {
-        connectionState = state
-    }
-}
-
-extension BaseDeviceManager: PumpManagerDelegate {
-    func pumpManager(_: PumpManager, didAdjustPumpClockBy _: TimeInterval) {
-//        log.debug("didAdjustPumpClockBy %@", adjustment)
-    }
-
-    func pumpManagerDidUpdateState(_ pumpManager: PumpManager) {
-        UserDefaults.standard.pumpManagerRawValue = pumpManager.rawValue
-    }
-
-    func pumpManagerBLEHeartbeatDidFire(_: PumpManager) {}
-
-    func pumpManagerMustProvideBLEHeartbeat(_: PumpManager) -> Bool {
-        true
-    }
-
-    func pumpManager(_: PumpManager, didUpdate _: PumpManagerStatus, oldStatus _: PumpManagerStatus) {}
-
-    func pumpManagerWillDeactivate(_: PumpManager) {
-        pumpManager = nil
-    }
-
-    func pumpManager(_: PumpManager, didUpdatePumpRecordsBasalProfileStartEvents _: Bool) {}
-
-    func pumpManager(_: PumpManager, didError _: PumpManagerError) {
-//        log.error("pumpManager didError %@", String(describing: error))
-    }
-
-    func pumpManager(
-        _: PumpManager,
-        hasNewPumpEvents _: [NewPumpEvent],
-        lastReconciliation _: Date?,
-        completion _: @escaping (_ error: Error?) -> Void
-    ) {}
-
-    func pumpManager(
-        _: PumpManager,
-        didReadReservoirValue _: Double,
-        at _: Date,
-        completion _: @escaping (Result<
-            (newValue: ReservoirValue, lastValue: ReservoirValue?, areStoredValuesContinuous: Bool),
-            Error
-        >) -> Void
-    ) {}
-
-    func pumpManagerRecommendsLoop(_: PumpManager) {}
-
-    func startDateToFilterNewPumpEvents(for _: PumpManager) -> Date {
-        Date().addingTimeInterval(-2.hours.timeInterval)
-    }
-}
-
-// MARK: - DeviceManagerDelegate
-
-extension BaseDeviceManager: DeviceManagerDelegate {
-    func scheduleNotification(
-        for _: DeviceManager,
-        identifier: String,
-        content: UNNotificationContent,
-        trigger: UNNotificationTrigger?
-    ) {
-        let request = UNNotificationRequest(
-            identifier: identifier,
-            content: content,
-            trigger: trigger
-        )
-
-        DispatchQueue.main.async {
-            UNUserNotificationCenter.current().add(request)
-        }
-    }
-
-    func clearNotification(for _: DeviceManager, identifier: String) {
-        DispatchQueue.main.async {
-            UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: [identifier])
-        }
-    }
-
-    func removeNotificationRequests(for _: DeviceManager, identifiers: [String]) {
-        DispatchQueue.main.async {
-            UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: identifiers)
-        }
-    }
-
-    func deviceManager(
-        _: DeviceManager,
-        logEventForDeviceIdentifier _: String?,
-        type _: DeviceLogEntryType,
-        message _: String,
-        completion _: ((Error?) -> Void)?
-    ) {}
-}
-
-// MARK: - AlertPresenter
-
-extension BaseDeviceManager: AlertPresenter {
-    func issueAlert(_: Alert) {}
-
-    func retractAlert(identifier _: Alert.Identifier) {}
-}
-
-extension RileyLinkConnectionManagerState: Codable {
-    enum CodingKeys: CodingKey {
-        case autoConnectIDs
-    }
-
-    public init(from decoder: Decoder) throws {
-        let container = try decoder.container(keyedBy: CodingKeys.self)
-
-        if let ids = try? container.decode([String].self, forKey: CodingKeys.autoConnectIDs) {
-            self.init(autoConnectIDs: Set(ids))
-            return
-        }
-        self.init(autoConnectIDs: [])
-    }
-
-    public func encode(to encoder: Encoder) throws {
-        var container = encoder.container(keyedBy: CodingKeys.self)
-        try container.encode(Array(autoConnectIDs), forKey: CodingKeys.autoConnectIDs)
-    }
-}
-
-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
-    }
-}

+ 0 - 1
FreeAPS/Sources/Containers/APSContainer.swift

@@ -5,7 +5,6 @@ private let resolver = FreeAPSApp.resolver
 
 enum APSContainer: DependeciesContainer {
     static func register(container: Container) {
-        container.register(DeviceDataManager.self) { _ in BaseDeviceManager() }
         container.register(APSManager.self) { _ in BaseAPSManager(resolver: resolver) }
     }
 }

+ 14 - 2
FreeAPS/Sources/Modules/PumpConfig/PumpConfigDataFlow.swift

@@ -1,4 +1,5 @@
 import Combine
+import LoopKit
 import LoopKitUI
 
 enum PumpConfig {
@@ -8,9 +9,20 @@ enum PumpConfig {
         case minimed
         case omnipod
     }
+
+    struct PumpInitialSettings {
+        let maxBolusUnits: Double
+        let maxBasalRateUnitsPerHour: Double
+        let basalSchedule: BasalRateSchedule
+
+        static let `default` = PumpInitialSettings(
+            maxBolusUnits: 10,
+            maxBasalRateUnitsPerHour: 2,
+            basalSchedule: BasalRateSchedule(dailyItems: [RepeatingScheduleValue(startTime: 0, value: 1.0)])!
+        )
+    }
 }
 
 protocol PumpConfigProvider: Provider {
-    func rileyDisplayStates() -> AnyPublisher<[RileyDisplayState], Never>
-    var setupDelegate: PumpManagerSetupViewControllerDelegate { get }
+    func setPumpManager(_: PumpManagerUI)
 }

+ 2 - 5
FreeAPS/Sources/Modules/PumpConfig/PumpConfigProvider.swift

@@ -6,11 +6,8 @@ extension PumpConfig {
     final class Provider: BaseProvider, PumpConfigProvider {
         @Injected() var apsManager: APSManager!
 
-        var deviceProvider: RileyLinkDeviceProvider { apsManager.deviceProvider }
-        var setupDelegate: PumpManagerSetupViewControllerDelegate { apsManager }
-
-        func rileyDisplayStates() -> AnyPublisher<[RileyDisplayState], Never> {
-            apsManager.rileyDisplayStates.eraseToAnyPublisher()
+        func setPumpManager(_ manager: PumpManagerUI) {
+            apsManager.setPumpManager(manager)
         }
     }
 }

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

@@ -3,16 +3,10 @@ import SwiftUI
 
 extension PumpConfig {
     class ViewModel<Provider>: BaseViewModel<Provider>, ObservableObject where Provider: PumpConfigProvider {
-        @Published var rileyDisplayStates: [RileyDisplayState] = []
         @Published var setupPump = false
         private(set) var setupPumpType: PumpType = .minimed
 
-        override func subscribe() {
-            provider.rileyDisplayStates()
-                .receive(on: DispatchQueue.main)
-                .assign(to: \.rileyDisplayStates, on: self)
-                .store(in: &lifetime)
-        }
+        override func subscribe() {}
 
         func addPump(_ type: PumpType) {
             setupPump = true
@@ -26,3 +20,10 @@ extension PumpConfig.ViewModel: CompletionDelegate {
         setupPump = false
     }
 }
+
+extension PumpConfig.ViewModel: PumpManagerSetupViewControllerDelegate {
+    func pumpManagerSetupViewController(_: PumpManagerSetupViewController, didSetUpPumpManager pumpManager: PumpManagerUI) {
+        provider.setPumpManager(pumpManager)
+        setupPump = false
+    }
+}

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

@@ -6,22 +6,6 @@ extension PumpConfig {
 
         var body: some View {
             Form {
-                Section(header: HStack {
-                    Text("Devices")
-                    Spacer()
-                    ProgressView()
-                }) {
-                    ForEach(viewModel.rileyDisplayStates.indexed(), id: \.1.id) { index, state in
-                        Toggle(isOn: self.$viewModel.rileyDisplayStates[index].connected) {
-                            HStack {
-                                Text(state.name)
-                                Spacer()
-                                Text(state.rssi.map { "\($0) " } ?? "").foregroundColor(.secondary)
-                            }
-                        }
-                    }
-                }
-
                 Section(header: Text("Pump")) {
                     Button("Add Medtronic") { viewModel.addPump(.minimed) }
                     Button("Add Omnipod") { viewModel.addPump(.omnipod) }
@@ -33,9 +17,9 @@ extension PumpConfig {
             .popover(isPresented: $viewModel.setupPump) {
                 PumpSetupView(
                     pumpType: viewModel.setupPumpType,
-                    deviceProvider: viewModel.provider.deviceProvider,
+                    pumpInitialSettings: .default,
                     completionDelegate: viewModel,
-                    setupDelegate: viewModel.provider.setupDelegate
+                    setupDelegate: viewModel
                 )
             }
         }

+ 16 - 13
FreeAPS/Sources/Modules/PumpConfig/View/PumpSetupView.swift

@@ -2,6 +2,7 @@ import LoopKit
 import LoopKitUI
 import MinimedKit
 import MinimedKitUI
+import OmniKit
 import OmniKitUI
 import RileyLinkBLEKit
 import RileyLinkKit
@@ -12,7 +13,7 @@ import UIKit
 extension PumpConfig {
     struct PumpSetupView: UIViewControllerRepresentable {
         let pumpType: PumpType
-        let deviceProvider: RileyLinkDeviceProvider
+        let pumpInitialSettings: PumpInitialSettings
         weak var completionDelegate: CompletionDelegate?
         weak var setupDelegate: PumpManagerSetupViewControllerDelegate?
 
@@ -21,22 +22,24 @@ extension PumpConfig {
 
             switch pumpType {
             case .minimed:
-                setupViewController = UIStoryboard(
-                    name: "MinimedPumpManager",
-                    bundle: Bundle(for: MinimedPumpManagerSetupViewController.self)
-                ).instantiateViewController(withIdentifier: "DevelopmentPumpSetup") as! MinimedPumpManagerSetupViewController
+                setupViewController = MinimedPumpManager.setupViewController(
+                    insulinTintColor: .accentColor,
+                    guidanceColors: GuidanceColors(acceptable: .green, warning: .orange, critical: .red),
+                    allowedInsulinTypes: [.apidra, .fiasp, .humalog, .novolog]
+                )
             case .omnipod:
-                setupViewController = UIStoryboard(
-                    name: "OmnipodPumpManager",
-                    bundle: Bundle(for: OmnipodPumpManagerSetupViewController.self)
-                ).instantiateViewController(withIdentifier: "DevelopmentPumpSetup") as! OmnipodPumpManagerSetupViewController
-            }
-            if let rileyLinkManagerViewController = setupViewController as? RileyLinkManagerSetupViewController {
-                rileyLinkManagerViewController
-                    .rileyLinkPumpManager = RileyLinkPumpManager(rileyLinkDeviceProvider: deviceProvider)
+                setupViewController = OmnipodPumpManager.setupViewController(
+                    insulinTintColor: .accentColor,
+                    guidanceColors: GuidanceColors(acceptable: .green, warning: .orange, critical: .red),
+                    allowedInsulinTypes: [.apidra, .fiasp, .humalog, .novolog]
+                )
             }
+
             setupViewController.setupDelegate = setupDelegate
             setupViewController.completionDelegate = completionDelegate
+            setupViewController.maxBolusUnits = pumpInitialSettings.maxBolusUnits
+            setupViewController.maxBasalRateUnitsPerHour = pumpInitialSettings.maxBasalRateUnitsPerHour
+            setupViewController.basalSchedule = pumpInitialSettings.basalSchedule
             return setupViewController
         }
 

+ 1 - 1
scripts/swiftformat.sh

@@ -39,7 +39,6 @@ redundantBreak,\
 redundantExtensionACL,\
 redundantFileprivate,\
 redundantGet,\
-redundantInit,\
 redundantLet,\
 redundantLetError,\
 redundantNilInit,\
@@ -80,6 +79,7 @@ wrapEnumCases,\
 wrapMultilineStatementBraces,\
 wrapSwitchCases \
 --disable braces,\
+redundantInit,\
 trailingClosures \
 --commas inline \
 --exponentcase uppercase \