Insight: better connector lifecycle handling

This commit is contained in:
Jamorham 2018-02-23 09:00:08 +00:00
parent b989cf5a3c
commit cd95a0f5dd
No known key found for this signature in database
GPG key ID: 0BC5C3E0AAD64DF9
2 changed files with 96 additions and 23 deletions

View file

@ -92,6 +92,7 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints
private PumpDescription pumpDescription = new PumpDescription();
private double basalRate = 0;
private Connector connector;
private volatile boolean connector_enabled = false;
private final TaskRunner.ResultCallback statusResultHandler = new TaskRunner.ResultCallback() {
@Override
@ -120,7 +121,7 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints
};
private InsightPumpPlugin() {
log("InsightPumpPlugin");
log("InsightPumpPlugin instantiated");
pumpDescription.isBolusCapable = true;
pumpDescription.bolusStep = 0.05d; // specification says 0.05U up to 2U then 0.1U @ 2-5U 0.2U @ 10-20U 0.5U 10-20U (are these just UI restrictions?)
@ -144,12 +145,8 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints
pumpDescription.basalMinimumRate = 0.02d;
pumpDescription.isRefillingCapable = true;
//pumpDescription.storesCarbInfo = false; // uncomment when PumpDescription updated to include this
//pumpDescription.storesCarbInfo = false;
this.connector = Connector.get();
this.connector.init();
log("back from init");
}
@ -181,6 +178,31 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints
MainApp.bus().post(e);
}
private void enableConnector() {
if (!connector_enabled) {
synchronized (this) {
if (!connector_enabled) {
log("Instantiating connector");
connector_enabled = true;
this.connector = Connector.get();
this.connector.init();
}
}
}
}
private void disableConnector() {
if (connector_enabled) {
synchronized (this) {
if (connector_enabled) {
log("Shutting down connector");
Connector.get().shutdown();
connector_enabled = false;
}
}
}
}
@Override
public String getFragmentClass() {
return InsightPumpFragment.class.getName();
@ -231,7 +253,14 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints
@Override
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
if (type == PUMP) this.fragmentEnabled = fragmentEnabled;
if (type == PUMP) {
if (fragmentEnabled) {
enableConnector();
} else {
disableConnector();
}
this.fragmentEnabled = fragmentEnabled;
}
}
@Override
@ -480,7 +509,7 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints
if ((temporaryBasalFromHistory != null) && (temporaryBasalFromHistory.isInProgress())) {
// only change if it is +- 30% from where we are now or we have done more than 15 minutes already
if ((Math.abs(temporaryBasalFromHistory.percentRate - percent_amount) <= 30)
|| (temporaryBasalFromHistory.getRealDuration() < 15)) {
|| (temporaryBasalFromHistory.getPlannedRemainingMinutes() > 15)) {
log("Refusing to change TBR due to Insight plugin setting: " + percent_amount + " vs " + temporaryBasalFromHistory.percentRate + " running for: " + temporaryBasalFromHistory.getRealDuration());
return new PumpEnactResult().enacted(false).success(true);
}

View file

@ -229,7 +229,6 @@ public class Connector {
}
}
private static synchronized void delayedDisconnectionThread() {
if (keepAliveActive()) {
if (!disconnect_thread_running) {
@ -239,7 +238,7 @@ public class Connector {
public void run() {
final PowerManager.WakeLock wl = Helpers.getWakeLock("insight-disconnection-timer", 600000);
try {
while (keepAliveActive()) {
while (disconnect_thread_running && keepAliveActive()) {
if (Helpers.ratelimit("insight-expiry-notice", 5)) {
log("Staying connected thread expires: " + Helpers.dateTimeText(stayConnectedTill));
}
@ -249,8 +248,13 @@ public class Connector {
//
}
}
log("Sending the real delayed disconnect");
get().getServiceConnector().disconnect();
if (disconnect_thread_running) {
log("Sending the real delayed disconnect");
get().getServiceConnector().disconnect();
} else {
log("Disconnect thread already terminating");
}
} finally {
Helpers.releaseWakeLock(wl);
disconnect_thread_running = false;
@ -267,6 +271,39 @@ public class Connector {
return (long) (Helpers.roundDouble(((double) t * 100) / total, 0));
}
public synchronized void shutdown() {
if (instance != null) {
log("Attempting to shut down connector");
try {
disconnect_thread_running = false;
try {
instance.serviceConnector.setConnectionCallback(null);
} catch (Exception e) {
//
}
try {
instance.serviceConnector.removeStatusCallback(statusCallback);
} catch (Exception e) {
//
}
try {
instance.serviceConnector.disconnect();
} catch (Exception e) {
log("Exception disconnecting: " + e);
}
try {
instance.serviceConnector.disconnectFromService();
} catch (Exception e) {
log("Excpetion disconnecting service: " + e);
}
instance.serviceConnector = null;
instance = null;
} catch (Exception e) {
log("Exception shutting down: " + e);
}
}
}
@SuppressWarnings("AccessStaticViaInstance")
private synchronized void initializeHistoryReceiver() {
if (historyReceiver == null) {
@ -494,17 +531,24 @@ public class Connector {
@Subscribe
public void onStatusEvent(final EventFeatureRunning ev) {
if (SP.getBoolean("insight_preemptive_connect", true)) {
switch (ev.getFeature()) {
case WIZARD:
log("Wizard feature detected, preconnecting to pump");
connectToPump(120 * 1000);
break;
case MAIN:
log("Main feature detected, preconnecting to pump");
connectToPump(30 * 1000);
break;
new Thread(new Runnable() {
@Override
public void run() {
if (isConnected()) {
if (SP.getBoolean("insight_preemptive_connect", true)) {
switch (ev.getFeature()) {
case WIZARD:
log("Wizard feature detected, preconnecting to pump");
connectToPump(120 * 1000);
break;
case MAIN:
log("Main feature detected, preconnecting to pump");
connectToPump(30 * 1000);
break;
}
}
}
}
}
}).start();
}
}