| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- import Combine
- import LoopKit
- import MinimedKit
- import RileyLinkBLEKit
- import RileyLinkKit
- import Swinject
- final class BaseAPSManager: APSManager, Injectable {
- private var openAPS: OpenAPS!
- @Injected() var deviceDataManager: DeviceDataManager!
- let rileyDisplayStates = CurrentValueSubject<[RileyDisplayState], Never>([])
- private(set) var devices: [RileyLinkDevice] = [] {
- didSet {
- print("Devices: \(devices)")
- updateDisplayStates()
- }
- }
- private var deviceRSSI: [UUID: Int] = [:] {
- didSet {
- print("RSSI: \(deviceRSSI)")
- updateDisplayStates()
- }
- }
- private(set) var rileyLinkPumpManager: RileyLinkPumpManager!
- private var rssiFetchTimer: Timer? {
- willSet {
- rssiFetchTimer?.invalidate()
- }
- }
- init(resolver: Resolver) {
- injectServices(resolver)
- openAPS = OpenAPS(storage: resolver.resolve(FileStorage.self)!)
- rileyLinkPumpManager = RileyLinkPumpManager(
- rileyLinkDeviceProvider: deviceDataManager.rileyLinkConnectionManager.deviceProvider,
- rileyLinkConnectionManager: deviceDataManager.rileyLinkConnectionManager
- )
- registerNotifications()
- reloadDevices()
- rssiFetchTimer = Timer.scheduledTimer(
- timeInterval: 3,
- target: self,
- selector: #selector(updateRSSI),
- userInfo: nil,
- repeats: true
- )
- updateRSSI()
- }
- private func updateDisplayStates() {
- rileyDisplayStates.value = devices.map {
- RileyDisplayState(
- id: $0.peripheralIdentifier,
- name: $0.name ?? "unknown",
- rssi: self.deviceRSSI[$0.peripheralIdentifier],
- connected: false
- )
- }
- }
- private func registerNotifications() {
- // Register for manager notifications
- NotificationCenter.default.addObserver(
- self,
- selector: #selector(reloadDevices),
- name: .ManagerDevicesDidChange,
- object: rileyLinkPumpManager.rileyLinkDeviceProvider
- )
- // Register for device notifications
- for name in [.DeviceConnectionStateDidChange, .DeviceRSSIDidChange, .DeviceNameDidChange] as [Notification.Name] {
- NotificationCenter.default.addObserver(self, selector: #selector(deviceDidUpdate(_:)), name: name, object: nil)
- }
- }
- @objc private func reloadDevices() {
- rileyLinkPumpManager.rileyLinkDeviceProvider.getDevices { devices in
- DispatchQueue.main.async { [weak self] in
- self?.devices = devices
- devices.forEach { self?.rileyLinkPumpManager.connectToRileyLink($0) }
- }
- }
- }
- @objc private func deviceDidUpdate(_ note: Notification) {
- DispatchQueue.main.async {
- if let device = note.object as? RileyLinkDevice {
- if let rssi = note.userInfo?[RileyLinkDevice.notificationRSSIKey] as? Int {
- self.deviceRSSI[device.peripheralIdentifier] = rssi
- }
- }
- }
- }
- @objc public func updateRSSI() {
- for device in devices {
- device.readRSSI()
- }
- }
- func runTest() {
- openAPS.test()
- }
- }
|