Preferences.swift 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. import Foundation
  2. struct Preferences: JSON, Equatable {
  3. var maxIOB: Decimal = 0
  4. var maxDailySafetyMultiplier: Decimal = 3
  5. var currentBasalSafetyMultiplier: Decimal = 4
  6. var autosensMax: Decimal = 1.2
  7. var autosensMin: Decimal = 0.7
  8. var smbDeliveryRatio: Decimal = 0.5
  9. var rewindResetsAutosens: Bool = true
  10. var highTemptargetRaisesSensitivity: Bool = false
  11. var lowTemptargetLowersSensitivity: Bool = false
  12. var sensitivityRaisesTarget: Bool = false
  13. var resistanceLowersTarget: Bool = false
  14. var advTargetAdjustments: Bool = false
  15. var exerciseMode: Bool = false
  16. var halfBasalExerciseTarget: Decimal = 160
  17. var maxCOB: Decimal = 120
  18. var wideBGTargetRange: Bool = false
  19. var skipNeutralTemps: Bool = false
  20. var unsuspendIfNoTemp: Bool = false
  21. var min5mCarbimpact: Decimal = 8
  22. var remainingCarbsFraction: Decimal = 1.0
  23. var remainingCarbsCap: Decimal = 90
  24. var enableUAM: Bool = false
  25. var a52RiskEnable: Bool = false
  26. var enableSMBWithCOB: Bool = false
  27. var enableSMBWithTemptarget: Bool = false
  28. var enableSMBAlways: Bool = false
  29. var enableSMBAfterCarbs: Bool = false
  30. var allowSMBWithHighTemptarget: Bool = false
  31. var maxSMBBasalMinutes: Decimal = 30
  32. var maxUAMSMBBasalMinutes: Decimal = 30
  33. var smbInterval: Decimal = 3
  34. var bolusIncrement: Decimal = 0.1
  35. var curve: InsulinCurve = .rapidActing
  36. var useCustomPeakTime: Bool = false
  37. var insulinPeakTime: Decimal = 75
  38. var carbsReqThreshold: Decimal = 1.0
  39. var noisyCGMTargetMultiplier: Decimal = 1.3
  40. var suspendZerosIOB: Bool = false
  41. var timestamp: Date?
  42. var maxDeltaBGthreshold: Decimal = 0.2
  43. var adjustmentFactor: Decimal = 0.8
  44. var adjustmentFactorSigmoid: Decimal = 0.5
  45. var sigmoid: Bool = false
  46. var enableDynamicCR: Bool = false
  47. var useNewFormula: Bool = false
  48. var useWeightedAverage: Bool = false
  49. var weightPercentage: Decimal = 0.35
  50. var tddAdjBasal: Bool = false
  51. var enableSMB_high_bg: Bool = false
  52. var enableSMB_high_bg_target: Decimal = 110
  53. var threshold_setting: Decimal = 60
  54. var updateInterval: Decimal = 20
  55. }
  56. extension Preferences {
  57. private enum CodingKeys: String, CodingKey {
  58. case maxIOB = "max_iob"
  59. case maxDailySafetyMultiplier = "max_daily_safety_multiplier"
  60. case currentBasalSafetyMultiplier = "current_basal_safety_multiplier"
  61. case autosensMax = "autosens_max"
  62. case autosensMin = "autosens_min"
  63. case smbDeliveryRatio = "smb_delivery_ratio"
  64. case rewindResetsAutosens = "rewind_resets_autosens"
  65. case highTemptargetRaisesSensitivity = "high_temptarget_raises_sensitivity"
  66. case lowTemptargetLowersSensitivity = "low_temptarget_lowers_sensitivity"
  67. case sensitivityRaisesTarget = "sensitivity_raises_target"
  68. case resistanceLowersTarget = "resistance_lowers_target"
  69. case advTargetAdjustments = "adv_target_adjustments"
  70. case exerciseMode = "exercise_mode"
  71. case halfBasalExerciseTarget = "half_basal_exercise_target"
  72. case maxCOB
  73. case wideBGTargetRange = "wide_bg_target_range"
  74. case skipNeutralTemps = "skip_neutral_temps"
  75. case unsuspendIfNoTemp = "unsuspend_if_no_temp"
  76. case min5mCarbimpact = "min_5m_carbimpact"
  77. case remainingCarbsFraction
  78. case remainingCarbsCap
  79. case enableUAM
  80. case a52RiskEnable = "A52_risk_enable"
  81. case enableSMBWithCOB = "enableSMB_with_COB"
  82. case enableSMBWithTemptarget = "enableSMB_with_temptarget"
  83. case enableSMBAlways = "enableSMB_always"
  84. case enableSMBAfterCarbs = "enableSMB_after_carbs"
  85. case allowSMBWithHighTemptarget = "allowSMB_with_high_temptarget"
  86. case maxSMBBasalMinutes
  87. case maxUAMSMBBasalMinutes
  88. case smbInterval = "SMBInterval"
  89. case bolusIncrement = "bolus_increment"
  90. case curve
  91. case useCustomPeakTime
  92. case insulinPeakTime
  93. case carbsReqThreshold
  94. case noisyCGMTargetMultiplier
  95. case suspendZerosIOB = "suspend_zeros_iob"
  96. case maxDeltaBGthreshold = "maxDelta_bg_threshold"
  97. case adjustmentFactor
  98. case adjustmentFactorSigmoid
  99. case sigmoid
  100. case enableDynamicCR
  101. case useNewFormula
  102. case useWeightedAverage
  103. case weightPercentage
  104. case tddAdjBasal
  105. case enableSMB_high_bg
  106. case enableSMB_high_bg_target
  107. case threshold_setting
  108. case updateInterval
  109. }
  110. }
  111. enum InsulinCurve: String, JSON, Identifiable, CaseIterable {
  112. case rapidActing = "rapid-acting"
  113. case ultraRapid = "ultra-rapid"
  114. case bilinear
  115. var id: InsulinCurve { self }
  116. }
  117. extension Preferences: Decodable {
  118. init(from decoder: Decoder) throws {
  119. let container = try decoder.container(keyedBy: CodingKeys.self)
  120. var preferences = Preferences()
  121. if let maxIOB = try? container.decode(Decimal.self, forKey: .maxIOB) {
  122. preferences.maxIOB = maxIOB
  123. }
  124. if let maxDailySafetyMultiplier = try? container.decode(Decimal.self, forKey: .maxDailySafetyMultiplier) {
  125. preferences.maxDailySafetyMultiplier = maxDailySafetyMultiplier
  126. }
  127. if let currentBasalSafetyMultiplier = try? container.decode(Decimal.self, forKey: .currentBasalSafetyMultiplier) {
  128. preferences.currentBasalSafetyMultiplier = currentBasalSafetyMultiplier
  129. }
  130. if let autosensMax = try? container.decode(Decimal.self, forKey: .autosensMax) {
  131. preferences.autosensMax = autosensMax
  132. }
  133. if let autosensMin = try? container.decode(Decimal.self, forKey: .autosensMin) {
  134. preferences.autosensMin = autosensMin
  135. }
  136. if let smbDeliveryRatio = try? container.decode(Decimal.self, forKey: .smbDeliveryRatio) {
  137. preferences.smbDeliveryRatio = smbDeliveryRatio
  138. }
  139. if let rewindResetsAutosens = try? container.decode(Bool.self, forKey: .rewindResetsAutosens) {
  140. preferences.rewindResetsAutosens = rewindResetsAutosens
  141. }
  142. if let highTemptargetRaisesSensitivity = try? container.decode(Bool.self, forKey: .highTemptargetRaisesSensitivity) {
  143. preferences.highTemptargetRaisesSensitivity = highTemptargetRaisesSensitivity
  144. }
  145. if let lowTemptargetLowersSensitivity = try? container.decode(Bool.self, forKey: .lowTemptargetLowersSensitivity) {
  146. preferences.lowTemptargetLowersSensitivity = lowTemptargetLowersSensitivity
  147. }
  148. if let sensitivityRaisesTarget = try? container.decode(Bool.self, forKey: .sensitivityRaisesTarget) {
  149. preferences.sensitivityRaisesTarget = sensitivityRaisesTarget
  150. }
  151. if let resistanceLowersTarget = try? container.decode(Bool.self, forKey: .resistanceLowersTarget) {
  152. preferences.resistanceLowersTarget = resistanceLowersTarget
  153. }
  154. if let advTargetAdjustments = try? container.decode(Bool.self, forKey: .advTargetAdjustments) {
  155. preferences.advTargetAdjustments = advTargetAdjustments
  156. }
  157. if let exerciseMode = try? container.decode(Bool.self, forKey: .exerciseMode) {
  158. preferences.exerciseMode = exerciseMode
  159. }
  160. if let halfBasalExerciseTarget = try? container.decode(Decimal.self, forKey: .halfBasalExerciseTarget) {
  161. preferences.halfBasalExerciseTarget = halfBasalExerciseTarget
  162. }
  163. if let maxCOB = try? container.decode(Decimal.self, forKey: .maxCOB) {
  164. preferences.maxCOB = maxCOB
  165. }
  166. if let wideBGTargetRange = try? container.decode(Bool.self, forKey: .wideBGTargetRange) {
  167. preferences.wideBGTargetRange = wideBGTargetRange
  168. }
  169. if let skipNeutralTemps = try? container.decode(Bool.self, forKey: .skipNeutralTemps) {
  170. preferences.skipNeutralTemps = skipNeutralTemps
  171. }
  172. if let unsuspendIfNoTemp = try? container.decode(Bool.self, forKey: .unsuspendIfNoTemp) {
  173. preferences.unsuspendIfNoTemp = unsuspendIfNoTemp
  174. }
  175. if let min5mCarbimpact = try? container.decode(Decimal.self, forKey: .min5mCarbimpact) {
  176. preferences.min5mCarbimpact = min5mCarbimpact
  177. }
  178. if let remainingCarbsFraction = try? container.decode(Decimal.self, forKey: .remainingCarbsFraction) {
  179. preferences.remainingCarbsFraction = remainingCarbsFraction
  180. }
  181. if let remainingCarbsCap = try? container.decode(Decimal.self, forKey: .remainingCarbsCap) {
  182. preferences.remainingCarbsCap = remainingCarbsCap
  183. }
  184. if let enableUAM = try? container.decode(Bool.self, forKey: .enableUAM) {
  185. preferences.enableUAM = enableUAM
  186. }
  187. if let a52RiskEnable = try? container.decode(Bool.self, forKey: .a52RiskEnable) {
  188. preferences.a52RiskEnable = a52RiskEnable
  189. }
  190. if let enableSMBWithCOB = try? container.decode(Bool.self, forKey: .enableSMBWithCOB) {
  191. preferences.enableSMBWithCOB = enableSMBWithCOB
  192. }
  193. if let enableSMBWithTemptarget = try? container.decode(Bool.self, forKey: .enableSMBWithTemptarget) {
  194. preferences.enableSMBWithTemptarget = enableSMBWithTemptarget
  195. }
  196. if let enableSMBAlways = try? container.decode(Bool.self, forKey: .enableSMBAlways) {
  197. preferences.enableSMBAlways = enableSMBAlways
  198. }
  199. if let enableSMBAfterCarbs = try? container.decode(Bool.self, forKey: .enableSMBAfterCarbs) {
  200. preferences.enableSMBAfterCarbs = enableSMBAfterCarbs
  201. }
  202. if let allowSMBWithHighTemptarget = try? container.decode(Bool.self, forKey: .allowSMBWithHighTemptarget) {
  203. preferences.allowSMBWithHighTemptarget = allowSMBWithHighTemptarget
  204. }
  205. if let maxSMBBasalMinutes = try? container.decode(Decimal.self, forKey: .maxSMBBasalMinutes) {
  206. preferences.maxSMBBasalMinutes = maxSMBBasalMinutes
  207. }
  208. if let maxUAMSMBBasalMinutes = try? container.decode(Decimal.self, forKey: .maxUAMSMBBasalMinutes) {
  209. preferences.maxUAMSMBBasalMinutes = maxUAMSMBBasalMinutes
  210. }
  211. if let smbInterval = try? container.decode(Decimal.self, forKey: .smbInterval) {
  212. preferences.smbInterval = smbInterval
  213. }
  214. if let bolusIncrement = try? container.decode(Decimal.self, forKey: .bolusIncrement) {
  215. preferences.bolusIncrement = bolusIncrement
  216. }
  217. if let curve = try? container.decode(InsulinCurve.self, forKey: .curve) {
  218. preferences.curve = curve
  219. }
  220. if let useCustomPeakTime = try? container.decode(Bool.self, forKey: .useCustomPeakTime) {
  221. preferences.useCustomPeakTime = useCustomPeakTime
  222. }
  223. if let insulinPeakTime = try? container.decode(Decimal.self, forKey: .insulinPeakTime) {
  224. preferences.insulinPeakTime = insulinPeakTime
  225. }
  226. if let carbsReqThreshold = try? container.decode(Decimal.self, forKey: .carbsReqThreshold) {
  227. preferences.carbsReqThreshold = carbsReqThreshold
  228. }
  229. if let noisyCGMTargetMultiplier = try? container.decode(Decimal.self, forKey: .noisyCGMTargetMultiplier) {
  230. preferences.noisyCGMTargetMultiplier = noisyCGMTargetMultiplier
  231. }
  232. if let suspendZerosIOB = try? container.decode(Bool.self, forKey: .suspendZerosIOB) {
  233. preferences.suspendZerosIOB = suspendZerosIOB
  234. }
  235. if let maxDeltaBGthreshold = try? container.decode(Decimal.self, forKey: .maxDeltaBGthreshold) {
  236. preferences.maxDeltaBGthreshold = maxDeltaBGthreshold
  237. }
  238. if let adjustmentFactor = try? container.decode(Decimal.self, forKey: .adjustmentFactor) {
  239. preferences.adjustmentFactor = adjustmentFactor
  240. }
  241. if let adjustmentFactorSigmoid = try? container.decode(Decimal.self, forKey: .adjustmentFactorSigmoid) {
  242. preferences.adjustmentFactorSigmoid = adjustmentFactorSigmoid
  243. }
  244. if let sigmoid = try? container.decode(Bool.self, forKey: .sigmoid) {
  245. preferences.sigmoid = sigmoid
  246. }
  247. if let enableDynamicCR = try? container.decode(Bool.self, forKey: .enableDynamicCR) {
  248. preferences.enableDynamicCR = enableDynamicCR
  249. }
  250. if let useNewFormula = try? container.decode(Bool.self, forKey: .useNewFormula) {
  251. preferences.useNewFormula = useNewFormula
  252. }
  253. if let useWeightedAverage = try? container.decode(Bool.self, forKey: .useWeightedAverage) {
  254. preferences.useWeightedAverage = useWeightedAverage
  255. }
  256. if let weightPercentage = try? container.decode(Decimal.self, forKey: .weightPercentage) {
  257. preferences.weightPercentage = weightPercentage
  258. }
  259. if let tddAdjBasal = try? container.decode(Bool.self, forKey: .tddAdjBasal) {
  260. preferences.tddAdjBasal = tddAdjBasal
  261. }
  262. if let enableSMB_high_bg = try? container.decode(Bool.self, forKey: .enableSMB_high_bg) {
  263. preferences.enableSMB_high_bg = enableSMB_high_bg
  264. }
  265. if let enableSMB_high_bg_target = try? container.decode(Decimal.self, forKey: .enableSMB_high_bg_target) {
  266. preferences.enableSMB_high_bg_target = enableSMB_high_bg_target
  267. }
  268. if let threshold_setting = try? container.decode(Decimal.self, forKey: .threshold_setting) {
  269. preferences.threshold_setting = threshold_setting
  270. }
  271. if let updateInterval = try? container.decode(Decimal.self, forKey: .updateInterval) {
  272. preferences.updateInterval = updateInterval
  273. }
  274. self = preferences
  275. }
  276. }