WatchState+Requests.swift 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  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 {
  10. WatchLogger.shared.log("⌚️ Bolus request aborted: session unreachable")
  11. return
  12. }
  13. WatchLogger.shared.log("⌚️ Sending bolus request: \(amount)U")
  14. let message: [String: Any] = [
  15. WatchMessageKeys.bolus: amount
  16. ]
  17. session.sendMessage(message, replyHandler: nil) { error in
  18. WatchLogger.shared.log("Error sending bolus request: \(error.localizedDescription)")
  19. }
  20. // Display pending communication animation
  21. showCommsAnimation = true
  22. WatchLogger.shared.log("⌚️ showCommsAnimation = true")
  23. }
  24. /// Sends a carbohydrate entry request to the paired iPhone
  25. /// - Parameters:
  26. /// - amount: The amount of carbs in grams
  27. /// - date: The timestamp for the carb entry (defaults to current time)
  28. func sendCarbsRequest(_ amount: Int, _ date: Date = Date()) {
  29. guard let session = session, session.isReachable else {
  30. WatchLogger.shared.log("⌚️ Carbs request aborted: session unreachable")
  31. return
  32. }
  33. WatchLogger.shared.log("⌚️ Sending carbs request: \(amount)g at \(date)")
  34. let message: [String: Any] = [
  35. WatchMessageKeys.carbs: amount,
  36. WatchMessageKeys.date: date.timeIntervalSince1970
  37. ]
  38. session.sendMessage(message, replyHandler: nil) { error in
  39. WatchLogger.shared.log("Error sending carbs request: \(error.localizedDescription)")
  40. }
  41. // Display pending communication animation
  42. showCommsAnimation = true
  43. WatchLogger.shared.log("⌚️ showCommsAnimation = true")
  44. }
  45. /// Sends a request to cancel the current override preset to the paired iPhone
  46. func sendCancelOverrideRequest() {
  47. guard let session = session, session.isReachable else {
  48. WatchLogger.shared.log("⌚️ Cancel override request aborted: session unreachable")
  49. return
  50. }
  51. WatchLogger.shared.log("⌚️ Sending cancel override request")
  52. let message: [String: Any] = [
  53. WatchMessageKeys.cancelOverride: true
  54. ]
  55. session.sendMessage(message, replyHandler: nil) { error in
  56. WatchLogger.shared.log("⌚️ Error sending cancel override request: \(error.localizedDescription)")
  57. }
  58. // Display pending communication animation
  59. showCommsAnimation = true
  60. WatchLogger.shared.log("⌚️ showCommsAnimation = true")
  61. }
  62. /// Sends a request to activate an override preset to the paired iPhone
  63. /// - Parameter presetName: The name of the override preset to activate
  64. func sendActivateOverrideRequest(presetName: String) {
  65. guard let session = session, session.isReachable else {
  66. WatchLogger.shared.log("⌚️ Activate override request aborted: session unreachable")
  67. return
  68. }
  69. WatchLogger.shared.log("⌚️ Sending activate override request for preset: \(presetName)")
  70. let message: [String: Any] = [
  71. WatchMessageKeys.activateOverride: presetName
  72. ]
  73. session.sendMessage(message, replyHandler: nil) { error in
  74. WatchLogger.shared.log("⌚️ Error sending activate override request: \(error.localizedDescription)")
  75. }
  76. // Display pending communication animation
  77. showCommsAnimation = true
  78. WatchLogger.shared.log("⌚️ 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 {
  83. WatchLogger.shared.log("⌚️ Cancel temp target request aborted: session unreachable")
  84. return
  85. }
  86. WatchLogger.shared.log("⌚️ Sending cancel temp target request")
  87. let message: [String: Any] = [
  88. WatchMessageKeys.cancelTempTarget: true
  89. ]
  90. session.sendMessage(message, replyHandler: nil) { error in
  91. WatchLogger.shared.log("⌚️ Error sending cancel temp target request: \(error.localizedDescription)")
  92. }
  93. // Display pending communication animation
  94. showCommsAnimation = true
  95. WatchLogger.shared.log("⌚️ showCommsAnimation = true")
  96. }
  97. /// Sends a request to activate a temporary target preset to the paired iPhone
  98. /// - Parameter presetName: The name of the temporary target preset to activate
  99. func sendActivateTempTargetRequest(presetName: String) {
  100. guard let session = session, session.isReachable else {
  101. WatchLogger.shared.log("⌚️ Activate temp target request aborted: session unreachable")
  102. return
  103. }
  104. WatchLogger.shared.log("⌚️ Sending activate temp target request for preset: \(presetName)")
  105. let message: [String: Any] = [
  106. WatchMessageKeys.activateTempTarget: presetName
  107. ]
  108. session.sendMessage(message, replyHandler: nil) { error in
  109. WatchLogger.shared.log("⌚️ Error sending activate temp target request: \(error.localizedDescription)")
  110. }
  111. // Display pending communication animation
  112. showCommsAnimation = true
  113. WatchLogger.shared.log("⌚️ showCommsAnimation = true")
  114. }
  115. /// Sends a request to calculate a bolus recommendation based on the current carbs amount
  116. func requestBolusRecommendation() {
  117. guard let session = session, session.isReachable else {
  118. WatchLogger.shared.log("⌚️ Bolus recommendation request aborted: session unreachable")
  119. return
  120. }
  121. WatchLogger.shared.log("⌚️ Requesting bolus recommendation for carbs: \(carbsAmount)")
  122. let message: [String: Any] = [
  123. WatchMessageKeys.requestBolusRecommendation: true,
  124. WatchMessageKeys.carbs: carbsAmount
  125. ]
  126. session.sendMessage(message, replyHandler: nil) { error in
  127. WatchLogger.shared.log("Error requesting bolus recommendation: \(error.localizedDescription)")
  128. }
  129. }
  130. func requestWatchStateUpdate() {
  131. guard let session = session else {
  132. WatchLogger.shared.log("⌚️ No session available for state update")
  133. return
  134. }
  135. guard session.activationState == .activated else {
  136. WatchLogger.shared.log("⌚️ Session not activated. Activating...")
  137. session.activate()
  138. return
  139. }
  140. if session.isReachable {
  141. WatchLogger.shared.log("⌚️ Requesting WatchState update from iPhone")
  142. let message = [WatchMessageKeys.requestWatchUpdate: WatchMessageKeys.watchState]
  143. session.sendMessage(message, replyHandler: nil) { error in
  144. WatchLogger.shared.log("⌚️ Error requesting WatchState update: \(error.localizedDescription)")
  145. }
  146. } else {
  147. WatchLogger.shared.log("⌚️ Phone not reachable for WatchState update")
  148. }
  149. }
  150. }