Implement workaround for bolus with timeshift carbs, improve registering implicitly cancelled TBRs and remove some redundant code

This commit is contained in:
Bart Sopers 2020-09-04 19:25:02 +02:00
parent 8a38ef4a97
commit 1d3f4d3591
4 changed files with 54 additions and 45 deletions

View file

@ -7,6 +7,7 @@ import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.SystemClock;
import androidx.annotation.NonNull;
@ -34,9 +35,7 @@ import info.nightscout.androidaps.data.DetailedBolusInfo;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.data.PumpEnactResult;
import info.nightscout.androidaps.db.ExtendedBolus;
import info.nightscout.androidaps.db.Source;
import info.nightscout.androidaps.db.TemporaryBasal;
import info.nightscout.androidaps.db.Treatment;
import info.nightscout.androidaps.events.EventAppExit;
import info.nightscout.androidaps.events.EventAppInitialized;
import info.nightscout.androidaps.events.EventPreferenceChange;
@ -56,7 +55,6 @@ import info.nightscout.androidaps.plugins.general.actions.defs.CustomAction;
import info.nightscout.androidaps.plugins.general.actions.defs.CustomActionType;
import info.nightscout.androidaps.plugins.general.overview.events.EventDismissNotification;
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.general.overview.events.EventOverviewBolusProgress;
import info.nightscout.androidaps.plugins.general.overview.notifications.Notification;
import info.nightscout.androidaps.plugins.pump.common.data.TempBasalPair;
import info.nightscout.androidaps.plugins.pump.common.defs.PumpType;
@ -140,9 +138,10 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
private long nextPodCheck;
private boolean sentIdToFirebase;
private long lastConnectionTimeMillis;
private final Handler loopHandler = new Handler();
private final Handler loopHandler = new Handler(Looper.getMainLooper());
private final Runnable statusChecker;
private OmnipodCommandType currentCommand;
@Inject
public OmnipodPumpPlugin(
@ -322,8 +321,11 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
// But it doesn't tell us the duration or amount, so we can only update TBR status in AAPS if
// The pod is not running a TBR, while AAPS thinks it is
if (!podStateManager.isTempBasalRunning()) {
if (activePlugin.getActiveTreatments().isTempBasalInProgress() && !aapsOmnipodManager.hasSuspendedFakeTbr()) {
aapsOmnipodManager.reportCancelledTbr();
// Only report TBR cancellations if they haven't been explicitly requested
if (currentCommand != OmnipodCommandType.CANCEL_TEMPORARY_BASAL) {
if (activePlugin.getActiveTreatments().isTempBasalInProgress() && !aapsOmnipodManager.hasSuspendedFakeTbr()) {
aapsOmnipodManager.reportCancelledTbr();
}
}
}
}
@ -596,7 +598,7 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
public PumpEnactResult deliverTreatment(DetailedBolusInfo detailedBolusInfo) {
if (detailedBolusInfo.insulin == 0 && detailedBolusInfo.carbs == 0) {
// neither carbs nor bolus requested
aapsLogger.error("deliverTreatment: Invalid input");
aapsLogger.error("deliverTreatment: Invalid input: neither carbs nor insulin are set in treatment");
return new PumpEnactResult(getInjector()).success(false).enacted(false).bolusDelivered(0d).carbsDelivered(0d)
.comment(getResourceHelper().gs(info.nightscout.androidaps.core.R.string.invalidinput));
} else if (detailedBolusInfo.insulin > 0) {
@ -606,15 +608,6 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
// no bolus required, carb only treatment
activePlugin.getActiveTreatments().addToHistoryTreatment(detailedBolusInfo, true);
// FIXME do we need this??
EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.INSTANCE;
bolusingEvent.setT(new Treatment());
bolusingEvent.getT().isSMB = detailedBolusInfo.isSMB;
bolusingEvent.setPercent(100);
rxBus.send(bolusingEvent);
aapsLogger.debug(LTag.PUMP, "deliverTreatment: Carb only treatment.");
return new PumpEnactResult(getInjector()).success(true).enacted(true).bolusDelivered(0d)
.carbsDelivered(detailedBolusInfo.carbs).comment(getResourceHelper().gs(info.nightscout.androidaps.core.R.string.common_resultok));
}
@ -643,7 +636,6 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
if (tbrCurrent != null && !enforceNew) {
if (Round.isSame(tbrCurrent.absoluteRate, absoluteRate)) {
aapsLogger.info(LTag.PUMP, "setTempBasalAbsolute - No enforceNew and same rate. Exiting.");
rxBus.send(new EventRefreshOverview("Omnipod command: SetTemporaryBasal", false));
return new PumpEnactResult(getInjector()).success(true).enacted(false);
}
}
@ -665,23 +657,10 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
if (tbrCurrent == null) {
aapsLogger.info(LTag.PUMP, "cancelTempBasal - TBR already cancelled.");
rxBus.send(new EventRefreshOverview("Omnipod command: CancelTemporaryBasal", false));
return new PumpEnactResult(getInjector()).success(true).enacted(false);
}
PumpEnactResult result = executeCommand(OmnipodCommandType.CANCEL_TEMPORARY_BASAL, aapsOmnipodManager::cancelTemporaryBasal);
if (result.success) {
// TODO is this necessary?
TemporaryBasal tempBasal = new TemporaryBasal(getInjector()) //
.date(System.currentTimeMillis()) //
.duration(0) //
.source(Source.USER);
activePlugin.getActiveTreatments().addToHistoryTempBasal(tempBasal);
}
return result;
return executeCommand(OmnipodCommandType.CANCEL_TEMPORARY_BASAL, aapsOmnipodManager::cancelTemporaryBasal);
}
// TODO improve (i8n and more)
@ -934,17 +913,21 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface,
}
private <T> T executeCommand(OmnipodCommandType commandType, Supplier<T> supplier) {
aapsLogger.debug(LTag.PUMP, "Executing command: {}", commandType);
try {
currentCommand = commandType;
aapsLogger.debug(LTag.PUMP, "Executing command: {}", commandType);
rileyLinkUtil.getRileyLinkHistory().add(new RLHistoryItemOmnipod(getInjector(), commandType));
rileyLinkUtil.getRileyLinkHistory().add(new RLHistoryItemOmnipod(getInjector(), commandType));
T pumpEnactResult = supplier.get();
T pumpEnactResult = supplier.get();
rxBus.send(new EventRefreshOverview("Omnipod command: " + commandType.name(), false));
rxBus.send(new EventRefreshOverview("Omnipod command: " + commandType.name(), false));
rxBus.send(new EventOmnipodPumpValuesChanged());
rxBus.send(new EventOmnipodPumpValuesChanged());
return pumpEnactResult;
return pumpEnactResult;
} finally {
currentCommand = null;
}
}
private boolean verifyPodAlertConfiguration() {

View file

@ -46,8 +46,8 @@ public class BolusAction implements OmnipodAction<StatusResponse> {
podStateManager.getCurrentNonce(), bolusDeliverySchedule);
BolusExtraCommand bolusExtraCommand = new BolusExtraCommand(units, timeBetweenPulses,
acknowledgementBeep, completionBeep);
OmnipodMessage primeBolusMessage = new OmnipodMessage(podStateManager.getAddress(),
OmnipodMessage bolusMessage = new OmnipodMessage(podStateManager.getAddress(),
Arrays.asList(setInsulinScheduleCommand, bolusExtraCommand), podStateManager.getMessageNumber());
return communicationService.exchangeMessages(StatusResponse.class, podStateManager, primeBolusMessage);
return communicationService.exchangeMessages(StatusResponse.class, podStateManager, bolusMessage);
}
}

