RileyLinkPumpManager.swift 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. //
  2. // RileyLinkPumpManager.swift
  3. // Loop
  4. //
  5. // Copyright © 2018 LoopKit Authors. All rights reserved.
  6. //
  7. import LoopKit
  8. import RileyLinkBLEKit
  9. open class RileyLinkPumpManager {
  10. open var rileyLinkConnectionManagerState: RileyLinkConnectionState?
  11. public init(rileyLinkDeviceProvider: RileyLinkDeviceProvider) {
  12. self.rileyLinkDeviceProvider = rileyLinkDeviceProvider
  13. rileyLinkDeviceProvider.delegate = self
  14. // Listen for device notifications
  15. NotificationCenter.default.addObserver(self, selector: #selector(receivedRileyLinkPacketNotification(_:)), name: .DevicePacketReceived, object: nil)
  16. NotificationCenter.default.addObserver(self, selector: #selector(receivedRileyLinkTimerTickNotification(_:)), name: .DeviceTimerDidTick, object: nil)
  17. NotificationCenter.default.addObserver(self, selector: #selector(receivedRileyLinkBatteryUpdate(_:)), name: .DeviceBatteryLevelUpdated, object: nil)
  18. }
  19. /// Access to rileylink devices
  20. public let rileyLinkDeviceProvider: RileyLinkDeviceProvider
  21. // TODO: Put this on each RileyLinkDevice?
  22. private var lastTimerTick = Locked(Date.distantPast)
  23. /// Called when one of the connected devices receives a packet outside of a session
  24. ///
  25. /// - Parameters:
  26. /// - device: The device
  27. /// - packet: The received packet
  28. open func device(_ device: RileyLinkDevice, didReceivePacket packet: RFPacket) { }
  29. open func deviceTimerDidTick(_ device: RileyLinkDevice) { }
  30. open func device(_ device: RileyLinkDevice, didUpdateBattery level: Int) { }
  31. // MARK: - CustomDebugStringConvertible
  32. open var debugDescription: String {
  33. return [
  34. "## RileyLinkPumpManager",
  35. "lastTimerTick: \(String(describing: lastTimerTick.value))",
  36. "",
  37. String(reflecting: rileyLinkDeviceProvider),
  38. ].joined(separator: "\n")
  39. }
  40. }
  41. // MARK: - RileyLink Updates
  42. extension RileyLinkPumpManager {
  43. /**
  44. Called when a new idle message is received by the RileyLink.
  45. Only MySentryPumpStatus messages are handled.
  46. - parameter note: The notification object
  47. */
  48. @objc private func receivedRileyLinkPacketNotification(_ note: Notification) {
  49. guard let device = note.object as? RileyLinkDevice,
  50. let packet = note.userInfo?[RileyLinkBluetoothDevice.notificationPacketKey] as? RFPacket
  51. else {
  52. return
  53. }
  54. device.assertOnSessionQueue()
  55. self.device(device, didReceivePacket: packet)
  56. }
  57. @objc private func receivedRileyLinkTimerTickNotification(_ note: Notification) {
  58. guard let device = note.object as? RileyLinkDevice else {
  59. return
  60. }
  61. self.lastTimerTick.value = Date()
  62. self.deviceTimerDidTick(device)
  63. }
  64. @objc private func receivedRileyLinkBatteryUpdate(_ note: Notification) {
  65. guard let device = note.object as? RileyLinkDevice,
  66. let batteryLevel = note.userInfo?[RileyLinkBluetoothDevice.batteryLevelKey] as? Int
  67. else {
  68. return
  69. }
  70. device.assertOnSessionQueue()
  71. self.device(device, didUpdateBattery: batteryLevel)
  72. }
  73. public func connectToRileyLink(_ device: RileyLinkDevice) {
  74. rileyLinkDeviceProvider.connect(device)
  75. }
  76. public func disconnectFromRileyLink(_ device: RileyLinkDevice) {
  77. rileyLinkDeviceProvider.disconnect(device)
  78. }
  79. }
  80. extension RileyLinkPumpManager: RileyLinkDeviceProviderDelegate {
  81. public func rileylinkDeviceProvider(_ rileylinkDeviceProvider: RileyLinkBLEKit.RileyLinkDeviceProvider, didChange state: RileyLinkBLEKit.RileyLinkConnectionState) {
  82. self.rileyLinkConnectionManagerState = state
  83. }
  84. }