MockHUDProvider.swift 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. //
  2. // MockHUDProvider.swift
  3. // MockKitUI
  4. //
  5. // Created by Michael Pangburn on 3/5/19.
  6. // Copyright © 2019 LoopKit Authors. All rights reserved.
  7. //
  8. import LoopKit
  9. import LoopKitUI
  10. import MockKit
  11. import Foundation
  12. final class MockHUDProvider: NSObject, HUDProvider {
  13. var managerIdentifier: String {
  14. return MockPumpManager.managerIdentifier
  15. }
  16. private var pumpManager: MockPumpManager
  17. private var lastPumpManagerStatus: PumpManagerStatus
  18. private weak var reservoirView: ReservoirVolumeHUDView?
  19. private weak var batteryView: BatteryLevelHUDView?
  20. init(pumpManager: MockPumpManager, allowedInsulinTypes: [InsulinType]) {
  21. self.pumpManager = pumpManager
  22. self.lastPumpManagerStatus = pumpManager.status
  23. super.init()
  24. pumpManager.addStateObserver(self, queue: .main)
  25. }
  26. var visible: Bool = false
  27. var hudViewRawState: HUDViewRawState {
  28. var rawValue: HUDViewRawState = [
  29. "pumpReservoirCapacity": pumpManager.pumpReservoirCapacity
  30. ]
  31. if let pumpBatteryChargeRemaining = lastPumpManagerStatus.pumpBatteryChargeRemaining {
  32. rawValue["pumpBatteryChargeRemaining"] = pumpBatteryChargeRemaining
  33. }
  34. rawValue["reservoirUnitsRemaining"] = pumpManager.state.reservoirUnitsRemaining
  35. return rawValue
  36. }
  37. func createHUDView() -> BaseHUDView? {
  38. reservoirView = ReservoirVolumeHUDView.instantiate()
  39. updateReservoirView()
  40. return reservoirView
  41. }
  42. static func createHUDView(rawValue: HUDViewRawState) -> BaseHUDView? {
  43. guard let pumpReservoirCapacity = rawValue["pumpReservoirCapacity"] as? Double else {
  44. return nil
  45. }
  46. let reservoirVolumeHUDView = ReservoirVolumeHUDView.instantiate()
  47. if let reservoirUnitsRemaining = rawValue["reservoirUnitsRemaining"] as? Double {
  48. let reservoirLevel = (reservoirUnitsRemaining / pumpReservoirCapacity).clamped(to: 0...1)
  49. reservoirVolumeHUDView.level = reservoirLevel
  50. reservoirVolumeHUDView.setReservoirVolume(volume: reservoirUnitsRemaining, at: Date())
  51. }
  52. return reservoirVolumeHUDView
  53. }
  54. func didTapOnHUDView(_ view: BaseHUDView, allowDebugFeatures: Bool) -> HUDTapAction? {
  55. return nil
  56. }
  57. private func updateReservoirView() {
  58. let reservoirVolume = pumpManager.state.reservoirUnitsRemaining
  59. let reservoirLevel = (reservoirVolume / pumpManager.pumpReservoirCapacity).clamped(to: 0...1)
  60. reservoirView?.level = reservoirLevel
  61. reservoirView?.setReservoirVolume(volume: reservoirVolume, at: Date())
  62. }
  63. private func updateBatteryView() {
  64. batteryView?.batteryLevel = lastPumpManagerStatus.pumpBatteryChargeRemaining
  65. }
  66. }
  67. extension MockHUDProvider: MockPumpManagerStateObserver {
  68. func mockPumpManager(_ manager: MockPumpManager, didUpdate state: MockPumpManagerState) {
  69. updateReservoirView()
  70. }
  71. func mockPumpManager(_ manager: MockPumpManager, didUpdate status: PumpManagerStatus, oldStatus: PumpManagerStatus) {
  72. lastPumpManagerStatus = status
  73. updateBatteryView()
  74. }
  75. }