diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPumpPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPumpPlugin.java index 0a92e4a8df..9d08d32e0c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPumpPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPumpPlugin.java @@ -38,8 +38,8 @@ import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProg import info.nightscout.androidaps.plugins.Overview.notifications.Notification; import info.nightscout.androidaps.plugins.PumpInsight.connector.CancelBolusTaskRunner; import info.nightscout.androidaps.plugins.PumpInsight.connector.Connector; -import info.nightscout.androidaps.plugins.PumpInsight.connector.ReadBasalProfileTaskRunner; import info.nightscout.androidaps.plugins.PumpInsight.connector.SetTBRTaskRunner; +import info.nightscout.androidaps.plugins.PumpInsight.connector.StatusTaskRunner; import info.nightscout.androidaps.plugins.PumpInsight.connector.WriteBasalProfileTaskRunner; import info.nightscout.androidaps.plugins.PumpInsight.events.EventInsightPumpCallback; import info.nightscout.androidaps.plugins.PumpInsight.events.EventInsightPumpUpdateGui; @@ -63,7 +63,7 @@ import sugar.free.sightparser.applayer.messages.remote_control.StandardBolusMess import sugar.free.sightparser.applayer.messages.status.ActiveBolusesMessage; import sugar.free.sightparser.handling.SingleMessageTaskRunner; import sugar.free.sightparser.handling.TaskRunner; -import sugar.free.sightparser.handling.taskrunners.StatusTaskRunner; +import sugar.free.sightparser.pipeline.Status; import static info.nightscout.androidaps.plugins.PumpInsight.history.PumpIdCache.getRecordUniqueID; @@ -89,12 +89,10 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints private static volatile boolean update_pending = false; private static Logger log = LoggerFactory.getLogger(InsightPumpPlugin.class); private static volatile InsightPumpPlugin plugin; - private final Handler handler = new Handler(); private final InsightPumpAsyncAdapter async = new InsightPumpAsyncAdapter(); - private StatusTaskRunner.StatusResult statusResult; + private StatusTaskRunner.Result statusResult; private long statusResultTime = -1; private Date lastDataTime = new Date(0); - private TaskRunner taskRunner; private boolean fragmentEnabled = false; private boolean fragmentVisible = false; private boolean fauxTBRcancel = true; @@ -103,36 +101,6 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints private Connector connector; private volatile boolean connector_enabled = false; private List profileBlocks; - private final TaskRunner.ResultCallback statusResultHandler = new TaskRunner.ResultCallback() { - - @Override - public void onError(Exception e) { - log("Got error taskrunner: " + e); - android.util.Log.e("INSIGHTPUMP", "taskrunner stacktrace: ", e); - - if (e instanceof sugar.free.sightparser.error.DisconnectedError) { - if (Helpers.ratelimit("insight-reconnect", 2)) { - Connector.connectToPump(); - updateGui(); - } - } - } - - @Override - public synchronized void onResult(Object result) { - if (result instanceof StatusTaskRunner.StatusResult) { - log("GOT STATUS RESULT!!!"); - statusResult = (StatusTaskRunner.StatusResult) result; - statusResultTime = Helpers.tsl(); - processStatusResult(); - updateGui(); - connector.requestHistoryReSync(); - connector.requestHistorySync(); - } else if (result instanceof List) { - profileBlocks = (List) result; - } - } - }; private InsightPumpPlugin() { log("InsightPumpPlugin instantiated"); @@ -388,22 +356,30 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints lastDataTime = new Date(); if (Connector.get().isPumpConnected()) { log("is connected.. requesting status"); - handler.postDelayed(new Runnable() { - @Override - public void run() { - taskRunner = new StatusTaskRunner(connector.getServiceConnector()); - taskRunner.fetch(statusResultHandler); - new ReadBasalProfileTaskRunner(connector.getServiceConnector()).fetch(statusResultHandler); - } - } - , 1000); + final UUID uuid = aSyncTaskRunner(new StatusTaskRunner(connector.getServiceConnector()), "Status"); + Mstatus mstatus = async.busyWaitForCommandResult(uuid, BUSY_WAIT_TIME); + if (mstatus.success()) { + log("GOT STATUS RESULT!!! PARTY WOOHOO!!!"); + statusResult = (StatusTaskRunner.Result) mstatus.getResponseObject(); + statusResultTime = Helpers.tsl(); + processStatusResult(); + updateGui(); + connector.requestHistoryReSync(); + connector.requestHistorySync(); + } else { + log("StatusTaskRunner wasn't successful."); + if (connector.getServiceConnector().isConnectedToService() && connector.getServiceConnector().getStatus() != Status.CONNECTED) { + if (Helpers.ratelimit("insight-reconnect", 2)) { + Connector.connectToPump(); + updateGui(); + } + } + } } else { log("not connected.. not requesting status"); } } - - @Override public PumpEnactResult setNewBasalProfile(Profile profile) { PumpEnactResult result = new PumpEnactResult(); @@ -845,6 +821,7 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints extended.put("ExtendedBolusStart", DateUtil.dateAndTimeString(eb.date)); extended.put("ExtendedBolusRemaining", eb.getPlannedRemainingMinutes()); } + extended.put("BaseBasalRate", getBaseBasalRate()); status.put("timestamp", DateUtil.toISOString(new Date())); pump.put("battery", battery); @@ -879,9 +856,10 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints private void processStatusResult() { if (statusResult != null) { - batteryPercent = statusResult.getBatteryAmountMessage().getBatteryAmount(); - reservoirInUnits = (int) statusResult.getCartridgeAmountMessage().getCartridgeAmount(); - basalRate = statusResult.getCurrentBasalMessage().getCurrentBasalAmount(); + batteryPercent = statusResult.battery; + reservoirInUnits = (int) statusResult.cartridge; + basalRate = statusResult.baseBasalRate; + profileBlocks = statusResult.basalProfile; initialized = true; // basic communication test } } @@ -892,7 +870,7 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints private boolean isPumpRunning() { if (statusResult == null) return true; // assume running if we have no information - return statusResult.getPumpStatusMessage().getPumpStatus() == PumpStatus.STARTED; + return statusResult.pumpStatus == PumpStatus.STARTED; } List getStatusItems(boolean refresh) { @@ -926,9 +904,9 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints (StatusItem.Highlight.BAD) : StatusItem.Highlight.NOTICE) : StatusItem.Highlight.NORMAL) : StatusItem.Highlight.GOOD)); l.add(new StatusItem(gs(R.string.pump_reservoir_label), reservoirInUnits + "U")); try { - if (statusResult.getCurrentTBRMessage().getPercentage() != 100) { - l.add(new StatusItem(gs(R.string.insight_active_tbr), statusResult.getCurrentTBRMessage().getPercentage() + "% " + gs(R.string.with) + " " - + Helpers.qs(statusResult.getCurrentTBRMessage().getLeftoverTime() - offset_minutes, 0) + if (statusResult.tbrAmount != 100) { + l.add(new StatusItem(gs(R.string.insight_active_tbr), statusResult.tbrAmount + "% " + gs(R.string.with) + " " + + Helpers.qs(statusResult.tbrLeftoverDuration - offset_minutes, 0) + " " + gs(R.string.insight_min_left), StatusItem.Highlight.NOTICE)); } } catch (NullPointerException e) { @@ -947,9 +925,9 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints if (statusResult != null) { try { - statusActiveBolus(statusResult.getActiveBolusesMessage().getBolus1(), offset_minutes, l); - statusActiveBolus(statusResult.getActiveBolusesMessage().getBolus2(), offset_minutes, l); - statusActiveBolus(statusResult.getActiveBolusesMessage().getBolus3(), offset_minutes, l); + statusActiveBolus(statusResult.activeBolus1, offset_minutes, l); + statusActiveBolus(statusResult.activeBolus2, offset_minutes, l); + statusActiveBolus(statusResult.activeBolus3, offset_minutes, l); } catch (NullPointerException e) { // getActiveBolusesMessage() may be null } @@ -1132,7 +1110,7 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints @Override public Double applyBasalConstraints(Double absoluteRate) { - return Math.min(absoluteRate, 25); // Maximum pump can support + return Math.min(absoluteRate, statusResult != null ? statusResult.maximumBasalAmount : 0); } @Override @@ -1142,9 +1120,7 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints @Override public Double applyBolusConstraints(Double insulin) { - // TODO we could check what the current max is set on the pump and use that information here - // Pump can be reconfigured up to 50U max - return Math.min(insulin, 25); + return Math.min(insulin, statusResult != null ? statusResult.maximumBolusAmount : 0); } @Override diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/ReadBasalProfileTaskRunner.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/ReadBasalProfileTaskRunner.java deleted file mode 100644 index f201d20dfe..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/ReadBasalProfileTaskRunner.java +++ /dev/null @@ -1,65 +0,0 @@ -package info.nightscout.androidaps.plugins.PumpInsight.connector; - -import android.util.Log; - -import sugar.free.sightparser.applayer.descriptors.configuration_blocks.ActiveProfileBlock; -import sugar.free.sightparser.applayer.descriptors.configuration_blocks.BRProfile1Block; -import sugar.free.sightparser.applayer.descriptors.configuration_blocks.BRProfile2Block; -import sugar.free.sightparser.applayer.descriptors.configuration_blocks.BRProfile3Block; -import sugar.free.sightparser.applayer.descriptors.configuration_blocks.BRProfile4Block; -import sugar.free.sightparser.applayer.descriptors.configuration_blocks.BRProfile5Block; -import sugar.free.sightparser.applayer.descriptors.configuration_blocks.BRProfileBlock; -import sugar.free.sightparser.applayer.descriptors.configuration_blocks.ConfigurationBlock; -import sugar.free.sightparser.applayer.messages.AppLayerMessage; -import sugar.free.sightparser.applayer.messages.configuration.ReadConfigurationBlockMessage; -import sugar.free.sightparser.handling.SightServiceConnector; -import sugar.free.sightparser.handling.TaskRunner; - -/** - * Created by Tebbe Ubben on 10.03.2018. - */ - -public class ReadBasalProfileTaskRunner extends TaskRunner { - - public ReadBasalProfileTaskRunner(SightServiceConnector serviceConnector) { - super(serviceConnector); - } - - @Override - protected AppLayerMessage run(AppLayerMessage message) throws Exception { - if (message == null) { - ReadConfigurationBlockMessage readMessage = new ReadConfigurationBlockMessage(); - readMessage.setConfigurationBlockID(ActiveProfileBlock.ID); - return readMessage; - } else if (message instanceof ReadConfigurationBlockMessage) { - ConfigurationBlock configurationBlock = ((ReadConfigurationBlockMessage) message).getConfigurationBlock(); - if (configurationBlock instanceof ActiveProfileBlock) { - ActiveProfileBlock activeProfileBlock = (ActiveProfileBlock) configurationBlock; - ReadConfigurationBlockMessage readMessage = new ReadConfigurationBlockMessage(); - switch (activeProfileBlock.getActiveProfile()) { - case BR_PROFILE_1: - readMessage.setConfigurationBlockID(BRProfile1Block.ID); - break; - case BR_PROFILE_2: - readMessage.setConfigurationBlockID(BRProfile2Block.ID); - break; - case BR_PROFILE_3: - readMessage.setConfigurationBlockID(BRProfile3Block.ID); - break; - case BR_PROFILE_4: - readMessage.setConfigurationBlockID(BRProfile4Block.ID); - break; - case BR_PROFILE_5: - readMessage.setConfigurationBlockID(BRProfile5Block.ID); - break; - } - ReadConfigurationBlockMessage test = new ReadConfigurationBlockMessage(); - test.setConfigurationBlockID(BRProfile1Block.ID); - return test; - } else if (configurationBlock instanceof BRProfileBlock) { - finish(((BRProfileBlock) configurationBlock).getProfileBlocks()); - } - } - return null; - } -} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/StatusTaskRunner.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/StatusTaskRunner.java new file mode 100644 index 0000000000..86e01f98f8 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/StatusTaskRunner.java @@ -0,0 +1,126 @@ +package info.nightscout.androidaps.plugins.PumpInsight.connector; + +import java.util.List; + +import sugar.free.sightparser.applayer.descriptors.ActiveBolus; +import sugar.free.sightparser.applayer.descriptors.PumpStatus; +import sugar.free.sightparser.applayer.descriptors.configuration_blocks.ActiveProfileBlock; +import sugar.free.sightparser.applayer.descriptors.configuration_blocks.BRProfile1Block; +import sugar.free.sightparser.applayer.descriptors.configuration_blocks.BRProfile2Block; +import sugar.free.sightparser.applayer.descriptors.configuration_blocks.BRProfile3Block; +import sugar.free.sightparser.applayer.descriptors.configuration_blocks.BRProfile4Block; +import sugar.free.sightparser.applayer.descriptors.configuration_blocks.BRProfile5Block; +import sugar.free.sightparser.applayer.descriptors.configuration_blocks.BRProfileBlock; +import sugar.free.sightparser.applayer.descriptors.configuration_blocks.ConfigurationBlock; +import sugar.free.sightparser.applayer.descriptors.configuration_blocks.MaxBRAmountBlock; +import sugar.free.sightparser.applayer.descriptors.configuration_blocks.MaxBolusAmountBlock; +import sugar.free.sightparser.applayer.messages.AppLayerMessage; +import sugar.free.sightparser.applayer.messages.configuration.ReadConfigurationBlockMessage; +import sugar.free.sightparser.applayer.messages.status.ActiveBolusesMessage; +import sugar.free.sightparser.applayer.messages.status.BatteryAmountMessage; +import sugar.free.sightparser.applayer.messages.status.CartridgeAmountMessage; +import sugar.free.sightparser.applayer.messages.status.CurrentBasalMessage; +import sugar.free.sightparser.applayer.messages.status.CurrentTBRMessage; +import sugar.free.sightparser.applayer.messages.status.PumpStatusMessage; +import sugar.free.sightparser.handling.SightServiceConnector; +import sugar.free.sightparser.handling.TaskRunner; + +/** + * Created by Tebbe Ubben on 12.03.2018. + */ + +public class StatusTaskRunner extends TaskRunner { + + private Result result = new Result(); + + public StatusTaskRunner(SightServiceConnector serviceConnector) { + super(serviceConnector); + } + + @Override + protected AppLayerMessage run(AppLayerMessage message) throws Exception { + if (message == null) return new PumpStatusMessage(); + else if (message instanceof PumpStatusMessage) { + result.pumpStatus = ((PumpStatusMessage) message).getPumpStatus(); + if (result.pumpStatus == PumpStatus.STOPPED) return new BatteryAmountMessage(); + else return new CurrentTBRMessage(); + } else if (message instanceof CurrentTBRMessage) { + CurrentTBRMessage currentTBRMessage = (CurrentTBRMessage) message; + result.tbrAmount = currentTBRMessage.getPercentage(); + result.tbrInitialDuration = currentTBRMessage.getInitialTime(); + result.tbrLeftoverDuration = currentTBRMessage.getLeftoverTime(); + return new ActiveBolusesMessage(); + } else if (message instanceof ActiveBolusesMessage) { + ActiveBolusesMessage activeBolusesMessage = (ActiveBolusesMessage) message; + result.activeBolus1 = activeBolusesMessage.getBolus1(); + result.activeBolus2 = activeBolusesMessage.getBolus2(); + result.activeBolus3 = activeBolusesMessage.getBolus3(); + return new CurrentBasalMessage(); + } else if (message instanceof CurrentBasalMessage) { + result.baseBasalRate = ((CurrentBasalMessage) message).getCurrentBasalAmount(); + return new BatteryAmountMessage(); + } else if (message instanceof BatteryAmountMessage) { + result.battery = ((BatteryAmountMessage) message).getBatteryAmount(); + return new CartridgeAmountMessage(); + } else if (message instanceof CartridgeAmountMessage) { + result.cartridge = ((CartridgeAmountMessage) message).getCartridgeAmount(); + ReadConfigurationBlockMessage readMessage = new ReadConfigurationBlockMessage(); + readMessage.setConfigurationBlockID(ActiveProfileBlock.ID); + return readMessage; + } else if (message instanceof ReadConfigurationBlockMessage) { + ConfigurationBlock configurationBlock = ((ReadConfigurationBlockMessage) message).getConfigurationBlock(); + if (configurationBlock instanceof ActiveProfileBlock) { + ActiveProfileBlock activeProfileBlock = (ActiveProfileBlock) configurationBlock; + ReadConfigurationBlockMessage readMessage = new ReadConfigurationBlockMessage(); + switch (activeProfileBlock.getActiveProfile()) { + case BR_PROFILE_1: + readMessage.setConfigurationBlockID(BRProfile1Block.ID); + break; + case BR_PROFILE_2: + readMessage.setConfigurationBlockID(BRProfile2Block.ID); + break; + case BR_PROFILE_3: + readMessage.setConfigurationBlockID(BRProfile3Block.ID); + break; + case BR_PROFILE_4: + readMessage.setConfigurationBlockID(BRProfile4Block.ID); + break; + case BR_PROFILE_5: + readMessage.setConfigurationBlockID(BRProfile5Block.ID); + break; + } + return readMessage; + } else if (configurationBlock instanceof BRProfileBlock) { + result.basalProfile = ((BRProfileBlock) configurationBlock).getProfileBlocks(); + ReadConfigurationBlockMessage readMessage = new ReadConfigurationBlockMessage(); + readMessage.setConfigurationBlockID(MaxBolusAmountBlock.ID); + return readMessage; + } else if (configurationBlock instanceof MaxBolusAmountBlock) { + result.maximumBolusAmount = ((MaxBolusAmountBlock) configurationBlock).getMaximumAmount(); + ReadConfigurationBlockMessage readMessage = new ReadConfigurationBlockMessage(); + readMessage.setConfigurationBlockID(MaxBRAmountBlock.ID); + return readMessage; + } else if (configurationBlock instanceof MaxBRAmountBlock) { + result.maximumBasalAmount = ((MaxBRAmountBlock) configurationBlock).getMaximumAmount(); + finish(result); + } + } + return null; + } + + public static class Result { + public PumpStatus pumpStatus; + public double baseBasalRate; + public int battery; + public double cartridge ; + public int tbrAmount = 100; + public int tbrInitialDuration = 0; + public int tbrLeftoverDuration = 0; + public ActiveBolus activeBolus1; + public ActiveBolus activeBolus2; + public ActiveBolus activeBolus3; + public List basalProfile; + public double maximumBolusAmount; + public double maximumBasalAmount; + } +}