Treatments.swift 5.9 KB

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