| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- //
- // MinimedHUDProvider.swift
- // MinimedKitUI
- //
- // Created by Pete Schwamb on 2/4/19.
- // Copyright © 2019 Pete Schwamb. All rights reserved.
- //
- import Foundation
- import LoopKit
- import LoopKitUI
- import MinimedKit
- import SwiftUI
- class MinimedHUDProvider: HUDProvider {
- var managerIdentifier: String {
- return MinimedPumpManager.managerIdentifier
- }
- private var state: MinimedPumpManagerState {
- didSet {
- guard visible else {
- return
- }
- if oldValue.lastReservoirReading != state.lastReservoirReading {
- self.updateReservoirView()
- }
- }
- }
- private let pumpManager: MinimedPumpManager
- private let bluetoothProvider: BluetoothProvider
-
- private let colorPalette: LoopUIColorPalette
- private let allowedInsulinTypes: [InsulinType]
-
- public init(pumpManager: MinimedPumpManager, bluetoothProvider: BluetoothProvider, colorPalette: LoopUIColorPalette, allowedInsulinTypes: [InsulinType]) {
- self.pumpManager = pumpManager
- self.bluetoothProvider = bluetoothProvider
- self.state = pumpManager.state
- self.colorPalette = colorPalette
- self.allowedInsulinTypes = allowedInsulinTypes
- pumpManager.stateObservers.insert(self, queue: .main)
- }
- var visible: Bool = false {
- didSet {
- if oldValue != visible && visible {
- self.updateReservoirView()
- }
- }
- }
- private weak var reservoirView: ReservoirHUDView?
- private func updateReservoirView() {
- if let lastReservoirVolume = state.lastReservoirReading,
- let reservoirView = reservoirView
- {
- let reservoirLevel = (lastReservoirVolume.units / pumpManager.pumpReservoirCapacity).clamped(to: 0...1.0)
- reservoirView.level = reservoirLevel
- reservoirView.setReservoirVolume(volume: lastReservoirVolume.units, at: lastReservoirVolume.validAt)
- }
- }
- public func createHUDView() -> BaseHUDView? {
- reservoirView = ReservoirHUDView.instantiate()
- if visible {
- updateReservoirView()
- }
- return reservoirView
- }
- public func didTapOnHUDView(_ view: BaseHUDView, allowDebugFeatures: Bool) -> HUDTapAction? {
- let vc = pumpManager.settingsViewController(bluetoothProvider: bluetoothProvider, colorPalette: colorPalette, allowDebugFeatures: allowDebugFeatures, allowedInsulinTypes: allowedInsulinTypes)
- return HUDTapAction.presentViewController(vc)
- }
- public var hudViewRawState: HUDProvider.HUDViewRawState {
- var rawValue: HUDProvider.HUDViewRawState = [
- "pumpReservoirCapacity": pumpManager.pumpReservoirCapacity
- ]
- if let lastReservoirReading = state.lastReservoirReading {
- rawValue["lastReservoirReading"] = lastReservoirReading.rawValue
- }
- return rawValue
- }
- public static func createHUDView(rawValue: HUDProvider.HUDViewRawState) -> BaseHUDView? {
- guard let pumpReservoirCapacity = rawValue["pumpReservoirCapacity"] as? Double else {
- return nil
- }
- let reservoirHUDView = ReservoirHUDView.instantiate()
- if let rawLastReservoirReading = rawValue["lastReservoirReading"] as? ReservoirReading.RawValue,
- let lastReservoirReading = ReservoirReading(rawValue: rawLastReservoirReading)
- {
- let reservoirLevel = (lastReservoirReading.units / pumpReservoirCapacity).clamped(to: 0...1.0)
- reservoirHUDView.level = reservoirLevel
- reservoirHUDView.setReservoirVolume(volume: lastReservoirReading.units, at: lastReservoirReading.validAt)
- }
-
- return reservoirHUDView
- }
- }
- extension MinimedHUDProvider: MinimedPumpManagerStateObserver {
- func didUpdatePumpManagerState(_ state: MinimedPumpManagerState) {
- dispatchPrecondition(condition: .onQueue(.main))
- self.state = state
- }
- }
|