MinimedHUDProvider.swift 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. //
  2. // MinimedHUDProvider.swift
  3. // MinimedKitUI
  4. //
  5. // Created by Pete Schwamb on 2/4/19.
  6. // Copyright © 2019 Pete Schwamb. All rights reserved.
  7. //
  8. import Foundation
  9. import LoopKit
  10. import LoopKitUI
  11. import MinimedKit
  12. import SwiftUI
  13. class MinimedHUDProvider: HUDProvider {
  14. var managerIdentifier: String {
  15. return MinimedPumpManager.managerIdentifier
  16. }
  17. private var state: MinimedPumpManagerState {
  18. didSet {
  19. guard visible else {
  20. return
  21. }
  22. if oldValue.lastReservoirReading != state.lastReservoirReading {
  23. self.updateReservoirView()
  24. }
  25. }
  26. }
  27. private let pumpManager: MinimedPumpManager
  28. private let bluetoothProvider: BluetoothProvider
  29. private let colorPalette: LoopUIColorPalette
  30. private let allowedInsulinTypes: [InsulinType]
  31. public init(pumpManager: MinimedPumpManager, bluetoothProvider: BluetoothProvider, colorPalette: LoopUIColorPalette, allowedInsulinTypes: [InsulinType]) {
  32. self.pumpManager = pumpManager
  33. self.bluetoothProvider = bluetoothProvider
  34. self.state = pumpManager.state
  35. self.colorPalette = colorPalette
  36. self.allowedInsulinTypes = allowedInsulinTypes
  37. pumpManager.stateObservers.insert(self, queue: .main)
  38. }
  39. var visible: Bool = false {
  40. didSet {
  41. if oldValue != visible && visible {
  42. self.updateReservoirView()
  43. }
  44. }
  45. }
  46. private weak var reservoirView: ReservoirHUDView?
  47. private func updateReservoirView() {
  48. if let lastReservoirVolume = state.lastReservoirReading,
  49. let reservoirView = reservoirView
  50. {
  51. let reservoirLevel = (lastReservoirVolume.units / pumpManager.pumpReservoirCapacity).clamped(to: 0...1.0)
  52. reservoirView.level = reservoirLevel
  53. reservoirView.setReservoirVolume(volume: lastReservoirVolume.units, at: lastReservoirVolume.validAt)
  54. }
  55. }
  56. public func createHUDView() -> BaseHUDView? {
  57. reservoirView = ReservoirHUDView.instantiate()
  58. if visible {
  59. updateReservoirView()
  60. }
  61. return reservoirView
  62. }
  63. public func didTapOnHUDView(_ view: BaseHUDView, allowDebugFeatures: Bool) -> HUDTapAction? {
  64. let vc = pumpManager.settingsViewController(bluetoothProvider: bluetoothProvider, colorPalette: colorPalette, allowDebugFeatures: allowDebugFeatures, allowedInsulinTypes: allowedInsulinTypes)
  65. return HUDTapAction.presentViewController(vc)
  66. }
  67. public var hudViewRawState: HUDProvider.HUDViewRawState {
  68. var rawValue: HUDProvider.HUDViewRawState = [
  69. "pumpReservoirCapacity": pumpManager.pumpReservoirCapacity
  70. ]
  71. if let lastReservoirReading = state.lastReservoirReading {
  72. rawValue["lastReservoirReading"] = lastReservoirReading.rawValue
  73. }
  74. return rawValue
  75. }
  76. public static func createHUDView(rawValue: HUDProvider.HUDViewRawState) -> BaseHUDView? {
  77. guard let pumpReservoirCapacity = rawValue["pumpReservoirCapacity"] as? Double else {
  78. return nil
  79. }
  80. let reservoirHUDView = ReservoirHUDView.instantiate()
  81. if let rawLastReservoirReading = rawValue["lastReservoirReading"] as? ReservoirReading.RawValue,
  82. let lastReservoirReading = ReservoirReading(rawValue: rawLastReservoirReading)
  83. {
  84. let reservoirLevel = (lastReservoirReading.units / pumpReservoirCapacity).clamped(to: 0...1.0)
  85. reservoirHUDView.level = reservoirLevel
  86. reservoirHUDView.setReservoirVolume(volume: lastReservoirReading.units, at: lastReservoirReading.validAt)
  87. }
  88. return reservoirHUDView
  89. }
  90. }
  91. extension MinimedHUDProvider: MinimedPumpManagerStateObserver {
  92. func didUpdatePumpManagerState(_ state: MinimedPumpManagerState) {
  93. dispatchPrecondition(condition: .onQueue(.main))
  94. self.state = state
  95. }
  96. }