Remove unclear error message field from CommandResult, use codes from pump warnings/errors.

This commit is contained in:
Johannes Mockenhaupt 2017-10-29 11:37:53 +01:00
parent 6b6d252173
commit a2460180f9
No known key found for this signature in database
GPG key ID: 9E1EA6AF7BBBB0D1
9 changed files with 60 additions and 60 deletions

View file

@ -88,9 +88,7 @@ public class ComboFragment extends SubscriberFragment implements View.OnClickLis
// state
stateView.setText(plugin.getStateSummary());
PumpState ps = plugin.getPump().state;
if (plugin.getPump().state.errorMsg != null
|| ps.insulinState == PumpState.EMPTY
|| ps.batteryState == PumpState.EMPTY) {
if ( ps.insulinState == PumpState.EMPTY || ps.batteryState == PumpState.EMPTY) {
stateView.setTextColor(Color.RED);
} else if (plugin.getPump().state.suspended) {
stateView.setTextColor(Color.YELLOW);

View file

@ -417,7 +417,6 @@ public class ComboPlugin implements PluginBase, PumpInterface {
PumpEnactResult pumpEnactResult = new PumpEnactResult();
pumpEnactResult.success = bolusCmdResult.success;
pumpEnactResult.enacted = bolusCmdResult.enacted;
// pumpEnactResult.comment = bolusCmdResult.message;
// if enacted, add bolus and carbs to treatment history
if (pumpEnactResult.enacted) {
@ -500,7 +499,6 @@ public class ComboPlugin implements PluginBase, PumpInterface {
PumpEnactResult pumpEnactResult = new PumpEnactResult();
pumpEnactResult.success = commandResult.success;
pumpEnactResult.enacted = commandResult.enacted;
// pumpEnactResult.comment = commandResult.message;
pumpEnactResult.isPercent = true;
// Combo would have bailed if this wasn't set properly. Maybe we should
// have the command return this anyways ...
@ -570,7 +568,6 @@ public class ComboPlugin implements PluginBase, PumpInterface {
if (commandResult != null) {
pumpEnactResult.success = commandResult.success;
pumpEnactResult.enacted = commandResult.enacted;
// pumpEnactResult.comment = commandResult.message;
}
return pumpEnactResult;
}
@ -752,8 +749,8 @@ public class ComboPlugin implements PluginBase, PumpInterface {
extendedJson.put("TempBasalPercent", ps.tbrPercent);
extendedJson.put("TempBasalRemaining", ps.tbrRemainingDuration);
}
if (ps.errorMsg != null) {
extendedJson.put("ErrorMessage", ps.errorMsg);
if (ps.alertCodes.errorCode != null) {
extendedJson.put("ErrorCode", ps.alertCodes.errorCode);
}
pumpJson.put("extended", extendedJson);

View file

@ -13,9 +13,6 @@ public class CommandResult {
public boolean enacted;
/** Null unless an unhandled exception was raised. */
public Exception exception;
/** (Error)message describing the result of the command. */
// TODO work outh this message
// public String message;
/** State of the pump *after* command execution. */
public PumpState state;
/** History if requested by the command. */
@ -60,11 +57,6 @@ public class CommandResult {
return this;
}
// public CommandResult message(String message) {
// this.message = message;
// return this;
// }
public CommandResult state(PumpState state) {
this.state = state;
return this;
@ -86,7 +78,6 @@ public class CommandResult {
", success=" + success +
", enacted=" + enacted +
", exception=" + exception +
// ", message='" + message + '\'' +
", state=" + state +
", history=" + history +
", basalProfile=" + basalProfile +

View file

@ -1,9 +1,13 @@
package de.jotomo.ruffy.spi;
import de.jotomo.ruffy.spi.history.WarningOrErrorCode;
/** State displayed on the main screen of the pump. */
public class PumpState {
public long timestamp;
public String menu = null;
public boolean suspended;
public boolean tbrActive = false;
/** TBR percentage. 100% means no TBR active, just the normal basal rate running. */
public int tbrPercent = -1;
@ -12,16 +16,10 @@ public class PumpState {
/** Remaining time of an active TBR. Note that 0:01 is te lowest displayed, the pump
* jumps from that to TBR end, skipping 0:00(xx). */
public int tbrRemainingDuration = -1;
/**
* This is the error message (if any) displayed by the pump if there is an alarm,
* e.g. if a "TBR cancelled alarm" is active, the value will be "TBR CANCELLED".
* Generally, an error code is also displayed, but it flashes and it might take
* longer to read that and the pump connection gets interrupted if we're not
* reacting quickly.
*/
// TODO pump errors (EXX) vs. errors talking to the pump
public String errorMsg;
public boolean suspended;
/** Warning or error code displayed if a warning or alert alert is active,
* see {@link PumpWarningCodes}, {@link PumpErrorCodes} */
public WarningOrErrorCode alertCodes;
public static final int UNKNOWN = -1;
public static final int LOW = 1;
@ -56,11 +54,6 @@ public class PumpState {
return this;
}
public PumpState errorMsg(String errorMsg) {
this.errorMsg = errorMsg;
return this;
}
public PumpState suspended(boolean suspended) {
this.suspended = suspended;
return this;
@ -89,7 +82,6 @@ public class PumpState {
", tbrPercent=" + tbrPercent +
", tbrRate=" + tbrRate +
", tbrRemainingDuration=" + tbrRemainingDuration +
", errorMsg='" + errorMsg + '\'' +
", suspended=" + suspended +
", batteryState=" + batteryState +
", insulinState=" + insulinState +

View file

@ -31,6 +31,7 @@ public interface RuffyCommands {
CommandResult getDateAndTime();
// TODO see how dana does this, autosync on DST change
CommandResult setDateAndTime(Date date);
void requestPairing();

View file

@ -0,0 +1,12 @@
package de.jotomo.ruffy.spi.history;
public class WarningOrErrorCode {
public final Integer warningCode;
public final Integer errorCode;
public WarningOrErrorCode(Integer warningCode, Integer errorCode) {
this.warningCode = warningCode;
this.errorCode = errorCode;
}
}

View file

@ -30,6 +30,7 @@ import de.jotomo.ruffy.spi.CommandResult;
import de.jotomo.ruffy.spi.PumpState;
import de.jotomo.ruffy.spi.RuffyCommands;
import de.jotomo.ruffy.spi.history.PumpHistoryRequest;
import de.jotomo.ruffy.spi.history.WarningOrErrorCode;
import de.jotomo.ruffyscripter.commands.BolusCommand;
import de.jotomo.ruffyscripter.commands.CancelTbrCommand;
import de.jotomo.ruffyscripter.commands.Command;
@ -218,13 +219,11 @@ public class RuffyScripter implements RuffyCommands {
/** Always returns a CommandResult, never throws */
private CommandResult runCommand(final Command cmd) {
log.debug("Attempting to run cmd: " + cmd);
if (unrecoverableError != null) {
return new CommandResult().success(false).enacted(false).message(unrecoverableError).state(readPumpStateInternal());
}
List<String> violations = cmd.validateArguments();
if (!violations.isEmpty()) {
return new CommandResult().message(Joiner.on("\n").join(violations)).state(readPumpStateInternal());
log.error("Command argument violations: " + Joiner.on(", ").join(violations));
return new CommandResult().state(readPumpStateInternal());
}
// TODO simplify, hard to reason about exists
@ -240,7 +239,8 @@ public class RuffyScripter implements RuffyCommands {
Menu localCurrentMenu = currentMenu;
if (localCurrentMenu == null || localCurrentMenu.getType() == MenuType.STOP) {
if (cmd.needsRunMode()) {
activeCmd.getResult().success(false).message("Pump is suspended but operations requires to the pump to be running");
log.error("Requested command requires run mode, but pump is suspended");
activeCmd.getResult().success = false;
return;
}
}
@ -255,10 +255,11 @@ public class RuffyScripter implements RuffyCommands {
long cmdEndTime = System.currentTimeMillis();
log.debug("Executing " + cmd + " took " + (cmdEndTime - cmdStartTime) + "ms");
} catch (CommandException e) {
activeCmd.getResult().message(e.getMessage());
log.error("CommandException running command", e);
activeCmd.getResult().success = false;
} catch (Exception e) {
log.error("Unexpected exception running cmd", e);
activeCmd.getResult().message("Unexpected exception running cmd");
activeCmd.getResult().success = false;
} finally {
lastCmdExecutionTime = System.currentTimeMillis();
}
@ -294,14 +295,13 @@ public class RuffyScripter implements RuffyCommands {
cmdThread.interrupt();
SystemClock.sleep(5000);
log.error("Timed out thread dead yet? " + cmdThread.isAlive());
activeCmd.getResult().success(false).message("Command stalled, check pump!");
activeCmd.getResult().success = false;
break;
}
}
if (now > overallTimeout) {
String msg = "Command " + cmd + " timed out after 4 min, check pump!";
log.error(msg);
activeCmd.getResult().success(false).message(msg);
log.error("Command " + cmd + " timed out");
activeCmd.getResult().success = false;
break;
}
}
@ -315,12 +315,13 @@ public class RuffyScripter implements RuffyCommands {
log.debug("Connect: " + connectDurationSec + "s, execution: " + executionDurationSec + "s");
}
return result;
// TOD under which circumstances can these occur?
} catch (CommandException e) {
return activeCmd.getResult().success(false).message(e.getMessage()).state(readPumpStateInternal());
log.error("CommandException while executing command", e);
return activeCmd.getResult().success(false).state(readPumpStateInternal());
} catch (Exception e) {
log.error("Unexpected exception communication with ruffy", e);
return activeCmd.getResult().success(false).exception(e)
.message("Unexpected exception communication with ruffy: " + e.getMessage()).state(readPumpStateInternal());
return activeCmd.getResult().success(false).exception(e).state(readPumpStateInternal());
} finally {
activeCmd = null;
}
@ -473,25 +474,26 @@ public class RuffyScripter implements RuffyCommands {
state.batteryState = ((int) menu.getAttribute(MenuAttribute.BATTERY_STATE));
state.insulinState = ((int) menu.getAttribute(MenuAttribute.INSULIN_STATE));
} else if (menuType == MenuType.WARNING_OR_ERROR) {
state.errorMsg = (String) menu.getAttribute(MenuAttribute.MESSAGE);
state.alertCodes = readWarningOrErrorCode();
} else if (menuType == MenuType.STOP) {
state.suspended = true;
state.batteryState = ((int) menu.getAttribute(MenuAttribute.BATTERY_STATE));
state.insulinState = ((int) menu.getAttribute(MenuAttribute.INSULIN_STATE));
} else {
// just return the PumpState with the menu set
}
return state;
}
public int readWarningCode() {
public WarningOrErrorCode readWarningOrErrorCode() {
verifyMenuIsDisplayed(MenuType.WARNING_OR_ERROR);
Integer warningCode = (Integer) getCurrentMenu().getAttribute(MenuAttribute.WARNING);
while (warningCode == null) {
Integer errorCode = (Integer) getCurrentMenu().getAttribute(MenuAttribute.ERROR);
while (warningCode == null && errorCode == null) {
waitForScreenUpdate();
warningCode = (Integer) getCurrentMenu().getAttribute(MenuAttribute.WARNING);
errorCode = (Integer) getCurrentMenu().getAttribute(MenuAttribute.ERROR);
}
return warningCode;
return new WarningOrErrorCode(warningCode, errorCode);
}
// below: methods to be used by commands
@ -810,7 +812,12 @@ public class RuffyScripter implements RuffyCommands {
// A wait till the error code can be read results in the code hanging, despite
// menu updates coming in, so just check the message.
int displayedWarningCode = readWarningCode();
WarningOrErrorCode warningOrErrorCode = readWarningOrErrorCode();
if (warningOrErrorCode.errorCode != 0) {
// TODO proper way to display such things in the UI;
throw new CommandException("Pump is in error state");
}
int displayedWarningCode = warningOrErrorCode.warningCode;
String errorMsg = (String) getCurrentMenu().getAttribute(MenuAttribute.MESSAGE);
if (displayedWarningCode != warningCode) {
throw new CommandException("An alert other than the expected warning " + warningCode+ " was raised by the pump: "

View file

@ -13,6 +13,7 @@ import java.util.List;
import de.jotomo.ruffy.spi.BolusProgressReporter;
import de.jotomo.ruffy.spi.CommandResult;
import de.jotomo.ruffy.spi.PumpWarningCodes;
import de.jotomo.ruffy.spi.history.WarningOrErrorCode;
import de.jotomo.ruffyscripter.RuffyScripter;
import static de.jotomo.ruffy.spi.BolusProgressReporter.State.DELIVERED;
@ -108,7 +109,11 @@ public class BolusCommand extends BaseCommand {
}
if (scripter.getCurrentMenu().getType() == MenuType.WARNING_OR_ERROR) {
// confirm warning alerts and update the result to indicate alerts occurred
int warningCode = scripter.readWarningCode();
WarningOrErrorCode warningOrErrorCode = scripter.readWarningOrErrorCode();
if (warningOrErrorCode.errorCode != 0) {
throw new CommandException("Pump is in error state");
}
int warningCode = warningOrErrorCode.warningCode;
if (warningCode == PumpWarningCodes.BOLUS_CANCELLED) {
scripter.confirmAlert(PumpWarningCodes.BOLUS_CANCELLED, 2000);
bolusProgressReporter.report(STOPPED, 0, 0);
@ -128,7 +133,6 @@ public class BolusCommand extends BaseCommand {
bolusProgressReporter.report(DELIVERING, percentDelivered, bolus - bolusRemaining);
lastBolusReported = bolusRemaining;
}
SystemClock.sleep(50);
bolusRemaining = (Double) scripter.getCurrentMenu().getAttribute(MenuAttribute.BOLUS_REMAINING);
}

View file

@ -10,7 +10,6 @@ import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import de.jotomo.ruffy.spi.PumpWarningCodes;
@ -89,11 +88,10 @@ public class SetTbrCommand extends BaseCommand {
// check main menu shows the same values we just set
if (cancellingTbr) {
verifyMainMenuShowsNoActiveTbr();
result.success(true).enacted(true).message("TBR was cancelled");
result.success(true).enacted(true);
} else {
verifyMainMenuShowsExpectedTbrActive();
result.success(true).enacted(true)
.message(String.format(Locale.US, "TBR set to %d%% for %d min", percentage, duration));
result.success(true).enacted(true);
}
}