MinimedHUDProvider.swift 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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 insulinTintColor: Color
  29. private let guidanceColors: GuidanceColors
  30. private let allowedInsulinTypes: [InsulinType]
  31. public init(pumpManager: MinimedPumpManager, insulinTintColor: Color, guidanceColors: GuidanceColors, allowedInsulinTypes: [InsulinType]) {
  32. self.pumpManager = pumpManager
  33. self.state = pumpManager.state
  34. self.insulinTintColor = insulinTintColor
  35. self.guidanceColors = guidanceColors
  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() -> LevelHUDView? {
  57. reservoirView = ReservoirHUDView.instantiate()
  58. if visible {
  59. updateReservoirView()
  60. }
  61. return reservoirView
  62. }
  63. public func didTapOnHUDView(_ view: BaseHUDView) -> HUDTapAction? {
  64. return HUDTapAction.presentViewController(pumpManager.settingsViewController(insulinTintColor: insulinTintColor, guidanceColors: guidanceColors, allowedInsulinTypes: allowedInsulinTypes))
  65. }
  66. public var hudViewRawState: HUDProvider.HUDViewRawState {
  67. var rawValue: HUDProvider.HUDViewRawState = [
  68. "pumpReservoirCapacity": pumpManager.pumpReservoirCapacity
  69. ]
  70. if let lastReservoirReading = state.lastReservoirReading {
  71. rawValue["lastReservoirReading"] = lastReservoirReading.rawValue
  72. }
  73. return rawValue
  74. }
  75. public static func createHUDView(rawValue: HUDProvider.HUDViewRawState) -> LevelHUDView? {
  76. guard let pumpReservoirCapacity = rawValue["pumpReservoirCapacity"] as? Double else {
  77. return nil
  78. }
  79. let reservoirHUDView = ReservoirHUDView.instantiate()
  80. if let rawLastReservoirReading = rawValue["lastReservoirReading"] as? ReservoirReading.RawValue,
  81. let lastReservoirReading = ReservoirReading(rawValue: rawLastReservoirReading)
  82. {
  83. let reservoirLevel = (lastReservoirReading.units / pumpReservoirCapacity).clamped(to: 0...1.0)
  84. reservoirHUDView.level = reservoirLevel
  85. reservoirHUDView.setReservoirVolume(volume: lastReservoirReading.units, at: lastReservoirReading.validAt)
  86. }
  87. return reservoirHUDView
  88. }
  89. }
  90. extension MinimedHUDProvider: MinimedPumpManagerStateObserver {
  91. func didUpdatePumpManagerState(_ state: MinimedPumpManagerState) {
  92. dispatchPrecondition(condition: .onQueue(.main))
  93. self.state = state
  94. }
  95. }