Treatments.swift 6.6 KB

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