WatchState+Requests.swift 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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. WatchMessageKeys.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. WatchMessageKeys.carbs: amount,
  29. WatchMessageKeys.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 request to cancel the current override preset to the paired iPhone
  38. func sendCancelOverrideRequest() {
  39. guard let session = session, session.isReachable else { return }
  40. let message: [String: Any] = [
  41. WatchMessageKeys.cancelOverride: true
  42. ]
  43. session.sendMessage(message, replyHandler: nil) { error in
  44. print("⌚️ Error sending cancel override request: \(error.localizedDescription)")
  45. }
  46. // Display pending communication animation
  47. showCommsAnimation = true
  48. }
  49. /// Sends a request to activate an override preset to the paired iPhone
  50. /// - Parameter presetName: The name of the override preset to activate
  51. func sendActivateOverrideRequest(presetName: String) {
  52. guard let session = session, session.isReachable else { return }
  53. let message: [String: Any] = [
  54. WatchMessageKeys.activateOverride: presetName
  55. ]
  56. session.sendMessage(message, replyHandler: nil) { error in
  57. print("⌚️ Error sending activate override request: \(error.localizedDescription)")
  58. }
  59. // Display pending communication animation
  60. showCommsAnimation = true
  61. }
  62. /// Sends a request to cancel the current temporary target to the paired iPhone
  63. func sendCancelTempTargetRequest() {
  64. guard let session = session, session.isReachable else { return }
  65. let message: [String: Any] = [
  66. WatchMessageKeys.cancelTempTarget: true
  67. ]
  68. session.sendMessage(message, replyHandler: nil) { error in
  69. print("⌚️ Error sending cancel temp target request: \(error.localizedDescription)")
  70. }
  71. // Display pending communication animation
  72. showCommsAnimation = true
  73. }
  74. /// Sends a request to activate a temporary target preset to the paired iPhone
  75. /// - Parameter presetName: The name of the temporary target preset to activate
  76. func sendActivateTempTargetRequest(presetName: String) {
  77. guard let session = session, session.isReachable else { return }
  78. let message: [String: Any] = [
  79. WatchMessageKeys.activateTempTarget: presetName
  80. ]
  81. session.sendMessage(message, replyHandler: nil) { error in
  82. print("⌚️ Error sending activate temp target request: \(error.localizedDescription)")
  83. }
  84. // Display pending communication animation
  85. showCommsAnimation = true
  86. }
  87. /// Sends a request to cancel the current bolus delivery to the paired iPhone
  88. func sendCancelBolusRequest() {
  89. isBolusCanceled = true
  90. guard let session = session, session.isReachable else { return }
  91. let message: [String: Any] = [
  92. WatchMessageKeys.cancelBolus: true
  93. ]
  94. session.sendMessage(message, replyHandler: nil) { error in
  95. print("Error sending cancel bolus request: \(error.localizedDescription)")
  96. }
  97. // Reset when cancelled
  98. bolusProgress = 0
  99. activeBolusAmount = 0
  100. // Display pending communication animation
  101. showCommsAnimation = true
  102. }
  103. /// Sends a request to calculate a bolus recommendation based on the current carbs amount
  104. func requestBolusRecommendation() {
  105. guard let session = session, session.isReachable else { return }
  106. let message: [String: Any] = [
  107. WatchMessageKeys.requestBolusRecommendation: true,
  108. WatchMessageKeys.carbs: carbsAmount
  109. ]
  110. session.sendMessage(message, replyHandler: nil) { error in
  111. print("Error requesting bolus recommendation: \(error.localizedDescription)")
  112. }
  113. if bolusAmount == 0 {
  114. showBolusCalculationProgress = true
  115. }
  116. }
  117. func requestWatchStateUpdate() {
  118. guard let session = session, session.activationState == .activated else {
  119. print("⌚️ Session not activated, activating...")
  120. session?.activate()
  121. return
  122. }
  123. if session.isReachable {
  124. print("⌚️ Request an update for watch state from Trio iPhone app...")
  125. let message = [WatchMessageKeys.requestWatchUpdate: WatchMessageKeys.watchState]
  126. session.sendMessage(message, replyHandler: nil) { error in
  127. print("⌚️ Update request for fresh watch state data: \(error.localizedDescription)")
  128. }
  129. } else {
  130. print("⌚️ Phone not reachable for watch state update")
  131. }
  132. }
  133. }