Calculate bolus durations and add bolus completion handler in OmnipodManager
This commit is contained in:
parent
f84149afa4
commit
f2e439a485
|
@ -34,11 +34,12 @@ import info.nightscout.androidaps.plugins.pump.omnipod.defs.PodInfoType;
|
|||
import info.nightscout.androidaps.plugins.pump.omnipod.defs.SetupProgress;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.defs.schedule.BasalSchedule;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.defs.state.PodSessionState;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.exception.IllegalSetupProgressException;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.util.OmnipodConst;
|
||||
import info.nightscout.androidaps.utils.SP;
|
||||
|
||||
public class OmnipodManager {
|
||||
private static final int SETUP_ACTION_VERIFICATION_TRIES = 3;
|
||||
private static final int ACTION_VERIFICATION_TRIES = 3;
|
||||
|
||||
protected final OmnipodCommunicationService communicationService;
|
||||
protected PodSessionState podState;
|
||||
|
@ -64,7 +65,7 @@ public class OmnipodManager {
|
|||
|
||||
executeDelayed(() -> verifySetupAction(statusResponse -> PrimeAction.updatePrimingStatus(podState, statusResponse), //
|
||||
SetupProgress.PRIMING_FINISHED, resultHandler), //
|
||||
OmnipodConst.POD_PRIME_DURATION);
|
||||
calculateBolusDuration(OmnipodConst.POD_PRIME_BOLUS_UNITS, OmnipodConst.POD_PRIMING_DELIVERY_RATE));
|
||||
} else {
|
||||
// TODO use string resource
|
||||
return new PumpEnactResult().success(false).enacted(false).comment("Illegal setup state: " + podState.getSetupProgress().name());
|
||||
|
@ -95,7 +96,7 @@ public class OmnipodManager {
|
|||
|
||||
executeDelayed(() -> verifySetupAction(statusResponse -> InsertCannulaAction.updateCannulaInsertionStatus(podState, statusResponse), //
|
||||
SetupProgress.COMPLETED, resultHandler),
|
||||
OmnipodConst.POD_CANNULA_INSERTION_DURATION);
|
||||
calculateBolusDuration(OmnipodConst.POD_CANNULA_INSERTION_BOLUS_UNITS, OmnipodConst.POD_CANNULA_INSERTION_DELIVERY_RATE));
|
||||
} catch (Exception ex) {
|
||||
// TODO distinguish between certain and uncertain failures
|
||||
// TODO user friendly error messages (string resources)
|
||||
|
@ -121,22 +122,12 @@ public class OmnipodManager {
|
|||
return new PumpEnactResult().success(true).enacted(true);
|
||||
}
|
||||
|
||||
public PumpEnactResult getPodStatus() {
|
||||
public StatusResponse getPodStatus() {
|
||||
if (podState == null) {
|
||||
// TODO use string resource
|
||||
return new PumpEnactResult().success(false).enacted(false).comment("Pod should be paired and primed first");
|
||||
throw new IllegalSetupProgressException(SetupProgress.PRIMING_FINISHED, null);
|
||||
}
|
||||
|
||||
try {
|
||||
// TODO how can we return the status response? Also refer to TODO in interface
|
||||
StatusResponse statusResponse = communicationService.executeAction(new GetStatusAction(podState));
|
||||
} catch (Exception ex) {
|
||||
// TODO distinguish between certain and uncertain failures
|
||||
// TODO user friendly error messages (string resources)
|
||||
return new PumpEnactResult().success(false).enacted(false).comment(ex.getMessage());
|
||||
}
|
||||
|
||||
return new PumpEnactResult().success(true).enacted(true);
|
||||
return communicationService.executeAction(new GetStatusAction(podState));
|
||||
}
|
||||
|
||||
public PumpEnactResult deactivatePod() {
|
||||
|
@ -181,20 +172,36 @@ public class OmnipodManager {
|
|||
return new PumpEnactResult().success(true).enacted(true);
|
||||
}
|
||||
|
||||
public PumpEnactResult bolus(Double units) {
|
||||
public PumpEnactResult bolus(Double units, StatusResponseHandler bolusCompletionHandler) {
|
||||
if (!isInitialized()) {
|
||||
return createNotInitializedResult();
|
||||
}
|
||||
|
||||
try {
|
||||
communicationService.executeAction(new BolusAction(podState, units, true, true));
|
||||
|
||||
if(bolusCompletionHandler != null) {
|
||||
executeDelayed(() -> {
|
||||
for (int i = 0; ACTION_VERIFICATION_TRIES > i; i++) {
|
||||
StatusResponse statusResponse = null;
|
||||
try {
|
||||
statusResponse = getPodStatus();
|
||||
if (statusResponse.getDeliveryStatus().isBolusing()) {
|
||||
break;
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
// Ignore
|
||||
}
|
||||
bolusCompletionHandler.handle(statusResponse);
|
||||
}
|
||||
}, calculateBolusDuration(units, OmnipodConst.POD_BOLUS_DELIVERY_RATE));
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
// TODO distinguish between certain and uncertain failures
|
||||
// TODO user friendly error messages (string resources)
|
||||
return new PumpEnactResult().success(false).enacted(false).comment(ex.getMessage());
|
||||
}
|
||||
|
||||
// TODO calculate bolus duration
|
||||
return new PumpEnactResult().success(true).enacted(true);
|
||||
}
|
||||
|
||||
|
@ -339,6 +346,10 @@ public class OmnipodManager {
|
|||
return podState == null ? "null" : podState.toString();
|
||||
}
|
||||
|
||||
private Duration calculateBolusDuration(double units, double deliveryRate) {
|
||||
return Duration.standardSeconds((long)Math.ceil(units / deliveryRate));
|
||||
}
|
||||
|
||||
private void executeDelayed(Runnable r, Duration timeout) {
|
||||
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
|
||||
scheduledExecutorService.schedule(r, timeout.getMillis(), TimeUnit.MILLISECONDS);
|
||||
|
@ -355,7 +366,7 @@ public class OmnipodManager {
|
|||
|
||||
private void verifySetupAction(StatusResponseHandler statusResponseHandler, SetupProgress expectedSetupProgress, SetupActionResultHandler resultHandler) {
|
||||
SetupActionResult result = null;
|
||||
for (int i = 0; SETUP_ACTION_VERIFICATION_TRIES > i; i++) {
|
||||
for (int i = 0; ACTION_VERIFICATION_TRIES > i; i++) {
|
||||
try {
|
||||
StatusResponse delayedStatusResponse = communicationService.executeAction(new GetStatusAction(podState));
|
||||
statusResponseHandler.handle(delayedStatusResponse);
|
||||
|
@ -376,11 +387,5 @@ public class OmnipodManager {
|
|||
if (resultHandler != null) {
|
||||
resultHandler.handle(result);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
private interface StatusResponseHandler {
|
||||
void handle(StatusResponse podState);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
package info.nightscout.androidaps.plugins.pump.omnipod.comm;
|
||||
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.comm.message.response.StatusResponse;
|
||||
|
||||
@FunctionalInterface
|
||||
public interface StatusResponseHandler {
|
||||
void handle(StatusResponse statusResponse);
|
||||
}
|
|
@ -26,4 +26,8 @@ public enum DeliveryStatus {
|
|||
public byte getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public boolean isBolusing() {
|
||||
return this.equals(BOLUS_IN_PROGRESS) || this.equals(BOLUS_AND_TEMP_BASAL);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,6 +13,7 @@ import info.nightscout.androidaps.plugins.pump.common.data.TempBasalPair;
|
|||
import info.nightscout.androidaps.plugins.pump.omnipod.comm.OmnipodCommunicationService;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.comm.OmnipodManager;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.comm.SetupActionResult;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.comm.message.response.StatusResponse;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.defs.OmnipodCommunicationManagerInterface;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.defs.PodInfoType;
|
||||
import info.nightscout.androidaps.plugins.pump.omnipod.defs.PodInitActionType;
|
||||
|
@ -66,7 +67,13 @@ public class AapsOmnipodManager implements OmnipodCommunicationManagerInterface
|
|||
|
||||
@Override
|
||||
public PumpEnactResult getPodStatus() {
|
||||
return delegate.getPodStatus();
|
||||
try {
|
||||
StatusResponse statusResponse = delegate.getPodStatus();
|
||||
return new PumpEnactResult().success(true).enacted(false);
|
||||
} catch(Exception ex) {
|
||||
// TODO return string resource
|
||||
return new PumpEnactResult().success(false).enacted(false).comment(ex.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -104,7 +111,16 @@ public class AapsOmnipodManager implements OmnipodCommunicationManagerInterface
|
|||
|
||||
@Override
|
||||
public PumpEnactResult setBolus(Double amount) {
|
||||
return delegate.bolus(amount);
|
||||
return delegate.bolus(amount, statusResponse -> {
|
||||
if(statusResponse == null) {
|
||||
// Failed to retrieve status response after bolus
|
||||
// Bolus probably finished anyway
|
||||
} else if(statusResponse.getDeliveryStatus().isBolusing()) {
|
||||
// This shouldn't happen
|
||||
} else {
|
||||
// Bolus successfully completed
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -26,6 +26,9 @@ public class OmnipodConst {
|
|||
}
|
||||
|
||||
public static final double POD_PULSE_SIZE = 0.05;
|
||||
public static final double POD_BOLUS_DELIVERY_RATE = 0.025; // units per second
|
||||
public static final double POD_PRIMING_DELIVERY_RATE = 0.05; // units per second
|
||||
public static final double POD_CANNULA_INSERTION_DELIVERY_RATE = 0.05; // units per second
|
||||
public static final double MAX_RESERVOIR_READING = 50.0;
|
||||
public static final double MAX_BOLUS = 30.0;
|
||||
public static final double MAX_BASAL_RATE = 30.0;
|
||||
|
@ -39,6 +42,4 @@ public class OmnipodConst {
|
|||
|
||||
public static final double POD_PRIME_BOLUS_UNITS = 2.6;
|
||||
public static final double POD_CANNULA_INSERTION_BOLUS_UNITS = 0.5;
|
||||
public static final Duration POD_PRIME_DURATION = Duration.standardSeconds(55);
|
||||
public static final Duration POD_CANNULA_INSERTION_DURATION = Duration.standardSeconds(10);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue