| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269 |
- import Foundation
- import WatchConnectivity
- // MARK: - Send Data to Phone
- extension WatchState {
- /// Sends a bolus insulin request to the paired iPhone
- /// - Parameters:
- /// - amount: The insulin amount to be delivered
- func sendBolusRequest(_ amount: Decimal) {
- guard let session = session, session.isReachable else {
- Task {
- await WatchLogger.shared.log("⌚️ Bolus request aborted: session unreachable")
- }
- return
- }
- Task {
- await WatchLogger.shared.log("⌚️ Sending bolus request: \(amount)U")
- }
- let message: [String: Any] = [
- WatchMessageKeys.bolus: amount
- ]
- session.sendMessage(message, replyHandler: nil) { error in
- Task {
- await WatchLogger.shared.log("Error sending bolus request: \(error)")
- }
- }
- // Display pending communication animation
- showCommsAnimation = true
- Task {
- await WatchLogger.shared.log("⌚️ showCommsAnimation = true")
- }
- }
- /// Sends a carbohydrate entry request to the paired iPhone
- /// - Parameters:
- /// - amount: The amount of carbs in grams
- /// - date: The timestamp for the carb entry (defaults to current time)
- func sendCarbsRequest(_ amount: Int, _ date: Date = Date()) {
- guard let session = session, session.isReachable else {
- Task {
- await WatchLogger.shared.log("⌚️ Carbs request aborted: session unreachable")
- }
- return
- }
- Task {
- await WatchLogger.shared.log("⌚️ Sending carbs request: \(amount)g at \(date)")
- }
- let message: [String: Any] = [
- WatchMessageKeys.carbs: amount,
- WatchMessageKeys.date: date.timeIntervalSince1970
- ]
- session.sendMessage(message, replyHandler: nil) { error in
- Task {
- await WatchLogger.shared.log("Error sending carbs request: \(error)")
- await WatchLogger.shared.log("⌚️ Saving logs to disk as fallback!")
- await WatchLogger.shared.persistLogsLocally()
- }
- }
- // Display pending communication animation
- showCommsAnimation = true
- Task {
- await WatchLogger.shared.log("⌚️ showCommsAnimation = true")
- }
- }
- /// Sends a request to cancel the current override preset to the paired iPhone
- func sendCancelOverrideRequest() {
- guard let session = session, session.isReachable else {
- Task {
- await WatchLogger.shared.log("⌚️ Cancel override request aborted: session unreachable")
- }
- return
- }
- Task {
- await WatchLogger.shared.log("⌚️ Sending cancel override request")
- }
- let message: [String: Any] = [
- WatchMessageKeys.cancelOverride: true
- ]
- session.sendMessage(message, replyHandler: nil) { error in
- Task {
- await WatchLogger.shared.log("⌚️ Error sending cancel override request: \(error)")
- await WatchLogger.shared.log("⌚️ Saving logs to disk as fallback!")
- await WatchLogger.shared.persistLogsLocally()
- }
- }
- // Display pending communication animation
- showCommsAnimation = true
- Task {
- await WatchLogger.shared.log("⌚️ showCommsAnimation = true")
- }
- }
- /// Sends a request to activate an override preset to the paired iPhone
- /// - Parameter presetName: The name of the override preset to activate
- func sendActivateOverrideRequest(presetName: String) {
- guard let session = session, session.isReachable else {
- Task {
- await WatchLogger.shared.log("⌚️ Activate override request aborted: session unreachable")
- }
- return
- }
- Task {
- await WatchLogger.shared.log("⌚️ Sending activate override request for preset: \(presetName)")
- }
- let message: [String: Any] = [
- WatchMessageKeys.activateOverride: presetName
- ]
- session.sendMessage(message, replyHandler: nil) { error in
- Task {
- await WatchLogger.shared.log("⌚️ Error sending activate override request: \(error)")
- await WatchLogger.shared.log("⌚️ Saving logs to disk as fallback!")
- await WatchLogger.shared.persistLogsLocally()
- }
- }
- // Display pending communication animation
- showCommsAnimation = true
- Task {
- await WatchLogger.shared.log("⌚️ showCommsAnimation = true")
- }
- }
- /// Sends a request to cancel the current temporary target to the paired iPhone
- func sendCancelTempTargetRequest() {
- guard let session = session, session.isReachable else {
- Task {
- await WatchLogger.shared.log("⌚️ Cancel temp target request aborted: session unreachable")
- }
- return
- }
- Task {
- await WatchLogger.shared.log("⌚️ Sending cancel temp target request")
- }
- let message: [String: Any] = [
- WatchMessageKeys.cancelTempTarget: true
- ]
- session.sendMessage(message, replyHandler: nil) { error in
- Task {
- await WatchLogger.shared.log("⌚️ Error sending cancel temp target request: \(error)")
- await WatchLogger.shared.log("⌚️ Saving logs to disk as fallback!")
- await WatchLogger.shared.persistLogsLocally()
- }
- }
- // Display pending communication animation
- showCommsAnimation = true
- Task {
- await WatchLogger.shared.log("⌚️ showCommsAnimation = true")
- }
- }
- /// Sends a request to activate a temporary target preset to the paired iPhone
- /// - Parameter presetName: The name of the temporary target preset to activate
- func sendActivateTempTargetRequest(presetName: String) {
- guard let session = session, session.isReachable else {
- Task {
- await WatchLogger.shared.log("⌚️ Activate temp target request aborted: session unreachable")
- }
- return
- }
- Task {
- await WatchLogger.shared.log("⌚️ Sending activate temp target request for preset: \(presetName)")
- }
- let message: [String: Any] = [
- WatchMessageKeys.activateTempTarget: presetName
- ]
- session.sendMessage(message, replyHandler: nil) { error in
- Task {
- await WatchLogger.shared.log("⌚️ Error sending activate temp target request: \(error)")
- await WatchLogger.shared.log("⌚️ Saving logs to disk as fallback!")
- await WatchLogger.shared.persistLogsLocally()
- }
- }
- // Display pending communication animation
- showCommsAnimation = true
- Task {
- await WatchLogger.shared.log("⌚️ showCommsAnimation = true")
- }
- }
- /// Sends a request to calculate a bolus recommendation based on the current carbs amount
- func requestBolusRecommendation() {
- guard let session = session, session.isReachable else {
- Task {
- await WatchLogger.shared.log("⌚️ Bolus recommendation request aborted: session unreachable")
- }
- return
- }
- Task {
- await WatchLogger.shared.log("⌚️ Requesting bolus recommendation for carbs: \(carbsAmount)")
- }
- let message: [String: Any] = [
- WatchMessageKeys.requestBolusRecommendation: true,
- WatchMessageKeys.carbs: carbsAmount
- ]
- session.sendMessage(message, replyHandler: nil) { error in
- Task {
- await WatchLogger.shared.log("Error requesting bolus recommendation: \(error)")
- await WatchLogger.shared.log("⌚️ Saving logs to disk as fallback!")
- await WatchLogger.shared.persistLogsLocally()
- }
- }
- }
- func requestWatchStateUpdate() {
- guard let session = session else {
- Task {
- await WatchLogger.shared.log("⌚️ No session available for state update")
- }
- return
- }
- guard session.activationState == .activated else {
- Task {
- await WatchLogger.shared.log("⌚️ Session not activated. Activating...")
- }
- session.activate()
- return
- }
- if session.isReachable {
- Task {
- await WatchLogger.shared.log("⌚️ Requesting WatchState update from iPhone")
- }
- let message = [WatchMessageKeys.requestWatchUpdate: WatchMessageKeys.watchState]
- session.sendMessage(message, replyHandler: nil) { error in
- Task {
- await WatchLogger.shared.log("⌚️ Error requesting WatchState update: \(error)")
- await WatchLogger.shared.log("⌚️ Saving logs to disk as fallback!")
- await WatchLogger.shared.persistLogsLocally()
- }
- }
- } else {
- Task {
- await WatchLogger.shared.log("⌚️ Phone not reachable for WatchState update")
- }
- }
- }
- }
|