TherapySettingsViewModel.swift 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. //
  2. // TherapySettingsViewModel.swift
  3. // LoopKitUI
  4. //
  5. // Created by Rick Pasetto on 7/13/20.
  6. // Copyright © 2020 LoopKit Authors. All rights reserved.
  7. //
  8. import Combine
  9. import LoopKit
  10. import HealthKit
  11. import SwiftUI
  12. public class TherapySettingsViewModel: ObservableObject {
  13. public typealias SaveCompletion = (TherapySetting, TherapySettings) -> Void
  14. public let mode: SettingsPresentationMode
  15. @Published public var therapySettings: TherapySettings
  16. public var supportedInsulinModelSettings: SupportedInsulinModelSettings
  17. private let didSave: SaveCompletion?
  18. private let initialTherapySettings: TherapySettings
  19. let pumpSupportedIncrements: (() -> PumpSupportedIncrements?)?
  20. let syncPumpSchedule: (() -> PumpManager.SyncSchedule?)?
  21. let sensitivityOverridesEnabled: Bool
  22. public var prescription: Prescription?
  23. let preferredGlucoseUnit: HKUnit
  24. lazy private var cancellables = Set<AnyCancellable>()
  25. public let chartColors: ChartColorPalette
  26. public init(mode: SettingsPresentationMode,
  27. therapySettings: TherapySettings,
  28. preferredGlucoseUnit: HKUnit,
  29. supportedInsulinModelSettings: SupportedInsulinModelSettings = SupportedInsulinModelSettings(fiaspModelEnabled: true, walshModelEnabled: true),
  30. pumpSupportedIncrements: (() -> PumpSupportedIncrements?)? = nil,
  31. syncPumpSchedule: (() -> PumpManager.SyncSchedule?)? = nil,
  32. sensitivityOverridesEnabled: Bool = false,
  33. prescription: Prescription? = nil,
  34. chartColors: ChartColorPalette,
  35. didSave: SaveCompletion? = nil) {
  36. self.mode = mode
  37. self.therapySettings = therapySettings
  38. self.initialTherapySettings = therapySettings
  39. self.preferredGlucoseUnit = preferredGlucoseUnit
  40. self.pumpSupportedIncrements = pumpSupportedIncrements
  41. self.syncPumpSchedule = syncPumpSchedule
  42. self.sensitivityOverridesEnabled = sensitivityOverridesEnabled
  43. self.prescription = prescription
  44. self.supportedInsulinModelSettings = supportedInsulinModelSettings
  45. self.chartColors = chartColors
  46. self.didSave = didSave
  47. }
  48. var deliveryLimits: DeliveryLimits {
  49. return DeliveryLimits(maximumBasalRate: therapySettings.maximumBasalRatePerHour.map { HKQuantity(unit: .internationalUnitsPerHour, doubleValue: $0) },
  50. maximumBolus: therapySettings.maximumBolus.map { HKQuantity(unit: .internationalUnit(), doubleValue: $0) } )
  51. }
  52. /// Reset to initial
  53. public func reset() {
  54. therapySettings = initialTherapySettings
  55. }
  56. public func saveCorrectionRange(range: GlucoseRangeSchedule) {
  57. therapySettings.glucoseTargetRangeSchedule = range
  58. didSave?(TherapySetting.glucoseTargetRange, therapySettings)
  59. }
  60. public func saveCorrectionRangeOverride(preMeal: ClosedRange<HKQuantity>?, unit: HKUnit) {
  61. therapySettings.preMealTargetRange = preMeal?.doubleRange(for: unit)
  62. didSave?(TherapySetting.preMealCorrectionRangeOverride, therapySettings)
  63. }
  64. public func saveCorrectionRangeOverride(workout: ClosedRange<HKQuantity>?, unit: HKUnit) {
  65. therapySettings.workoutTargetRange = workout?.doubleRange(for: unit)
  66. didSave?(TherapySetting.workoutCorrectionRangeOverride, therapySettings)
  67. }
  68. public func saveSuspendThreshold(value: GlucoseThreshold) {
  69. therapySettings.suspendThreshold = value
  70. didSave?(TherapySetting.suspendThreshold, therapySettings)
  71. }
  72. public func saveBasalRates(basalRates: BasalRateSchedule) {
  73. therapySettings.basalRateSchedule = basalRates
  74. didSave?(TherapySetting.basalRate, therapySettings)
  75. }
  76. public func saveDeliveryLimits(limits: DeliveryLimits) {
  77. therapySettings.maximumBasalRatePerHour = limits.maximumBasalRate?.doubleValue(for: .internationalUnitsPerHour)
  78. therapySettings.maximumBolus = limits.maximumBolus?.doubleValue(for: .internationalUnit())
  79. didSave?(TherapySetting.deliveryLimits, therapySettings)
  80. }
  81. public func saveInsulinModel(insulinModelSettings: InsulinModelSettings) {
  82. therapySettings.insulinModelSettings = insulinModelSettings
  83. didSave?(TherapySetting.insulinModel, therapySettings)
  84. }
  85. public func saveCarbRatioSchedule(carbRatioSchedule: CarbRatioSchedule) {
  86. therapySettings.carbRatioSchedule = carbRatioSchedule
  87. didSave?(TherapySetting.carbRatio, therapySettings)
  88. }
  89. public func saveInsulinSensitivitySchedule(insulinSensitivitySchedule: InsulinSensitivitySchedule) {
  90. therapySettings.insulinSensitivitySchedule = insulinSensitivitySchedule
  91. didSave?(TherapySetting.insulinSensitivity, therapySettings)
  92. }
  93. }