Skip to content

Commit 7ded2bc

Browse files
committed
fix for pump manager returns bogus podSuspended;
add self.tryToValidateComms to handle uncertain comms; ensure podSuspended is only return when actually suspended
1 parent 1fa2874 commit 7ded2bc

File tree

1 file changed

+73
-2
lines changed

1 file changed

+73
-2
lines changed

OmniBLE/PumpManager/OmniBLEPumpManager.swift

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

Comments
 (0)