BaseAPSManager.swift 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import Combine
  2. import LoopKit
  3. import MinimedKit
  4. import RileyLinkBLEKit
  5. import RileyLinkKit
  6. import Swinject
  7. final class BaseAPSManager: APSManager, Injectable {
  8. private var openAPS: OpenAPS!
  9. @Injected() var deviceDataManager: DeviceDataManager!
  10. let rileyDisplayStates = CurrentValueSubject<[RileyDisplayState], Never>([])
  11. private(set) var devices: [RileyLinkDevice] = [] {
  12. didSet {
  13. print("Devices: \(devices)")
  14. updateDisplayStates()
  15. }
  16. }
  17. private var deviceRSSI: [UUID: Int] = [:] {
  18. didSet {
  19. print("RSSI: \(deviceRSSI)")
  20. updateDisplayStates()
  21. }
  22. }
  23. private(set) var rileyLinkPumpManager: RileyLinkPumpManager!
  24. private var rssiFetchTimer: Timer? {
  25. willSet {
  26. rssiFetchTimer?.invalidate()
  27. }
  28. }
  29. init(resolver: Resolver) {
  30. injectServices(resolver)
  31. openAPS = OpenAPS(storage: resolver.resolve(FileStorage.self)!)
  32. rileyLinkPumpManager = RileyLinkPumpManager(
  33. rileyLinkDeviceProvider: deviceDataManager.rileyLinkConnectionManager.deviceProvider,
  34. rileyLinkConnectionManager: deviceDataManager.rileyLinkConnectionManager
  35. )
  36. registerNotifications()
  37. reloadDevices()
  38. rssiFetchTimer = Timer.scheduledTimer(
  39. timeInterval: 3,
  40. target: self,
  41. selector: #selector(updateRSSI),
  42. userInfo: nil,
  43. repeats: true
  44. )
  45. updateRSSI()
  46. }
  47. private func updateDisplayStates() {
  48. rileyDisplayStates.value = devices.map {
  49. RileyDisplayState(
  50. id: $0.peripheralIdentifier,
  51. name: $0.name ?? "unknown",
  52. rssi: self.deviceRSSI[$0.peripheralIdentifier],
  53. connected: false
  54. )
  55. }
  56. }
  57. private func registerNotifications() {
  58. // Register for manager notifications
  59. NotificationCenter.default.addObserver(
  60. self,
  61. selector: #selector(reloadDevices),
  62. name: .ManagerDevicesDidChange,
  63. object: rileyLinkPumpManager.rileyLinkDeviceProvider
  64. )
  65. // Register for device notifications
  66. for name in [.DeviceConnectionStateDidChange, .DeviceRSSIDidChange, .DeviceNameDidChange] as [Notification.Name] {
  67. NotificationCenter.default.addObserver(self, selector: #selector(deviceDidUpdate(_:)), name: name, object: nil)
  68. }
  69. }
  70. @objc private func reloadDevices() {
  71. rileyLinkPumpManager.rileyLinkDeviceProvider.getDevices { devices in
  72. DispatchQueue.main.async { [weak self] in
  73. self?.devices = devices
  74. devices.forEach { self?.rileyLinkPumpManager.connectToRileyLink($0) }
  75. }
  76. }
  77. }
  78. @objc private func deviceDidUpdate(_ note: Notification) {
  79. DispatchQueue.main.async {
  80. if let device = note.object as? RileyLinkDevice {
  81. if let rssi = note.userInfo?[RileyLinkDevice.notificationRSSIKey] as? Int {
  82. self.deviceRSSI[device.peripheralIdentifier] = rssi
  83. }
  84. }
  85. }
  86. }
  87. @objc public func updateRSSI() {
  88. for device in devices {
  89. device.readRSSI()
  90. }
  91. }
  92. func runTest() {
  93. openAPS.test()
  94. }
  95. }