Treatments.swift 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. // LoopFollow
  2. // Treatments.swift
  3. import Foundation
  4. extension MainViewController {
  5. // NS Treatments Web Call
  6. // Downloads Basal, Bolus, Carbs, BG Check, Notes, Overrides
  7. func WebLoadNSTreatments() {
  8. if !Storage.shared.downloadTreatments.value { return }
  9. let startTimeString = dateTimeUtils.getDateTimeString(addingDays: -1 * Storage.shared.downloadDays.value)
  10. let endTimeString = dateTimeUtils.getDateTimeString(addingHours: 6)
  11. let estimatedCount = max(Storage.shared.downloadDays.value * 100, 5000)
  12. let parameters: [String: String] = [
  13. "find[created_at][$gte]": startTimeString,
  14. "find[created_at][$lte]": endTimeString,
  15. "count": "\(estimatedCount)",
  16. ]
  17. NightscoutUtils.executeDynamicRequest(eventType: .treatments, parameters: parameters) { (result: Result<Any, Error>) in
  18. switch result {
  19. case let .success(data):
  20. if let entries = data as? [[String: AnyObject]] {
  21. DispatchQueue.main.async {
  22. self.updateTreatments(entries: entries)
  23. }
  24. } else {
  25. LogManager.shared.log(category: .nightscout, message: "WebLoadNSTreatments, Unexpected data structure")
  26. }
  27. case let .failure(error):
  28. LogManager.shared.log(category: .nightscout, message: "WebLoadNSTreatments, error \(error.localizedDescription)")
  29. }
  30. }
  31. }
  32. // Process and split out treatments to individual tasks
  33. func updateTreatments(entries: [[String: AnyObject]]) {
  34. var tempBasal: [[String: AnyObject]] = []
  35. var bolus: [[String: AnyObject]] = []
  36. var smb: [[String: AnyObject]] = []
  37. var carbs: [[String: AnyObject]] = []
  38. var temporaryOverride: [[String: AnyObject]] = []
  39. var temporaryTarget: [[String: AnyObject]] = []
  40. var note: [[String: AnyObject]] = []
  41. var bgCheck: [[String: AnyObject]] = []
  42. var suspendPump: [[String: AnyObject]] = []
  43. var resumePump: [[String: AnyObject]] = []
  44. var pumpSiteChange: [cageData] = []
  45. var cgmSensorStart: [sageData] = []
  46. var insulinCartridge: [iageData] = []
  47. for entry in entries {
  48. guard let eventType = entry["eventType"] as? String else {
  49. continue
  50. }
  51. switch eventType {
  52. case "Temp Basal":
  53. tempBasal.append(entry)
  54. case "Correction Bolus", "Bolus", "External Insulin":
  55. if let automatic = entry["automatic"] as? Bool, automatic {
  56. smb.append(entry)
  57. } else {
  58. bolus.append(entry)
  59. }
  60. case "SMB":
  61. smb.append(entry)
  62. case "Meal Bolus":
  63. carbs.append(entry)
  64. bolus.append(entry)
  65. case "Carb Correction":
  66. carbs.append(entry)
  67. case "Temporary Override", "Exercise":
  68. temporaryOverride.append(entry)
  69. case "Temporary Target":
  70. temporaryTarget.append(entry)
  71. case "Note":
  72. note.append(entry)
  73. case "BG Check":
  74. bgCheck.append(entry)
  75. case "Suspend Pump":
  76. suspendPump.append(entry)
  77. case "Resume Pump":
  78. resumePump.append(entry)
  79. case "Pump Site Change", "Site Change":
  80. if let createdAt = entry["created_at"] as? String {
  81. let newEntry = cageData(created_at: createdAt)
  82. pumpSiteChange.append(newEntry)
  83. }
  84. case "Sensor Start":
  85. if let createdAt = entry["created_at"] as? String {
  86. let newEntry = sageData(created_at: createdAt)
  87. cgmSensorStart.append(newEntry)
  88. }
  89. case "Insulin Change":
  90. if let createdAt = entry["created_at"] as? String {
  91. let newEntry = iageData(created_at: createdAt)
  92. insulinCartridge.append(newEntry)
  93. }
  94. default:
  95. print("No Match: \(String(describing: entry))")
  96. }
  97. }
  98. if tempBasal.count > 0 {
  99. processNSBasals(entries: tempBasal)
  100. } else {
  101. if basalData.count > 0 {
  102. clearOldTempBasal()
  103. }
  104. }
  105. if bolus.count > 0 {
  106. processNSBolus(entries: bolus)
  107. } else {
  108. if bolusData.count > 0 {
  109. clearOldBolus()
  110. }
  111. }
  112. if smb.count > 0 {
  113. processNSSmb(entries: smb)
  114. } else {
  115. if smbData.count > 0 {
  116. clearOldSmb()
  117. }
  118. }
  119. updateTodaysCarbsFromEntries(entries: carbs)
  120. if carbs.count > 0 {
  121. processNSCarbs(entries: carbs)
  122. } else {
  123. if carbData.count > 0 {
  124. clearOldCarb()
  125. }
  126. }
  127. if bgCheck.count > 0 {
  128. processNSBGCheck(entries: bgCheck)
  129. } else {
  130. if bgCheckData.count > 0 {
  131. clearOldBGCheck()
  132. }
  133. }
  134. if temporaryOverride.count == 0, overrideGraphData.count > 0 {
  135. clearOldOverride()
  136. }
  137. if temporaryOverride.count > 0 {
  138. processNSOverrides(entries: temporaryOverride)
  139. }
  140. if temporaryTarget.count == 0, tempTargetGraphData.count > 0 {
  141. clearOldTempTarget()
  142. }
  143. if temporaryTarget.count > 0 {
  144. processNSTemporaryTarget(entries: temporaryTarget)
  145. }
  146. if suspendPump.count > 0 {
  147. processSuspendPump(entries: suspendPump)
  148. } else {
  149. if suspendGraphData.count > 0 {
  150. clearOldSuspend()
  151. }
  152. }
  153. if resumePump.count > 0 {
  154. processResumePump(entries: resumePump)
  155. } else {
  156. if resumeGraphData.count > 0 {
  157. clearOldResume()
  158. }
  159. }
  160. processSage(entries: cgmSensorStart)
  161. if cgmSensorStart.count > 0 {
  162. processSensorStart(entries: cgmSensorStart)
  163. } else {
  164. if sensorStartGraphData.count > 0 {
  165. clearOldSensor()
  166. }
  167. }
  168. processIage(entries: insulinCartridge)
  169. if note.count > 0 {
  170. processNotes(entries: note)
  171. } else {
  172. if noteGraphData.count > 0 {
  173. clearOldNotes()
  174. }
  175. }
  176. processCage(entries: pumpSiteChange)
  177. }
  178. }