BaseAPSManager.swift 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. import Combine
  2. import Foundation
  3. import LoopKit
  4. import LoopKitUI
  5. import MinimedKit
  6. import MinimedKitUI
  7. import NightscoutUploadKit
  8. import OmniKit
  9. import RileyLinkBLEKit
  10. import RileyLinkKit
  11. import RileyLinkKitUI
  12. import SwiftDate
  13. import Swinject
  14. import UserNotifications
  15. private let staticPumpManagers: [PumpManagerUI.Type] = [
  16. MinimedPumpManager.self,
  17. OmnipodPumpManager.self
  18. ]
  19. private let staticPumpManagersByIdentifier: [String: PumpManagerUI.Type] = staticPumpManagers.reduce(into: [:]) { map, Type in
  20. map[Type.managerIdentifier] = Type
  21. }
  22. final class BaseAPSManager: APSManager, Injectable {
  23. private var openAPS: OpenAPS!
  24. var pumpManager: PumpManagerUI? {
  25. didSet {
  26. pumpManager?.pumpManagerDelegate = self
  27. UserDefaults.standard.pumpManagerRawValue = pumpManager?.rawValue
  28. if let pumpManager = pumpManager {
  29. pumpDisplayState.value = PumpDisplayState(name: pumpManager.localizedTitle, image: pumpManager.smallImage)
  30. } else {
  31. pumpDisplayState.value = nil
  32. }
  33. }
  34. }
  35. let pumpDisplayState = CurrentValueSubject<PumpDisplayState?, Never>(nil)
  36. init(resolver: Resolver) {
  37. injectServices(resolver)
  38. openAPS = OpenAPS(storage: resolver.resolve(FileStorage.self)!)
  39. setupPumpManager()
  40. }
  41. private func setupPumpManager() {
  42. if let pumpManagerRawValue = UserDefaults.standard.pumpManagerRawValue {
  43. pumpManager = pumpManagerFromRawValue(pumpManagerRawValue)
  44. }
  45. }
  46. func runTest() {
  47. openAPS.test()
  48. }
  49. private func pumpManagerFromRawValue(_ rawValue: [String: Any]) -> PumpManagerUI? {
  50. guard let rawState = rawValue["state"] as? PumpManager.RawStateValue,
  51. let Manager = pumpManagerTypeFromRawValue(rawValue)
  52. else {
  53. return nil
  54. }
  55. return Manager.init(rawState: rawState) as? PumpManagerUI
  56. }
  57. private func pumpManagerTypeFromRawValue(_ rawValue: [String: Any]) -> PumpManager.Type? {
  58. guard let managerIdentifier = rawValue["managerIdentifier"] as? String else {
  59. return nil
  60. }
  61. return staticPumpManagersByIdentifier[managerIdentifier]
  62. }
  63. }
  64. extension BaseAPSManager: PumpManagerDelegate {
  65. func pumpManager(_: PumpManager, didAdjustPumpClockBy _: TimeInterval) {
  66. // log.debug("didAdjustPumpClockBy %@", adjustment)
  67. }
  68. func pumpManagerDidUpdateState(_ pumpManager: PumpManager) {
  69. UserDefaults.standard.pumpManagerRawValue = pumpManager.rawValue
  70. }
  71. func pumpManagerBLEHeartbeatDidFire(_: PumpManager) {}
  72. func pumpManagerMustProvideBLEHeartbeat(_: PumpManager) -> Bool {
  73. true
  74. }
  75. func pumpManager(_: PumpManager, didUpdate _: PumpManagerStatus, oldStatus _: PumpManagerStatus) {}
  76. func pumpManagerWillDeactivate(_: PumpManager) {
  77. pumpManager = nil
  78. }
  79. func pumpManager(_: PumpManager, didUpdatePumpRecordsBasalProfileStartEvents _: Bool) {}
  80. func pumpManager(_: PumpManager, didError _: PumpManagerError) {
  81. // log.error("pumpManager didError %@", String(describing: error))
  82. }
  83. func pumpManager(
  84. _: PumpManager,
  85. hasNewPumpEvents _: [NewPumpEvent],
  86. lastReconciliation _: Date?,
  87. completion _: @escaping (_ error: Error?) -> Void
  88. ) {}
  89. func pumpManager(
  90. _: PumpManager,
  91. didReadReservoirValue _: Double,
  92. at _: Date,
  93. completion _: @escaping (Result<
  94. (newValue: ReservoirValue, lastValue: ReservoirValue?, areStoredValuesContinuous: Bool),
  95. Error
  96. >) -> Void
  97. ) {}
  98. func pumpManagerRecommendsLoop(_: PumpManager) {}
  99. func startDateToFilterNewPumpEvents(for _: PumpManager) -> Date {
  100. Date().addingTimeInterval(-2.hours.timeInterval)
  101. }
  102. }
  103. // MARK: - DeviceManagerDelegate
  104. extension BaseAPSManager: DeviceManagerDelegate {
  105. func scheduleNotification(
  106. for _: DeviceManager,
  107. identifier: String,
  108. content: UNNotificationContent,
  109. trigger: UNNotificationTrigger?
  110. ) {
  111. let request = UNNotificationRequest(
  112. identifier: identifier,
  113. content: content,
  114. trigger: trigger
  115. )
  116. DispatchQueue.main.async {
  117. UNUserNotificationCenter.current().add(request)
  118. }
  119. }
  120. func clearNotification(for _: DeviceManager, identifier: String) {
  121. DispatchQueue.main.async {
  122. UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: [identifier])
  123. }
  124. }
  125. func removeNotificationRequests(for _: DeviceManager, identifiers: [String]) {
  126. DispatchQueue.main.async {
  127. UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: identifiers)
  128. }
  129. }
  130. func deviceManager(
  131. _: DeviceManager,
  132. logEventForDeviceIdentifier _: String?,
  133. type _: DeviceLogEntryType,
  134. message _: String,
  135. completion _: ((Error?) -> Void)?
  136. ) {}
  137. }
  138. // MARK: - AlertPresenter
  139. extension BaseAPSManager: AlertPresenter {
  140. func issueAlert(_: Alert) {}
  141. func retractAlert(identifier _: Alert.Identifier) {}
  142. }