diff --git a/app/libs/sightparser-release.aar b/app/libs/sightparser-release.aar
index de57a184f6..eef6d4ee59 100644
Binary files a/app/libs/sightparser-release.aar and b/app/libs/sightparser-release.aar differ
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 29b70202e7..446db92fac 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
@@ -9,6 +9,7 @@ import org.slf4j.LoggerFactory;
import java.text.DecimalFormat;
import java.util.Date;
+import java.util.UUID;
import info.nightscout.androidaps.BuildConfig;
import info.nightscout.androidaps.Config;
@@ -29,10 +30,12 @@ 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.events.EventInsightPumpCallback;
import info.nightscout.androidaps.plugins.PumpInsight.events.EventInsightPumpUpdateGui;
import info.nightscout.androidaps.plugins.PumpInsight.utils.Helpers;
import info.nightscout.utils.DateUtil;
import info.nightscout.utils.NSUpload;
+import sugar.free.sightparser.applayer.AppLayerMessage;
import sugar.free.sightparser.applayer.remote_control.CancelTBRMessage;
import sugar.free.sightparser.applayer.remote_control.ExtendedBolusMessage;
import sugar.free.sightparser.applayer.remote_control.StandardBolusMessage;
@@ -42,6 +45,7 @@ import sugar.free.sightparser.handling.TaskRunner;
import sugar.free.sightparser.handling.taskrunners.SetTBRTaskRunner;
import sugar.free.sightparser.handling.taskrunners.StatusTaskRunner;
+
/**
* Created by jamorham on 23/01/2018.
*
@@ -62,19 +66,22 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface {
private static Logger log = LoggerFactory.getLogger(InsightPumpPlugin.class);
private static volatile InsightPumpPlugin plugin;
+
private Date lastDataTime = new Date(0);
private TaskRunner taskRunner;
private boolean fragmentEnabled = true;
private boolean fragmentVisible = true;
private PumpDescription pumpDescription = new PumpDescription();
- private Handler handler = new Handler();
+ private final Handler handler = new Handler();
+ private final InsightPumpAsyncAdapter async = new InsightPumpAsyncAdapter();
private StatusTaskRunner.StatusResult statusResult;
private double basalRate = 0;
private final TaskRunner.ResultCallback statusResultHandler = new TaskRunner.ResultCallback() {
@Override
public void onError(Exception e) {
- log("Got error taskrunner: " + 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)) {
@@ -90,8 +97,6 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface {
statusResult = (StatusTaskRunner.StatusResult) result;
processStatusResult();
updateGui();
-
-
}
};
private Connector connector;
@@ -125,6 +130,7 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface {
this.connector = Connector.get();
this.connector.init();
+
log("back from init");
}
@@ -143,10 +149,19 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface {
}
}
+ // just log during debugging
private static void log(String msg) {
android.util.Log.e("INSIGHTPUMP", msg);
}
+ private static void updateGui() {
+ MainApp.bus().post(new EventInsightPumpUpdateGui());
+ }
+
+ private static void pushCallbackEvent(EventInsightPumpCallback e) {
+ MainApp.bus().post(e);
+ }
+
@Override
public String getFragmentClass() {
return InsightPumpFragment.class.getName();
@@ -253,7 +268,7 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface {
@Override
public void disconnect(String reason) {
try {
- connector.getServiceConnector().disconnect();
+ connector.getServiceConnector().disconnect();
} catch (NullPointerException e) {
log("Could not disconnect - null pointer: " + e);
}
@@ -270,7 +285,6 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface {
lastDataTime = new Date();
if (Connector.get().isPumpConnected()) {
log("is connected.. requesting status");
- //handler.removeCallbacks(statusTaskRunnable);
handler.postDelayed(new Runnable() {
@Override
public void run() {
@@ -278,12 +292,13 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface {
taskRunner.fetch(statusResultHandler);
}
}
- , 500);
+ , 1000);
} else {
log("not connected.. not requesting status");
}
}
+ // TODO implement
@Override
public PumpEnactResult setNewBasalProfile(Profile profile) {
lastDataTime = new Date();
@@ -315,7 +330,6 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface {
return df.format(basalRate);
}
-
@Override
public PumpEnactResult deliverTreatment(DetailedBolusInfo detailedBolusInfo) {
PumpEnactResult result = new PumpEnactResult();
@@ -325,29 +339,29 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface {
result.enacted = result.bolusDelivered > 0 || result.carbsDelivered > 0;
result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
- Double delivering = 0d;
+ final UUID cmd = deliverBolus((float) detailedBolusInfo.insulin); // actually request delivery
+ final Cstatus cs = async.busyWaitForCommandResult(cmd, 10000);
- /* while (delivering < detailedBolusInfo.insulin) {
- SystemClock.sleep(200);
- EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance();
- bolusingEvent.status = String.format(MainApp.sResources.getString(R.string.bolusdelivering), delivering);
- bolusingEvent.percent = Math.min((int) (delivering / detailedBolusInfo.insulin * 100), 100);
+ result.percent = 100;
+ result.success = cs == Cstatus.SUCCESS;;
+
+ if (result.success) {
+ log("Success!");
+
+ if (Config.logPumpComm)
+ log.debug("Delivering treatment insulin: " + detailedBolusInfo.insulin + "U carbs: " + detailedBolusInfo.carbs + "g " + result);
+
+ final EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance();
+ bolusingEvent.status = String.format(MainApp.sResources.getString(R.string.bolusdelivered), detailedBolusInfo.insulin);
+ bolusingEvent.percent = 100;
MainApp.bus().post(bolusingEvent);
- delivering += 0.1d;
+ MainApp.getConfigBuilder().addToHistoryTreatment(detailedBolusInfo);
+ } else {
+ log.debug("Failure to deliver treatment");
}
- SystemClock.sleep(200); */
- deliverBolus((float) detailedBolusInfo.insulin); // actually request delivery
- // TODO handle status result
- EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance();
- bolusingEvent.status = String.format(MainApp.sResources.getString(R.string.bolusdelivered), detailedBolusInfo.insulin);
- bolusingEvent.percent = 100;
- MainApp.bus().post(bolusingEvent);
- // SystemClock.sleep(1000);
- if (Config.logPumpComm)
- log.debug("Delivering treatment insulin: " + detailedBolusInfo.insulin + "U carbs: " + detailedBolusInfo.carbs + "g " + result);
MainApp.bus().post(new EventInsightPumpUpdateGui());
lastDataTime = new Date();
- MainApp.getConfigBuilder().addToHistoryTreatment(detailedBolusInfo);
+
return result;
}
@@ -356,6 +370,7 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface {
}
+ // TODO implement
@Override
public PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes, boolean enforceNew) {
TreatmentsInterface treatmentsInterface = MainApp.getConfigBuilder();
@@ -380,59 +395,58 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface {
return result;
}
- /*@Override
+
+ @Override
public PumpEnactResult setTempBasalPercent(Integer percent, Integer durationInMinutes, boolean enforceNew) {
- TreatmentsInterface treatmentsInterface = MainApp.getConfigBuilder();
- PumpEnactResult result = new PumpEnactResult();
- if (MainApp.getConfigBuilder().isTempBasalInProgress()) {
- result = cancelTempBasal(false);
- if (!result.success)
- return result;
+ log("Set TBR %");
+ final UUID cmd = aSyncTaskRunner(new SetTBRTaskRunner(connector.getServiceConnector(), percent, durationInMinutes), "Set TBR " + percent+"%" + " " + durationInMinutes + "m");
+
+ if (cmd == null) {
+ return new PumpEnactResult().success(false).enacted(false);
}
- TemporaryBasal tempBasal = new TemporaryBasal();
+
+ Cstatus cs = async.busyWaitForCommandResult(cmd, 10000);
+ log("Got command status: " + cs);
+
+ // create log entry
+ final TemporaryBasal tempBasal = new TemporaryBasal();
tempBasal.date = System.currentTimeMillis();
tempBasal.isAbsolute = false;
tempBasal.percentRate = percent;
tempBasal.durationInMinutes = durationInMinutes;
- tempBasal.source = Source.USER;
- result.success = true;
- result.enacted = true;
- result.percent = percent;
- result.isPercent = true;
- result.isTempCancel = false;
- result.duration = durationInMinutes;
- result.comment = MainApp.instance().getString(R.string.virtualpump_resultok);
- treatmentsInterface.addToHistoryTempBasal(tempBasal);
- if (Config.logPumpComm)
- log.debug("Settings temp basal percent: " + result);
- MainApp.bus().post(new EventInsightPumpUpdateGui());
- lastDataTime = new Date();
- return result;
- }*/
+ tempBasal.source = Source.USER; // TODO check this is correct
+ MainApp.getConfigBuilder().addToHistoryTempBasal(tempBasal);
+ PumpEnactResult pumpEnactResult = new PumpEnactResult().success(true).enacted(true).isPercent(true).duration(durationInMinutes);
+ pumpEnactResult.percent = percent;
+ pumpEnactResult.success = cs == Cstatus.SUCCESS;
+ pumpEnactResult.isTempCancel = percent == 100; // 100% temp basal is a cancellation
+ pumpEnactResult.comment=async.getCommandComment(cmd);
- @Override
- public PumpEnactResult setTempBasalPercent(Integer percent, Integer durationInMinutes, boolean enforceNew) {
- try {
- SetTBRTaskRunner setTBRTaskRunner = new SetTBRTaskRunner(connector.getServiceConnector(), percent, durationInMinutes);
- setTBRTaskRunner.fetchBlockingCall();
- PumpEnactResult pumpEnactResult = new PumpEnactResult().success(true).enacted(true).isPercent(true).duration(durationInMinutes);
- pumpEnactResult.percent = percent;
- return pumpEnactResult;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return new PumpEnactResult().success(false).enacted(false);
+ return pumpEnactResult;
}
+
+ // TODO update
@Override
public PumpEnactResult setExtendedBolus(Double insulin, Integer durationInMinutes) {
+ log("Set Extended Bolus");
ExtendedBolusMessage extendedBolusMessage = new ExtendedBolusMessage();
extendedBolusMessage.setAmount((float) ((double) insulin));
extendedBolusMessage.setDuration((short) ((int) durationInMinutes));
SingleMessageTaskRunner singleMessageTaskRunner = new SingleMessageTaskRunner(connector.getServiceConnector(), extendedBolusMessage);
try {
- singleMessageTaskRunner.fetchBlockingCall();
+ singleMessageTaskRunner.fetch(new TaskRunner.ResultCallback() {
+ @Override
+ public void onResult(Object o) {
+ log("OK TBR %");
+ }
+
+ @Override
+ public void onError(Exception e) {
+ log("Error TBR %");
+ }
+ });
return new PumpEnactResult().enacted(true).success(true).bolusDelivered(insulin).duration(durationInMinutes);
} catch (Exception e) {
e.printStackTrace();
@@ -442,28 +456,18 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface {
@Override
public PumpEnactResult cancelTempBasal(boolean enforceNew) {
- CancelTBRMessage cancelTBRMessage = new CancelTBRMessage();
- SingleMessageTaskRunner singleMessageTaskRunner = new SingleMessageTaskRunner(connector.getServiceConnector(), cancelTBRMessage);
- try {
- singleMessageTaskRunner.fetchBlockingCall();
- return new PumpEnactResult().success(true).enacted(true);
- } catch (Exception e) {
- e.printStackTrace();
+ log("Cancel TBR");
+ final UUID cmd = aSyncSingleCommand(new CancelTBRMessage(),"Cancel Temp Basal");;
+
+ if (cmd == null) {
+ return pumpEnactFailure();
}
- return new PumpEnactResult().success(false).enacted(false);
+
+ final Cstatus cs = async.busyWaitForCommandResult(cmd,10000);
+ return new PumpEnactResult().success(cs == Cstatus.SUCCESS).enacted(true).isTempCancel(true);
}
- @Override
- public PumpEnactResult cancelExtendedBolus() {
- CancelBolusTaskRunner cancelBolusTaskRunner = new CancelBolusTaskRunner(connector.getServiceConnector(), BolusType.EXTENDED);
- try {
- cancelBolusTaskRunner.fetchBlockingCall();
- return new PumpEnactResult().success(true).enacted(true);
- } catch (Exception e) {
- e.printStackTrace();
- }
- return new PumpEnactResult().success(false).enacted(false);
- }
+
/*
@Override
@@ -533,6 +537,86 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface {
return result;
}*/
+ private synchronized UUID aSyncSingleCommand(final AppLayerMessage msg, final String name) {
+ // if (!isConnected()) return false;
+ //if (isBusy()) return false;
+ log("asyncSinglecommand called: "+name);
+ final EventInsightPumpCallback event = new EventInsightPumpCallback();
+ new Thread() {
+ @Override
+ public void run() {
+ log("asyncSingleCommand thread");
+ final SingleMessageTaskRunner singleMessageTaskRunner = new SingleMessageTaskRunner(connector.getServiceConnector(), msg);
+ try {
+ singleMessageTaskRunner.fetch(new TaskRunner.ResultCallback() {
+ @Override
+ public void onResult(Object o) {
+ log(name+" success");
+ event.success = true;
+ pushCallbackEvent(event);
+ }
+
+ @Override
+ public void onError(Exception e) {
+ log(name+" error");
+ event.message = e.getMessage();
+ pushCallbackEvent(event);
+ }
+ });
+
+ } catch (Exception e) {
+ log("EXCEPTION" + e.toString());
+ }
+ }}.start();
+ return event.request_uuid;
+ }
+
+ private synchronized UUID aSyncTaskRunner(final TaskRunner task, final String name) {
+ // if (!isConnected()) return false;
+ //if (isBusy()) return false;
+ log("asyncTaskRunner called: "+name);
+ final EventInsightPumpCallback event = new EventInsightPumpCallback();
+ new Thread() {
+ @Override
+ public void run() {
+ log("asyncTaskRunner thread");
+ try {
+ task.fetch(new TaskRunner.ResultCallback() {
+ @Override
+ public void onResult(Object o) {
+ log(name+" success");
+ event.success = true;
+ pushCallbackEvent(event);
+ }
+
+ @Override
+ public void onError(Exception e) {
+ log(name+" error");
+ event.message = e.getMessage();
+ pushCallbackEvent(event);
+ }
+ });
+
+ } catch (Exception e) {
+ log("EXCEPTION" + e.toString());
+ }
+ }}.start();
+ return event.request_uuid;
+ }
+
+ // TODO update
+ @Override
+ public PumpEnactResult cancelExtendedBolus() {
+ CancelBolusTaskRunner cancelBolusTaskRunner = new CancelBolusTaskRunner(connector.getServiceConnector(), BolusType.EXTENDED);
+ try {
+ cancelBolusTaskRunner.fetchBlockingCall();
+ return new PumpEnactResult().success(true).enacted(true);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return new PumpEnactResult().success(false).enacted(false);
+ }
+
@Override
public JSONObject getJSONStatus() {
@@ -590,7 +674,6 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface {
return "Insight Pump";
}
-
private void processStatusResult() {
if (statusResult != null) {
batteryPercent = statusResult.getBatteryAmountMessage().getBatteryAmount();
@@ -600,38 +683,26 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface {
}
}
- private void deliverBolus(float bolusValue) {
+ private synchronized UUID deliverBolus(float bolusValue) {
log("!!!!!!!!!! DeliverBolus: " + bolusValue);
-
// Bare sanity checking
- if (bolusValue == 0) return;
- if (bolusValue > 10) return;
- if (bolusValue < 0) return;
+ if (bolusValue == 0) return null;
+ if (bolusValue > 10) return null;
+ if (bolusValue < 0) return null;
// TODO check limits here?
- StandardBolusMessage message = new StandardBolusMessage();
+ final StandardBolusMessage message = new StandardBolusMessage();
message.setAmount(bolusValue);
- final SingleMessageTaskRunner taskRunner = new SingleMessageTaskRunner(Connector.get().getServiceConnector(), message);
-
- taskRunner.fetch(new TaskRunner.ResultCallback() {
- @Override
- public void onResult(Object result) {
- log("Bolus result: " + result.toString());
- }
-
- @Override
- public void onError(Exception e) {
- log("Bolus error");
- }
- });
+ return aSyncSingleCommand(message,"Deliver Bolus "+bolusValue);
}
- private static void updateGui() {
- MainApp.bus().post(new EventInsightPumpUpdateGui());
+ private PumpEnactResult pumpEnactFailure() {
+ return new PumpEnactResult().success(false).enacted(false);
}
+
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java
index 0837051684..1d91eead62 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java
@@ -1,10 +1,5 @@
package info.nightscout.androidaps.plugins.PumpInsight.connector;
-import android.content.Context;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.util.Log;
-
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.plugins.PumpInsight.events.EventInsightPumpUpdateGui;
import info.nightscout.androidaps.plugins.PumpInsight.utils.Helpers;
@@ -28,7 +23,6 @@ public class Connector {
private static final String TAG = "InsightConnector";
private static final String COMPANION_APP_PACKAGE = "sugar.free.sightremote";
- private static final String STATUS_RECEIVER = "sugar.free.sightparser.handling.StatusCallback";
private static volatile Connector instance;
private volatile SightServiceConnector serviceConnector;
private volatile Status lastStatus = null;
@@ -80,22 +74,8 @@ public class Connector {
}
}
-
private static boolean isCompanionAppInstalled() {
- return checkPackageExists(MainApp.instance(), COMPANION_APP_PACKAGE);
- }
-
- private static boolean checkPackageExists(Context context, String packageName) {
- try {
- final PackageManager pm = context.getPackageManager();
- final PackageInfo pi = pm.getPackageInfo(packageName, 0);
- return pi.packageName.equals(packageName);
- } catch (PackageManager.NameNotFoundException e) {
- return false;
- } catch (Exception e) {
- Log.wtf(TAG, "Exception trying to determine packages! " + e);
- return false;
- }
+ return Helpers.checkPackageExists(MainApp.instance(), TAG, COMPANION_APP_PACKAGE);
}
public static void connectToPump() {
@@ -121,6 +101,11 @@ public class Connector {
} else {
log("Not trying init due to missing companion app");
}
+ } else {
+ if (!serviceConnector.isConnectedToService()) {
+ log("Trying to reconnect to service");
+ serviceConnector.connectToService();
+ }
}
}
@@ -148,7 +133,6 @@ public class Connector {
}
public boolean isPumpConnected() {
- //return isConnected() && serviceConnector.isUseable();
return isConnected() && getLastStatus() == Status.CONNECTED;
}
@@ -159,6 +143,10 @@ public class Connector {
}
if (!isConnected()) {
+ log("Not connected to companion");
+ if (Helpers.ratelimit("insight-app-not-connected", 5)) {
+ init();
+ }
return "Not connected to companion app!";
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/utils/Helpers.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/utils/Helpers.java
index 1f299ff6c6..0f4a386636 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/utils/Helpers.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/utils/Helpers.java
@@ -1,10 +1,15 @@
package info.nightscout.androidaps.plugins.PumpInsight.utils;
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
import android.util.Log;
import java.util.HashMap;
import java.util.Map;
+import info.nightscout.androidaps.plugins.PumpInsight.connector.Connector;
+
/**
* Created by jamorham on 24/01/2018.
*
@@ -34,4 +39,24 @@ public class Helpers {
return System.currentTimeMillis();
}
+ public static long msSince(long when) {
+ return (tsl() - when);
+ }
+
+ public static long msTill(long when) {
+ return (when - tsl());
+ }
+
+ public static boolean checkPackageExists(Context context, String TAG, String packageName) {
+ try {
+ final PackageManager pm = context.getPackageManager();
+ final PackageInfo pi = pm.getPackageInfo(packageName, 0);
+ return pi.packageName.equals(packageName);
+ } catch (PackageManager.NameNotFoundException e) {
+ return false;
+ } catch (Exception e) {
+ Log.wtf(TAG, "Exception trying to determine packages! " + e);
+ return false;
+ }
+ }
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 748a5cd017..97c672da68 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -862,6 +862,6 @@
Not enough insulin for bolus left in reservoir
Extended bolus delivery error
Insight
- Insight
+ Insight Pump