@@ -1050,6 +1050,33 @@ extension OmniBLEPumpManager {
10501050 }
10511051 }
10521052
1053+ // Will execute a getStatus command if the pod is not connected, the last delivery statusreceived is invalid,
1054+ // or there is an unacknowledged command. If the getStatus fails, returns its error that can be passed on the
1055+ // higher level instead of having to return a potentially inappropriate error when using uncertain pod status.
1056+ // Returns nil if comms looks OK or a getStatus was successful executed or the getStatus error on failure.
1057+ private func tryToValidateComms( session: PodCommsSession ) -> LocalizedError ? {
1058+
1059+ // If we're connected, have a valid delivery status, and there is not an unacknowledged command, we're all good to go
1060+ if isConnected && self . state. podState? . lastDeliveryStatusReceived != nil && self . state. podState? . unacknowledgedCommand == nil {
1061+ return nil
1062+ }
1063+
1064+ // Attempt to do a getStatus to try to resolve any outstanding comms issues
1065+ do {
1066+ let _ = try session. getStatus ( )
1067+ // Paranoid debug testing as the successful getStatus should have set the last delivery status and handled any unacknowledged command.
1068+ if self . state. podState? . lastDeliveryStatusReceived == nil || self . state. podState? . unacknowledgedCommand != nil {
1069+ self . log. error ( " ### tryToValidateComms getStatus successful, but still have no last delivery status or an unacknowledged command! " )
1070+ } else {
1071+ self . log. debug ( " ### tryToValidateComms getStatus resolved all pending comms issues " )
1072+ }
1073+ return nil
1074+ } catch let error {
1075+ self . log. debug ( " ### tryToValidateComms getStatus failed, returning: %@ " , error. localizedDescription)
1076+ return error as? LocalizedError
1077+ }
1078+ }
1079+
10531080 // MARK: - Pump Commands
10541081
10551082 public func getPodStatus( completion: ( ( _ result: PumpManagerResult < StatusResponse > ) -> Void ) ? = nil ) {
@@ -1163,6 +1190,11 @@ extension OmniBLEPumpManager {
11631190 switch result {
11641191 case . success( let session) :
11651192 do {
1193+ if let error = self . tryToValidateComms ( session: session) {
1194+ completion ( . state( error) )
1195+ return
1196+ }
1197+
11661198 let beep = self . silencePod ? false : self . beepPreference. shouldBeepForManualCommand
11671199 let _ = try session. setTime ( timeZone: timeZone, basalSchedule: self . state. basalSchedule, date: Date ( ) , acknowledgementBeep: beep)
11681200 self . clearSuspendReminder ( )
@@ -1216,6 +1248,11 @@ extension OmniBLEPumpManager {
12161248 do {
12171249 switch result {
12181250 case . success( let session) :
1251+ if let error = self . tryToValidateComms ( session: session) {
1252+ completion ( error)
1253+ return
1254+ }
1255+
12191256 let scheduleOffset = timeZone. scheduleOffset ( forDate: Date ( ) )
12201257 let result = session. cancelDelivery ( deliveryType: . all)
12211258 switch result {
@@ -1454,6 +1491,11 @@ extension OmniBLEPumpManager {
14541491 self . podComms. runSession ( withName: name) { ( result) in
14551492 switch result {
14561493 case . success( let session) :
1494+ if let error = self . tryToValidateComms ( session: session) {
1495+ completion ( . communication( error) )
1496+ return
1497+ }
1498+
14571499 // enable/disable Pod completion beep state for any unfinalized manual insulin delivery
14581500 let enabled = newPreference. shouldBeepForManualCommand
14591501 let beepType : BeepType = enabled ? . bipBip : . noBeepNonCancel
@@ -1504,6 +1546,11 @@ extension OmniBLEPumpManager {
15041546 return
15051547 }
15061548
1549+ if let error = self . tryToValidateComms ( session: session) {
1550+ completion ( . state( error) )
1551+ return
1552+ }
1553+
15071554 guard let configuredAlerts = self . state. podState? . configuredAlerts,
15081555 let activeAlertSlots = self . state. podState? . activeAlertSlots,
15091556 let reservoirLevel = self . state. podState? . lastInsulinMeasurements? . reservoirLevel? . rawValue else
@@ -1707,6 +1754,11 @@ extension OmniBLEPumpManager: PumpManager {
17071754 state. suspendEngageState = . engaging
17081755 } )
17091756
1757+ if let error = self . tryToValidateComms ( session: session) {
1758+ completion ( error)
1759+ return
1760+ }
1761+
17101762 // Use a beepBlock for the confirmation beep to avoid getting 3 beeps using cancel command beeps!
17111763 let beepBlock = self . beepMessageBlock ( beepType: . beeeeeep)
17121764 let result = session. suspendDelivery ( suspendReminder: suspendReminder, silent: self . silencePod, beepBlock: beepBlock)
@@ -1753,6 +1805,11 @@ extension OmniBLEPumpManager: PumpManager {
17531805 state. suspendEngageState = . disengaging
17541806 } )
17551807
1808+ if let error = self . tryToValidateComms ( session: session) {
1809+ completion ( error)
1810+ return
1811+ }
1812+
17561813 do {
17571814 let scheduleOffset = self . state. timeZone. scheduleOffset ( forDate: Date ( ) )
17581815 let beep = self . silencePod ? false : self . beepPreference. shouldBeepForManualCommand
@@ -1848,7 +1905,14 @@ extension OmniBLEPumpManager: PumpManager {
18481905 state. bolusEngageState = . engaging
18491906 } )
18501907
1851- guard let podState = self . state. podState, !podState. isSuspended && podState. lastDeliveryStatusReceived? . suspended == false else {
1908+ if let error = self . tryToValidateComms ( session: session) {
1909+ completion ( . deviceState( error) )
1910+ return
1911+ }
1912+
1913+ // Use a lastDeliveryStatusReceived?.suspended != true test here to not return a pod suspended failure if
1914+ // there is not a valid last delivery status (which shouldn't even happen now with tryToValidateComms()).
1915+ guard let podState = self . state. podState, !podState. isSuspended && podState. lastDeliveryStatusReceived? . suspended != true else {
18521916 self . log. info ( " Not enacting bolus because podState or last status received indicates pod is suspended " )
18531917 completion ( . deviceState( PodCommsError . podSuspended) )
18541918 return
@@ -1989,7 +2053,14 @@ extension OmniBLEPumpManager: PumpManager {
19892053 return
19902054 }
19912055
1992- guard let podState = self . state. podState, !podState. isSuspended && podState. lastDeliveryStatusReceived? . suspended == false else {
2056+ if let error = self . tryToValidateComms ( session: session) {
2057+ completion ( . deviceState( PumpManagerError . deviceState ( error) ) )
2058+ return
2059+ }
2060+
2061+ // Use a lastDeliveryStatusReceived?.suspended != true test here to not return a pod suspended failure if
2062+ // there is not a valid last delivery status (which shouldn't even happen now with tryToValidateComms()).
2063+ guard let podState = self . state. podState, !podState. isSuspended && podState. lastDeliveryStatusReceived? . suspended != true else {
19932064 self . log. info ( " Not enacting temp basal because podState or last status received indicates pod is suspended " )
19942065 completion ( . deviceState( PodCommsError . podSuspended) )
19952066 return
0 commit comments