CommandPayload.swift 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import Foundation
  2. struct EncryptedPushMessage: Decodable {
  3. let encryptedData: String
  4. enum CodingKeys: String, CodingKey {
  5. case encryptedData = "encrypted_data"
  6. }
  7. }
  8. struct CommandPayload: Decodable, Sendable {
  9. var user: String
  10. var commandType: TrioRemoteControl.CommandType
  11. var timestamp: TimeInterval
  12. var bolusAmount: Decimal?
  13. var target: Int?
  14. var duration: Int?
  15. var carbs: Int?
  16. var protein: Int?
  17. var fat: Int?
  18. var overrideName: String?
  19. var scheduledTime: TimeInterval?
  20. var returnNotification: ReturnNotificationInfo?
  21. struct ReturnNotificationInfo: Decodable, Sendable {
  22. let productionEnvironment: Bool
  23. let deviceToken: String
  24. let bundleId: String
  25. let teamId: String
  26. let keyId: String
  27. let apnsKey: String
  28. enum CodingKeys: String, CodingKey {
  29. case productionEnvironment = "production_environment"
  30. case deviceToken = "device_token"
  31. case bundleId = "bundle_id"
  32. case teamId = "team_id"
  33. case keyId = "key_id"
  34. case apnsKey = "apns_key"
  35. }
  36. }
  37. enum CodingKeys: String, CodingKey {
  38. case user
  39. case timestamp
  40. case target
  41. case duration
  42. case carbs
  43. case protein
  44. case fat
  45. case overrideName
  46. case commandType = "command_type"
  47. case bolusAmount = "bolus_amount"
  48. case scheduledTime = "scheduled_time"
  49. case returnNotification = "return_notification"
  50. }
  51. func humanReadableDescription() -> String {
  52. var description = "User: \(user). Command Type: \(commandType.description). "
  53. if let override = overrideName {
  54. description += "Override Name: \(override). "
  55. }
  56. switch commandType {
  57. case .bolus:
  58. if let amount = bolusAmount {
  59. description += "Bolus Amount: \(amount) units."
  60. } else {
  61. description += "Bolus Amount: unknown."
  62. }
  63. case .tempTarget:
  64. let targetDesc = target != nil ? "\(target!) mg/dL" : "unknown target"
  65. let durationDesc = duration != nil ? "\(duration!) minutes" : "unknown duration"
  66. description += "Temp Target: \(targetDesc), Duration: \(durationDesc)."
  67. case .cancelTempTarget:
  68. description += "Cancel Temp Target command."
  69. case .meal:
  70. let carbsDesc = carbs != nil ? "\(carbs!)g carbs" : "unknown carbs"
  71. let fatDesc = fat != nil ? "\(fat!)g fat" : "unknown fat"
  72. let proteinDesc = protein != nil ? "\(protein!)g protein" : "unknown protein"
  73. description += "Meal with \(carbsDesc), \(fatDesc), \(proteinDesc)."
  74. case .startOverride:
  75. if let override = overrideName {
  76. description += "Start Override: \(override)."
  77. } else {
  78. description += "Start Override: unknown override name."
  79. }
  80. case .cancelOverride:
  81. description += "Cancel Override command."
  82. }
  83. if let scheduledTime = scheduledTime {
  84. let date = Date(timeIntervalSince1970: scheduledTime)
  85. let formatter = DateFormatter()
  86. formatter.dateStyle = .short
  87. formatter.timeStyle = .short
  88. let dateString = formatter.string(from: date)
  89. description += " Scheduled for: \(dateString)."
  90. }
  91. return description
  92. }
  93. }
  94. extension TrioRemoteControl {
  95. enum CommandType: String, Codable {
  96. case bolus
  97. case tempTarget = "temp_target"
  98. case cancelTempTarget = "cancel_temp_target"
  99. case meal
  100. case startOverride = "start_override"
  101. case cancelOverride = "cancel_override"
  102. var description: String {
  103. switch self {
  104. case .bolus:
  105. return "Bolus"
  106. case .tempTarget:
  107. return "Temporary Target"
  108. case .cancelTempTarget:
  109. return "Cancel Temporary Target"
  110. case .meal:
  111. return "Meal"
  112. case .startOverride:
  113. return "Start Override"
  114. case .cancelOverride:
  115. return "Cancel Override"
  116. }
  117. }
  118. }
  119. }