TemporaryScheduleOverrideSettings.swift 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. //
  2. // TemporaryScheduleOverrideSettings.swift
  3. // LoopKit
  4. //
  5. // Created by Michael Pangburn on 1/2/19.
  6. // Copyright © 2019 LoopKit Authors. All rights reserved.
  7. //
  8. import HealthKit
  9. public struct TemporaryScheduleOverrideSettings: Hashable {
  10. private var targetRangeInMgdl: DoubleRange?
  11. public var insulinNeedsScaleFactor: Double?
  12. public var targetRange: ClosedRange<HKQuantity>? {
  13. return targetRangeInMgdl.map { $0.quantityRange(for: .milligramsPerDeciliter) }
  14. }
  15. public var basalRateMultiplier: Double? {
  16. return insulinNeedsScaleFactor
  17. }
  18. public var insulinSensitivityMultiplier: Double? {
  19. return insulinNeedsScaleFactor.map { 1.0 / $0 }
  20. }
  21. public var carbRatioMultiplier: Double? {
  22. return insulinNeedsScaleFactor.map { 1.0 / $0 }
  23. }
  24. public var effectiveInsulinNeedsScaleFactor: Double {
  25. return insulinNeedsScaleFactor ?? 1.0
  26. }
  27. public init(unit: HKUnit, targetRange: DoubleRange?, insulinNeedsScaleFactor: Double? = nil) {
  28. self.targetRangeInMgdl = targetRange?.quantityRange(for: unit).doubleRange(for: .milligramsPerDeciliter)
  29. self.insulinNeedsScaleFactor = insulinNeedsScaleFactor
  30. }
  31. }
  32. extension TemporaryScheduleOverrideSettings: RawRepresentable {
  33. public typealias RawValue = [String: Any]
  34. private enum Key {
  35. static let targetRange = "targetRange"
  36. static let insulinNeedsScaleFactor = "insulinNeedsScaleFactor"
  37. static let version = "version"
  38. }
  39. public init?(rawValue: RawValue) {
  40. if let targetRangeRawValue = rawValue[Key.targetRange] as? DoubleRange.RawValue,
  41. let targetRange = DoubleRange(rawValue: targetRangeRawValue) {
  42. self.targetRangeInMgdl = targetRange
  43. }
  44. let version = rawValue[Key.version] as? Int ?? 0
  45. // Do not allow target ranges from versions < 1, as there was no unit convention at that point.
  46. if version < 1 && targetRange != nil {
  47. return nil
  48. }
  49. self.insulinNeedsScaleFactor = rawValue[Key.insulinNeedsScaleFactor] as? Double
  50. }
  51. public var rawValue: RawValue {
  52. var raw: RawValue = [:]
  53. if let targetRangeInMgdl = targetRangeInMgdl {
  54. raw[Key.targetRange] = targetRangeInMgdl.rawValue
  55. }
  56. if let insulinNeedsScaleFactor = insulinNeedsScaleFactor {
  57. raw[Key.insulinNeedsScaleFactor] = insulinNeedsScaleFactor
  58. }
  59. raw[Key.version] = 1
  60. return raw
  61. }
  62. }
  63. extension TemporaryScheduleOverrideSettings: Codable {}