LibreTransmitterSource.swift 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import Combine
  2. import Foundation
  3. import LibreTransmitter
  4. import Swinject
  5. protocol LibreTransmitterSource: GlucoseSource {
  6. var manager: LibreTransmitterManager? { get set }
  7. }
  8. final class BaseLibreTransmitterSource: LibreTransmitterSource, Injectable {
  9. private let processQueue = DispatchQueue(label: "BaseLibreTransmitterSource.processQueue")
  10. @Injected() var glucoseStorage: GlucoseStorage!
  11. @Injected() var calibrationService: CalibrationService!
  12. private var promise: Future<[BloodGlucose], Error>.Promise?
  13. var glucoseManager: FetchGlucoseManager?
  14. var manager: LibreTransmitterManager? {
  15. didSet {
  16. configured = manager != nil
  17. manager?.cgmManagerDelegate = self
  18. }
  19. }
  20. @Persisted(key: "LibreTransmitterManager.configured") private(set) var configured = false
  21. init(resolver: Resolver) {
  22. if configured {
  23. manager = LibreTransmitterManager()
  24. manager?.cgmManagerDelegate = self
  25. }
  26. injectServices(resolver)
  27. }
  28. func fetch(_: DispatchTimer?) -> AnyPublisher<[BloodGlucose], Never> {
  29. Just([]).eraseToAnyPublisher()
  30. // Future<[BloodGlucose], Error> { [weak self] promise in
  31. // self?.promise = promise
  32. // }
  33. // .timeout(60, scheduler: processQueue, options: nil, customError: nil)
  34. // .replaceError(with: [])
  35. // .replaceEmpty(with: [])
  36. // .eraseToAnyPublisher()
  37. }
  38. func fetchIfNeeded() -> AnyPublisher<[BloodGlucose], Never> {
  39. fetch(nil)
  40. }
  41. func sourceInfo() -> [String: Any]? {
  42. if let battery = manager?.battery {
  43. return ["transmitterBattery": battery]
  44. }
  45. return nil
  46. }
  47. }
  48. extension BaseLibreTransmitterSource: LibreTransmitterManagerDelegate {
  49. var queue: DispatchQueue { processQueue }
  50. func startDateToFilterNewData(for _: LibreTransmitterManager) -> Date? {
  51. glucoseStorage.syncDate()
  52. }
  53. func cgmManager(_ manager: LibreTransmitterManager, hasNew result: Result<[LibreGlucose], Error>) {
  54. switch result {
  55. case let .success(newGlucose):
  56. let glucose = newGlucose.map { value -> BloodGlucose in
  57. BloodGlucose(
  58. _id: value.syncId,
  59. sgv: Int(value.glucose),
  60. direction: manager.glucoseDisplay?.trendType
  61. .map { .init(trendType: $0) },
  62. date: Decimal(Int(value.startDate.timeIntervalSince1970 * 1000)),
  63. dateString: value.startDate,
  64. unfiltered: Decimal(value.unsmoothedGlucose),
  65. filtered: nil,
  66. noise: nil,
  67. glucose: Int(value.glucose),
  68. type: "sgv",
  69. activationDate: value.sensorStartDate ?? manager.sensorStartDate,
  70. sessionStartDate: value.sensorStartDate ?? manager.sensorStartDate,
  71. transmitterID: manager.sensorSerialNumber
  72. )
  73. }
  74. NSLog("Debug Libre \(glucose)")
  75. glucoseManager?.updateGlucoseStore(newBloodGlucose: glucose)
  76. promise?(.success(glucose))
  77. case let .failure(error):
  78. warning(.service, "LibreTransmitter error:", error: error)
  79. promise?(.failure(error))
  80. }
  81. }
  82. func overcalibration(for _: LibreTransmitterManager) -> ((Double) -> (Double))? {
  83. calibrationService.calibrate
  84. }
  85. }