RileyLinkListDataSource.swift 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. //
  2. // RileyLinkListDataSource.swift
  3. // OmniKitUI
  4. //
  5. // Created by Pete Schwamb on 6/7/22.
  6. // Copyright © 2022 Pete Schwamb. All rights reserved.
  7. //
  8. import Foundation
  9. import RileyLinkKit
  10. import RileyLinkBLEKit
  11. import SwiftUI
  12. class RileyLinkListDataSource: ObservableObject {
  13. public let rileyLinkPumpManager: RileyLinkPumpManager
  14. @Published private(set) public var devices: [RileyLinkDevice] = []
  15. init(rileyLinkPumpManager: RileyLinkPumpManager) {
  16. self.rileyLinkPumpManager = rileyLinkPumpManager
  17. // Register for manager notifications
  18. NotificationCenter.default.addObserver(self, selector: #selector(reloadDevices), name: .ManagerDevicesDidChange, object: rileyLinkPumpManager.rileyLinkDeviceProvider)
  19. // Register for device notifications
  20. for name in [.DeviceConnectionStateDidChange, .DeviceRSSIDidChange, .DeviceNameDidChange] as [Notification.Name] {
  21. NotificationCenter.default.addObserver(self, selector: #selector(reloadDevices), name: name, object: nil)
  22. }
  23. reloadDevices()
  24. }
  25. func autoconnectBinding(for device: RileyLinkDevice) -> Binding<Bool> {
  26. return Binding(
  27. get: { [weak self] in
  28. if let connectionManager = self?.rileyLinkPumpManager.rileyLinkDeviceProvider {
  29. return connectionManager.shouldConnect(to: device.peripheralIdentifier.uuidString)
  30. } else {
  31. return false
  32. }
  33. },
  34. set: { [weak self] in
  35. if $0 {
  36. self?.rileyLinkPumpManager.connectToRileyLink(device)
  37. } else {
  38. self?.rileyLinkPumpManager.disconnectFromRileyLink(device)
  39. }
  40. })
  41. }
  42. @objc private func reloadDevices() {
  43. rileyLinkPumpManager.rileyLinkDeviceProvider.getDevices { (devices) in
  44. DispatchQueue.main.async { [weak self] in
  45. self?.devices = devices
  46. }
  47. }
  48. }
  49. public var isScanningEnabled: Bool = false {
  50. didSet {
  51. rileyLinkPumpManager.rileyLinkDeviceProvider.setScanningEnabled(isScanningEnabled)
  52. if isScanningEnabled {
  53. rssiFetchTimer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(updateRSSI), userInfo: nil, repeats: true)
  54. updateRSSI()
  55. } else {
  56. rssiFetchTimer = nil
  57. }
  58. }
  59. }
  60. var connecting: Bool {
  61. #if targetEnvironment(simulator)
  62. return true
  63. #else
  64. return rileyLinkPumpManager.rileyLinkDeviceProvider.connectingCount > 0
  65. #endif
  66. }
  67. private var rssiFetchTimer: Timer? {
  68. willSet {
  69. rssiFetchTimer?.invalidate()
  70. }
  71. }
  72. @objc public func updateRSSI() {
  73. for device in devices {
  74. device.readRSSI()
  75. }
  76. }
  77. }