DecimalPickerSettings.swift 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. import SwiftUI
  2. class PickerSettingsProvider: ObservableObject {
  3. static let shared = PickerSettingsProvider()
  4. var settings = DecimalPickerSettings()
  5. private init() {} // Private init to enforce singleton pattern
  6. // Helper function to generate values for the picker
  7. func generatePickerValues(from setting: PickerSetting, units: GlucoseUnits) -> [Decimal] {
  8. var values: [Decimal] = []
  9. var currentValue = setting.min
  10. while currentValue <= setting.max {
  11. values.append(currentValue)
  12. currentValue += setting.step
  13. }
  14. // Glucose values are stored as mg/dl values, so Integers.
  15. // Filter out duplicate values when rounded to 1 decimal place.
  16. if units == .mmolL, setting.type == PickerSetting.PickerSettingType.glucose {
  17. // Use a Set to track unique values rounded to 1 decimal
  18. var uniqueRoundedValues = Set<String>()
  19. values = values.filter { value in
  20. let roundedValue = String(format: "%.1f", NSDecimalNumber(decimal: value.asMmolL).doubleValue)
  21. return uniqueRoundedValues.insert(roundedValue).inserted
  22. }
  23. }
  24. return values
  25. }
  26. }
  27. struct DecimalPickerSettings {
  28. var lowGlucose = PickerSetting(value: 70, step: 5, min: 40, max: 100, type: PickerSetting.PickerSettingType.glucose)
  29. var highGlucose = PickerSetting(value: 180, step: 5, min: 100, max: 400, type: PickerSetting.PickerSettingType.glucose)
  30. var carbsRequiredThreshold = PickerSetting(value: 10, step: 1, min: 0, max: 100, type: PickerSetting.PickerSettingType.gram)
  31. var individualAdjustmentFactor = PickerSetting(
  32. value: 0.5,
  33. step: 0.05,
  34. min: 0.1,
  35. max: 2,
  36. type: PickerSetting.PickerSettingType.factor
  37. )
  38. var high = PickerSetting(value: 180, step: 1, min: 100, max: 500, type: PickerSetting.PickerSettingType.glucose)
  39. var low = PickerSetting(value: 70, step: 1, min: 40, max: 100, type: PickerSetting.PickerSettingType.glucose)
  40. var maxCarbs = PickerSetting(value: 250, step: 5, min: 0, max: 300, type: PickerSetting.PickerSettingType.gram)
  41. var maxFat = PickerSetting(value: 250, step: 5, min: 0, max: 300, type: PickerSetting.PickerSettingType.gram)
  42. var maxProtein = PickerSetting(value: 250, step: 5, min: 0, max: 300, type: PickerSetting.PickerSettingType.gram)
  43. var overrideFactor = PickerSetting(value: 0.8, step: 0.05, min: 0.5, max: 1.5, type: PickerSetting.PickerSettingType.factor)
  44. var fattyMealFactor = PickerSetting(value: 0.7, step: 0.05, min: 0.5, max: 2, type: PickerSetting.PickerSettingType.factor)
  45. var sweetMealFactor = PickerSetting(value: 2, step: 0.05, min: 1, max: 3, type: PickerSetting.PickerSettingType.factor)
  46. var maxIOB = PickerSetting(value: 0, step: 1, min: 0, max: 20, type: PickerSetting.PickerSettingType.insulinUnit)
  47. var maxDailySafetyMultiplier = PickerSetting(
  48. value: 3,
  49. step: 0.1,
  50. min: 1,
  51. max: 5,
  52. type: PickerSetting.PickerSettingType.factor
  53. )
  54. var currentBasalSafetyMultiplier = PickerSetting(
  55. value: 4,
  56. step: 0.1,
  57. min: 1,
  58. max: 5,
  59. type: PickerSetting.PickerSettingType.factor
  60. )
  61. var autosensMax = PickerSetting(value: 1.2, step: 0.1, min: 0.5, max: 2, type: PickerSetting.PickerSettingType.factor)
  62. var autosensMin = PickerSetting(value: 0.7, step: 0.1, min: 0.5, max: 1, type: PickerSetting.PickerSettingType.factor)
  63. var smbDeliveryRatio = PickerSetting(value: 0.5, step: 0.05, min: 0.3, max: 0.7, type: PickerSetting.PickerSettingType.factor)
  64. var halfBasalExerciseTarget = PickerSetting(
  65. value: 160,
  66. step: 1,
  67. min: 100,
  68. max: 200,
  69. type: PickerSetting.PickerSettingType.glucose
  70. )
  71. var maxCOB = PickerSetting(value: 120, step: 5, min: 0, max: 300, type: PickerSetting.PickerSettingType.gram)
  72. var min5mCarbimpact = PickerSetting(value: 8, step: 1, min: 1, max: 20, type: PickerSetting.PickerSettingType.glucose)
  73. var autotuneISFAdjustmentFraction = PickerSetting(
  74. value: 1.0,
  75. step: 0.05,
  76. min: 0,
  77. max: 1,
  78. type: PickerSetting.PickerSettingType.factor
  79. )
  80. var remainingCarbsFraction = PickerSetting(
  81. value: 1.0,
  82. step: 0.05,
  83. min: 0.5,
  84. max: 1,
  85. type: PickerSetting.PickerSettingType.factor
  86. )
  87. var remainingCarbsCap = PickerSetting(value: 90, step: 5, min: 0, max: 200, type: PickerSetting.PickerSettingType.gram)
  88. var maxSMBBasalMinutes = PickerSetting(value: 30, step: 5, min: 30, max: 180, type: PickerSetting.PickerSettingType.minute)
  89. var maxUAMSMBBasalMinutes = PickerSetting(value: 30, step: 5, min: 30, max: 180, type: PickerSetting.PickerSettingType.minute)
  90. var smbInterval = PickerSetting(value: 3, step: 1, min: 1, max: 10, type: PickerSetting.PickerSettingType.minute)
  91. var bolusIncrement = PickerSetting(
  92. value: 0.1,
  93. step: 0.05,
  94. min: 0.05,
  95. max: 1,
  96. type: PickerSetting.PickerSettingType.insulinUnit
  97. )
  98. var insulinPeakTime = PickerSetting(value: 75, step: 5, min: 35, max: 120, type: PickerSetting.PickerSettingType.minute)
  99. var carbsReqThreshold = PickerSetting(value: 1.0, step: 0.1, min: 0, max: 10, type: PickerSetting.PickerSettingType.gram)
  100. var noisyCGMTargetMultiplier = PickerSetting(
  101. value: 1.3,
  102. step: 0.05,
  103. min: 1,
  104. max: 2,
  105. type: PickerSetting.PickerSettingType.factor
  106. )
  107. var maxDeltaBGthreshold = PickerSetting(
  108. value: 0.2,
  109. step: 0.05,
  110. min: 0.1,
  111. max: 0.4,
  112. type: PickerSetting.PickerSettingType.factor
  113. )
  114. var adjustmentFactor = PickerSetting(value: 0.8, step: 0.1, min: 0.5, max: 1.5, type: PickerSetting.PickerSettingType.factor)
  115. var adjustmentFactorSigmoid = PickerSetting(
  116. value: 0.5,
  117. step: 0.1,
  118. min: 0.5,
  119. max: 2,
  120. type: PickerSetting.PickerSettingType.factor
  121. )
  122. var weightPercentage = PickerSetting(value: 0.65, step: 0.1, min: 0.1, max: 1, type: PickerSetting.PickerSettingType.factor)
  123. var enableSMB_high_bg_target = PickerSetting(
  124. value: 110,
  125. step: 1,
  126. min: 70,
  127. max: 200,
  128. type: PickerSetting.PickerSettingType.glucose
  129. )
  130. var threshold_setting = PickerSetting(value: 60, step: 1, min: 60, max: 120, type: PickerSetting.PickerSettingType.glucose)
  131. var updateInterval = PickerSetting(value: 20, step: 5, min: 1, max: 60, type: PickerSetting.PickerSettingType.minute)
  132. var delay = PickerSetting(value: 60, step: 15, min: 30, max: 120, type: PickerSetting.PickerSettingType.minute)
  133. var minuteInterval = PickerSetting(value: 20, step: 5, min: 5, max: 60, type: PickerSetting.PickerSettingType.minute)
  134. var timeCap = PickerSetting(value: 8, step: 1, min: 5, max: 12, type: PickerSetting.PickerSettingType.hour)
  135. var hours = PickerSetting(value: 6, step: 0.5, min: 2, max: 24, type: PickerSetting.PickerSettingType.hour)
  136. var dia = PickerSetting(value: 6, step: 0.5, min: 4, max: 10, type: PickerSetting.PickerSettingType.hour)
  137. var maxBolus = PickerSetting(value: 10, step: 0.5, min: 1, max: 30, type: PickerSetting.PickerSettingType.insulinUnit)
  138. var maxBasal = PickerSetting(value: 10, step: 0.5, min: 1, max: 30, type: PickerSetting.PickerSettingType.insulinUnit)
  139. }
  140. struct PickerSetting {
  141. var value: Decimal
  142. var step: Decimal
  143. var min: Decimal
  144. var max: Decimal
  145. var type: PickerSettingType
  146. enum PickerSettingType {
  147. case glucose
  148. case factor
  149. case gram
  150. case insulinUnit
  151. case minute
  152. case hour
  153. }
  154. }