GlucoseRangeSchedule+SafeBounds.swift 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. //
  2. // GlucoseRangeSchedule+SafeBounds.swift
  3. // LoopKit
  4. //
  5. // Created by Noah Brauner on 12/5/22.
  6. // Copyright © 2022 LoopKit Authors. All rights reserved.
  7. //
  8. import Foundation
  9. import HealthKit
  10. extension GlucoseRangeSchedule {
  11. public func safeSchedule(with suspendThreshold: HKQuantity?) -> GlucoseRangeSchedule? {
  12. let minGlucoseValue = [
  13. suspendThreshold?.doubleValue(for: self.unit),
  14. Guardrail.correctionRange.absoluteBounds.lowerBound.doubleValue(for: self.unit)
  15. ]
  16. .compactMap({ $0 })
  17. .max()!
  18. let maxGlucoseValue = Guardrail.correctionRange.absoluteBounds.upperBound.doubleValue(for: self.unit)
  19. func safeGlucoseValue(_ initialValue: Double) -> Double {
  20. return max(minGlucoseValue, min(maxGlucoseValue, initialValue))
  21. }
  22. let filteredItems = rangeSchedule.valueSchedule.items.map { scheduleValue in
  23. let newScheduleValue = DoubleRange(minValue: safeGlucoseValue(scheduleValue.value.minValue), maxValue: safeGlucoseValue(scheduleValue.value.maxValue))
  24. return RepeatingScheduleValue(startTime: scheduleValue.startTime, value: newScheduleValue)
  25. }
  26. guard let filteredRangeSchedule = DailyQuantitySchedule(unit: rangeSchedule.unit, dailyItems: filteredItems) else {
  27. return nil
  28. }
  29. return GlucoseRangeSchedule(rangeSchedule: filteredRangeSchedule, override: self.override)
  30. }
  31. }