AlgorithmAdvancedSettingsStateModel.swift 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import Combine
  2. import SwiftUI
  3. extension AlgorithmAdvancedSettings {
  4. final class StateModel: BaseStateModel<Provider> {
  5. @Injected() var settings: SettingsManager!
  6. @Injected() var storage: FileStorage!
  7. @Injected() var nightscout: NightscoutManager!
  8. @Published var units: GlucoseUnits = .mgdL
  9. @Published var maxDailySafetyMultiplier: Decimal = 3
  10. @Published var currentBasalSafetyMultiplier: Decimal = 4
  11. @Published var useCustomPeakTime: Bool = false
  12. @Published var insulinPeakTime: Decimal = 75
  13. @Published var skipNeutralTemps: Bool = false
  14. @Published var unsuspendIfNoTemp: Bool = false
  15. @Published var suspendZerosIOB: Bool = false
  16. @Published var min5mCarbimpact: Decimal = 8
  17. @Published var autotuneISFAdjustmentFraction: Decimal = 1.0
  18. @Published var remainingCarbsFraction: Decimal = 1.0
  19. @Published var remainingCarbsCap: Decimal = 90
  20. @Published var noisyCGMTargetMultiplier: Decimal = 1.3
  21. @Published var insulinActionCurve: Decimal = 6
  22. var preferences: Preferences {
  23. settingsManager.preferences
  24. }
  25. var pumpSettings: PumpSettings {
  26. provider.settings()
  27. }
  28. override func subscribe() {
  29. units = settingsManager.settings.units
  30. maxDailySafetyMultiplier = settings.preferences.maxDailySafetyMultiplier
  31. currentBasalSafetyMultiplier = settings.preferences.currentBasalSafetyMultiplier
  32. useCustomPeakTime = settings.preferences.useCustomPeakTime
  33. insulinPeakTime = settings.preferences.insulinPeakTime
  34. skipNeutralTemps = settings.preferences.skipNeutralTemps
  35. unsuspendIfNoTemp = settings.preferences.unsuspendIfNoTemp
  36. suspendZerosIOB = settings.preferences.suspendZerosIOB
  37. min5mCarbimpact = settings.preferences.min5mCarbimpact
  38. autotuneISFAdjustmentFraction = settings.preferences.autotuneISFAdjustmentFraction
  39. remainingCarbsFraction = settings.preferences.remainingCarbsFraction
  40. remainingCarbsCap = settings.preferences.remainingCarbsCap
  41. noisyCGMTargetMultiplier = settings.preferences.noisyCGMTargetMultiplier
  42. insulinActionCurve = pumpSettings.insulinActionCurve
  43. }
  44. var isPumpSettingUnchanged: Bool {
  45. pumpSettings.insulinActionCurve == insulinActionCurve
  46. }
  47. var isSettingUnchanged: Bool {
  48. preferences.maxDailySafetyMultiplier == maxDailySafetyMultiplier &&
  49. preferences.currentBasalSafetyMultiplier == currentBasalSafetyMultiplier &&
  50. preferences.useCustomPeakTime == useCustomPeakTime &&
  51. preferences.insulinPeakTime == insulinPeakTime &&
  52. preferences.skipNeutralTemps == skipNeutralTemps &&
  53. preferences.unsuspendIfNoTemp == unsuspendIfNoTemp &&
  54. preferences.suspendZerosIOB == suspendZerosIOB &&
  55. preferences.min5mCarbimpact == min5mCarbimpact &&
  56. preferences.autotuneISFAdjustmentFraction == autotuneISFAdjustmentFraction &&
  57. preferences.remainingCarbsFraction == remainingCarbsFraction &&
  58. preferences.remainingCarbsCap == remainingCarbsCap &&
  59. preferences.noisyCGMTargetMultiplier == noisyCGMTargetMultiplier
  60. }
  61. func saveIfChanged() {
  62. if !isSettingUnchanged {
  63. var newSettings = storage.retrieve(OpenAPS.Settings.preferences, as: Preferences.self) ?? Preferences()
  64. newSettings.maxDailySafetyMultiplier = maxDailySafetyMultiplier
  65. newSettings.currentBasalSafetyMultiplier = currentBasalSafetyMultiplier
  66. newSettings.useCustomPeakTime = useCustomPeakTime
  67. newSettings.insulinPeakTime = insulinPeakTime
  68. newSettings.skipNeutralTemps = skipNeutralTemps
  69. newSettings.unsuspendIfNoTemp = unsuspendIfNoTemp
  70. newSettings.suspendZerosIOB = suspendZerosIOB
  71. newSettings.min5mCarbimpact = min5mCarbimpact
  72. newSettings.autotuneISFAdjustmentFraction = autotuneISFAdjustmentFraction
  73. newSettings.remainingCarbsFraction = remainingCarbsFraction
  74. newSettings.remainingCarbsCap = remainingCarbsCap
  75. newSettings.noisyCGMTargetMultiplier = noisyCGMTargetMultiplier
  76. newSettings.timestamp = Date()
  77. storage.save(newSettings, as: OpenAPS.Settings.preferences)
  78. }
  79. if !isPumpSettingUnchanged {
  80. let settings = PumpSettings(
  81. insulinActionCurve: insulinActionCurve,
  82. maxBolus: pumpSettings.maxBolus,
  83. maxBasal: pumpSettings.maxBasal
  84. )
  85. provider.save(settings: settings)
  86. .receive(on: DispatchQueue.main)
  87. .sink { _ in
  88. let settings = self.provider.settings()
  89. self.insulinActionCurve = settings.insulinActionCurve
  90. Task.detached(priority: .low) {
  91. debug(.nightscout, "Attempting to upload DIA to Nightscout")
  92. await self.nightscout.uploadProfiles()
  93. }
  94. } receiveValue: {}
  95. .store(in: &lifetime)
  96. }
  97. }
  98. }
  99. }
  100. extension AlgorithmAdvancedSettings.StateModel: SettingsObserver {
  101. func settingsDidChange(_: FreeAPSSettings) {
  102. units = settingsManager.settings.units
  103. }
  104. }