@@ -1003,6 +1003,27 @@ extension OmnipodPumpManager {
10031003 }
10041004 }
10051005
1006+ // If the last delivery status received is invalid or there is an unacknowledged command, execute a getStatus command
1007+ // for the current PodCommsSession. If the getStatus fails, return its error to be passed on to the higher level.
1008+ // Return nil if comms looks OK or the getStatus was successful.
1009+ private func tryToValidateComms( session: PodCommsSession ) -> LocalizedError ? {
1010+
1011+ // Since we're already connected for this session, if we have a delivery status and no unacknowledged command, return nil
1012+ if self . state. podState? . lastDeliveryStatusReceived != nil && self . state. podState? . unacknowledgedCommand == nil {
1013+ return nil
1014+ }
1015+
1016+ // Attempt to do a getStatus to try to resolve any outstanding comms issues
1017+ do {
1018+ let _ = try session. getStatus ( )
1019+ self . log. debug ( " ### tryToValidateComms getStatus resolved all pending comms issues " )
1020+ return nil
1021+ } catch let error {
1022+ self . log. debug ( " ### tryToValidateComms getStatus failed, returning: %@ " , error. localizedDescription)
1023+ return error as? LocalizedError
1024+ }
1025+ }
1026+
10061027 // MARK: - Pump Commands
10071028
10081029 public func getPodStatus( completion: ( ( _ result: PumpManagerResult < StatusResponse > ) -> Void ) ? = nil ) {
@@ -1119,6 +1140,11 @@ extension OmnipodPumpManager {
11191140 switch result {
11201141 case . success( let session) :
11211142 do {
1143+ if let error = self . tryToValidateComms ( session: session) {
1144+ completion ( . communication( error) )
1145+ return
1146+ }
1147+
11221148 let beep = self . silencePod ? false : self . beepPreference. shouldBeepForManualCommand
11231149 let _ = try session. setTime ( timeZone: timeZone, basalSchedule: self . state. basalSchedule, date: Date ( ) , acknowledgementBeep: beep)
11241150 self . setState { ( state) in
@@ -1171,6 +1197,11 @@ extension OmnipodPumpManager {
11711197 do {
11721198 switch result {
11731199 case . success( let session) :
1200+ if let error = self . tryToValidateComms ( session: session) {
1201+ completion ( error)
1202+ return
1203+ }
1204+
11741205 let scheduleOffset = timeZone. scheduleOffset ( forDate: Date ( ) )
11751206 let result = session. cancelDelivery ( deliveryType: . all)
11761207 switch result {
@@ -1415,6 +1446,11 @@ extension OmnipodPumpManager {
14151446 self . podComms. runSession ( withName: name, using: rileyLinkSelector) { ( result) in
14161447 switch result {
14171448 case . success( let session) :
1449+ if let error = self . tryToValidateComms ( session: session) {
1450+ completion ( . communication( error) )
1451+ return
1452+ }
1453+
14181454 // enable/disable Pod completion beep state for any unfinalized manual insulin delivery
14191455 let enabled = newPreference. shouldBeepForManualCommand
14201456 let beepType : BeepType = enabled ? . bipBip : . noBeepNonCancel
@@ -1466,6 +1502,11 @@ extension OmnipodPumpManager {
14661502 return
14671503 }
14681504
1505+ if let error = self . tryToValidateComms ( session: session) {
1506+ completion ( . communication( error) )
1507+ return
1508+ }
1509+
14691510 guard let configuredAlerts = self . state. podState? . configuredAlerts,
14701511 let activeAlertSlots = self . state. podState? . activeAlertSlots,
14711512 let reservoirLevel = self . state. podState? . lastInsulinMeasurements? . reservoirLevel? . rawValue else
@@ -1716,6 +1757,11 @@ extension OmnipodPumpManager: PumpManager {
17161757 state. suspendEngageState = . engaging
17171758 } )
17181759
1760+ if let error = self . tryToValidateComms ( session: session) {
1761+ completion ( error)
1762+ return
1763+ }
1764+
17191765 // Use a beepBlock for the confirmation beep to avoid getting 3 beeps using cancel command beeps!
17201766 let beepBlock = self . beepMessageBlock ( beepType: . beeeeeep)
17211767 let result = session. suspendDelivery ( suspendReminder: suspendReminder, silent: self . silencePod, beepBlock: beepBlock)
@@ -1762,6 +1808,11 @@ extension OmnipodPumpManager: PumpManager {
17621808 state. suspendEngageState = . disengaging
17631809 } )
17641810
1811+ if let error = self . tryToValidateComms ( session: session) {
1812+ completion ( error)
1813+ return
1814+ }
1815+
17651816 do {
17661817 let scheduleOffset = self . state. timeZone. scheduleOffset ( forDate: Date ( ) )
17671818 let beep = self . silencePod ? false : self . beepPreference. shouldBeepForManualCommand
@@ -1870,7 +1921,14 @@ extension OmnipodPumpManager: PumpManager {
18701921 state. bolusEngageState = . engaging
18711922 } )
18721923
1873- guard let podState = self . state. podState, !podState. isSuspended && podState. lastDeliveryStatusReceived? . suspended == false else {
1924+ if let error = self . tryToValidateComms ( session: session) {
1925+ completion ( . communication( error) )
1926+ return
1927+ }
1928+
1929+ // Use a lastDeliveryStatusReceived?.suspended != true test here to not return a pod suspended failure if
1930+ // there is not a valid last delivery status (which shouldn't even happen now with tryToValidateComms()).
1931+ guard let podState = self . state. podState, !podState. isSuspended && podState. lastDeliveryStatusReceived? . suspended != true else {
18741932 self . log. info ( " Not enacting bolus because podState or last status received indicates pod is suspended " )
18751933 completion ( . deviceState( PodCommsError . podSuspended) )
18761934 return
@@ -2009,7 +2067,14 @@ extension OmnipodPumpManager: PumpManager {
20092067 return
20102068 }
20112069
2012- guard let podState = self . state. podState, !podState. isSuspended && podState. lastDeliveryStatusReceived? . suspended == false else {
2070+ if let error = self . tryToValidateComms ( session: session) {
2071+ completion ( . communication( error) )
2072+ return
2073+ }
2074+
2075+ // Use a lastDeliveryStatusReceived?.suspended != true test here to not return a pod suspended failure if
2076+ // there is not a valid last delivery status (which shouldn't even happen now with tryToValidateComms()).
2077+ guard let podState = self . state. podState, !podState. isSuspended && podState. lastDeliveryStatusReceived? . suspended != true else {
20132078 self . log. info ( " Not enacting temp basal because podState or last status received indicates pod is suspended " )
20142079 completion ( . deviceState( PodCommsError . podSuspended) )
20152080 return
0 commit comments