AlgorithmState.swift 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. //
  2. // CalibrationState.swift
  3. // xDripG5
  4. //
  5. // Created by Nate Racklyeft on 8/6/16.
  6. // Copyright © 2016 Nathan Racklyeft. All rights reserved.
  7. //
  8. import Foundation
  9. public enum AlgorithmState: RawRepresentable {
  10. public typealias RawValue = UInt8
  11. public enum State: RawValue {
  12. case stopped = 1
  13. case warmup = 2
  14. case ok = 6
  15. case questionMarks = 18
  16. case expired = 24
  17. case sensorFailed = 25
  18. }
  19. case known(State)
  20. case unknown(RawValue)
  21. public init(rawValue: RawValue) {
  22. guard let state = State(rawValue: rawValue) else {
  23. self = .unknown(rawValue)
  24. return
  25. }
  26. self = .known(state)
  27. }
  28. public var rawValue: RawValue {
  29. switch self {
  30. case .known(let state):
  31. return state.rawValue
  32. case .unknown(let rawValue):
  33. return rawValue
  34. }
  35. }
  36. public var sensorFailed: Bool {
  37. guard case .known(let state) = self else {
  38. return false
  39. }
  40. switch state {
  41. case .sensorFailed:
  42. return true
  43. default:
  44. return false
  45. }
  46. }
  47. public var isInWarmup: Bool {
  48. guard case .known(let state) = self else {
  49. return false
  50. }
  51. switch state {
  52. case .warmup:
  53. return true
  54. default:
  55. return false
  56. }
  57. }
  58. public var isInSensorError: Bool {
  59. guard case .known(let state) = self else {
  60. return false
  61. }
  62. switch state {
  63. case .questionMarks:
  64. return true
  65. default:
  66. return false
  67. }
  68. }
  69. public var hasReliableGlucose: Bool {
  70. guard case .known(let state) = self else {
  71. return false
  72. }
  73. switch state {
  74. case .stopped,
  75. .warmup,
  76. .questionMarks,
  77. .expired,
  78. .sensorFailed:
  79. return false
  80. case .ok:
  81. return true
  82. }
  83. }
  84. }
  85. extension AlgorithmState: Equatable {
  86. public static func ==(lhs: AlgorithmState, rhs: AlgorithmState) -> Bool {
  87. switch (lhs, rhs) {
  88. case (.known(let lhs), .known(let rhs)):
  89. return lhs == rhs
  90. case (.unknown(let lhs), .unknown(let rhs)):
  91. return lhs == rhs
  92. default:
  93. return false
  94. }
  95. }
  96. }
  97. extension AlgorithmState: CustomStringConvertible {
  98. public var description: String {
  99. switch self {
  100. case .known(let state):
  101. return String(describing: state)
  102. case .unknown(let value):
  103. return ".unknown(\(value))"
  104. }
  105. }
  106. }