PumpHistoryStorage.swift 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import Foundation
  2. import LoopKit
  3. import SwiftDate
  4. import Swinject
  5. protocol PumpHistoryStorage {
  6. func storePumpEvents(_ events: [NewPumpEvent])
  7. }
  8. final class BasePumpHistoryStorage: PumpHistoryStorage, Injectable {
  9. private let processQueue = DispatchQueue(label: "BasePumpHistoryStorage.processQueue")
  10. @Injected() private var storage: FileStorage!
  11. init(resolver: Resolver) {
  12. injectServices(resolver)
  13. }
  14. func storePumpEvents(_ events: [NewPumpEvent]) {
  15. processQueue.async {
  16. let eventsToStore = events.flatMap { event -> [PumpHistoryEvent] in
  17. let id = event.raw.md5String
  18. switch event.type {
  19. case .bolus:
  20. print("[PUMP EVENT] Bolus event:\n\(event.title))")
  21. guard let dose = event.dose else { return [] }
  22. let amount = Decimal(string: dose.unitsInDeliverableIncrements.description)
  23. let minutes = Int((dose.endDate - dose.startDate).timeInterval / 60)
  24. return [PumpHistoryEvent(
  25. id: id,
  26. type: .bolus,
  27. timestamp: event.date,
  28. amount: amount,
  29. duration: minutes,
  30. durationMin: nil,
  31. rate: nil,
  32. temp: nil
  33. )]
  34. case .tempBasal:
  35. print("[PUMP EVENT] Temp basal event:\n\(event.title))")
  36. guard let dose = event.dose else { return [] }
  37. let rate = Decimal(string: dose.unitsPerHour.description)
  38. let minutes = Int((dose.endDate - dose.startDate).timeInterval / 60)
  39. return [
  40. PumpHistoryEvent(
  41. id: id,
  42. type: .tempBasalDuration,
  43. timestamp: event.date,
  44. amount: nil,
  45. duration: nil,
  46. durationMin: minutes,
  47. rate: rate,
  48. temp: nil
  49. ),
  50. PumpHistoryEvent(
  51. id: "_" + id,
  52. type: .tempBasal,
  53. timestamp: event.date,
  54. amount: nil,
  55. duration: nil,
  56. durationMin: nil,
  57. rate: rate,
  58. temp: .absolute
  59. )
  60. ]
  61. case .suspend:
  62. print("[PUMP EVENT] Suspend event:\n\(event.title))")
  63. return [
  64. PumpHistoryEvent(
  65. id: id,
  66. type: .pumpSuspend,
  67. timestamp: event.date,
  68. amount: nil,
  69. duration: nil,
  70. durationMin: nil,
  71. rate: nil,
  72. temp: nil
  73. )
  74. ]
  75. case .resume:
  76. print("[PUMP EVENT] Resume event:\n\(event.title))")
  77. return [
  78. PumpHistoryEvent(
  79. id: id,
  80. type: .pumpResume,
  81. timestamp: event.date,
  82. amount: nil,
  83. duration: nil,
  84. durationMin: nil,
  85. rate: nil,
  86. temp: nil
  87. )
  88. ]
  89. case .rewind:
  90. print("[PUMP EVENT] Rewind event:\n\(event.title))")
  91. return [
  92. PumpHistoryEvent(
  93. id: id,
  94. type: .rewind,
  95. timestamp: event.date,
  96. amount: nil,
  97. duration: nil,
  98. durationMin: nil,
  99. rate: nil,
  100. temp: nil
  101. )
  102. ]
  103. case .prime:
  104. print("[PUMP EVENT] Prime event:\n\(event.title))")
  105. return [
  106. PumpHistoryEvent(
  107. id: id,
  108. type: .prime,
  109. timestamp: event.date,
  110. amount: nil,
  111. duration: nil,
  112. durationMin: nil,
  113. rate: nil,
  114. temp: nil
  115. )
  116. ]
  117. default:
  118. return []
  119. }
  120. }
  121. self.processNewEvents(eventsToStore)
  122. }
  123. }
  124. private func processNewEvents(_ events: [PumpHistoryEvent]) {
  125. dispatchPrecondition(condition: .onQueue(processQueue))
  126. try? storage.transaction { storage in
  127. try storage.append(events, to: OpenAPS.Monitor.pumpHistory, uniqBy: \.id)
  128. let uniqEvents = try storage.retrieve(OpenAPS.Monitor.pumpHistory, as: [PumpHistoryEvent].self)
  129. .filter { $0.timestamp.addingTimeInterval(1.days.timeInterval) > Date() }
  130. .sorted { $0.timestamp > $1.timestamp }
  131. print("[HISTORY] New Events\n\(uniqEvents)")
  132. try storage.save(Array(uniqEvents), as: OpenAPS.Monitor.pumpHistory)
  133. }
  134. }
  135. }