Skip to content

Commit 39915b0

Browse files
authored
Merge pull request #49 from LoopKit/try_to_validate_comms
Fix for pump manager returns bogus podSuspended
2 parents 48a35ef + 447caa4 commit 39915b0

File tree

1 file changed

+67
-2
lines changed

1 file changed

+67
-2
lines changed

OmniKit/PumpManager/OmnipodPumpManager.swift

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)