NightscoutSocketDataHandler.swift 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. // LoopFollow
  2. // NightscoutSocketDataHandler.swift
  3. import Foundation
  4. extension MainViewController {
  5. func setupNightscoutSocket() {
  6. NightscoutSocketManager.shared.onDataUpdate = { [weak self] data in
  7. self?.handleSocketDataUpdate(data)
  8. }
  9. NightscoutSocketManager.shared.connectIfNeeded()
  10. }
  11. func handleSocketDataUpdate(_ data: [String: Any]) {
  12. let isDelta = data["delta"] as? Bool ?? false
  13. if !isDelta {
  14. // Full data on initial connect — trigger all fetches
  15. LogManager.shared.log(category: .websocket, message: "Full data received, triggering all fetches")
  16. TaskScheduler.shared.rescheduleTask(id: .fetchBG, to: Date())
  17. TaskScheduler.shared.rescheduleTask(id: .deviceStatus, to: Date())
  18. TaskScheduler.shared.rescheduleTask(id: .treatments, to: Date())
  19. TaskScheduler.shared.rescheduleTask(id: .profile, to: Date())
  20. return
  21. }
  22. // Selective: only fetch data types present in the delta
  23. var triggered: [String] = []
  24. if data["sgvs"] != nil || data["mbgs"] != nil {
  25. TaskScheduler.shared.rescheduleTask(id: .fetchBG, to: Date())
  26. triggered.append("BG")
  27. }
  28. if data["devicestatus"] != nil {
  29. TaskScheduler.shared.rescheduleTask(id: .deviceStatus, to: Date())
  30. triggered.append("DeviceStatus")
  31. }
  32. if data["treatments"] != nil {
  33. TaskScheduler.shared.rescheduleTask(id: .treatments, to: Date())
  34. triggered.append("Treatments")
  35. }
  36. if data["profiles"] != nil {
  37. TaskScheduler.shared.rescheduleTask(id: .profile, to: Date())
  38. triggered.append("Profile")
  39. }
  40. if !triggered.isEmpty {
  41. LogManager.shared.log(category: .websocket, message: "Delta triggered: \(triggered.joined(separator: ", "))", isDebug: true)
  42. }
  43. }
  44. }