From c29b4d13a3c5c3946bf7d198035cea97c8b7bfca Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Thu, 19 Oct 2017 19:08:48 +0200 Subject: [PATCH] Support pump suspend status (and misc other ...). --- .../androidaps/interfaces/PumpInterface.java | 3 + .../plugins/Actions/ActionsFragment.java | 2 +- .../plugins/PumpCombo/ComboFragment.java | 219 ++++--- .../plugins/PumpCombo/ComboPlugin.java | 162 +++-- .../plugins/PumpCombo/ComboPump.java | 2 +- .../events/EventComboPumpUpdateGUI.java | 7 + .../main/res/layout/combopump_fragment.xml | 614 +++++++----------- app/src/main/res/values/strings.xml | 2 + .../java/de/jotomo/ruffy/spi/PumpState.java | 2 +- .../jotomo/ruffy/spi/history/PumpHistory.java | 9 +- .../ruffy/spi/history/PumpHistoryRequest.java | 1 + .../jotomo/ruffyscripter/RuffyScripter.java | 23 +- .../ruffyscripter/commands/BaseCommand.java | 5 + .../ruffyscripter/commands/BolusCommand.java | 9 +- .../commands/CancelTbrCommand.java | 5 + .../ruffyscripter/commands/Command.java | 1 + .../commands/ReadBasalProfileCommand.java | 2 +- .../commands/ReadHistoryCommand.java | 19 +- .../commands/ReadPumpStateCommand.java | 4 +- .../commands/SetBasalProfileCommand.java | 2 +- .../ruffyscripter/commands/SetTbrCommand.java | 5 + 21 files changed, 541 insertions(+), 557 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java b/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java index 9da9cb0dd0..60b7367100 100644 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java +++ b/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java @@ -1,5 +1,7 @@ package info.nightscout.androidaps.interfaces; +import android.support.annotation.NonNull; + import org.json.JSONObject; import java.util.Date; @@ -24,6 +26,7 @@ public interface PumpInterface { int setNewBasalProfile(Profile profile); boolean isThisProfileSet(Profile profile); + @NonNull Date lastDataTime(); void refreshDataFromPump(String reason); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/ActionsFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/ActionsFragment.java index fdb1953531..b3a023e7a9 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/ActionsFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/ActionsFragment.java @@ -189,7 +189,7 @@ public class ActionsFragment extends SubscriberFragment implements View.OnClickL @Override public void onClick(View view) { - FragmentManager manager = getFragmentManager(); + FragmentManager manager = getChildFragmentManager(); final PumpInterface pump = MainApp.getConfigBuilder(); switch (view.getId()) { case R.id.actions_profileswitch: diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboFragment.java index 64cecc825b..6fce4df711 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboFragment.java @@ -4,7 +4,7 @@ package info.nightscout.androidaps.plugins.PumpCombo; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; -import android.support.v4.app.Fragment; +import android.os.SystemClock; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -16,87 +16,67 @@ import com.squareup.otto.Subscribe; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.Date; + import de.jotomo.ruffy.spi.CommandResult; import de.jotomo.ruffy.spi.PumpState; +import de.jotomo.ruffy.spi.history.Bolus; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; +import info.nightscout.androidaps.db.TemporaryBasal; +import info.nightscout.androidaps.plugins.Common.SubscriberFragment; import info.nightscout.androidaps.plugins.PumpCombo.events.EventComboPumpUpdateGUI; +import info.nightscout.utils.DateUtil; +import info.nightscout.utils.DecimalFormatter; -public class ComboFragment extends Fragment implements View.OnClickListener { +public class ComboFragment extends SubscriberFragment implements View.OnClickListener { private static Logger log = LoggerFactory.getLogger(ComboFragment.class); - // TODO rename to sync, shall sync everything, purge an ongoing alert and raise an AAPS notification for it + private TextView statusView; + private TextView batteryView; + private TextView reservoirView; + + private TextView lastConnectionView; + private TextView lastBolusView; + private TextView basaBasalRateView; + private TextView tempBasalText; + private Button refresh; - // TODO create tabs: Status/Overview (like Dana), Errors, Stats (TDD) - // boluses, tbrs, refills, battery change ... all covered already by Treatments, CP, - // boluses & tbrs are synced from pump; - // profile: will also be viewable already, no need to duplicate; - private TextView statusText; - - private TextView tbrPercentageText; - private TextView tbrDurationText; - private TextView tbrRateText; - private TextView pumpErrorText; - - private TextView lastCmdText; - private TextView lastCmdTimeText; - private TextView lastCmdResultText; - private TextView lastCmdDurationText; - - private TextView pumpstateBatteryText; - private TextView insulinstateText; - - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.combopump_fragment, container, false); + statusView = (TextView) view.findViewById(R.id.combo_status); + batteryView = (TextView) view.findViewById(R.id.combo_pumpstate_battery); + reservoirView = (TextView) view.findViewById(R.id.combo_insulinstate); + + lastConnectionView = (TextView) view.findViewById(R.id.combo_lastconnection); + lastBolusView = (TextView) view.findViewById(R.id.combo_lastbolus); + basaBasalRateView = (TextView) view.findViewById(R.id.combo_basabasalrate); + tempBasalText = (TextView) view.findViewById(R.id.combo_temp_basal); + refresh = (Button) view.findViewById(R.id.combo_refresh); - - statusText = (TextView) view.findViewById(R.id.combo_status); - - tbrPercentageText = (TextView) view.findViewById(R.id.combo_tbr_percentage); - tbrDurationText = (TextView) view.findViewById(R.id.combo_tbr_duration); - tbrRateText = (TextView) view.findViewById(R.id.combo_tbr_rate); - pumpErrorText = (TextView) view.findViewById(R.id.combo_pump_error); - - lastCmdText = (TextView) view.findViewById(R.id.combo_last_command); - lastCmdTimeText = (TextView) view.findViewById(R.id.combo_last_command_time); - lastCmdResultText = (TextView) view.findViewById(R.id.combo_last_command_result); - lastCmdDurationText = (TextView) view.findViewById(R.id.combo_last_command_duration); - pumpstateBatteryText = (TextView) view.findViewById(R.id.combo_pumpstate_battery); - insulinstateText = (TextView) view.findViewById(R.id.combo_insulinstate); - refresh.setOnClickListener(this); updateGUI(); return view; } - @Override - public void onPause() { - super.onPause(); - MainApp.bus().unregister(this); - } - - @Override - public void onResume() { - super.onResume(); - MainApp.bus().register(this); - updateGUI(); - } - - @Subscribe - public void onStatusEvent(final EventComboPumpUpdateGUI ev) { - updateGUI(); - } - @Override public void onClick(View view) { switch (view.getId()) { case R.id.combo_refresh: +/* Activity activity = getActivity(); + if (activity != null) { + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + statusView.setText("Refreshing"); + } + }); + }*/ Thread thread = new Thread(new Runnable() { @Override public void run() { @@ -108,6 +88,22 @@ public class ComboFragment extends Fragment implements View.OnClickListener { } } + @Subscribe + public void onStatusEvent(final EventComboPumpUpdateGUI ev) { + if (ev.status != null) { + Activity activity = getActivity(); + if (activity != null) + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + statusView.setText(ev.status); + } + }); + } else { + updateGUI(); + } + } + public void updateGUI() { Activity activity = getActivity(); if (activity != null) @@ -115,63 +111,108 @@ public class ComboFragment extends Fragment implements View.OnClickListener { @Override public void run() { ComboPlugin plugin = ComboPlugin.getPlugin(); - if (plugin.getPump().lastCmdResult != null) - statusText.setText(plugin.getPump().state.getStateSummary()); + if (plugin.getPump().lastCmdResult == null) { + statusView.setText("Initializing"); + } else { + statusView.setText(plugin.getPump().state.getStateSummary()); + } + if (plugin.getPump().state.errorMsg != null) { + statusView.setTextColor(Color.RED); + } else { + statusView.setTextColor(Color.WHITE); + } + // ??? if (plugin.isInitialized()) { PumpState ps = plugin.getPump().state; if (ps != null) { boolean tbrActive = ps.tbrPercent != -1 && ps.tbrPercent != 100; if (tbrActive) { - tbrPercentageText.setText("" + ps.tbrPercent + "%"); - tbrDurationText.setText("" + ps.tbrRemainingDuration + " min"); - tbrRateText.setText("" + ps.tbrRate + " U/h"); +// tbrPercentageText.setText("" + ps.tbrPercent + "%"); +// tbrDurationText.setText("" + ps.tbrRemainingDuration + " min"); +// tbrRateText.setText("" + ps.tbrRate + " U/h"); } else { - tbrPercentageText.setText("Default basal rate running"); - tbrDurationText.setText(""); - tbrRateText.setText(""); +// tbrPercentageText.setText("Default basal rate running"); +// tbrDurationText.setText(""); +// tbrRateText.setText(""); } - pumpErrorText.setText(ps.errorMsg != null ? ps.errorMsg : ""); - if(ps.batteryState == PumpState.EMPTY){ - pumpstateBatteryText.setText("{fa-battery-empty}"); - pumpstateBatteryText.setTextColor(Color.RED); - } else if(ps.batteryState == PumpState.LOW){ - pumpstateBatteryText.setText("{fa-battery-quarter}"); - pumpstateBatteryText.setTextColor(Color.YELLOW); +// pumpErrorText.setText(ps.errorMsg != null ? ps.errorMsg : ""); + if (ps.batteryState == PumpState.EMPTY) { + batteryView.setText("{fa-battery-empty}"); + batteryView.setTextColor(Color.RED); + } else if (ps.batteryState == PumpState.LOW) { + batteryView.setText("{fa-battery-quarter}"); + batteryView.setTextColor(Color.YELLOW); } else { - pumpstateBatteryText.setText("{fa-battery-full}"); - pumpstateBatteryText.setTextColor(Color.WHITE); + batteryView.setText("{fa-battery-full}"); + batteryView.setTextColor(Color.WHITE); } - switch (ps.insulinState){ - case 0: insulinstateText.setText("ok"); - insulinstateText.setTextColor(Color.WHITE); + switch (ps.insulinState) { + case 0: + reservoirView.setText("ok"); break; - case 1: insulinstateText.setText("low"); - insulinstateText.setTextColor(Color.YELLOW); + case 1: + reservoirView.setText("low"); break; - case 2: insulinstateText.setText("empty"); - insulinstateText.setTextColor(Color.RED); + case 2: + reservoirView.setText("empty"); break; } int reservoirLevel = plugin.getPump().history.reservoirLevel; - insulinstateText.setText(reservoirLevel == - 1 ? "" : "" + reservoirLevel + " U"); + reservoirView.setText(reservoirLevel == -1 ? "" : "" + reservoirLevel + " U"); } + if (plugin.getPump().lastCmdResult != null) { + CommandResult lastCmdResult = plugin.getPump().lastCmdResult; + lastConnectionView.setText( + "4 m ago (18:58)" +// new Date(lastCmdResult.completionTime).toLocaleString() + ); + } + + plugin.getPump().history.bolusHistory.add(new Bolus(System.currentTimeMillis() - 7 * 60 * 1000, 12.8d)); + if (!plugin.getPump().history.bolusHistory.isEmpty()) { + Bolus bolus = plugin.getPump().history.bolusHistory.get(0); +// double agoHours = agoMsec / 60d / 60d / 1000d; +// if (agoHours < 6) // max 6h back + if (bolus.timestamp + 6 * 60 * 60 * 1000 < System.currentTimeMillis()) { + lastBolusView.setText(""); + } else { + // TODO only if !SMB; also: bolus history: should only be used to sync to DB; + // remember that datum someplace else? + long agoMsc = System.currentTimeMillis() - bolus.timestamp; + double agoHours = agoMsc / 60d / 60d / 1000d; + lastBolusView.setText(DateUtil.timeString(bolus.timestamp) + + " (" + DecimalFormatter.to1Decimal(agoHours) + " " + MainApp.sResources.getString(R.string.hoursago) + ") " + + DecimalFormatter.to2Decimal(bolus.amount) + " U"); + lastBolusView.setText("12.80 U (15 m ago, 19:04)"); // (19:04)"); + } + } + + basaBasalRateView.setText(DecimalFormatter.to2Decimal(plugin.getBaseBasalRate()) + " U/h"); + + TemporaryBasal temporaryBasal = new TemporaryBasal(System.currentTimeMillis()); + temporaryBasal.percentRate = 420; + temporaryBasal.durationInMinutes = 20; + + tempBasalText.setText(temporaryBasal.toStringFull()); + tempBasalText.setText("420% 5/20' (18:45)"); + CommandResult lastCmdResult1 = plugin.getPump().lastCmdResult; String lastCmd = lastCmdResult1.request; if (lastCmd != null) { - lastCmdText.setText(lastCmd); - lastCmdTimeText.setText(plugin.getPump().lastCmdTime.toLocaleString()); +// lastCmdText.setText(lastCmd); +// lastCmdTimeText.setText(plugin.getPump().lastCmdTime.toLocaleString()); } else { - lastCmdText.setText(""); - lastCmdTimeText.setText(""); +// lastCmdText.setText(""); +// lastCmdTimeText.setText(""); } if (lastCmdResult1.message != null) { - lastCmdResultText.setText(lastCmdResult1.message); - lastCmdDurationText.setText(lastCmdResult1.duration); +// lastCmdResultText.setText(lastCmdResult1.message); +// lastCmdDurationText.setText(lastCmdResult1.duration); } else { - lastCmdResultText.setText(""); - lastCmdDurationText.setText(""); +// lastCmdResultText.setText(""); +// lastCmdDurationText.setText(""); } } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java index 34bc4ca54a..5076fba662 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java @@ -15,7 +15,12 @@ import org.slf4j.LoggerFactory; import java.util.Date; +import de.jotomo.ruffy.spi.BolusProgressReporter; +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.ruffyscripter.RuffyCommandsV1Impl; import info.nightscout.androidaps.BuildConfig; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; @@ -30,11 +35,6 @@ import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress; import info.nightscout.androidaps.plugins.PumpCombo.events.EventComboPumpUpdateGUI; -import de.jotomo.ruffyscripter.RuffyCommandsV1Impl; -import de.jotomo.ruffy.spi.BolusProgressReporter; -import de.jotomo.ruffy.spi.CommandResult; -import de.jotomo.ruffy.spi.PumpState; -import de.jotomo.ruffy.spi.RuffyCommands; import info.nightscout.utils.DateUtil; import info.nightscout.utils.SP; @@ -226,19 +226,17 @@ public class ComboPlugin implements PluginBase, PumpInterface { @Override public boolean isInitialized() { - // consider initialized when the pump's state was initially fetched, - // after that lastCmd* variables will have values - return pump.lastCmdTime.getTime() > 0; + return pump.lastCmdResult != null; } @Override public boolean isSuspended() { - return pump.state != null && pump.state.suspended; + return pump.state.suspended; } @Override public boolean isBusy() { - return ruffyScripter.isPumpBusy(); + return ruffyScripter.isPumpBusy() && !pump.state.suspended; } // TODO @@ -255,7 +253,8 @@ public class ComboPlugin implements PluginBase, PumpInterface { @Override public Date lastDataTime() { - return pump.lastCmdTime; + CommandResult lastCmdResult = pump.lastCmdResult; + return lastCmdResult != null ? new Date(lastCmdResult.completionTime) : new Date(0); } // this method is regularly called from info.nightscout.androidaps.receivers.KeepAliveReceiver @@ -271,18 +270,19 @@ public class ComboPlugin implements PluginBase, PumpInterface { return; } + // TODO boolean notAUserRequest = !reason.toLowerCase().contains("user"); - boolean wasRunAtLeastOnce = pump.lastCmdTime.getTime() > 0; - boolean ranWithinTheLastMinute = System.currentTimeMillis() < pump.lastCmdTime.getTime() + 60 * 1000; + boolean wasRunAtLeastOnce = pump.lastCmdResult != null; + boolean ranWithinTheLastMinute = wasRunAtLeastOnce && System.currentTimeMillis() < pump.lastCmdResult.completionTime + 60 * 1000; if (notAUserRequest && wasRunAtLeastOnce && ranWithinTheLastMinute) { log.debug("Not fetching state from pump, since we did already within the last 60 seconds"); } else { - CommandResult commandResult = ruffyScripter.readPumpState(); - pump.lastCmdResult = commandResult; - pump.lastCmdTime = new Date(commandResult.completionTime); - CommandResult reservoirQueryResult = ruffyScripter.readHistory(new PumpHistoryRequest().reservoirLevel(true)); - pump.history = reservoirQueryResult.history; - MainApp.bus().post(new EventComboPumpUpdateGUI()); + runCommand("Refreshing", new CommandExecution() { + @Override + public CommandResult execute() { + return ruffyScripter.readHistory(new PumpHistoryRequest().reservoirLevel(true)); + } + }); } } @@ -299,32 +299,34 @@ public class ComboPlugin implements PluginBase, PumpInterface { // TODO remove dep on BolusCommand private static BolusProgressReporter bolusProgressReporter = new BolusProgressReporter() { - @Override - public void report(BolusProgressReporter.State state, int percent, double delivered) { - EventOverviewBolusProgress event = EventOverviewBolusProgress.getInstance(); - switch (state) { - case PROGRAMMING: - event.status = MainApp.sResources.getString(R.string.bolusprogramming); - break; - case DELIVERING: - event.status = String.format(MainApp.sResources.getString(R.string.bolusdelivering), delivered); - break; - case DELIVERED: - event.status = String.format(MainApp.sResources.getString(R.string.bolusdelivered), delivered); - break; - case STOPPING: - event.status = MainApp.sResources.getString(R.string.bolusstopping); - break; - case STOPPED: - event.status = MainApp.sResources.getString(R.string.bolusstopped); - break; - } - event.percent = percent; - MainApp.bus().post(event); - } - }; + @Override + public void report(BolusProgressReporter.State state, int percent, double delivered) { + EventOverviewBolusProgress event = EventOverviewBolusProgress.getInstance(); + switch (state) { + case PROGRAMMING: + event.status = MainApp.sResources.getString(R.string.bolusprogramming); + break; + case DELIVERING: + event.status = String.format(MainApp.sResources.getString(R.string.bolusdelivering), delivered); + break; + case DELIVERED: + event.status = String.format(MainApp.sResources.getString(R.string.bolusdelivered), delivered); + break; + case STOPPING: + event.status = MainApp.sResources.getString(R.string.bolusstopping); + break; + case STOPPED: + event.status = MainApp.sResources.getString(R.string.bolusstopped); + break; + } + event.percent = percent; + MainApp.bus().post(event); + } + }; - /** Updates Treatment records with carbs and boluses and delivers a bolus if needed */ + /** + * Updates Treatment records with carbs and boluses and delivers a bolus if needed + */ @Override public PumpEnactResult deliverTreatment(DetailedBolusInfo detailedBolusInfo) { try { @@ -369,11 +371,13 @@ public class ComboPlugin implements PluginBase, PumpInterface { } @NonNull - private PumpEnactResult deliverBolus(DetailedBolusInfo detailedBolusInfo) { - CommandResult bolusCmdResult = ruffyScripter.deliverBolus(detailedBolusInfo.insulin, bolusProgressReporter); - pump.lastCmdResult = bolusCmdResult; - pump.lastCmdTime = new Date(bolusCmdResult.completionTime); - MainApp.bus().post(new EventComboPumpUpdateGUI()); + private PumpEnactResult deliverBolus(final DetailedBolusInfo detailedBolusInfo) { + CommandResult bolusCmdResult = runCommand("Bolusing", new CommandExecution() { + @Override + public CommandResult execute() { + return ruffyScripter.deliverBolus(detailedBolusInfo.insulin, bolusProgressReporter); + } + }); PumpEnactResult pumpEnactResult = new PumpEnactResult(); pumpEnactResult.success = bolusCmdResult.success; @@ -422,7 +426,7 @@ public class ComboPlugin implements PluginBase, PumpInterface { // Note: AAPS calls this only for setting a temp basal issued by the user @Override - public PumpEnactResult setTempBasalPercent(Integer percent, Integer durationInMinutes) { + public PumpEnactResult setTempBasalPercent(Integer percent, final Integer durationInMinutes) { log.debug("setTempBasalPercent called with " + percent + "% for " + durationInMinutes + "min"); int adjustedPercent = percent; @@ -438,10 +442,14 @@ public class ComboPlugin implements PluginBase, PumpInterface { adjustedPercent = rounded.intValue(); } - CommandResult commandResult = ruffyScripter.setTbr(adjustedPercent, durationInMinutes); - pump.lastCmdResult = commandResult; - pump.lastCmdTime = new Date(commandResult.completionTime); - MainApp.bus().post(new EventComboPumpUpdateGUI()); + final int finalAdjustedPercent = adjustedPercent; + CommandResult commandResult = runCommand("Setting TBR", new CommandExecution() { + @Override + public CommandResult execute() { + return ruffyScripter.setTbr(finalAdjustedPercent, durationInMinutes); + } + } + ); if (commandResult.enacted) { TemporaryBasal tempStart = new TemporaryBasal(commandResult.completionTime); @@ -488,10 +496,12 @@ public class ComboPlugin implements PluginBase, PumpInterface { if (activeTemp == null || userRequested) { /* v1 compatibility to sync DB to pump if they diverged (activeTemp == null) */ log.debug("cancelTempBasal: hard-cancelling TBR since user requested"); - commandResult = ruffyScripter.cancelTbr(); - pump.lastCmdResult = commandResult; - pump.lastCmdTime = new Date(commandResult.completionTime); - MainApp.bus().post(new EventComboPumpUpdateGUI()); + commandResult = runCommand("Cancelling TBR", new CommandExecution() { + @Override + public CommandResult execute() { + return ruffyScripter.cancelTbr(); + } + }); if (commandResult.enacted) { tempBasal = new TemporaryBasal(commandResult.completionTime); @@ -512,12 +522,14 @@ public class ComboPlugin implements PluginBase, PumpInterface { } else { // Set a fake neutral temp to avoid TBR cancel alert. Decide 90% vs 110% based on // on whether the TBR we're cancelling is above or below 100%. - int percentage = (activeTemp.percentRate > 100) ? 110 : 90; + final int percentage = (activeTemp.percentRate > 100) ? 110 : 90; log.debug("cancelTempBasal: changing tbr to " + percentage + "% for 15 mins."); - commandResult = ruffyScripter.setTbr(percentage, 15); - pump.lastCmdResult = commandResult; - pump.lastCmdTime = new Date(commandResult.completionTime); - MainApp.bus().post(new EventComboPumpUpdateGUI()); + commandResult = runCommand("Setting TBR", new CommandExecution() { + @Override + public CommandResult execute() { + return ruffyScripter.setTbr(percentage, 15); + } + }); if (commandResult.enacted) { tempBasal = new TemporaryBasal(commandResult.completionTime); @@ -541,6 +553,23 @@ public class ComboPlugin implements PluginBase, PumpInterface { return pumpEnactResult; } + interface CommandExecution { + CommandResult execute(); + } + + private CommandResult runCommand(String status, CommandExecution commandExecution) { + MainApp.bus().post(new EventComboPumpUpdateGUI(status)); + // TODO handle running into WARNING_OR_ERROR ... or scripter? purge it + CommandResult commandResult = commandExecution.execute(); + pump.lastCmdResult = commandResult; + pump.state = commandResult.state; + // TOOD + if (commandResult.history != null) + pump.history = commandResult.history; + MainApp.bus().post(new EventComboPumpUpdateGUI()); + return commandResult; + } + @Override public PumpEnactResult cancelExtendedBolus() { return OPERATION_NOT_SUPPORTED; @@ -550,7 +579,8 @@ public class ComboPlugin implements PluginBase, PumpInterface { // TODO v2 add battery, reservoir info when we start reading that and clean up the code @Override public JSONObject getJSONStatus() { - if (pump.lastCmdTime.getTime() + 5 * 60 * 1000L < System.currentTimeMillis()) { + CommandResult lastCmdResult = pump.lastCmdResult; + if (lastCmdResult == null || lastCmdResult.completionTime + 5 * 60 * 1000L < System.currentTimeMillis()) { return null; } @@ -564,7 +594,7 @@ public class ComboPlugin implements PluginBase, PumpInterface { extendedJson.put("ActiveProfile", MainApp.getConfigBuilder().getProfileName()); } catch (Exception e) { } - statusJson.put("timestamp", pump.lastCmdTime); + statusJson.put("timestamp", lastCmdResult.completionTime); PumpState ps = pump.state; if (ps != null) { @@ -582,7 +612,7 @@ public class ComboPlugin implements PluginBase, PumpInterface { pumpJson.put("status", statusJson); pumpJson.put("extended", extendedJson); - pumpJson.put("clock", DateUtil.toISOString(pump.lastCmdTime)); + pumpJson.put("clock", DateUtil.toISOString(lastCmdResult.completionTime)); return pumpJson; } catch (Exception e) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPump.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPump.java index 08a63f62aa..2a40fd66fa 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPump.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPump.java @@ -13,7 +13,7 @@ class ComboPump { @Nullable volatile CommandResult lastCmdResult; @NonNull - volatile Date lastCmdTime = new Date(0); volatile PumpState state = new PumpState(); + @NonNull volatile PumpHistory history = new PumpHistory(); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/events/EventComboPumpUpdateGUI.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/events/EventComboPumpUpdateGUI.java index e9bf3f8415..5b0755da97 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/events/EventComboPumpUpdateGUI.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/events/EventComboPumpUpdateGUI.java @@ -5,4 +5,11 @@ package info.nightscout.androidaps.plugins.PumpCombo.events; */ public class EventComboPumpUpdateGUI { + public EventComboPumpUpdateGUI() {} + + public EventComboPumpUpdateGUI(String status) { + this.status = status; + } + + public String status; } diff --git a/app/src/main/res/layout/combopump_fragment.xml b/app/src/main/res/layout/combopump_fragment.xml index b09c7aa757..4544943570 100644 --- a/app/src/main/res/layout/combopump_fragment.xml +++ b/app/src/main/res/layout/combopump_fragment.xml @@ -4,6 +4,10 @@ android:layout_height="match_parent" tools:context=".plugins.PumpCombo.ComboFragment"> + + -