AlgorithmAdvancedSettingsStateModel.swift 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. @Injected() private var tidepoolManager: TidepoolManager!
  10. var units: GlucoseUnits = .mgdL
  11. // settings
  12. @Published var maxDailySafetyMultiplier: Decimal = 3
  13. @Published var currentBasalSafetyMultiplier: Decimal = 4
  14. @Published var useCustomPeakTime: Bool = false
  15. @Published var insulinPeakTime: Decimal = 75
  16. @Published var skipNeutralTemps: Bool = false
  17. @Published var unsuspendIfNoTemp: Bool = false
  18. @Published var min5mCarbimpact: Decimal = 8
  19. @Published var remainingCarbsFraction: Decimal = 1.0
  20. @Published var remainingCarbsCap: Decimal = 90
  21. @Published var noisyCGMTargetMultiplier: Decimal = 1.3
  22. @Published var useSwiftOref: Bool = false
  23. // preference
  24. @Published var insulinActionCurve: Decimal = 10
  25. @Published var smbDeliveryRatio: Decimal = 0.5
  26. @Published var smbInterval: Decimal = 3
  27. var pumpSettings: PumpSettings {
  28. provider.settings()
  29. }
  30. override func subscribe() {
  31. units = settingsManager.settings.units
  32. subscribePreferencesSetting(\.maxDailySafetyMultiplier, on: $maxDailySafetyMultiplier) {
  33. maxDailySafetyMultiplier = $0 }
  34. subscribePreferencesSetting(\.currentBasalSafetyMultiplier, on: $currentBasalSafetyMultiplier) {
  35. currentBasalSafetyMultiplier = $0 }
  36. subscribePreferencesSetting(\.useCustomPeakTime, on: $useCustomPeakTime) { useCustomPeakTime = $0 }
  37. subscribePreferencesSetting(\.insulinPeakTime, on: $insulinPeakTime) { insulinPeakTime = $0 }
  38. subscribePreferencesSetting(\.skipNeutralTemps, on: $skipNeutralTemps) { skipNeutralTemps = $0 }
  39. subscribePreferencesSetting(\.unsuspendIfNoTemp, on: $unsuspendIfNoTemp) { unsuspendIfNoTemp = $0 }
  40. subscribePreferencesSetting(\.min5mCarbimpact, on: $min5mCarbimpact) { min5mCarbimpact = $0 }
  41. subscribePreferencesSetting(\.remainingCarbsFraction, on: $remainingCarbsFraction) { remainingCarbsFraction = $0 }
  42. subscribePreferencesSetting(\.remainingCarbsCap, on: $remainingCarbsCap) { remainingCarbsCap = $0 }
  43. subscribePreferencesSetting(\.noisyCGMTargetMultiplier, on: $noisyCGMTargetMultiplier) {
  44. noisyCGMTargetMultiplier = $0 }
  45. subscribeSetting(\.useSwiftOref, on: $useSwiftOref) {
  46. useSwiftOref = $0 }
  47. subscribePreferencesSetting(\.smbDeliveryRatio, on: $smbDeliveryRatio) { smbDeliveryRatio = $0 }
  48. subscribePreferencesSetting(\.smbInterval, on: $smbInterval) { smbInterval = $0 }
  49. subscribePreferencesSetting(\.smbDeliveryRatio, on: $smbDeliveryRatio) { smbDeliveryRatio = $0 }
  50. subscribePreferencesSetting(\.smbInterval, on: $smbInterval) { smbInterval = $0 }
  51. insulinActionCurve = pumpSettings.insulinActionCurve
  52. }
  53. var isPumpSettingUnchanged: Bool {
  54. pumpSettings.insulinActionCurve == insulinActionCurve
  55. }
  56. func saveIfChanged() {
  57. if !isPumpSettingUnchanged {
  58. let settings = PumpSettings(
  59. insulinActionCurve: insulinActionCurve,
  60. maxBolus: pumpSettings.maxBolus,
  61. maxBasal: pumpSettings.maxBasal
  62. )
  63. provider.save(settings: settings)
  64. .receive(on: DispatchQueue.main)
  65. .sink { _ in
  66. let settings = self.provider.settings()
  67. self.insulinActionCurve = settings.insulinActionCurve
  68. Task.detached(priority: .low) {
  69. do {
  70. debug(.nightscout, "Attempting to upload DIA to Nightscout")
  71. try await self.nightscout.uploadProfiles()
  72. } catch {
  73. debug(
  74. .default,
  75. "\(DebuggingIdentifiers.failed) failed to upload DIA to Nightscout: \(error)"
  76. )
  77. }
  78. }
  79. Task.detached(priority: .low) {
  80. await self.tidepoolManager.uploadSettings()
  81. }
  82. } receiveValue: {}
  83. .store(in: &lifetime)
  84. }
  85. }
  86. }
  87. }
  88. extension AlgorithmAdvancedSettings.StateModel: SettingsObserver {
  89. func settingsDidChange(_: TrioSettings) {
  90. units = settingsManager.settings.units
  91. }
  92. }