TherapySettings.swift 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. //
  2. // TherapySettings.swift
  3. // LoopKit
  4. //
  5. // Created by Anna Quinlan on 7/6/20.
  6. // Copyright © 2020 LoopKit Authors. All rights reserved.
  7. //
  8. import HealthKit
  9. public struct TherapySettings: Equatable, Codable {
  10. public var glucoseTargetRangeSchedule: GlucoseRangeSchedule?
  11. public var preMealTargetRange: DoubleRange?
  12. public var workoutTargetRange: DoubleRange?
  13. public var maximumBasalRatePerHour: Double?
  14. public var maximumBolus: Double?
  15. public var suspendThreshold: GlucoseThreshold?
  16. public var insulinSensitivitySchedule: InsulinSensitivitySchedule?
  17. public var carbRatioSchedule: CarbRatioSchedule?
  18. public var basalRateSchedule: BasalRateSchedule?
  19. public var insulinModelSettings: InsulinModelSettings?
  20. public var glucoseUnit: HKUnit? {
  21. return glucoseTargetRangeSchedule?.unit
  22. }
  23. public var isComplete: Bool {
  24. return
  25. glucoseTargetRangeSchedule != nil &&
  26. /* Premeal and workout targets are optional */
  27. //preMealTargetRange != nil &&
  28. //workoutTargetRange != nil &&
  29. maximumBasalRatePerHour != nil &&
  30. maximumBolus != nil &&
  31. suspendThreshold != nil &&
  32. insulinSensitivitySchedule != nil &&
  33. carbRatioSchedule != nil &&
  34. basalRateSchedule != nil &&
  35. insulinModelSettings != nil
  36. }
  37. public init(
  38. glucoseTargetRangeSchedule: GlucoseRangeSchedule? = nil,
  39. preMealTargetRange: DoubleRange? = nil,
  40. workoutTargetRange: DoubleRange? = nil,
  41. maximumBasalRatePerHour: Double? = nil,
  42. maximumBolus: Double? = nil,
  43. suspendThreshold: GlucoseThreshold? = nil,
  44. insulinSensitivitySchedule: InsulinSensitivitySchedule? = nil,
  45. carbRatioSchedule: CarbRatioSchedule? = nil,
  46. basalRateSchedule: BasalRateSchedule? = nil,
  47. insulinModelSettings: InsulinModelSettings? = nil
  48. ){
  49. self.glucoseTargetRangeSchedule = glucoseTargetRangeSchedule
  50. self.preMealTargetRange = preMealTargetRange
  51. self.workoutTargetRange = workoutTargetRange
  52. self.maximumBasalRatePerHour = maximumBasalRatePerHour
  53. self.maximumBolus = maximumBolus
  54. self.suspendThreshold = suspendThreshold
  55. self.insulinSensitivitySchedule = insulinSensitivitySchedule
  56. self.carbRatioSchedule = carbRatioSchedule
  57. self.basalRateSchedule = basalRateSchedule
  58. self.insulinModelSettings = insulinModelSettings
  59. }
  60. }
  61. extension TherapySettings {
  62. // Mock therapy settings for QA and mock prescriptions
  63. public static var mockTherapySettings: TherapySettings {
  64. let timeZone = TimeZone(identifier: "America/Los_Angeles")!
  65. let glucoseTargetRangeSchedule = GlucoseRangeSchedule(
  66. rangeSchedule: DailyQuantitySchedule(unit: .milligramsPerDeciliter,
  67. dailyItems: [RepeatingScheduleValue(startTime: .hours(0), value: DoubleRange(minValue: 100.0, maxValue: 110.0)),
  68. RepeatingScheduleValue(startTime: .hours(8), value: DoubleRange(minValue: 105.0, maxValue: 115.0)),
  69. RepeatingScheduleValue(startTime: .hours(21), value: DoubleRange(minValue: 100.0, maxValue: 110.0))],
  70. timeZone: timeZone)!,
  71. override: GlucoseRangeSchedule.Override(value: DoubleRange(minValue: 80.0, maxValue: 90.0),
  72. start: Date().addingTimeInterval(.minutes(-30)),
  73. end: Date().addingTimeInterval(.minutes(30)))
  74. )
  75. let basalRateSchedule = BasalRateSchedule(
  76. dailyItems: [RepeatingScheduleValue(startTime: .hours(0), value: 1),
  77. RepeatingScheduleValue(startTime: .hours(15), value: 0.85)],
  78. timeZone: timeZone)!
  79. let insulinSensitivitySchedule = InsulinSensitivitySchedule(
  80. unit: .milligramsPerDeciliter,
  81. dailyItems: [RepeatingScheduleValue(startTime: .hours(0), value: 45.0),
  82. RepeatingScheduleValue(startTime: .hours(9), value: 55.0)],
  83. timeZone: timeZone)!
  84. let carbRatioSchedule = CarbRatioSchedule(
  85. unit: .gram(),
  86. dailyItems: [RepeatingScheduleValue(startTime: .hours(0), value: 10.0)],
  87. timeZone: timeZone)!
  88. return TherapySettings(
  89. glucoseTargetRangeSchedule: glucoseTargetRangeSchedule,
  90. preMealTargetRange: DoubleRange(minValue: 80.0, maxValue: 90.0),
  91. workoutTargetRange: DoubleRange(minValue: 140.0, maxValue: 160.0),
  92. maximumBasalRatePerHour: 5,
  93. maximumBolus: 10,
  94. suspendThreshold: GlucoseThreshold(unit: .milligramsPerDeciliter, value: 75),
  95. insulinSensitivitySchedule: insulinSensitivitySchedule,
  96. carbRatioSchedule: carbRatioSchedule,
  97. basalRateSchedule: basalRateSchedule,
  98. insulinModelSettings: InsulinModelSettings(model: ExponentialInsulinModelPreset.rapidActingAdult)
  99. )
  100. }
  101. }