RileyLinkListDataSource.swift 2.9 KB

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