From 2905bfba86c30eb5d63834989468686829873bd0 Mon Sep 17 00:00:00 2001 From: Bart Sopers Date: Sun, 8 Dec 2019 17:47:36 +0100 Subject: [PATCH 1/5] Knit in OmnipodManager --- .../plugins/pump/omnipod/comm/OmnipodManager.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 e2c80374a2..4112a0cdfe 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 @@ -200,6 +200,10 @@ public class OmnipodManager { SingleSubject bolusCompletionSubject = SingleSubject.create(); + synchronized (bolusDataLock) { + activeBolusData = new ActiveBolusData(units, startDate, bolusCompletionSubject, disposables); + } + disposables.add(Completable.complete() // .delay(estimatedRemainingBolusDuration.getMillis() + 250, TimeUnit.MILLISECONDS) // .observeOn(AndroidSchedulers.mainThread()) // @@ -229,10 +233,6 @@ public class OmnipodManager { }) .subscribe()); - synchronized (bolusDataLock) { - activeBolusData = new ActiveBolusData(units, startDate, bolusCompletionSubject, disposables); - } - return new BolusCommandResult(commandDeliveryStatus, bolusCompletionSubject); } From 29d12eeb266c8ef59c061f1c15b6f97af737db60 Mon Sep 17 00:00:00 2001 From: Bart Sopers Date: Sun, 8 Dec 2019 18:18:09 +0100 Subject: [PATCH 2/5] Update pump status when it gets assigned; don't schedule on main thread --- .../pump/omnipod/comm/OmnipodManager.java | 12 +++++----- .../driver/comm/AapsOmnipodManager.java | 23 +++++++++++++++---- 2 files changed, 24 insertions(+), 11 deletions(-) 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 4112a0cdfe..c8691273c9 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 @@ -48,8 +48,8 @@ import info.nightscout.androidaps.utils.SP; import io.reactivex.Completable; import io.reactivex.Flowable; import io.reactivex.Single; -import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.schedulers.Schedulers; import io.reactivex.subjects.SingleSubject; public class OmnipodManager { @@ -97,7 +97,7 @@ public class OmnipodManager { return Single.timer(delayInSeconds, TimeUnit.SECONDS) // .map(o -> verifySetupAction(statusResponse -> PrimeAction.updatePrimingStatus(podState, statusResponse), SetupProgress.PRIMING_FINISHED)) // - .observeOn(AndroidSchedulers.mainThread()); + .observeOn(Schedulers.io()); } public synchronized Single insertCannula(BasalSchedule basalSchedule) { @@ -113,7 +113,7 @@ public class OmnipodManager { return Single.timer(delayInSeconds, TimeUnit.SECONDS) // .map(o -> verifySetupAction(statusResponse -> InsertCannulaAction.updateCannulaInsertionStatus(podState, statusResponse), SetupProgress.COMPLETED)) // - .observeOn(AndroidSchedulers.mainThread()); + .observeOn(Schedulers.io()); } public synchronized StatusResponse getPodStatus() { @@ -190,7 +190,7 @@ public class OmnipodManager { long progressReportInterval = estimatedRemainingBolusDuration.getMillis() / numberOfProgressReports; disposables.add(Flowable.intervalRange(0, numberOfProgressReports + 1, 0, progressReportInterval, TimeUnit.MILLISECONDS) // - .observeOn(AndroidSchedulers.mainThread()) // + .observeOn(Schedulers.io()) // .subscribe(count -> { int percentage = (int) ((double) count / numberOfProgressReports * 100); double estimatedUnitsDelivered = activeBolusData == null ? 0 : activeBolusData.estimateUnitsDelivered(); @@ -206,7 +206,7 @@ public class OmnipodManager { disposables.add(Completable.complete() // .delay(estimatedRemainingBolusDuration.getMillis() + 250, TimeUnit.MILLISECONDS) // - .observeOn(AndroidSchedulers.mainThread()) // + .observeOn(Schedulers.io()) // .doOnComplete(() -> { synchronized (bolusDataLock) { for (int i = 0; i < ACTION_VERIFICATION_TRIES; i++) { @@ -220,7 +220,7 @@ public class OmnipodManager { } } catch (Exception ex) { if (isLoggingEnabled()) { - LOG.debug("Ignoring exception in bolus completion verfication", ex); + LOG.debug("Ignoring exception in bolus completion verification", ex); } } } 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 fe2c8d68cf..d9965dcf8a 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 @@ -77,10 +77,24 @@ public class AapsOmnipodManager implements OmnipodCommunicationManagerInterface public AapsOmnipodManager(OmnipodCommunicationService communicationService, PodSessionState podState, OmnipodPumpStatus _pumpStatus) { delegate = new OmnipodManager(communicationService, podState, podSessionState -> { // Handle pod state changes - OmnipodUtil.setPodSessionState(podSessionState); + updatePumpStatus(podSessionState); + }); + this.pumpStatus = _pumpStatus; + instance = this; + } - if (pumpStatus != null) { + private void updatePumpStatus(PodSessionState podSessionState) { + if (pumpStatus != null) { + if (podSessionState == null) { + pumpStatus.ackAlertsText = null; + pumpStatus.ackAlertsAvailable = false; + pumpStatus.lastBolusTime = null; + pumpStatus.lastBolusAmount = null; + pumpStatus.reservoirRemainingUnits = 0.0; + sendEvent(new EventOmnipodAcknowledgeAlertsChanged()); + sendEvent(new EventOmnipodPumpValuesChanged()); + } else { // Update active alerts if (podSessionState.hasActiveAlerts()) { List alerts = translateActiveAlerts(podSessionState); @@ -110,9 +124,7 @@ public class AapsOmnipodManager implements OmnipodCommunicationManagerInterface sendEvent(new EventOmnipodPumpValuesChanged()); } } - }); - this.pumpStatus = _pumpStatus; - instance = this; + } } private static boolean isReservoirStatusUpToDate(OmnipodPumpStatus pumpStatus, Double unitsRemaining) { @@ -300,6 +312,7 @@ public class AapsOmnipodManager implements OmnipodCommunicationManagerInterface public void setPumpStatus(OmnipodPumpStatus pumpStatus) { this.pumpStatus = pumpStatus; this.getCommunicationService().setPumpStatus(pumpStatus); + updatePumpStatus(delegate.getPodState()); } // TODO should we add this to the OmnipodCommunicationManager interface? From 057927d24ec1820216545e10edee08480236f57a Mon Sep 17 00:00:00 2001 From: Bart Sopers Date: Sun, 8 Dec 2019 18:46:51 +0100 Subject: [PATCH 3/5] Ignore PodFaultException when deactivating pod --- .../plugins/pump/omnipod/comm/OmnipodManager.java | 9 ++++++++- .../plugins/pump/omnipod/defs/FaultEventCode.java | 7 +++++++ .../pump/omnipod/exception/PodFaultException.java | 5 +---- 3 files changed, 16 insertions(+), 5 deletions(-) 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 c8691273c9..7fef20c81b 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 @@ -43,6 +43,7 @@ import info.nightscout.androidaps.plugins.pump.omnipod.exception.IllegalDelivery import info.nightscout.androidaps.plugins.pump.omnipod.exception.IllegalSetupProgressException; import info.nightscout.androidaps.plugins.pump.omnipod.exception.NonceOutOfSyncException; import info.nightscout.androidaps.plugins.pump.omnipod.exception.OmnipodException; +import info.nightscout.androidaps.plugins.pump.omnipod.exception.PodFaultException; import info.nightscout.androidaps.plugins.pump.omnipod.util.OmnipodConst; import info.nightscout.androidaps.utils.SP; import io.reactivex.Completable; @@ -286,7 +287,13 @@ public class OmnipodManager { throw new IllegalSetupProgressException(SetupProgress.ADDRESS_ASSIGNED, null); } - executeAndVerify(() -> communicationService.executeAction(new DeactivatePodAction(podState, acknowledgementBeep))); + try { + executeAndVerify(() -> communicationService.executeAction(new DeactivatePodAction(podState, acknowledgementBeep))); + } catch (PodFaultException ex) { + if (isLoggingEnabled()) { + LOG.info("Ignoring PodFaultException in deactivatePod", ex); + } + } resetPodState(); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/defs/FaultEventCode.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/defs/FaultEventCode.java index 048c9c4804..df17fd0b5c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/defs/FaultEventCode.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/defs/FaultEventCode.java @@ -1,5 +1,7 @@ package info.nightscout.androidaps.plugins.pump.omnipod.defs; +import java.util.Locale; + public enum FaultEventCode { NO_FAULTS((byte) 0x00), FAILED_FLASH_ERASE((byte) 0x01), @@ -138,4 +140,9 @@ public enum FaultEventCode { public byte getValue() { return value; } + + @Override + public String toString() { + return String.format(Locale.getDefault(), "Pod fault (%d): %s", value, name()); + } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/exception/PodFaultException.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/exception/PodFaultException.java index bddc5738ca..0a90b5d092 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/exception/PodFaultException.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/exception/PodFaultException.java @@ -1,15 +1,12 @@ package info.nightscout.androidaps.plugins.pump.omnipod.exception; -import java.util.Locale; - import info.nightscout.androidaps.plugins.pump.omnipod.comm.message.response.podinfo.PodInfoFaultEvent; public class PodFaultException extends OmnipodException { private final PodInfoFaultEvent faultEvent; public PodFaultException(PodInfoFaultEvent faultEvent) { - super(String.format(Locale.getDefault(), "Pod fault (%d): %s", faultEvent.getFaultEventCode().getValue(), - faultEvent.getFaultEventCode().toString()), true); + super(faultEvent.getFaultEventCode().toString(), true); this.faultEvent = faultEvent; } From e350856161fabcdd9183ee1722a8c85c4b6ebe8b Mon Sep 17 00:00:00 2001 From: Bart Sopers Date: Sun, 8 Dec 2019 18:53:45 +0100 Subject: [PATCH 4/5] Don't emit acknowledgement beeps when cancelling delivery before deactivating pod --- .../androidaps/plugins/pump/omnipod/comm/OmnipodManager.java | 5 +++-- .../plugins/pump/omnipod/driver/comm/AapsOmnipodManager.java | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) 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 7fef20c81b..bf30b73033 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 @@ -282,13 +282,14 @@ public class OmnipodManager { resumeDelivery(acknowledgementBeeps); } - public synchronized void deactivatePod(boolean acknowledgementBeep) { + public synchronized void deactivatePod() { if (podState == null) { throw new IllegalSetupProgressException(SetupProgress.ADDRESS_ASSIGNED, null); } try { - executeAndVerify(() -> communicationService.executeAction(new DeactivatePodAction(podState, acknowledgementBeep))); + // Never send acknowledgement beeps here. Matches the PDM's behavior + executeAndVerify(() -> communicationService.executeAction(new DeactivatePodAction(podState, false))); } catch (PodFaultException ex) { if (isLoggingEnabled()) { LOG.info("Ignoring PodFaultException in deactivatePod", ex); 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 d9965dcf8a..be587b8890 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 @@ -182,7 +182,7 @@ public class AapsOmnipodManager implements OmnipodCommunicationManagerInterface @Override public PumpEnactResult deactivatePod(PodInitReceiver podInitReceiver) { try { - delegate.deactivatePod(true); + delegate.deactivatePod(); } catch (Exception ex) { String comment = handleAndTranslateException(ex); podInitReceiver.returnInitTaskStatus(PodInitActionType.DeactivatePodWizardStep, false, comment); From 4beb62700b6cb1101993664b1c062024c5a0a1bc Mon Sep 17 00:00:00 2001 From: Bart Sopers Date: Sun, 8 Dec 2019 19:10:12 +0100 Subject: [PATCH 5/5] Ignore PodFaultException in cancelBolus --- .../plugins/pump/omnipod/comm/OmnipodManager.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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 bf30b73033..442a12e176 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 @@ -245,7 +245,13 @@ public class OmnipodManager { throw new IllegalDeliveryStatusException(DeliveryStatus.BOLUS_IN_PROGRESS, podState.getLastDeliveryStatus()); } - executeAndVerify(() -> communicationService.executeAction(new CancelDeliveryAction(podState, DeliveryType.BOLUS, acknowledgementBeep))); + try { + executeAndVerify(() -> communicationService.executeAction(new CancelDeliveryAction(podState, DeliveryType.BOLUS, acknowledgementBeep))); + } catch (PodFaultException ex) { + if (isLoggingEnabled()) { + LOG.info("Ignoring PodFaultException in cancelBolus", ex); + } + } activeBolusData.getDisposables().dispose(); activeBolusData.getBolusCompletionSubject().onSuccess(new BolusDeliveryResult(activeBolusData.estimateUnitsDelivered()));