WatchState+Requests.swift 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. import Foundation
  2. import WatchConnectivity
  3. // MARK: - Send Data to Phone
  4. extension WatchState {
  5. /// Sends a bolus insulin request to the paired iPhone
  6. /// - Parameters:
  7. /// - amount: The insulin amount to be delivered
  8. func sendBolusRequest(_ amount: Decimal) {
  9. guard let session = session, session.isReachable else { return }
  10. isBolusCanceled = false // Reset canceled state when starting new bolus
  11. activeBolusAmount = Double(truncating: amount as NSNumber) // Set active bolus amount
  12. let message: [String: Any] = [
  13. "bolus": amount
  14. ]
  15. session.sendMessage(message, replyHandler: nil) { error in
  16. print("Error sending bolus request: \(error.localizedDescription)")
  17. }
  18. // Display pending communication animation
  19. showCommsAnimation = true
  20. }
  21. /// Sends a carbohydrate entry request to the paired iPhone
  22. /// - Parameters:
  23. /// - amount: The amount of carbs in grams
  24. /// - date: The timestamp for the carb entry (defaults to current time)
  25. func sendCarbsRequest(_ amount: Int, _ date: Date = Date()) {
  26. guard let session = session, session.isReachable else { return }
  27. let message: [String: Any] = [
  28. "carbs": amount,
  29. "date": date.timeIntervalSince1970
  30. ]
  31. session.sendMessage(message, replyHandler: nil) { error in
  32. print("Error sending carbs request: \(error.localizedDescription)")
  33. }
  34. // Display pending communication animation
  35. showCommsAnimation = true
  36. }
  37. /// Sends a meal and bolus insulin combo request to the paired iPhone
  38. /// - Parameters:
  39. /// - amount: The insulin amount to be delivered
  40. /// - isExternal: Indicates if the bolus is from an external source
  41. func sendMealBolusComboRequest(carbsAmount _: Decimal, bolusAmount: Decimal, _ date: Date = Date()) {
  42. guard let session = session, session.isReachable else { return }
  43. let message: [String: Any] = [
  44. "bolus": bolusAmount,
  45. "carbs": bolusAmount,
  46. "date": date.timeIntervalSince1970
  47. ]
  48. session.sendMessage(message, replyHandler: nil) { error in
  49. print("Error sending meal bolus combo request: \(error.localizedDescription)")
  50. }
  51. // Display pending communication animation
  52. showCommsAnimation = true
  53. isMealBolusCombo = true
  54. }
  55. /// Sends a request to cancel the current override preset to the paired iPhone
  56. func sendCancelOverrideRequest() {
  57. guard let session = session, session.isReachable else { return }
  58. let message: [String: Any] = [
  59. "cancelOverride": true
  60. ]
  61. session.sendMessage(message, replyHandler: nil) { error in
  62. print("⌚️ Error sending cancel override request: \(error.localizedDescription)")
  63. }
  64. // Display pending communication animation
  65. showCommsAnimation = true
  66. }
  67. /// Sends a request to activate an override preset to the paired iPhone
  68. /// - Parameter presetName: The name of the override preset to activate
  69. func sendActivateOverrideRequest(presetName: String) {
  70. guard let session = session, session.isReachable else { return }
  71. let message: [String: Any] = [
  72. "activateOverride": presetName
  73. ]
  74. session.sendMessage(message, replyHandler: nil) { error in
  75. print("⌚️ Error sending activate override request: \(error.localizedDescription)")
  76. }
  77. // Display pending communication animation
  78. showCommsAnimation = true
  79. }
  80. /// Sends a request to cancel the current temporary target to the paired iPhone
  81. func sendCancelTempTargetRequest() {
  82. guard let session = session, session.isReachable else { return }
  83. let message: [String: Any] = [
  84. "cancelTempTarget": true
  85. ]
  86. session.sendMessage(message, replyHandler: nil) { error in
  87. print("⌚️ Error sending cancel temp target request: \(error.localizedDescription)")
  88. }
  89. // Display pending communication animation
  90. showCommsAnimation = true
  91. }
  92. /// Sends a request to activate a temporary target preset to the paired iPhone
  93. /// - Parameter presetName: The name of the temporary target preset to activate
  94. func sendActivateTempTargetRequest(presetName: String) {
  95. guard let session = session, session.isReachable else { return }
  96. let message: [String: Any] = [
  97. "activateTempTarget": presetName
  98. ]
  99. session.sendMessage(message, replyHandler: nil) { error in
  100. print("⌚️ Error sending activate temp target request: \(error.localizedDescription)")
  101. }
  102. // Display pending communication animation
  103. showCommsAnimation = true
  104. }
  105. /// Sends a request to cancel the current bolus delivery to the paired iPhone
  106. func sendCancelBolusRequest() {
  107. isBolusCanceled = true
  108. guard let session = session, session.isReachable else { return }
  109. let message: [String: Any] = [
  110. "cancelBolus": true
  111. ]
  112. session.sendMessage(message, replyHandler: nil) { error in
  113. print("Error sending cancel bolus request: \(error.localizedDescription)")
  114. }
  115. // Reset when cancelled
  116. bolusProgress = 0
  117. activeBolusAmount = 0
  118. // Display pending communication animation
  119. showCommsAnimation = true
  120. }
  121. /// Sends a request to calculate a bolus recommendation based on the current carbs amount
  122. func requestBolusRecommendation() {
  123. guard let session = session, session.isReachable else { return }
  124. let message: [String: Any] = [
  125. WatchMessageKeys.requestBolusRecommendation: true,
  126. WatchMessageKeys.carbs: carbsAmount
  127. ]
  128. session.sendMessage(message, replyHandler: nil) { error in
  129. print("Error requesting bolus recommendation: \(error.localizedDescription)")
  130. }
  131. if bolusAmount == 0 {
  132. showBolusCalculationProgress = true
  133. }
  134. }
  135. func requestWatchStateUpdate() {
  136. guard let session = session, session.activationState == .activated else {
  137. print("⌚️ Session not activated, activating...")
  138. session?.activate()
  139. return
  140. }
  141. if session.isReachable {
  142. print("⌚️ Request an update for watch state from Trio iPhone app...")
  143. let message = [WatchMessageKeys.requestWatchUpdate: WatchMessageKeys.watchState]
  144. session.sendMessage(message, replyHandler: nil) { error in
  145. print("⌚️ Update request for fresh watch state data: \(error.localizedDescription)")
  146. }
  147. } else {
  148. print("⌚️ Phone not reachable for watch state update")
  149. }
  150. }
  151. }