PumpState.swift 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. //
  2. // PumpState.swift
  3. // RileyLink
  4. //
  5. // Created by Nathan Racklyeft on 4/9/16.
  6. // Copyright © 2016 Pete Schwamb. All rights reserved.
  7. //
  8. import Foundation
  9. public struct PumpState: RawRepresentable, Equatable {
  10. public typealias RawValue = [String: Any]
  11. public var timeZone: TimeZone
  12. public var pumpModel: PumpModel?
  13. public var useMySentry: Bool
  14. public var awakeUntil: Date?
  15. public var lastValidFrequency: Measurement<UnitFrequency>?
  16. public var lastTuned: Date?
  17. var isAwake: Bool {
  18. if let awakeUntil = awakeUntil {
  19. return awakeUntil.timeIntervalSinceNow > 0
  20. }
  21. return false
  22. }
  23. var lastWakeAttempt: Date?
  24. public init() {
  25. self.timeZone = .currentFixed
  26. self.useMySentry = true
  27. }
  28. public init(timeZone: TimeZone, pumpModel: PumpModel, useMySentry: Bool) {
  29. self.timeZone = timeZone
  30. self.pumpModel = pumpModel
  31. self.useMySentry = useMySentry
  32. }
  33. public init?(rawValue: RawValue) {
  34. guard
  35. let timeZoneSeconds = rawValue["timeZone"] as? Int,
  36. let timeZone = TimeZone(secondsFromGMT: timeZoneSeconds),
  37. let useMySentry = rawValue["useMySentry"] as? Bool
  38. else {
  39. return nil
  40. }
  41. self.timeZone = timeZone
  42. self.useMySentry = useMySentry
  43. if let pumpModelNumber = rawValue["pumpModel"] as? PumpModel.RawValue {
  44. pumpModel = PumpModel(rawValue: pumpModelNumber)
  45. }
  46. if let frequencyRaw = rawValue["lastValidFrequency"] as? Double {
  47. lastValidFrequency = Measurement<UnitFrequency>(value: frequencyRaw, unit: .megahertz)
  48. }
  49. }
  50. public var rawValue: RawValue {
  51. var rawValue: RawValue = [
  52. "timeZone": timeZone.secondsFromGMT(),
  53. "useMySentry": useMySentry,
  54. ]
  55. if let pumpModel = pumpModel {
  56. rawValue["pumpModel"] = pumpModel.rawValue
  57. }
  58. if let frequency = lastValidFrequency?.converted(to: .megahertz) {
  59. rawValue["lastValidFrequency"] = frequency.value
  60. }
  61. return rawValue
  62. }
  63. }
  64. extension PumpState: CustomDebugStringConvertible {
  65. public var debugDescription: String {
  66. return [
  67. "## PumpState",
  68. "timeZone: \(timeZone)",
  69. "pumpModel: \(pumpModel?.rawValue ?? "")",
  70. "useMySentry: \(useMySentry)",
  71. "awakeUntil: \(awakeUntil ?? .distantPast)",
  72. "lastValidFrequency: \(String(describing: lastValidFrequency))",
  73. "lastTuned: \(awakeUntil ?? .distantPast))",
  74. "lastWakeAttempt: \(String(describing: lastWakeAttempt))"
  75. ].joined(separator: "\n")
  76. }
  77. }