LoopSettings.swift 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. //
  2. // LoopSettings.swift
  3. // NightscoutUploadKit
  4. //
  5. // Created by Pete Schwamb on 4/21/20.
  6. // Copyright © 2020 Pete Schwamb. All rights reserved.
  7. //
  8. import Foundation
  9. public struct LoopSettings {
  10. typealias RawValue = [String: Any]
  11. public let dosingEnabled: Bool
  12. public let overridePresets: [TemporaryScheduleOverride]
  13. public let scheduleOverride: TemporaryScheduleOverride?
  14. public let minimumBGGuard: Double?
  15. public let preMealTargetRange: ClosedRange<Double>?
  16. public let maximumBasalRatePerHour: Double?
  17. public let maximumBolus: Double?
  18. public let deviceToken: String?
  19. public let bundleIdentifier: String?
  20. public let dosingStrategy: String?
  21. public init(dosingEnabled: Bool, overridePresets: [TemporaryScheduleOverride], scheduleOverride: TemporaryScheduleOverride?, minimumBGGuard: Double?, preMealTargetRange: ClosedRange<Double>?, maximumBasalRatePerHour: Double?, maximumBolus: Double?,
  22. deviceToken: String?, bundleIdentifier: String?, dosingStrategy: String?) {
  23. self.dosingEnabled = dosingEnabled
  24. self.overridePresets = overridePresets
  25. self.scheduleOverride = scheduleOverride
  26. self.minimumBGGuard = minimumBGGuard
  27. self.preMealTargetRange = preMealTargetRange
  28. self.maximumBasalRatePerHour = maximumBasalRatePerHour
  29. self.maximumBolus = maximumBolus
  30. self.deviceToken = deviceToken
  31. self.bundleIdentifier = bundleIdentifier
  32. self.dosingStrategy = dosingStrategy
  33. }
  34. public var dictionaryRepresentation: [String: Any] {
  35. var rval: [String: Any] = [
  36. "dosingEnabled": dosingEnabled,
  37. "overridePresets": overridePresets.map { $0.dictionaryRepresentation },
  38. ]
  39. rval["minimumBGGuard"] = minimumBGGuard
  40. rval["scheduleOverride"] = scheduleOverride?.dictionaryRepresentation
  41. if let preMealTargetRange = preMealTargetRange {
  42. rval["preMealTargetRange"] = [preMealTargetRange.lowerBound, preMealTargetRange.upperBound]
  43. }
  44. rval["maximumBasalRatePerHour"] = maximumBasalRatePerHour
  45. rval["maximumBolus"] = maximumBolus
  46. rval["deviceToken"] = deviceToken
  47. rval["dosingStrategy"] = dosingStrategy
  48. if let bundleIdentifier = bundleIdentifier {
  49. rval["bundleIdentifier"] = bundleIdentifier
  50. }
  51. return rval
  52. }
  53. init?(rawValue: RawValue) {
  54. guard
  55. let dosingEnabled = rawValue["dosingEnabled"] as? Bool,
  56. let overridePresetsRaw = rawValue["overridePresets"] as? [TemporaryScheduleOverride.RawValue]
  57. else {
  58. return nil
  59. }
  60. self.dosingEnabled = dosingEnabled
  61. self.overridePresets = overridePresetsRaw.compactMap { TemporaryScheduleOverride(rawValue: $0) }
  62. if let scheduleOverrideRaw = rawValue["scheduleOverride"] as? TemporaryScheduleOverride.RawValue {
  63. scheduleOverride = TemporaryScheduleOverride(rawValue: scheduleOverrideRaw)
  64. } else {
  65. scheduleOverride = nil
  66. }
  67. minimumBGGuard = rawValue["minimumBGGuard"] as? Double
  68. if let preMealTargetRangeRaw = rawValue["preMealTargetRange"] as? [Double], preMealTargetRangeRaw.count == 2 {
  69. preMealTargetRange = ClosedRange(uncheckedBounds: (lower: preMealTargetRangeRaw[0], upper: preMealTargetRangeRaw[1]))
  70. } else {
  71. preMealTargetRange = nil
  72. }
  73. maximumBasalRatePerHour = rawValue["maximumBasalRatePerHour"] as? Double
  74. maximumBolus = rawValue["maximumBolus"] as? Double
  75. deviceToken = rawValue["deviceToken"] as? String
  76. bundleIdentifier = rawValue["bundleIdentifier"] as? String
  77. dosingStrategy = rawValue["dosingStrategy"] as? String
  78. }
  79. }