RuffyScripter: extract and extend runPreCommandChecks().
This commit is contained in:
parent
b8e320ae6f
commit
a95a00377b
1 changed files with 45 additions and 27 deletions
|
@ -254,35 +254,9 @@ public class RuffyScripter implements RuffyCommands {
|
||||||
log.debug("Connection ready to execute cmd " + cmd);
|
log.debug("Connection ready to execute cmd " + cmd);
|
||||||
Thread cmdThread = new Thread(() -> {
|
Thread cmdThread = new Thread(() -> {
|
||||||
try {
|
try {
|
||||||
// check pump in a suitable state to run the requested command
|
if (!runPreCommandChecks(cmd)) {
|
||||||
if (cmd instanceof ReadPumpStateCommand) {
|
|
||||||
// always allowed, state is set at the end of runCommand method
|
|
||||||
activeCmd.getResult().success = true;
|
|
||||||
} else if (getCurrentMenu().getType() == MenuType.STOP) {
|
|
||||||
if (cmd.needsRunMode()) {
|
|
||||||
log.error("Requested command requires run mode, but pump is suspended");
|
|
||||||
activeCmd.getResult().success = false;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else if (getCurrentMenu().getType() == MenuType.WARNING_OR_ERROR) {
|
|
||||||
if (!(cmd instanceof ConfirmAlertCommand)) {
|
|
||||||
log.warn("Warning/alert active on pump, but requested command is not ConfirmAlertCommand");
|
|
||||||
activeCmd.getResult().success = false;
|
|
||||||
return; // active alert is returned as part of PumpState
|
|
||||||
}
|
|
||||||
} else if (getCurrentMenu().getType() != MenuType.MAIN_MENU) {
|
|
||||||
log.debug("Pump is unexpectedly not on main menu but " + getCurrentMenuName());
|
|
||||||
activeCmd.getResult().success = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if everything broke before, the pump might still be delivering a bolus, if that's the case, wait for bolus to finish
|
|
||||||
Double bolusRemaining = (Double) getCurrentMenu().getAttribute(MenuAttribute.BOLUS_REMAINING);
|
|
||||||
while (ruffyService.isConnected() && bolusRemaining != null) {
|
|
||||||
log.debug("Waiting for bolus from previous connection to complete, remaining: " + bolusRemaining);
|
|
||||||
waitForScreenUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
PumpState pumpState = readPumpStateInternal();
|
PumpState pumpState = readPumpStateInternal();
|
||||||
log.debug("Pump state before running command: " + pumpState);
|
log.debug("Pump state before running command: " + pumpState);
|
||||||
|
|
||||||
|
@ -370,6 +344,50 @@ public class RuffyScripter implements RuffyCommands {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean runPreCommandChecks(Command cmd) {
|
||||||
|
if (cmd instanceof ReadPumpStateCommand) {
|
||||||
|
// always allowed, state is set at the end of runCommand method
|
||||||
|
activeCmd.getResult().success = true;
|
||||||
|
} else if (getCurrentMenu().getType() == MenuType.STOP) {
|
||||||
|
if (cmd.needsRunMode()) {
|
||||||
|
log.error("Requested command requires run mode, but pump is suspended");
|
||||||
|
activeCmd.getResult().success = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else if (getCurrentMenu().getType() == MenuType.WARNING_OR_ERROR) {
|
||||||
|
if (!(cmd instanceof ConfirmAlertCommand)) {
|
||||||
|
log.warn("Warning/alert active on pump, but requested command is not ConfirmAlertCommand");
|
||||||
|
activeCmd.getResult().success = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else if (getCurrentMenu().getType() != MenuType.MAIN_MENU) {
|
||||||
|
log.debug("Pump is unexpectedly not on main menu but " + getCurrentMenuName() + ", trying to recover");
|
||||||
|
try {
|
||||||
|
recoverFromCommandFailure();
|
||||||
|
} catch (Exception e) {
|
||||||
|
activeCmd.getResult().success = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (getCurrentMenu().getType() != MenuType.MAIN_MENU) {
|
||||||
|
activeCmd.getResult().success = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if everything broke before, the pump might still be delivering a bolus, if that's the case, wait for bolus to finish
|
||||||
|
Double bolusRemaining = (Double) getCurrentMenu().getAttribute(MenuAttribute.BOLUS_REMAINING);
|
||||||
|
try {
|
||||||
|
while (ruffyService.isConnected() && bolusRemaining != null) {
|
||||||
|
log.debug("Waiting for bolus from previous connection to complete, remaining: " + bolusRemaining);
|
||||||
|
waitForScreenUpdate();
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("Exception waiting for bolus from previous command to finish", e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* On connection loss the pump raises an alert immediately (when setting a TBR or giving a bolus) -
|
* On connection loss the pump raises an alert immediately (when setting a TBR or giving a bolus) -
|
||||||
* there's no timeout before that happens. But: a reconnect is still possible which can then
|
* there's no timeout before that happens. But: a reconnect is still possible which can then
|
||||||
|
|
Loading…
Reference in a new issue