Preferences.swift 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. import Foundation
  2. struct Preferences: JSON {
  3. var maxIOB: Decimal
  4. var maxDailySafetyMultiplier: Decimal
  5. var currentBasalSafetyMultiplier: Decimal
  6. var autosensMax: Decimal
  7. var autosensMin: Decimal
  8. var rewindResetsAutosens: Bool
  9. var highTemptargetRaisesSensitivity: Bool
  10. var lowTemptargetLowersSensitivity: Bool
  11. var sensitivityRaisesTarget: Bool
  12. var resistanceLowersTarget: Bool
  13. var advTargetAdjustments: Bool
  14. var exerciseMode: Bool
  15. var halfBasalExerciseTarget: Decimal
  16. var maxCOB: Decimal
  17. var wideBGTargetRange: Bool
  18. var skipNeutralTemps: Bool
  19. var unsuspendIfNoTemp: Bool
  20. var bolusSnoozeDIADivisor: Decimal
  21. var min5mCarbimpact: Decimal
  22. var autotuneISFAdjustmentFraction: Decimal
  23. var remainingCarbsFraction: Decimal
  24. var remainingCarbsCap: Decimal
  25. var enableUAM: Bool
  26. var a52RiskEnable: Bool
  27. var enableSMBWithCOB: Bool
  28. var enableSMBWithTemptarget: Bool
  29. var enableSMBAlways: Bool
  30. var enableSMBAfterCarbs: Bool
  31. var allowSMBWithHighTemptarget: Bool
  32. var maxSMBBasalMinutes: Decimal
  33. var maxUAMSMBBasalMinutes: Decimal
  34. var smbInterval: Decimal
  35. var bolusIncrement: Decimal
  36. var curve: InsulinCurve
  37. var useCustomPeakTime: Bool
  38. var insulinPeakTime: Decimal
  39. var carbsReqThreshold: Decimal
  40. var offlineHotspot: Bool // unused, for compatibility
  41. var noisyCGMTargetMultiplier: Decimal
  42. var suspendZerosIOB: Bool
  43. var enableEnliteBgproxy: Bool // unused, for compatibility
  44. init(
  45. maxIOB: Decimal = 0,
  46. maxDailySafetyMultiplier: Decimal = 3,
  47. currentBasalSafetyMultiplier: Decimal = 4,
  48. autosensMax: Decimal = 1.2,
  49. autosensMin: Decimal = 0.7,
  50. rewindResetsAutosens: Bool = true,
  51. highTemptargetRaisesSensitivity: Bool = false,
  52. lowTemptargetLowersSensitivity: Bool = false,
  53. sensitivityRaisesTarget: Bool = true,
  54. resistanceLowersTarget: Bool = false,
  55. advTargetAdjustments: Bool = false,
  56. exerciseMode: Bool = false,
  57. halfBasalExerciseTarget: Decimal = 160,
  58. maxCOB: Decimal = 120,
  59. wideBGTargetRange: Bool = false,
  60. skipNeutralTemps: Bool = false,
  61. unsuspendIfNoTemp: Bool = false,
  62. bolusSnoozeDIADivisor: Decimal = 2,
  63. min5mCarbimpact: Decimal = 8,
  64. autotuneISFAdjustmentFraction: Decimal = 1.0,
  65. remainingCarbsFraction: Decimal = 1.0,
  66. remainingCarbsCap: Decimal = 90,
  67. enableUAM: Bool = false,
  68. a52RiskEnable: Bool = false,
  69. enableSMBWithCOB: Bool = false,
  70. enableSMBWithTemptarget: Bool = false,
  71. enableSMBAlways: Bool = false,
  72. enableSMBAfterCarbs: Bool = false,
  73. allowSMBWithHighTemptarget: Bool = false,
  74. maxSMBBasalMinutes: Decimal = 30,
  75. maxUAMSMBBasalMinutes: Decimal = 30,
  76. smbInterval: Decimal = 3,
  77. bolusIncrement: Decimal = 0.1,
  78. curve: InsulinCurve = .rapidActing,
  79. useCustomPeakTime: Bool = false,
  80. insulinPeakTime: Decimal = 75,
  81. carbsReqThreshold: Decimal = 1,
  82. offlineHotspot: Bool = false, // unused, for compatibility
  83. noisyCGMTargetMultiplier: Decimal = 1.3,
  84. suspendZerosIOB: Bool = true,
  85. enableEnliteBgproxy: Bool = false // unused, for compatibility
  86. ) {
  87. self.maxIOB = maxIOB
  88. self.maxDailySafetyMultiplier = maxDailySafetyMultiplier
  89. self.currentBasalSafetyMultiplier = currentBasalSafetyMultiplier
  90. self.autosensMax = autosensMax
  91. self.autosensMin = autosensMin
  92. self.rewindResetsAutosens = rewindResetsAutosens
  93. self.highTemptargetRaisesSensitivity = highTemptargetRaisesSensitivity
  94. self.lowTemptargetLowersSensitivity = lowTemptargetLowersSensitivity
  95. self.sensitivityRaisesTarget = sensitivityRaisesTarget
  96. self.resistanceLowersTarget = resistanceLowersTarget
  97. self.advTargetAdjustments = advTargetAdjustments
  98. self.exerciseMode = exerciseMode
  99. self.halfBasalExerciseTarget = halfBasalExerciseTarget
  100. self.maxCOB = maxCOB
  101. self.wideBGTargetRange = wideBGTargetRange
  102. self.skipNeutralTemps = skipNeutralTemps
  103. self.unsuspendIfNoTemp = unsuspendIfNoTemp
  104. self.bolusSnoozeDIADivisor = bolusSnoozeDIADivisor
  105. self.min5mCarbimpact = min5mCarbimpact
  106. self.autotuneISFAdjustmentFraction = autotuneISFAdjustmentFraction
  107. self.remainingCarbsFraction = remainingCarbsFraction
  108. self.remainingCarbsCap = remainingCarbsCap
  109. self.enableUAM = enableUAM
  110. self.a52RiskEnable = a52RiskEnable
  111. self.enableSMBWithCOB = enableSMBWithCOB
  112. self.enableSMBWithTemptarget = enableSMBWithTemptarget
  113. self.enableSMBAlways = enableSMBAlways
  114. self.enableSMBAfterCarbs = enableSMBAfterCarbs
  115. self.allowSMBWithHighTemptarget = allowSMBWithHighTemptarget
  116. self.maxSMBBasalMinutes = maxSMBBasalMinutes
  117. self.maxUAMSMBBasalMinutes = maxUAMSMBBasalMinutes
  118. self.smbInterval = smbInterval
  119. self.bolusIncrement = bolusIncrement
  120. self.curve = curve
  121. self.useCustomPeakTime = useCustomPeakTime
  122. self.insulinPeakTime = insulinPeakTime
  123. self.carbsReqThreshold = carbsReqThreshold
  124. self.offlineHotspot = offlineHotspot
  125. self.noisyCGMTargetMultiplier = noisyCGMTargetMultiplier
  126. self.suspendZerosIOB = suspendZerosIOB
  127. self.enableEnliteBgproxy = enableEnliteBgproxy
  128. }
  129. }
  130. extension Preferences {
  131. private enum CodingKeys: String, CodingKey {
  132. case maxIOB = "max_iob"
  133. case maxDailySafetyMultiplier = "max_daily_safety_multiplier"
  134. case currentBasalSafetyMultiplier = "current_basal_safety_multiplier"
  135. case autosensMax = "autosens_max"
  136. case autosensMin = "autosens_min"
  137. case rewindResetsAutosens = "rewind_resets_autosens"
  138. case highTemptargetRaisesSensitivity = "high_temptarget_raises_sensitivity"
  139. case lowTemptargetLowersSensitivity = "low_temptarget_lowers_sensitivity"
  140. case sensitivityRaisesTarget = "sensitivity_raises_target"
  141. case resistanceLowersTarget
  142. case advTargetAdjustments = "adv_target_adjustments"
  143. case exerciseMode = "exercise_mode"
  144. case halfBasalExerciseTarget = "half_basal_exercise_target"
  145. case maxCOB
  146. case wideBGTargetRange = "wide_bg_target_range"
  147. case skipNeutralTemps = "skip_neutral_temps"
  148. case unsuspendIfNoTemp = "unsuspend_if_no_temp"
  149. case bolusSnoozeDIADivisor = "bolussnooze_dia_divisor"
  150. case min5mCarbimpact = "min_5m_carbimpact"
  151. case autotuneISFAdjustmentFraction = "autotune_isf_adjustmentFraction"
  152. case remainingCarbsFraction
  153. case remainingCarbsCap
  154. case enableUAM
  155. case a52RiskEnable = "A52_risk_enable"
  156. case enableSMBWithCOB = "enableSMB_with_COB"
  157. case enableSMBWithTemptarget = "enableSMB_with_temptarget"
  158. case enableSMBAlways = "enableSMB_always"
  159. case enableSMBAfterCarbs = "enableSMB_after_carbs"
  160. case allowSMBWithHighTemptarget = "allowSMB_with_high_temptarget"
  161. case maxSMBBasalMinutes
  162. case maxUAMSMBBasalMinutes
  163. case smbInterval = "SMBInterval"
  164. case bolusIncrement = "bolus_increment"
  165. case curve
  166. case useCustomPeakTime
  167. case insulinPeakTime
  168. case carbsReqThreshold
  169. case offlineHotspot = "offline_hotspot"
  170. case noisyCGMTargetMultiplier
  171. case suspendZerosIOB = "suspend_zeros_iob"
  172. case enableEnliteBgproxy
  173. }
  174. }
  175. enum InsulinCurve: String, Codable {
  176. case rapidActing = "rapid-acting"
  177. case ultraRapid = "ultra-rapid"
  178. case bilinear
  179. }
  180. extension Preferences {
  181. var prettyPrinted: String {
  182. let encoder = JSONEncoder()
  183. encoder.outputFormatting = .prettyPrinted
  184. return String(data: try! encoder.encode(self), encoding: .utf8)!
  185. }
  186. }