Fix reading blinking values, use alternate SetTbrCommand by default,

cleanups
This commit is contained in:
Johannes Mockenhaupt 2017-08-27 11:05:37 +02:00
parent 37523fbdd1
commit e6ba99b02f
No known key found for this signature in database
GPG key ID: 9E1EA6AF7BBBB0D1
5 changed files with 100 additions and 66 deletions

View file

@ -218,10 +218,6 @@ public class RuffyScripter {
this.ruffyService = null; this.ruffyService = null;
} }
public Menu getCurrentMenu() {
return currentMenu;
}
private static class Returnable { private static class Returnable {
CommandResult cmdResult; CommandResult cmdResult;
} }
@ -401,6 +397,53 @@ public class RuffyScripter {
} }
} }
// TODO v2 add remaining info we can extract from the main menu, low battery and low
// cartridge warnings, running extended bolus (how does that look if a TBR is active as well?)
/** This reads the state of the, which is whatever is currently displayed on the display,
* no actions are performed. */
public PumpState readPumpState() {
PumpState state = new PumpState();
Menu menu = currentMenu;
if (menu == null) {
return new PumpState().errorMsg("Menu is not available");
}
MenuType menuType = menu.getType();
if (menuType == MenuType.MAIN_MENU) {
Double tbrPercentage = (Double) menu.getAttribute(MenuAttribute.TBR);
if (tbrPercentage != 100) {
state.tbrActive = true;
Double displayedTbr = (Double) menu.getAttribute(MenuAttribute.TBR);
state.tbrPercent = displayedTbr.intValue();
MenuTime durationMenuTime = ((MenuTime) menu.getAttribute(MenuAttribute.RUNTIME));
state.tbrRemainingDuration = durationMenuTime.getHour() * 60 + durationMenuTime.getMinute();
state.tbrRate = ((double) menu.getAttribute(MenuAttribute.BASAL_RATE));
}
state.lowBattery = ((boolean) menu.getAttribute(MenuAttribute.LOW_BATTERY));
state.insulinState = ((int) menu.getAttribute(MenuAttribute.INSULIN_STATE));
// TODO v2, read current base basal rate, which is shown center when no TBR is active.
// Check if that holds true when an extended bolus is running.
// Add a field to PumpStatus, rather than renaming/overloading tbrRate to mean
// either TBR rate or basal rate depending on whether a TBR is active.
} else if (menuType == MenuType.WARNING_OR_ERROR) {
state.errorMsg = (String) menu.getAttribute(MenuAttribute.MESSAGE);
} else if (menuType == MenuType.STOP) {
state.suspended = true;
state.lowBattery = ((boolean) menu.getAttribute(MenuAttribute.LOW_BATTERY));
state.insulinState = ((int) menu.getAttribute(MenuAttribute.INSULIN_STATE));
} else {
StringBuilder sb = new StringBuilder();
for (MenuAttribute menuAttribute : menu.attributes()) {
sb.append(menuAttribute);
sb.append(": ");
sb.append(menu.getAttribute(menuAttribute));
sb.append("\n");
}
state.errorMsg = "Pump is on menu " + menuType + ", listing attributes: \n" + sb.toString();
}
return state;
}
// below: methods to be used by commands // below: methods to be used by commands
// TODO move into a new Operations(scripter) class commands can delegate to, // TODO move into a new Operations(scripter) class commands can delegate to,
// so this class can focus on providing a connection to run commands // so this class can focus on providing a connection to run commands
@ -415,10 +458,50 @@ public class RuffyScripter {
public static byte BACK = (byte) 0x33; public static byte BACK = (byte) 0x33;
} }
interface Step {
void run(boolean waitForPumpUpdateAfterwards);
}
/*
private long lastPumpWrite = 0;
private void wrapNoNotTheSubwayKind(Step step, boolean waitForPumpUpdateAfterwards) {
if (!connected) {
// try to reconnect, with a timeout before the pump raises a menu timeout
// timeout = lastPumpWrite + 15 * 1000 // avoid default pump timeout of 20s
}
step.run(waitForPumpUpdateAfterwards);
// TODO there's a chance the above was not executed by the pump; assume that if we're not
// still connected and abort the command and retry if it it's retryable
// isConnected
lastPumpWrite = System.currentTimeMillis();
// TODO: spike: source the ruffy driver package and do away with the remote service
refuse to debug and fix incomprehensive code that Sandra wrote, can't explain why she
did what she did nor commented on it
if (!connected) {
// cancelInternal();
// if (activeCmd.isRetriable) {
}
}
*/
// === pump ops ===
public Menu getCurrentMenu() {
return currentMenu;
}
public void pressUpKey() { public void pressUpKey() {
log.debug("Pressing up key"); // wrapNoNotTheSubwayKind(new Step() {
pressKey(Key.UP, 2000); // @Override
log.debug("Releasing up key"); // public void doStep() {
log.debug("Pressing up key");
pressKey(Key.UP, 2000);
log.debug("Releasing up key");
// }
// });
} }
public void pressDownKey() { public void pressDownKey() {
@ -588,12 +671,12 @@ public class RuffyScripter {
public <T> T readBlinkingValue(Class<T> expectedType, MenuAttribute attribute) { public <T> T readBlinkingValue(Class<T> expectedType, MenuAttribute attribute) {
int retries = 5; int retries = 5;
Object value = currentMenu.getAttribute(attribute); Object value = currentMenu.getAttribute(attribute);
while (!value.getClass().isAssignableFrom(expectedType.getClass())) { while (!expectedType.isInstance(value)) {
value = currentMenu.getAttribute(attribute); value = currentMenu.getAttribute(attribute);
waitForScreenUpdate(1000); waitForScreenUpdate(1000);
retries--; retries--;
if (retries == 0) { if (retries == 0) {
throw new CommandException().message("Failed to read blinkng value: " + attribute); throw new CommandException().message("Failed to read blinkng value: " + attribute + "=" + value + " type=" + value.getClass());
} }
} }
return (T) value; return (T) value;
@ -603,51 +686,4 @@ public class RuffyScripter {
MenuTime duration = readBlinkingValue(MenuTime.class, MenuAttribute.RUNTIME); MenuTime duration = readBlinkingValue(MenuTime.class, MenuAttribute.RUNTIME);
return duration.getHour() * 60 + duration.getMinute(); return duration.getHour() * 60 + duration.getMinute();
} }
// TODO v2 add remaining info we can extract from the main menu, low battery and low
// cartridge warnings, running extended bolus (how does that look if a TBR is active as well?)
/** This reads the state of the, which is whatever is currently displayed on the display,
* no actions are performed. */
public PumpState readPumpState() {
PumpState state = new PumpState();
Menu menu = currentMenu;
if (menu == null) {
return new PumpState().errorMsg("Menu is not available");
}
MenuType menuType = menu.getType();
if (menuType == MenuType.MAIN_MENU) {
Double tbrPercentage = (Double) menu.getAttribute(MenuAttribute.TBR);
if (tbrPercentage != 100) {
state.tbrActive = true;
Double displayedTbr = (Double) menu.getAttribute(MenuAttribute.TBR);
state.tbrPercent = displayedTbr.intValue();
MenuTime durationMenuTime = ((MenuTime) menu.getAttribute(MenuAttribute.RUNTIME));
state.tbrRemainingDuration = durationMenuTime.getHour() * 60 + durationMenuTime.getMinute();
state.tbrRate = ((double) menu.getAttribute(MenuAttribute.BASAL_RATE));
}
state.lowBattery = ((boolean) menu.getAttribute(MenuAttribute.LOW_BATTERY));
state.insulinState = ((int) menu.getAttribute(MenuAttribute.INSULIN_STATE));
// TODO v2, read current base basal rate, which is shown center when no TBR is active.
// Check if that holds true when an extended bolus is running.
// Add a field to PumpStatus, rather than renaming/overloading tbrRate to mean
// either TBR rate or basal rate depending on whether a TBR is active.
} else if (menuType == MenuType.WARNING_OR_ERROR) {
state.errorMsg = (String) menu.getAttribute(MenuAttribute.MESSAGE);
} else if (menuType == MenuType.STOP) {
state.suspended = true;
state.lowBattery = ((boolean) menu.getAttribute(MenuAttribute.LOW_BATTERY));
state.insulinState = ((int) menu.getAttribute(MenuAttribute.INSULIN_STATE));
} else {
StringBuilder sb = new StringBuilder();
for (MenuAttribute menuAttribute : menu.attributes()) {
sb.append(menuAttribute);
sb.append(": ");
sb.append(menu.getAttribute(menuAttribute));
sb.append("\n");
}
state.errorMsg = "Pump is on menu " + menuType + ", listing attributes: \n" + sb.toString();
}
return state;
}
} }

View file

@ -49,7 +49,9 @@ public class CancelTbrCommand extends BaseCommand {
} }
log.debug("Cancelling active TBR of " + pumpState.tbrPercent log.debug("Cancelling active TBR of " + pumpState.tbrPercent
+ "% with " + pumpState.tbrRemainingDuration + " min remaining"); + "% with " + pumpState.tbrRemainingDuration + " min remaining");
return new SetTbrCommand(100, 0).execute(); SetTbrCommand setTbrCommand = new SetTbrCommand(100, 0);
setTbrCommand.setScripter(scripter);
return setTbrCommand.execute();
} catch (CommandException e) { } catch (CommandException e) {
return e.toCommandResult(); return e.toCommandResult();
} }