View file

@ -374,7 +374,7 @@ public class AapsOmnipodManager {
sp.remove(OmnipodStorageKeys.Preferences.ACTIVE_BOLUS);
return new PumpEnactResult(injector).success(true).enacted(true).bolusDelivered(detailedBolusInfo.insulin);
return new PumpEnactResult(injector).success(true).enacted(true).carbsDelivered(detailedBolusInfo.carbs).bolusDelivered(detailedBolusInfo.insulin);
}
public PumpEnactResult cancelBolus() {
@ -464,13 +464,22 @@ public class AapsOmnipodManager {
public PumpEnactResult cancelTemporaryBasal() {
try {
delegate.cancelTemporaryBasal(isTbrBeepsEnabled());
addSuccessToHistory(PodHistoryEntryType.CANCEL_TEMPORARY_BASAL, null);
} catch (Exception ex) {
String comment = handleAndTranslateException(ex);
addFailureToHistory(PodHistoryEntryType.CANCEL_TEMPORARY_BASAL, comment);
return new PumpEnactResult(injector).success(false).enacted(false).comment(comment);
}
long pumpId = addSuccessToHistory(PodHistoryEntryType.CANCEL_TEMPORARY_BASAL, null);
TemporaryBasal tempBasal = new TemporaryBasal(injector) //
.date(System.currentTimeMillis()) //
.duration(0) //
.pumpId(pumpId) //
.source(Source.PUMP);
activePlugin.getActiveTreatments().addToHistoryTempBasal(tempBasal);
return new PumpEnactResult(injector).success(true).enacted(true);
}
@ -568,9 +577,25 @@ public class AapsOmnipodManager {
return timeChangeEventEnabled;
}
public void addBolusToHistory(DetailedBolusInfo detailedBolusInfo) {
public void addBolusToHistory(DetailedBolusInfo originalDetailedBolusInfo) {
DetailedBolusInfo detailedBolusInfo = originalDetailedBolusInfo.copy();
long pumpId = addSuccessToHistory(detailedBolusInfo.date, PodHistoryEntryType.SET_BOLUS, detailedBolusInfo.insulin + ";" + detailedBolusInfo.carbs);
detailedBolusInfo.pumpId = pumpId;
if (detailedBolusInfo.carbs > 0 && detailedBolusInfo.carbTime > 0) {
// split out a separate carbs record without a pumpId
DetailedBolusInfo carbInfo = new DetailedBolusInfo();
carbInfo.date = detailedBolusInfo.date + detailedBolusInfo.carbTime * 60L * 1000L;
carbInfo.carbs = detailedBolusInfo.carbs;
carbInfo.source = Source.USER;
activePlugin.getActiveTreatments().addToHistoryTreatment(carbInfo, false);
// remove carbs from bolusInfo to not trigger any unwanted code paths in
// TreatmentsPlugin.addToHistoryTreatment() method
detailedBolusInfo.carbTime = 0;
detailedBolusInfo.carbs = 0;
}
activePlugin.getActiveTreatments().addToHistoryTreatment(detailedBolusInfo, false);
}
@ -634,7 +659,7 @@ public class AapsOmnipodManager {
.date(time) //
.duration(tempBasalPair.getDurationMinutes()) //
.absolute(tempBasalPair.getInsulinRate()) //
.pumpId(pumpId)
.pumpId(pumpId) //
.source(Source.PUMP);
activePlugin.getActiveTreatments().addToHistoryTempBasal(tempStart);

View file

@ -4,6 +4,7 @@ import android.content.Intent
import android.graphics.Color
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.text.TextUtils
import android.view.LayoutInflater
import android.view.View
@ -71,7 +72,7 @@ class OmnipodFragment : DaggerFragment() {
private var disposables: CompositeDisposable = CompositeDisposable()
private val loopHandler = Handler()
private val loopHandler = Handler(Looper.getMainLooper())
private lateinit var refreshLoop: Runnable
init {