WatchState+Requests.swift 8.2 KB

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