View file

@ -4,10 +4,6 @@ import org.monkey.d.ruffy.ruffy.driver.display.MenuType;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.TreeSet;
import de.jotomo.ruffyscripter.PumpState;
import de.jotomo.ruffyscripter.RuffyScripter;
import static de.jotomo.ruffyscripter.commands.GetPumpStateCommand.Stepper.runStep; import static de.jotomo.ruffyscripter.commands.GetPumpStateCommand.Stepper.runStep;

View file

@ -104,7 +104,7 @@ public class SetTbrCommandAlt extends BaseCommand {
private void inputTbrPercentage() { private void inputTbrPercentage() {
scripter.verifyMenuIsDisplayed(MenuType.TBR_SET); scripter.verifyMenuIsDisplayed(MenuType.TBR_SET);
long currentPercent = scripter.readBlinkingValue(Long.class, MenuAttribute.BASAL_RATE); long currentPercent = scripter.readBlinkingValue(Double.class, MenuAttribute.BASAL_RATE).longValue();
log.debug("Current TBR %: " + currentPercent); log.debug("Current TBR %: " + currentPercent);
long percentageChange = percentage - currentPercent; long percentageChange = percentage - currentPercent;
long percentageSteps = percentageChange / 10; long percentageSteps = percentageChange / 10;
@ -128,16 +128,16 @@ public class SetTbrCommandAlt extends BaseCommand {
private void verifyDisplayedTbrPercentage() { private void verifyDisplayedTbrPercentage() {
scripter.verifyMenuIsDisplayed(MenuType.TBR_SET); scripter.verifyMenuIsDisplayed(MenuType.TBR_SET);
long displayedPercentage = scripter.readBlinkingValue(Long.class, MenuAttribute.BASAL_RATE); long displayedPercentage = scripter.readBlinkingValue(Double.class, MenuAttribute.BASAL_RATE).longValue();
if (displayedPercentage != percentage) { if (displayedPercentage != percentage) {
log.debug("Final displayed TBR percentage: " + displayedPercentage); log.debug("Final displayed TBR percentage: " + displayedPercentage);
throw new CommandException().message("Failed to set TBR percentage"); throw new CommandException().message("Failed to set TBR percentage, requested: " + percentage + ", actual: " + displayedPercentage);
} }
// check again to ensure the displayed value hasn't change due to due scrolling taking extremely long // check again to ensure the displayed value hasn't change due to due scrolling taking extremely long
SystemClock.sleep(2000); SystemClock.sleep(2000);
scripter.verifyMenuIsDisplayed(MenuType.TBR_SET); scripter.verifyMenuIsDisplayed(MenuType.TBR_SET);
long refreshedDisplayedTbrPecentage = scripter.readBlinkingValue(Long.class, MenuAttribute.BASAL_RATE); long refreshedDisplayedTbrPecentage = scripter.readBlinkingValue(Double.class, MenuAttribute.BASAL_RATE).longValue();
if (displayedPercentage != refreshedDisplayedTbrPecentage) { if (displayedPercentage != refreshedDisplayedTbrPecentage) {
throw new CommandException().message("Failed to set TBR percentage: " + throw new CommandException().message("Failed to set TBR percentage: " +
"percentage changed after input stopped from " "percentage changed after input stopped from "

View file

@ -50,7 +50,7 @@ public class Config {
// Combo specific // Combo specific
/** use alternate SetTbrCommand (uses the initial implementation) */ /** use alternate SetTbrCommand (uses the initial implementation) */
public static final boolean comboUseAlternateSetTbrCommand = false; public static final boolean comboUseAlternateSetTbrCommand = true;
/** very quick hack to split up bolus into 2 U parts, spaced roughly 45s apart */ /** very quick hack to split up bolus into 2 U parts, spaced roughly 45s apart */
public static final boolean comboSplitBoluses = false; public static final boolean comboSplitBoluses = false;
} }