AlgorithmAdvancedSettingsStateModel.swift 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import Combine
  2. import Observation
  3. import SwiftUI
  4. extension AlgorithmAdvancedSettings {
  5. final class StateModel: BaseStateModel<Provider> {
  6. @Injected() var settings: SettingsManager!
  7. @Injected() var storage: FileStorage!
  8. @Injected() var nightscout: NightscoutManager!
  9. var units: GlucoseUnits = .mgdL
  10. @Published var maxDailySafetyMultiplier: Decimal = 3
  11. @Published var currentBasalSafetyMultiplier: Decimal = 4
  12. @Published var useCustomPeakTime: Bool = false
  13. @Published var insulinPeakTime: Decimal = 75
  14. @Published var skipNeutralTemps: Bool = false
  15. @Published var unsuspendIfNoTemp: Bool = false
  16. @Published var suspendZerosIOB: Bool = false
  17. @Published var min5mCarbimpact: Decimal = 8
  18. @Published var remainingCarbsFraction: Decimal = 1.0
  19. @Published var remainingCarbsCap: Decimal = 90
  20. @Published var noisyCGMTargetMultiplier: Decimal = 1.3
  21. var insulinActionCurve: Decimal = 10
  22. var pumpSettings: PumpSettings {
  23. provider.settings()
  24. }
  25. override func subscribe() {
  26. units = settingsManager.settings.units
  27. subscribePreferencesSetting(\.maxDailySafetyMultiplier, on: $maxDailySafetyMultiplier) {
  28. maxDailySafetyMultiplier = $0 }
  29. subscribePreferencesSetting(\.currentBasalSafetyMultiplier, on: $currentBasalSafetyMultiplier) {
  30. currentBasalSafetyMultiplier = $0 }
  31. subscribePreferencesSetting(\.useCustomPeakTime, on: $useCustomPeakTime) { useCustomPeakTime = $0 }
  32. subscribePreferencesSetting(\.insulinPeakTime, on: $insulinPeakTime) { insulinPeakTime = $0 }
  33. subscribePreferencesSetting(\.unsuspendIfNoTemp, on: $unsuspendIfNoTemp) { unsuspendIfNoTemp = $0 }
  34. subscribePreferencesSetting(\.suspendZerosIOB, on: $suspendZerosIOB) { suspendZerosIOB = $0 }
  35. subscribePreferencesSetting(\.suspendZerosIOB, on: $suspendZerosIOB) { suspendZerosIOB = $0 }
  36. subscribePreferencesSetting(\.min5mCarbimpact, on: $min5mCarbimpact) { min5mCarbimpact = $0 }
  37. subscribePreferencesSetting(\.remainingCarbsFraction, on: $remainingCarbsFraction) { remainingCarbsFraction = $0 }
  38. subscribePreferencesSetting(\.remainingCarbsCap, on: $remainingCarbsCap) { remainingCarbsCap = $0 }
  39. subscribePreferencesSetting(\.noisyCGMTargetMultiplier, on: $noisyCGMTargetMultiplier) {
  40. noisyCGMTargetMultiplier = $0 }
  41. insulinActionCurve = pumpSettings.insulinActionCurve
  42. }
  43. var isPumpSettingUnchanged: Bool {
  44. pumpSettings.insulinActionCurve == insulinActionCurve
  45. }
  46. func saveIfChanged() {
  47. if !isPumpSettingUnchanged {
  48. let settings = PumpSettings(
  49. insulinActionCurve: insulinActionCurve,
  50. maxBolus: pumpSettings.maxBolus,
  51. maxBasal: pumpSettings.maxBasal
  52. )
  53. provider.save(settings: settings)
  54. .receive(on: DispatchQueue.main)
  55. .sink { _ in
  56. let settings = self.provider.settings()
  57. self.insulinActionCurve = settings.insulinActionCurve
  58. Task.detached(priority: .low) {
  59. debug(.nightscout, "Attempting to upload DIA to Nightscout")
  60. await self.nightscout.uploadProfiles()
  61. }
  62. } receiveValue: {}
  63. .store(in: &lifetime)
  64. }
  65. }
  66. }
  67. }
  68. extension AlgorithmAdvancedSettings.StateModel: SettingsObserver {
  69. func settingsDidChange(_: FreeAPSSettings) {
  70. units = settingsManager.settings.units
  71. }
  72. }