From b482f0690f392d491ef96d869f08cc24a5f68af0 Mon Sep 17 00:00:00 2001 From: Bart Sopers Date: Wed, 29 Apr 2020 00:01:11 +0200 Subject: [PATCH] WIP on always retrying 0x07 and 0x03 messages together --- .../pump/omnipod/comm/OmnipodManager.java | 19 ++++++++++++------- .../comm/action/AssignAddressAction.java | 17 +++++++++++------ .../omnipod/comm/action/SetupPodAction.java | 8 ++++++++ .../IllegalVersionResponseTypeException.java | 9 +++++++++ .../driver/comm/AapsOmnipodManager.java | 5 ++++- 5 files changed, 44 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/comm/exception/IllegalVersionResponseTypeException.java diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/comm/OmnipodManager.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/comm/OmnipodManager.java index 4e64ef6092..0c30d2f6c4 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/comm/OmnipodManager.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/comm/OmnipodManager.java @@ -7,6 +7,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.EnumSet; +import java.util.Random; import java.util.TimeZone; import java.util.concurrent.TimeUnit; @@ -81,19 +82,18 @@ public class OmnipodManager { this(communicationService, podState, null); } - public synchronized Single pairAndPrime() { + public synchronized Single pairAndPrime(int address) { logStartingCommandExecution("pairAndPrime"); try { - if (podState == null) { + if (podState == null || podState.getSetupProgress().isBefore(SetupProgress.POD_CONFIGURED)) { + // Always send both 0x07 and 0x03 on retries podState = communicationService.executeAction( - new AssignAddressAction(podStateChangedHandler)); - } else if (SetupProgress.PRIMING.isBefore(podState.getSetupProgress())) { - throw new IllegalSetupProgressException(SetupProgress.ADDRESS_ASSIGNED, podState.getSetupProgress()); - } + new AssignAddressAction(podStateChangedHandler, address)); - if (SetupProgress.ADDRESS_ASSIGNED.equals(podState.getSetupProgress())) { communicationService.executeAction(new SetupPodAction(podState)); + } else if (SetupProgress.PRIMING.isBefore(podState.getSetupProgress())) { + throw new IllegalSetupProgressException(SetupProgress.POD_CONFIGURED, podState.getSetupProgress()); } communicationService.executeAction(new PrimeAction(new PrimeService(), podState)); @@ -592,6 +592,11 @@ public class OmnipodManager { return ex instanceof OmnipodException && ((OmnipodException) ex).isCertainFailure(); } + public static int generateRandomAddress() { + // Create random address with 20 bits to match PDM, could easily use 24 bits instead + return 0x1f000000 | (new Random().nextInt() & 0x000fffff); + } + public static class BolusCommandResult { private final CommandDeliveryStatus commandDeliveryStatus; private final SingleSubject deliveryResultSubject; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/comm/action/AssignAddressAction.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/comm/action/AssignAddressAction.java index 09b096f78d..01a6180027 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/comm/action/AssignAddressAction.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/comm/action/AssignAddressAction.java @@ -6,6 +6,8 @@ import java.util.Collections; import java.util.Random; import info.nightscout.androidaps.plugins.pump.omnipod.comm.OmnipodCommunicationService; +import info.nightscout.androidaps.plugins.pump.omnipod.comm.exception.IllegalMessageAddressException; +import info.nightscout.androidaps.plugins.pump.omnipod.comm.exception.IllegalVersionResponseTypeException; import info.nightscout.androidaps.plugins.pump.omnipod.comm.message.OmnipodMessage; import info.nightscout.androidaps.plugins.pump.omnipod.comm.message.command.AssignAddressCommand; import info.nightscout.androidaps.plugins.pump.omnipod.comm.message.response.VersionResponse; @@ -18,15 +20,11 @@ public class AssignAddressAction implements OmnipodAction { private final int address; private final PodStateChangedHandler podStateChangedHandler; - public AssignAddressAction(PodStateChangedHandler podStateChangedHandler) { - this.address = generateRandomAddress(); + public AssignAddressAction(PodStateChangedHandler podStateChangedHandler, int address) { + this.address = address; this.podStateChangedHandler = podStateChangedHandler; } - private static int generateRandomAddress() { - return 0x1f000000 | (new Random().nextInt() & 0x000fffff); - } - @Override public PodSessionState execute(OmnipodCommunicationService communicationService) { PodSetupState setupState = new PodSetupState(address, 0x00, 0x00); @@ -38,6 +36,13 @@ public class AssignAddressAction implements OmnipodAction { VersionResponse assignAddressResponse = communicationService.exchangeMessages(VersionResponse.class, setupState, assignAddressMessage, OmnipodConst.DEFAULT_ADDRESS, setupState.getAddress()); + if(!assignAddressResponse.isAssignAddressVersionResponse()) { + throw new IllegalVersionResponseTypeException("assignAddress", "setupPod"); + } + if(assignAddressResponse.getAddress() != address) { + throw new IllegalMessageAddressException(address, assignAddressResponse.getAddress()); + } + DateTimeZone timeZone = DateTimeZone.getDefault(); PodSessionState podState = new PodSessionState(timeZone, address, assignAddressResponse.getPiVersion(), diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/comm/action/SetupPodAction.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/comm/action/SetupPodAction.java index 2a6135e9ab..b6c81196c6 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/comm/action/SetupPodAction.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/comm/action/SetupPodAction.java @@ -5,6 +5,8 @@ import org.joda.time.DateTime; import java.util.Collections; import info.nightscout.androidaps.plugins.pump.omnipod.comm.OmnipodCommunicationService; +import info.nightscout.androidaps.plugins.pump.omnipod.comm.exception.IllegalMessageAddressException; +import info.nightscout.androidaps.plugins.pump.omnipod.comm.exception.IllegalVersionResponseTypeException; import info.nightscout.androidaps.plugins.pump.omnipod.comm.message.OmnipodMessage; import info.nightscout.androidaps.plugins.pump.omnipod.comm.message.command.SetupPodCommand; import info.nightscout.androidaps.plugins.pump.omnipod.comm.message.response.VersionResponse; @@ -48,6 +50,12 @@ public class SetupPodAction implements OmnipodAction { throw ex; } + if(!setupPodResponse.isSetupPodVersionResponse()) { + throw new IllegalVersionResponseTypeException("setupPod", "assignAddress"); + } + if(setupPodResponse.getAddress() != podState.getAddress()) { + throw new IllegalMessageAddressException(podState.getAddress(), setupPodResponse.getAddress()); + } if (setupPodResponse.getPodProgressStatus() != PodProgressStatus.PAIRING_SUCCESS) { throw new IllegalPodProgressException(PodProgressStatus.PAIRING_SUCCESS, setupPodResponse.getPodProgressStatus()); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/comm/exception/IllegalVersionResponseTypeException.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/comm/exception/IllegalVersionResponseTypeException.java new file mode 100644 index 0000000000..0dbe0805d5 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/comm/exception/IllegalVersionResponseTypeException.java @@ -0,0 +1,9 @@ +package info.nightscout.androidaps.plugins.pump.omnipod.comm.exception; + +import info.nightscout.androidaps.plugins.pump.omnipod.exception.OmnipodException; + +public class IllegalVersionResponseTypeException extends OmnipodException { + public IllegalVersionResponseTypeException(String expected, String actual) { + super("Invalid Version Response type. Expected="+ expected +", actual="+ actual, false); + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/comm/AapsOmnipodManager.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/comm/AapsOmnipodManager.java index 34fdce45e0..f8ca563156 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/comm/AapsOmnipodManager.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/comm/AapsOmnipodManager.java @@ -170,7 +170,10 @@ public class AapsOmnipodManager implements OmnipodCommunicationManagerInterface long time = System.currentTimeMillis(); if (PodInitActionType.PairAndPrimeWizardStep.equals(podInitActionType)) { try { - Disposable disposable = delegate.pairAndPrime().subscribe(res -> // + // BS FIXME use static address for retries + int address = OmnipodManager.generateRandomAddress(); + + Disposable disposable = delegate.pairAndPrime(address).subscribe(res -> // handleSetupActionResult(podInitActionType, podInitReceiver, res, time, null)); return new PumpEnactResult().success(true).enacted(true); } catch (Exception ex) {