BolusWizard -> kt, code consolidation
This commit is contained in:
parent
89fef312c5
commit
09e4106182
|
@ -50,7 +50,7 @@ public class QuickWizardEntry {
|
|||
useTemptarget: 0
|
||||
}
|
||||
*/
|
||||
public QuickWizardEntry() {
|
||||
QuickWizardEntry() {
|
||||
String emptyData = "{\"buttonText\":\"\",\"carbs\":0,\"validFrom\":0,\"validTo\":86340}";
|
||||
try {
|
||||
storage = new JSONObject(emptyData);
|
||||
|
@ -60,18 +60,17 @@ public class QuickWizardEntry {
|
|||
position = -1;
|
||||
}
|
||||
|
||||
public QuickWizardEntry(JSONObject entry, int position) {
|
||||
QuickWizardEntry(JSONObject entry, int position) {
|
||||
storage = entry;
|
||||
this.position = position;
|
||||
}
|
||||
|
||||
public Boolean isActive() {
|
||||
Boolean isActive() {
|
||||
return Profile.secondsFromMidnight() >= validFrom() && Profile.secondsFromMidnight() <= validTo();
|
||||
}
|
||||
|
||||
public BolusWizard doCalc(Profile profile, TempTarget tempTarget, BgReading lastBG, boolean _synchronized) {
|
||||
BolusWizard wizard = new BolusWizard();
|
||||
|
||||
public BolusWizard doCalc(Profile profile, String profileName, BgReading lastBG, boolean _synchronized) {
|
||||
final TempTarget tempTarget = TreatmentsPlugin.getPlugin().getTempTargetFromHistory();
|
||||
//BG
|
||||
double bg = 0;
|
||||
if (lastBG != null && useBG() == YES) {
|
||||
|
@ -86,11 +85,6 @@ public class QuickWizardEntry {
|
|||
cob = cobInfo.displayCob;
|
||||
}
|
||||
|
||||
// Temp target
|
||||
if (useTempTarget() == NO) {
|
||||
tempTarget = null;
|
||||
}
|
||||
|
||||
// Bolus IOB
|
||||
boolean bolusIOB = false;
|
||||
if (useBolusIOB() == YES) {
|
||||
|
@ -130,7 +124,9 @@ public class QuickWizardEntry {
|
|||
trend = true;
|
||||
}
|
||||
|
||||
wizard.doCalc(profile, tempTarget, carbs(), cob, bg, 0d, bolusIOB, basalIOB, superBolus, trend);
|
||||
BolusWizard wizard = new BolusWizard(profile, profileName, tempTarget, carbs(), cob, bg, 0d, 100, true, useCOB() == YES, bolusIOB, basalIOB, superBolus, useTempTarget() == YES, trend);
|
||||
wizard.doCalc();
|
||||
wizard.setNotes("QuickWizard");
|
||||
return wizard;
|
||||
}
|
||||
|
||||
|
|
|
@ -37,12 +37,9 @@ import android.widget.TextView;
|
|||
import com.jjoe64.graphview.GraphView;
|
||||
import com.squareup.otto.Subscribe;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
|
@ -55,7 +52,6 @@ import info.nightscout.androidaps.Config;
|
|||
import info.nightscout.androidaps.Constants;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.data.DetailedBolusInfo;
|
||||
import info.nightscout.androidaps.data.IobTotal;
|
||||
import info.nightscout.androidaps.data.Profile;
|
||||
import info.nightscout.androidaps.data.QuickWizardEntry;
|
||||
|
@ -95,7 +91,6 @@ import info.nightscout.androidaps.plugins.general.nsclient.data.NSDeviceStatus;
|
|||
import info.nightscout.androidaps.plugins.general.nsclient.data.NSSettingsStatus;
|
||||
import info.nightscout.androidaps.plugins.general.overview.activities.QuickWizardListActivity;
|
||||
import info.nightscout.androidaps.plugins.general.overview.dialogs.CalibrationDialog;
|
||||
import info.nightscout.androidaps.plugins.general.overview.dialogs.ErrorHelperActivity;
|
||||
import info.nightscout.androidaps.plugins.general.overview.dialogs.NewCarbsDialog;
|
||||
import info.nightscout.androidaps.plugins.general.overview.dialogs.NewInsulinDialog;
|
||||
import info.nightscout.androidaps.plugins.general.overview.dialogs.NewTreatmentDialog;
|
||||
|
@ -781,141 +776,25 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
|
|||
void onClickQuickwizard() {
|
||||
final BgReading actualBg = DatabaseHelper.actualBg();
|
||||
final Profile profile = ProfileFunctions.getInstance().getProfile();
|
||||
final TempTarget tempTarget = TreatmentsPlugin.getPlugin().getTempTargetFromHistory();
|
||||
final String profileName = ProfileFunctions.getInstance().getProfileName();
|
||||
final PumpInterface pump = ConfigBuilderPlugin.getPlugin().getActivePump();
|
||||
|
||||
final QuickWizardEntry quickWizardEntry = OverviewPlugin.getPlugin().quickWizard.getActive();
|
||||
if (quickWizardEntry != null && actualBg != null && profile != null) {
|
||||
if (quickWizardEntry != null && actualBg != null && profile != null && pump != null) {
|
||||
quickWizardButton.setVisibility(View.VISIBLE);
|
||||
final BolusWizard wizard = quickWizardEntry.doCalc(profile, tempTarget, actualBg, true);
|
||||
final BolusWizard wizard = quickWizardEntry.doCalc(profile, profileName, actualBg, true);
|
||||
|
||||
final JSONObject boluscalcJSON = new JSONObject();
|
||||
try {
|
||||
boluscalcJSON.put("eventTime", DateUtil.toISOString(new Date()));
|
||||
boluscalcJSON.put("targetBGLow", wizard.targetBGLow);
|
||||
boluscalcJSON.put("targetBGHigh", wizard.targetBGHigh);
|
||||
boluscalcJSON.put("isf", wizard.sens);
|
||||
boluscalcJSON.put("ic", wizard.ic);
|
||||
boluscalcJSON.put("iob", -(wizard.insulingFromBolusIOB + wizard.insulingFromBasalsIOB));
|
||||
boluscalcJSON.put("bolusiobused", true);
|
||||
boluscalcJSON.put("basaliobused", true);
|
||||
boluscalcJSON.put("bg", actualBg.valueToUnits(profile.getUnits()));
|
||||
boluscalcJSON.put("insulinbg", wizard.insulinFromBG);
|
||||
boluscalcJSON.put("insulinbgused", true);
|
||||
boluscalcJSON.put("bgdiff", wizard.bgDiff);
|
||||
boluscalcJSON.put("insulincarbs", wizard.insulinFromCarbs);
|
||||
boluscalcJSON.put("carbs", quickWizardEntry.carbs());
|
||||
boluscalcJSON.put("othercorrection", 0d);
|
||||
boluscalcJSON.put("insulintrend", wizard.insulinFromTrend);
|
||||
boluscalcJSON.put("insulin", wizard.calculatedTotalInsulin);
|
||||
} catch (JSONException e) {
|
||||
log.error("Unhandled exception", e);
|
||||
}
|
||||
if (wizard.calculatedTotalInsulin > 0d && quickWizardEntry.carbs() > 0d) {
|
||||
DecimalFormat formatNumber2decimalplaces = new DecimalFormat("0.00");
|
||||
String confirmMessage = MainApp.gs(R.string.entertreatmentquestion);
|
||||
|
||||
Double insulinAfterConstraints = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(wizard.calculatedTotalInsulin)).value();
|
||||
if (wizard.getCalculatedTotalInsulin() > 0d && quickWizardEntry.carbs() > 0d) {
|
||||
Integer carbsAfterConstraints = MainApp.getConstraintChecker().applyCarbsConstraints(new Constraint<>(quickWizardEntry.carbs())).value();
|
||||
|
||||
confirmMessage += "\n" + MainApp.gs(R.string.bolus) + ": " + formatNumber2decimalplaces.format(insulinAfterConstraints) + "U";
|
||||
confirmMessage += "\n" + MainApp.gs(R.string.carbs) + ": " + carbsAfterConstraints + "g";
|
||||
|
||||
if (Math.abs(insulinAfterConstraints - wizard.calculatedTotalInsulin) >= 0.01 || !carbsAfterConstraints.equals(quickWizardEntry.carbs())) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
|
||||
builder.setTitle(MainApp.gs(R.string.treatmentdeliveryerror));
|
||||
builder.setMessage(MainApp.gs(R.string.constraints_violation) + "\n" + MainApp.gs(R.string.changeyourinput));
|
||||
builder.setPositiveButton(MainApp.gs(R.string.ok), null);
|
||||
builder.show();
|
||||
if (Math.abs(wizard.getInsulinAfterConstraints() - wizard.getCalculatedTotalInsulin()) >= pump.getPumpDescription().pumpType.determineCorrectBolusSize(wizard.getInsulinAfterConstraints()) || !carbsAfterConstraints.equals(quickWizardEntry.carbs())) {
|
||||
OKDialog.show(getContext(), MainApp.gs(R.string.treatmentdeliveryerror), MainApp.gs(R.string.constraints_violation) + "\n" + MainApp.gs(R.string.changeyourinput), null);
|
||||
return;
|
||||
}
|
||||
|
||||
final Double finalInsulinAfterConstraints = insulinAfterConstraints;
|
||||
final Integer finalCarbsAfterConstraints = carbsAfterConstraints;
|
||||
final Context context = getContext();
|
||||
final AlertDialog.Builder builder = new AlertDialog.Builder(context);
|
||||
accepted = false;
|
||||
builder.setTitle(MainApp.gs(R.string.confirmation));
|
||||
builder.setMessage(confirmMessage);
|
||||
builder.setPositiveButton(MainApp.gs(R.string.ok), (dialog, id) -> {
|
||||
synchronized (builder) {
|
||||
if (accepted) {
|
||||
if (L.isEnabled(L.OVERVIEW))
|
||||
log.debug("guarding: already accepted");
|
||||
return;
|
||||
}
|
||||
accepted = true;
|
||||
if (Math.abs(insulinAfterConstraints - wizard.calculatedTotalInsulin) >= 0.01 || finalCarbsAfterConstraints > 0) {
|
||||
if (wizard.superBolus) {
|
||||
final LoopPlugin loopPlugin = LoopPlugin.getPlugin();
|
||||
if (loopPlugin.isEnabled(PluginType.LOOP)) {
|
||||
loopPlugin.superBolusTo(System.currentTimeMillis() + T.hours(2).msecs());
|
||||
MainApp.bus().post(new EventRefreshOverview("WizardDialog"));
|
||||
}
|
||||
|
||||
PumpInterface pump = ConfigBuilderPlugin.getPlugin().getActivePump();
|
||||
|
||||
if (pump.getPumpDescription().tempBasalStyle == PumpDescription.ABSOLUTE) {
|
||||
ConfigBuilderPlugin.getPlugin().getCommandQueue().tempBasalAbsolute(0.0d, 120, true, profile, new Callback() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (!result.success) {
|
||||
Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class);
|
||||
i.putExtra("soundid", R.raw.boluserror);
|
||||
i.putExtra("status", result.comment);
|
||||
i.putExtra("title", MainApp.gs(R.string.tempbasaldeliveryerror));
|
||||
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
MainApp.instance().startActivity(i);
|
||||
wizard.confirmAndExecute(getContext());
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
ConfigBuilderPlugin.getPlugin().getCommandQueue().tempBasalPercent(0, 120, true, profile, new Callback() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (!result.success) {
|
||||
Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class);
|
||||
i.putExtra("soundid", R.raw.boluserror);
|
||||
i.putExtra("status", result.comment);
|
||||
i.putExtra("title", MainApp.gs(R.string.tempbasaldeliveryerror));
|
||||
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
MainApp.instance().startActivity(i);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo();
|
||||
detailedBolusInfo.eventType = CareportalEvent.BOLUSWIZARD;
|
||||
detailedBolusInfo.insulin = finalInsulinAfterConstraints;
|
||||
detailedBolusInfo.carbs = finalCarbsAfterConstraints;
|
||||
detailedBolusInfo.context = context;
|
||||
detailedBolusInfo.boluscalc = boluscalcJSON;
|
||||
detailedBolusInfo.source = Source.USER;
|
||||
if (finalInsulinAfterConstraints > 0 || ConfigBuilderPlugin.getPlugin().getActivePump().getPumpDescription().storesCarbInfo) {
|
||||
ConfigBuilderPlugin.getPlugin().getCommandQueue().bolus(detailedBolusInfo, new Callback() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (!result.success) {
|
||||
Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class);
|
||||
i.putExtra("soundid", R.raw.boluserror);
|
||||
i.putExtra("status", result.comment);
|
||||
i.putExtra("title", MainApp.gs(R.string.treatmentdeliveryerror));
|
||||
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
MainApp.instance().startActivity(i);
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
TreatmentsPlugin.getPlugin().addToHistoryTreatment(detailedBolusInfo, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(MainApp.gs(R.string.cancel), null);
|
||||
builder.show();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -1100,6 +979,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
|
|||
final PumpInterface pump = ConfigBuilderPlugin.getPlugin().getActivePump();
|
||||
|
||||
final Profile profile = ProfileFunctions.getInstance().getProfile();
|
||||
final String profileName = ProfileFunctions.getInstance().getProfileName();
|
||||
|
||||
final String units = profile.getUnits();
|
||||
final double lowLine = OverviewPlugin.getPlugin().determineLowLine(units);
|
||||
|
@ -1297,10 +1177,10 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
|
|||
if (quickWizardEntry != null && lastBG != null && pump.isInitialized() && !pump.isSuspended()) {
|
||||
quickWizardButton.setVisibility(View.VISIBLE);
|
||||
String text = quickWizardEntry.buttonText() + "\n" + DecimalFormatter.to0Decimal(quickWizardEntry.carbs()) + "g";
|
||||
BolusWizard wizard = quickWizardEntry.doCalc(profile, tempTarget, lastBG, false);
|
||||
text += " " + DecimalFormatter.toPumpSupportedBolus(wizard.calculatedTotalInsulin) + "U";
|
||||
BolusWizard wizard = quickWizardEntry.doCalc(profile, profileName, lastBG, false);
|
||||
text += " " + DecimalFormatter.toPumpSupportedBolus(wizard.getCalculatedTotalInsulin()) + "U";
|
||||
quickWizardButton.setText(text);
|
||||
if (wizard.calculatedTotalInsulin <= 0)
|
||||
if (wizard.getCalculatedTotalInsulin() <= 0)
|
||||
quickWizardButton.setVisibility(View.GONE);
|
||||
} else
|
||||
quickWizardButton.setVisibility(View.GONE);
|
||||
|
|
|
@ -2,13 +2,9 @@ package info.nightscout.androidaps.plugins.general.overview.dialogs;
|
|||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.DialogFragment;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
import android.text.Editable;
|
||||
import android.text.Html;
|
||||
import android.text.TextWatcher;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
|
@ -28,47 +24,35 @@ import android.widget.TextView;
|
|||
|
||||
import com.squareup.otto.Subscribe;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
|
||||
import info.nightscout.androidaps.Constants;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.data.DetailedBolusInfo;
|
||||
import info.nightscout.androidaps.data.IobTotal;
|
||||
import info.nightscout.androidaps.data.Profile;
|
||||
import info.nightscout.androidaps.data.ProfileStore;
|
||||
import info.nightscout.androidaps.db.BgReading;
|
||||
import info.nightscout.androidaps.db.CareportalEvent;
|
||||
import info.nightscout.androidaps.db.DatabaseHelper;
|
||||
import info.nightscout.androidaps.db.Source;
|
||||
import info.nightscout.androidaps.db.TempTarget;
|
||||
import info.nightscout.androidaps.events.EventFeatureRunning;
|
||||
import info.nightscout.androidaps.events.EventRefreshOverview;
|
||||
import info.nightscout.androidaps.interfaces.Constraint;
|
||||
import info.nightscout.androidaps.interfaces.PluginType;
|
||||
import info.nightscout.androidaps.interfaces.PumpDescription;
|
||||
import info.nightscout.androidaps.interfaces.PumpInterface;
|
||||
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin;
|
||||
import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin;
|
||||
import info.nightscout.androidaps.plugins.configBuilder.ProfileFunctions;
|
||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.CobInfo;
|
||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin;
|
||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventAutosensCalculationFinished;
|
||||
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin;
|
||||
import info.nightscout.androidaps.queue.Callback;
|
||||
import info.nightscout.androidaps.utils.BolusWizard;
|
||||
import info.nightscout.androidaps.utils.DateUtil;
|
||||
import info.nightscout.androidaps.utils.DecimalFormatter;
|
||||
import info.nightscout.androidaps.utils.NumberPicker;
|
||||
import info.nightscout.androidaps.utils.SP;
|
||||
import info.nightscout.androidaps.utils.SafeParse;
|
||||
import info.nightscout.androidaps.utils.StringUtils;
|
||||
import info.nightscout.androidaps.utils.ToastUtils;
|
||||
|
||||
public class WizardDialog extends DialogFragment implements OnClickListener, CompoundButton.OnCheckedChangeListener, Spinner.OnItemSelectedListener {
|
||||
|
@ -109,8 +93,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com
|
|||
EditText notesEdit;
|
||||
|
||||
Integer calculatedCarbs = 0;
|
||||
Double calculatedTotalInsulin = 0d;
|
||||
JSONObject boluscalcJSON;
|
||||
BolusWizard wizard;
|
||||
|
||||
Context context;
|
||||
|
||||
|
@ -312,119 +295,8 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com
|
|||
return;
|
||||
}
|
||||
okClicked = true;
|
||||
final Profile profile = ProfileFunctions.getInstance().getProfile();
|
||||
final PumpInterface pump = ConfigBuilderPlugin.getPlugin().getActivePump();
|
||||
|
||||
if (pump != null && profile != null && (calculatedTotalInsulin > 0d || calculatedCarbs > 0d)) {
|
||||
String confirmMessage = MainApp.gs(R.string.entertreatmentquestion);
|
||||
|
||||
Double insulinAfterConstraints = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(calculatedTotalInsulin)).value();
|
||||
Integer carbsAfterConstraints = MainApp.getConstraintChecker().applyCarbsConstraints(new Constraint<>(calculatedCarbs)).value();
|
||||
|
||||
if (insulinAfterConstraints > 0)
|
||||
confirmMessage += "<br/>" + MainApp.gs(R.string.bolus) + ": " + "<font color='" + MainApp.gc(R.color.bolus) + "'>" + DecimalFormatter.toPumpSupportedBolus(insulinAfterConstraints) + "U" + "</font>";
|
||||
if (carbsAfterConstraints > 0)
|
||||
confirmMessage += "<br/>" + MainApp.gs(R.string.carbs) + ": " + "<font color='" + MainApp.gc(R.color.carbs) + "'>" + carbsAfterConstraints + "g" + "</font>";
|
||||
|
||||
if (Math.abs(insulinAfterConstraints - calculatedTotalInsulin) > pump.getPumpDescription().pumpType.determineCorrectBolusSize(insulinAfterConstraints) || !carbsAfterConstraints.equals(calculatedCarbs)) {
|
||||
confirmMessage += "<br/><font color='" + MainApp.gc(R.color.warning) + "'>" + MainApp.gs(R.string.bolusconstraintapplied) + "</font>";
|
||||
}
|
||||
|
||||
final Double finalInsulinAfterConstraints = insulinAfterConstraints;
|
||||
final Integer finalCarbsAfterConstraints = carbsAfterConstraints;
|
||||
final Double bg = SafeParse.stringToDouble(editBg.getText());
|
||||
final int carbTime = SafeParse.stringToInt(editCarbTime.getText());
|
||||
final boolean useSuperBolus = superbolusCheckbox.isChecked();
|
||||
final String finalNotes = notesEdit.getText().toString();
|
||||
|
||||
final AlertDialog.Builder builder = new AlertDialog.Builder(context);
|
||||
builder.setTitle(MainApp.gs(R.string.confirmation));
|
||||
builder.setMessage(Html.fromHtml(confirmMessage));
|
||||
builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int id) {
|
||||
synchronized (builder) {
|
||||
if (accepted) {
|
||||
log.debug("guarding: already accepted");
|
||||
return;
|
||||
}
|
||||
accepted = true;
|
||||
if (finalInsulinAfterConstraints > 0 || finalCarbsAfterConstraints > 0) {
|
||||
if (useSuperBolus) {
|
||||
final LoopPlugin loopPlugin = LoopPlugin.getPlugin();
|
||||
if (loopPlugin.isEnabled(PluginType.LOOP)) {
|
||||
loopPlugin.superBolusTo(System.currentTimeMillis() + 2 * 60L * 60 * 1000);
|
||||
MainApp.bus().post(new EventRefreshOverview("WizardDialog"));
|
||||
}
|
||||
|
||||
PumpInterface pump = ConfigBuilderPlugin.getPlugin().getActivePump();
|
||||
|
||||
if (pump.getPumpDescription().tempBasalStyle == PumpDescription.ABSOLUTE) {
|
||||
ConfigBuilderPlugin.getPlugin().getCommandQueue().tempBasalAbsolute(0.0d, 120, true, profile, new Callback() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (!result.success) {
|
||||
Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class);
|
||||
i.putExtra("soundid", R.raw.boluserror);
|
||||
i.putExtra("status", result.comment);
|
||||
i.putExtra("title", MainApp.gs(R.string.tempbasaldeliveryerror));
|
||||
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
MainApp.instance().startActivity(i);
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
|
||||
ConfigBuilderPlugin.getPlugin().getCommandQueue().tempBasalPercent(0, 120, true, profile, new Callback() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (!result.success) {
|
||||
Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class);
|
||||
i.putExtra("soundid", R.raw.boluserror);
|
||||
i.putExtra("status", result.comment);
|
||||
i.putExtra("title", MainApp.gs(R.string.tempbasaldeliveryerror));
|
||||
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
MainApp.instance().startActivity(i);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo();
|
||||
detailedBolusInfo.eventType = CareportalEvent.BOLUSWIZARD;
|
||||
detailedBolusInfo.insulin = finalInsulinAfterConstraints;
|
||||
detailedBolusInfo.carbs = finalCarbsAfterConstraints;
|
||||
detailedBolusInfo.context = context;
|
||||
detailedBolusInfo.glucose = bg;
|
||||
detailedBolusInfo.glucoseType = "Manual";
|
||||
detailedBolusInfo.carbTime = carbTime;
|
||||
detailedBolusInfo.boluscalc = boluscalcJSON;
|
||||
detailedBolusInfo.source = Source.USER;
|
||||
detailedBolusInfo.notes = finalNotes;
|
||||
if (detailedBolusInfo.insulin > 0 || ConfigBuilderPlugin.getPlugin().getActivePump().getPumpDescription().storesCarbInfo) {
|
||||
ConfigBuilderPlugin.getPlugin().getCommandQueue().bolus(detailedBolusInfo, new Callback() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (!result.success) {
|
||||
Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class);
|
||||
i.putExtra("soundid", R.raw.boluserror);
|
||||
i.putExtra("status", result.comment);
|
||||
i.putExtra("title", MainApp.gs(R.string.treatmentdeliveryerror));
|
||||
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
MainApp.instance().startActivity(i);
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
TreatmentsPlugin.getPlugin().addToHistoryTreatment(detailedBolusInfo, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(MainApp.gs(R.string.cancel), null);
|
||||
builder.show();
|
||||
wizard.confirmAndExecute(context);
|
||||
dismiss();
|
||||
}
|
||||
break;
|
||||
case R.id.cancel:
|
||||
dismiss();
|
||||
|
@ -471,8 +343,8 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com
|
|||
TreatmentsPlugin.getPlugin().updateTotalIOBTempBasals();
|
||||
IobTotal basalIob = TreatmentsPlugin.getPlugin().getLastCalculationTempBasals().round();
|
||||
|
||||
bolusIobInsulin.setText(DecimalFormatter.to2Decimal(-bolusIob.iob) + "U");
|
||||
basalIobInsulin.setText(DecimalFormatter.to2Decimal(-basalIob.basaliob) + "U");
|
||||
bolusIobInsulin.setText(StringUtils.formatInsulin(-bolusIob.iob));
|
||||
basalIobInsulin.setText(StringUtils.formatInsulin(-basalIob.basaliob));
|
||||
|
||||
calculateInsulin();
|
||||
}
|
||||
|
@ -481,13 +353,13 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com
|
|||
ProfileStore profileStore = ConfigBuilderPlugin.getPlugin().getActiveProfileInterface().getProfile();
|
||||
if (profileSpinner == null || profileSpinner.getSelectedItem() == null || profileStore == null)
|
||||
return; // not initialized yet
|
||||
String selectedAlternativeProfile = profileSpinner.getSelectedItem().toString();
|
||||
String profileName = profileSpinner.getSelectedItem().toString();
|
||||
Profile specificProfile;
|
||||
if (selectedAlternativeProfile.equals(MainApp.gs(R.string.active))) {
|
||||
if (profileName.equals(MainApp.gs(R.string.active))) {
|
||||
specificProfile = ProfileFunctions.getInstance().getProfile();
|
||||
selectedAlternativeProfile = ProfileFunctions.getInstance().getProfileName();
|
||||
profileName = ProfileFunctions.getInstance().getProfileName();
|
||||
} else
|
||||
specificProfile = profileStore.getSpecificProfile(selectedAlternativeProfile);
|
||||
specificProfile = profileStore.getSpecificProfile(profileName);
|
||||
|
||||
// Entered values
|
||||
Double c_bg = SafeParse.stringToDouble(editBg.getText());
|
||||
|
@ -515,104 +387,64 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com
|
|||
Double c_cob = 0d;
|
||||
if (cobCheckbox.isChecked()) {
|
||||
CobInfo cobInfo = IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "Wizard COB");
|
||||
if (cobInfo != null && cobInfo.displayCob != null)
|
||||
if (cobInfo.displayCob != null)
|
||||
c_cob = cobInfo.displayCob;
|
||||
}
|
||||
|
||||
BolusWizard wizard = new BolusWizard();
|
||||
wizard.doCalc(specificProfile, tempTarget, carbsAfterConstraint, c_cob, c_bg, corrAfterConstraint, bolusIobCheckbox.isChecked(), basalIobCheckbox.isChecked(), superbolusCheckbox.isChecked(), bgtrendCheckbox.isChecked());
|
||||
wizard = new BolusWizard(specificProfile, profileName, tempTarget, carbsAfterConstraint, c_cob, c_bg, corrAfterConstraint, 100d, bgCheckbox.isChecked(), cobCheckbox.isChecked(), bolusIobCheckbox.isChecked(), basalIobCheckbox.isChecked(), superbolusCheckbox.isChecked(), ttCheckbox.isChecked(), bgtrendCheckbox.isChecked());
|
||||
wizard.doCalc();
|
||||
wizard.setNotes(notesEdit.getText().toString());
|
||||
wizard.setCarbTime(SafeParse.stringToInt(editCarbTime.getText()));
|
||||
|
||||
bg.setText(c_bg + " ISF: " + DecimalFormatter.to1Decimal(wizard.sens));
|
||||
bgInsulin.setText(DecimalFormatter.to2Decimal(wizard.insulinFromBG) + "U");
|
||||
bg.setText(c_bg + " ISF: " + DecimalFormatter.to1Decimal(wizard.getSens()));
|
||||
bgInsulin.setText(StringUtils.formatInsulin(wizard.getInsulinFromBG()));
|
||||
|
||||
carbs.setText(DecimalFormatter.to0Decimal(c_carbs) + "g IC: " + DecimalFormatter.to1Decimal(wizard.ic));
|
||||
carbsInsulin.setText(DecimalFormatter.to2Decimal(wizard.insulinFromCarbs) + "U");
|
||||
carbs.setText(DecimalFormatter.to0Decimal(c_carbs) + "g IC: " + DecimalFormatter.to1Decimal(wizard.getIc()));
|
||||
carbsInsulin.setText(StringUtils.formatInsulin(wizard.getInsulinFromCarbs()));
|
||||
|
||||
bolusIobInsulin.setText(DecimalFormatter.to2Decimal(wizard.insulingFromBolusIOB) + "U");
|
||||
basalIobInsulin.setText(DecimalFormatter.to2Decimal(wizard.insulingFromBasalsIOB) + "U");
|
||||
bolusIobInsulin.setText(StringUtils.formatInsulin(wizard.getInsulingFromBolusIOB()));
|
||||
basalIobInsulin.setText(StringUtils.formatInsulin(wizard.getInsulingFromBasalsIOB()));
|
||||
|
||||
correctionInsulin.setText(DecimalFormatter.to2Decimal(wizard.insulinFromCorrection) + "U");
|
||||
calculatedTotalInsulin = wizard.calculatedTotalInsulin;
|
||||
correctionInsulin.setText(StringUtils.formatInsulin(wizard.getInsulinFromCorrection()));
|
||||
|
||||
calculatedCarbs = carbsAfterConstraint;
|
||||
|
||||
// Superbolus
|
||||
if (superbolusCheckbox.isChecked()) {
|
||||
superbolus.setText("2h");
|
||||
} else {
|
||||
superbolus.setText("");
|
||||
}
|
||||
superbolusInsulin.setText(DecimalFormatter.to2Decimal(wizard.insulinFromSuperBolus) + "U");
|
||||
superbolus.setText(superbolusCheckbox.isChecked() ? MainApp.gs(R.string.twohours) : "");
|
||||
superbolusInsulin.setText(StringUtils.formatInsulin(wizard.getInsulinFromSuperBolus()));
|
||||
|
||||
// Trend
|
||||
if (bgtrendCheckbox.isChecked()) {
|
||||
if (wizard.glucoseStatus != null) {
|
||||
bgTrend.setText((wizard.glucoseStatus.avgdelta > 0 ? "+" : "") + Profile.toUnitsString(wizard.glucoseStatus.avgdelta * 3, wizard.glucoseStatus.avgdelta * 3 / 18, specificProfile.getUnits()) + " " + specificProfile.getUnits());
|
||||
if (bgtrendCheckbox.isChecked() && wizard.getGlucoseStatus() != null) {
|
||||
bgTrend.setText(
|
||||
(wizard.getTrend() > 0 ? "+" : "")
|
||||
+ Profile.toUnitsString(wizard.getTrend() * 3, wizard.getTrend() * 3 / Constants.MMOLL_TO_MGDL, specificProfile.getUnits())
|
||||
+ " " + specificProfile.getUnits());
|
||||
} else {
|
||||
bgTrend.setText("");
|
||||
}
|
||||
} else {
|
||||
bgTrend.setText("");
|
||||
}
|
||||
bgTrendInsulin.setText(DecimalFormatter.to2Decimal(wizard.insulinFromTrend) + "U");
|
||||
bgTrendInsulin.setText(StringUtils.formatInsulin(wizard.getInsulinFromTrend()));
|
||||
|
||||
// COB
|
||||
if (cobCheckbox.isChecked()) {
|
||||
cob.setText(DecimalFormatter.to2Decimal(c_cob) + "g IC: " + DecimalFormatter.to1Decimal(wizard.ic));
|
||||
cobInsulin.setText(DecimalFormatter.to2Decimal(wizard.insulinFromCOB) + "U");
|
||||
cob.setText(DecimalFormatter.to2Decimal(c_cob) + "g IC: " + DecimalFormatter.to1Decimal(wizard.getIc()));
|
||||
cobInsulin.setText(StringUtils.formatInsulin(wizard.getInsulinFromCOB()));
|
||||
} else {
|
||||
cob.setText("");
|
||||
cobInsulin.setText("");
|
||||
}
|
||||
|
||||
if (calculatedTotalInsulin > 0d || calculatedCarbs > 0d) {
|
||||
String insulinText = calculatedTotalInsulin > 0d ? (DecimalFormatter.toPumpSupportedBolus(calculatedTotalInsulin) + "U") : "";
|
||||
if (wizard.getCalculatedTotalInsulin() > 0d || calculatedCarbs > 0d) {
|
||||
String insulinText = wizard.getCalculatedTotalInsulin() > 0d ? (DecimalFormatter.toPumpSupportedBolus(wizard.getCalculatedTotalInsulin()) + "U") : "";
|
||||
String carbsText = calculatedCarbs > 0d ? (DecimalFormatter.to0Decimal(calculatedCarbs) + "g") : "";
|
||||
total.setText(MainApp.gs(R.string.result) + ": " + insulinText + " " + carbsText);
|
||||
okButton.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
// TODO this should also be run when loading the dialog as the OK button is initially visible
|
||||
// but does nothing if neither carbs nor insulin is > 0
|
||||
total.setText(MainApp.gs(R.string.missing) + " " + DecimalFormatter.to0Decimal(wizard.carbsEquivalent) + "g");
|
||||
total.setText(MainApp.gs(R.string.missing) + " " + DecimalFormatter.to0Decimal(wizard.getCarbsEquivalent()) + "g");
|
||||
okButton.setVisibility(View.INVISIBLE);
|
||||
}
|
||||
|
||||
boluscalcJSON = new JSONObject();
|
||||
try {
|
||||
boluscalcJSON.put("profile", selectedAlternativeProfile);
|
||||
boluscalcJSON.put("notes", notesEdit.getText());
|
||||
boluscalcJSON.put("eventTime", DateUtil.toISOString(new Date()));
|
||||
boluscalcJSON.put("targetBGLow", wizard.targetBGLow);
|
||||
boluscalcJSON.put("targetBGHigh", wizard.targetBGHigh);
|
||||
boluscalcJSON.put("isf", wizard.sens);
|
||||
boluscalcJSON.put("ic", wizard.ic);
|
||||
boluscalcJSON.put("iob", -(wizard.insulingFromBolusIOB + wizard.insulingFromBasalsIOB));
|
||||
boluscalcJSON.put("bolusiob", wizard.insulingFromBolusIOB);
|
||||
boluscalcJSON.put("basaliob", wizard.insulingFromBasalsIOB);
|
||||
boluscalcJSON.put("bolusiobused", bolusIobCheckbox.isChecked());
|
||||
boluscalcJSON.put("basaliobused", basalIobCheckbox.isChecked());
|
||||
boluscalcJSON.put("bg", c_bg);
|
||||
boluscalcJSON.put("insulinbg", wizard.insulinFromBG);
|
||||
boluscalcJSON.put("insulinbgused", bgCheckbox.isChecked());
|
||||
boluscalcJSON.put("bgdiff", wizard.bgDiff);
|
||||
boluscalcJSON.put("insulincarbs", wizard.insulinFromCarbs);
|
||||
boluscalcJSON.put("carbs", c_carbs);
|
||||
boluscalcJSON.put("cob", c_cob);
|
||||
boluscalcJSON.put("cobused", cobCheckbox.isChecked());
|
||||
boluscalcJSON.put("insulincob", wizard.insulinFromCOB);
|
||||
boluscalcJSON.put("othercorrection", corrAfterConstraint);
|
||||
boluscalcJSON.put("insulinsuperbolus", wizard.insulinFromSuperBolus);
|
||||
boluscalcJSON.put("insulintrend", wizard.insulinFromTrend);
|
||||
boluscalcJSON.put("insulin", calculatedTotalInsulin);
|
||||
boluscalcJSON.put("superbolusused", superbolusCheckbox.isChecked());
|
||||
boluscalcJSON.put("insulinsuperbolus", wizard.insulinFromSuperBolus);
|
||||
boluscalcJSON.put("trendused", bgtrendCheckbox.isChecked());
|
||||
boluscalcJSON.put("insulintrend", wizard.insulinFromTrend);
|
||||
boluscalcJSON.put("trend", bgTrend.getText());
|
||||
boluscalcJSON.put("ttused", ttCheckbox.isChecked());
|
||||
} catch (JSONException e) {
|
||||
log.error("Unhandled exception", e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -207,6 +207,7 @@ public class ActionStringHandler {
|
|||
int percentage = Integer.parseInt(act[2]);
|
||||
|
||||
Profile profile = ProfileFunctions.getInstance().getProfile();
|
||||
String profileName = ProfileFunctions.getInstance().getProfileName();
|
||||
if (profile == null) {
|
||||
sendError("No profile found!");
|
||||
return;
|
||||
|
@ -226,45 +227,45 @@ public class ActionStringHandler {
|
|||
|
||||
DecimalFormat format = new DecimalFormat("0.00");
|
||||
DecimalFormat formatInt = new DecimalFormat("0");
|
||||
BolusWizard bolusWizard = new BolusWizard();
|
||||
bolusWizard.doCalc(profile, useTT ? TreatmentsPlugin.getPlugin().getTempTargetFromHistory() : null,
|
||||
carbsAfterConstraints, useCOB?cobInfo.displayCob:0d, useBG ? bgReading.valueToUnits(profile.getUnits()) : 0d,
|
||||
0d, percentage, useBolusIOB, useBasalIOB, false, useTrend);
|
||||
BolusWizard bolusWizard = new BolusWizard(profile, profileName, TreatmentsPlugin.getPlugin().getTempTargetFromHistory(),
|
||||
carbsAfterConstraints, cobInfo.displayCob, bgReading.valueToUnits(profile.getUnits()),
|
||||
0d, percentage, useBG, useCOB, useBolusIOB, useBasalIOB, false, useTT, useTrend);
|
||||
bolusWizard.doCalc();
|
||||
|
||||
Double insulinAfterConstraints = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(bolusWizard.calculatedTotalInsulin)).value();
|
||||
if (Math.abs(insulinAfterConstraints - bolusWizard.calculatedTotalInsulin) >= 0.01) {
|
||||
Double insulinAfterConstraints = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(bolusWizard.getCalculatedTotalInsulin())).value();
|
||||
if (Math.abs(insulinAfterConstraints - bolusWizard.getCalculatedTotalInsulin()) >= 0.01) {
|
||||
sendError("Insulin constraint violation!" +
|
||||
"\nCannot deliver " + format.format(bolusWizard.calculatedTotalInsulin) + "!");
|
||||
"\nCannot deliver " + format.format(bolusWizard.getCalculatedTotalInsulin()) + "!");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (bolusWizard.calculatedTotalInsulin < 0) {
|
||||
bolusWizard.calculatedTotalInsulin = 0d;
|
||||
if (bolusWizard.getCalculatedTotalInsulin() < 0) {
|
||||
bolusWizard.setCalculatedTotalInsulin(0d);
|
||||
}
|
||||
|
||||
if (bolusWizard.calculatedTotalInsulin <= 0 && bolusWizard.carbs <= 0) {
|
||||
if (bolusWizard.getCalculatedTotalInsulin() <= 0 && bolusWizard.getCarbs() <= 0) {
|
||||
rAction = "info";
|
||||
rTitle = "INFO";
|
||||
} else {
|
||||
rAction = actionstring;
|
||||
}
|
||||
rMessage += "Carbs: " + bolusWizard.carbs + "g";
|
||||
rMessage += "\nBolus: " + format.format(bolusWizard.calculatedTotalInsulin) + "U";
|
||||
rMessage += "Carbs: " + bolusWizard.getCarbs() + "g";
|
||||
rMessage += "\nBolus: " + format.format(bolusWizard.getCalculatedTotalInsulin()) + "U";
|
||||
rMessage += "\n_____________";
|
||||
rMessage += "\nCalc (IC:" + DecimalFormatter.to1Decimal(bolusWizard.ic) + ", " + "ISF:" + DecimalFormatter.to1Decimal(bolusWizard.sens) + "): ";
|
||||
rMessage += "\nFrom Carbs: " + format.format(bolusWizard.insulinFromCarbs) + "U";
|
||||
rMessage += "\nCalc (IC:" + DecimalFormatter.to1Decimal(bolusWizard.getIc()) + ", " + "ISF:" + DecimalFormatter.to1Decimal(bolusWizard.getSens()) + "): ";
|
||||
rMessage += "\nFrom Carbs: " + format.format(bolusWizard.getInsulinFromCarbs()) + "U";
|
||||
if (useCOB)
|
||||
rMessage += "\nFrom" + formatInt.format(cobInfo.displayCob) + "g COB : " + format.format(bolusWizard.insulinFromCOB) + "U";
|
||||
if (useBG) rMessage += "\nFrom BG: " + format.format(bolusWizard.insulinFromBG) + "U";
|
||||
rMessage += "\nFrom" + formatInt.format(cobInfo.displayCob) + "g COB : " + format.format(bolusWizard.getInsulinFromCOB()) + "U";
|
||||
if (useBG) rMessage += "\nFrom BG: " + format.format(bolusWizard.getInsulinFromBG()) + "U";
|
||||
if (useBolusIOB)
|
||||
rMessage += "\nBolus IOB: " + format.format(bolusWizard.insulingFromBolusIOB) + "U";
|
||||
rMessage += "\nBolus IOB: " + format.format(bolusWizard.getInsulingFromBolusIOB()) + "U";
|
||||
if (useBasalIOB)
|
||||
rMessage += "\nBasal IOB: " + format.format(bolusWizard.insulingFromBasalsIOB) + "U";
|
||||
rMessage += "\nBasal IOB: " + format.format(bolusWizard.getInsulingFromBasalsIOB()) + "U";
|
||||
if (useTrend)
|
||||
rMessage += "\nFrom 15' trend: " + format.format(bolusWizard.insulinFromTrend) + "U";
|
||||
rMessage += "\nFrom 15' trend: " + format.format(bolusWizard.getInsulinFromTrend()) + "U";
|
||||
if (percentage != 100) {
|
||||
rMessage += "\nPercentage: " + format.format(bolusWizard.totalBeforePercentageAdjustment) + "U * " + percentage + "% -> ~" + format.format(bolusWizard.calculatedTotalInsulin) + "U";
|
||||
rMessage += "\nPercentage: " + format.format(bolusWizard.getTotalBeforePercentageAdjustment()) + "U * " + percentage + "% -> ~" + format.format(bolusWizard.getCalculatedTotalInsulin()) + "U";
|
||||
}
|
||||
|
||||
lastBolusWizard = bolusWizard;
|
||||
|
@ -628,7 +629,7 @@ public class ActionStringHandler {
|
|||
if (lastBolusWizard != null) {
|
||||
//use last calculation as confirmed string matches
|
||||
|
||||
doBolus(lastBolusWizard.calculatedTotalInsulin, lastBolusWizard.carbs);
|
||||
doBolus(lastBolusWizard.getCalculatedTotalInsulin(), lastBolusWizard.getCarbs());
|
||||
lastBolusWizard = null;
|
||||
}
|
||||
} else if ("bolus".equals(act[0])) {
|
||||
|
|
|
@ -1,183 +0,0 @@
|
|||
package info.nightscout.androidaps.utils;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus;
|
||||
import info.nightscout.androidaps.data.IobTotal;
|
||||
import info.nightscout.androidaps.data.Profile;
|
||||
import info.nightscout.androidaps.db.TempTarget;
|
||||
import info.nightscout.androidaps.interfaces.TreatmentsInterface;
|
||||
import info.nightscout.androidaps.logging.L;
|
||||
import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin;
|
||||
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin;
|
||||
|
||||
/**
|
||||
* Created by mike on 11.10.2016.
|
||||
*/
|
||||
|
||||
public class BolusWizard {
|
||||
private Logger log = LoggerFactory.getLogger(L.CORE);
|
||||
// Inputs
|
||||
private Profile specificProfile = null;
|
||||
private TempTarget tempTarget;
|
||||
public Integer carbs = 0;
|
||||
private Double bg = 0d;
|
||||
private Double cob = 0d;
|
||||
private Double correction;
|
||||
private Double percentageCorrection;
|
||||
private Boolean includeBolusIOB = true;
|
||||
private Boolean includeBasalIOB = true;
|
||||
public Boolean superBolus = false;
|
||||
private Boolean trend = false;
|
||||
|
||||
// Intermediate
|
||||
public double sens = 0d;
|
||||
public double ic = 0d;
|
||||
|
||||
public GlucoseStatus glucoseStatus;
|
||||
|
||||
public double targetBGLow = 0d;
|
||||
public double targetBGHigh = 0d;
|
||||
public double bgDiff = 0d;
|
||||
|
||||
public double insulinFromBG = 0d;
|
||||
public double insulinFromCarbs = 0d;
|
||||
public double insulingFromBolusIOB = 0d;
|
||||
public double insulingFromBasalsIOB = 0d;
|
||||
public double insulinFromCorrection = 0d;
|
||||
public double insulinFromSuperBolus = 0d;
|
||||
public double insulinFromCOB = 0d;
|
||||
public double insulinFromTrend = 0d;
|
||||
|
||||
// Result
|
||||
public Double calculatedTotalInsulin = 0d;
|
||||
public Double totalBeforePercentageAdjustment = 0d;
|
||||
public Double carbsEquivalent = 0d;
|
||||
|
||||
public Double doCalc(Profile specificProfile, TempTarget tempTarget, Integer carbs, Double cob, Double bg, Double correction, Boolean includeBolusIOB, Boolean includeBasalIOB, Boolean superBolus, Boolean trend) {
|
||||
return doCalc(specificProfile, tempTarget, carbs, cob, bg, correction, 100d, includeBolusIOB, includeBasalIOB, superBolus, trend);
|
||||
}
|
||||
|
||||
public Double doCalc(Profile specificProfile, TempTarget tempTarget, Integer carbs, Double cob, Double bg, Double correction, double percentageCorrection, Boolean includeBolusIOB, Boolean includeBasalIOB, Boolean superBolus, Boolean trend) {
|
||||
this.specificProfile = specificProfile;
|
||||
this.tempTarget = tempTarget;
|
||||
this.carbs = carbs;
|
||||
this.bg = bg;
|
||||
this.cob = cob;
|
||||
this.correction = correction;
|
||||
this.percentageCorrection = percentageCorrection;
|
||||
this.includeBolusIOB = includeBolusIOB;
|
||||
this.includeBasalIOB = includeBasalIOB;
|
||||
this.superBolus = superBolus;
|
||||
this.trend = trend;
|
||||
|
||||
// Insulin from BG
|
||||
sens = specificProfile.getIsf();
|
||||
targetBGLow = specificProfile.getTargetLow();
|
||||
targetBGHigh = specificProfile.getTargetHigh();
|
||||
if (tempTarget != null) {
|
||||
targetBGLow = Profile.fromMgdlToUnits(tempTarget.low, specificProfile.getUnits());
|
||||
targetBGHigh = Profile.fromMgdlToUnits(tempTarget.high, specificProfile.getUnits());
|
||||
}
|
||||
if (bg >= targetBGLow && bg <= targetBGHigh) {
|
||||
bgDiff = 0d;
|
||||
} else if (bg <= targetBGLow) {
|
||||
bgDiff = bg - targetBGLow;
|
||||
} else {
|
||||
bgDiff = bg - targetBGHigh;
|
||||
}
|
||||
insulinFromBG = bg != 0d ? bgDiff / sens : 0d;
|
||||
|
||||
// Insulin from 15 min trend
|
||||
glucoseStatus = GlucoseStatus.getGlucoseStatusData();
|
||||
if (glucoseStatus != null && trend) {
|
||||
insulinFromTrend = (Profile.fromMgdlToUnits(glucoseStatus.short_avgdelta, specificProfile.getUnits()) * 3) / sens;
|
||||
}
|
||||
|
||||
// Insuling from carbs
|
||||
ic = specificProfile.getIc();
|
||||
insulinFromCarbs = carbs / ic;
|
||||
insulinFromCOB = cob / ic;
|
||||
|
||||
// Insulin from IOB
|
||||
// IOB calculation
|
||||
TreatmentsInterface treatments = TreatmentsPlugin.getPlugin();
|
||||
treatments.updateTotalIOBTreatments();
|
||||
IobTotal bolusIob = treatments.getLastCalculationTreatments().round();
|
||||
treatments.updateTotalIOBTempBasals();
|
||||
IobTotal basalIob = treatments.getLastCalculationTempBasals().round();
|
||||
|
||||
insulingFromBolusIOB = includeBolusIOB ? -bolusIob.iob : 0d;
|
||||
insulingFromBasalsIOB = includeBasalIOB ? -basalIob.basaliob : 0d;
|
||||
|
||||
// Insulin from correction
|
||||
insulinFromCorrection = correction;
|
||||
|
||||
// Insulin from superbolus for 2h. Get basal rate now and after 1h
|
||||
if (superBolus) {
|
||||
insulinFromSuperBolus = specificProfile.getBasal();
|
||||
long timeAfter1h = System.currentTimeMillis();
|
||||
timeAfter1h += T.hours(1).msecs();
|
||||
insulinFromSuperBolus += specificProfile.getBasal(timeAfter1h);
|
||||
}
|
||||
|
||||
// Total
|
||||
calculatedTotalInsulin = insulinFromBG + insulinFromTrend + insulinFromCarbs + insulingFromBolusIOB + insulingFromBasalsIOB + insulinFromCorrection + insulinFromSuperBolus + insulinFromCOB;
|
||||
|
||||
// Percentage adjustment
|
||||
totalBeforePercentageAdjustment = calculatedTotalInsulin;
|
||||
if (calculatedTotalInsulin > 0) {
|
||||
calculatedTotalInsulin = calculatedTotalInsulin * percentageCorrection / 100d;
|
||||
}
|
||||
|
||||
if (calculatedTotalInsulin < 0) {
|
||||
carbsEquivalent = -calculatedTotalInsulin * ic;
|
||||
calculatedTotalInsulin = 0d;
|
||||
}
|
||||
|
||||
double bolusStep = ConfigBuilderPlugin.getPlugin().getActivePump().getPumpDescription().bolusStep;
|
||||
calculatedTotalInsulin = Round.roundTo(calculatedTotalInsulin, bolusStep);
|
||||
|
||||
log.debug(log());
|
||||
|
||||
return calculatedTotalInsulin;
|
||||
}
|
||||
|
||||
public String log() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
sb.append("TempTarget=").append(tempTarget != null ? tempTarget.toString() : "null").append("; ");
|
||||
sb.append("Carbs=").append(carbs != null ? carbs : null).append("; ");
|
||||
sb.append("Bg=").append(bg).append("; ");
|
||||
sb.append("Cob=").append(cob).append("; ");
|
||||
sb.append("Correction=").append(correction).append("; ");
|
||||
sb.append("PercentageCorrection=").append(percentageCorrection).append("; ");
|
||||
sb.append("IncludeBolusIOB=").append(includeBolusIOB).append("; ");
|
||||
sb.append("IncludeBasalIOB=").append(includeBasalIOB).append("; ");
|
||||
sb.append("Superbolus=").append(superBolus).append("; ");
|
||||
sb.append("Trend=").append(trend).append("; ");
|
||||
sb.append("Profile=").append(specificProfile != null && specificProfile.getData() != null ? specificProfile.getData().toString() : "null").append("; ");
|
||||
sb.append("\n");
|
||||
|
||||
sb.append("targetBGLow=").append(targetBGLow).append("; ");
|
||||
sb.append("targetBGHigh=").append(targetBGHigh).append("; ");
|
||||
sb.append("bgDiff=").append(bgDiff).append("; ");
|
||||
sb.append("insulinFromBG=").append(insulinFromBG).append("; ");
|
||||
sb.append("insulinFromCarbs=").append(insulinFromCarbs).append("; ");
|
||||
sb.append("insulingFromBolusIOB=").append(insulingFromBolusIOB).append("; ");
|
||||
sb.append("insulingFromBasalsIOB=").append(insulingFromBasalsIOB).append("; ");
|
||||
sb.append("insulinFromCorrection=").append(insulinFromCorrection).append("; ");
|
||||
sb.append("insulinFromSuperBolus=").append(insulinFromSuperBolus).append("; ");
|
||||
sb.append("insulinFromCOB=").append(insulinFromCOB).append("; ");
|
||||
sb.append("insulinFromTrend=").append(insulinFromTrend).append("; ");
|
||||
sb.append("\n");
|
||||
|
||||
|
||||
sb.append("calculatedTotalInsulin=").append(calculatedTotalInsulin).append("; ");
|
||||
sb.append("totalBeforePercentageAdjustment=").append(totalBeforePercentageAdjustment).append("; ");
|
||||
sb.append("carbsEquivalent=").append(carbsEquivalent).append("; ");
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,342 @@
|
|||
package info.nightscout.androidaps.utils
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.support.v7.app.AlertDialog
|
||||
import android.text.Html
|
||||
import info.nightscout.androidaps.MainApp
|
||||
import info.nightscout.androidaps.R
|
||||
import info.nightscout.androidaps.data.DetailedBolusInfo
|
||||
import info.nightscout.androidaps.data.Profile
|
||||
import info.nightscout.androidaps.db.CareportalEvent
|
||||
import info.nightscout.androidaps.db.Source
|
||||
import info.nightscout.androidaps.db.TempTarget
|
||||
import info.nightscout.androidaps.events.EventRefreshOverview
|
||||
import info.nightscout.androidaps.interfaces.Constraint
|
||||
import info.nightscout.androidaps.interfaces.PluginType
|
||||
import info.nightscout.androidaps.interfaces.PumpDescription
|
||||
import info.nightscout.androidaps.interfaces.PumpInterface
|
||||
import info.nightscout.androidaps.logging.L
|
||||
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
|
||||
import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin
|
||||
import info.nightscout.androidaps.plugins.configBuilder.ProfileFunctions
|
||||
import info.nightscout.androidaps.plugins.general.overview.dialogs.ErrorHelperActivity
|
||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus
|
||||
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin
|
||||
import info.nightscout.androidaps.queue.Callback
|
||||
import org.json.JSONException
|
||||
import org.json.JSONObject
|
||||
import org.slf4j.LoggerFactory
|
||||
import java.util.*
|
||||
|
||||
class BolusWizard(val profile: Profile,
|
||||
val profileName: String,
|
||||
val tempTarget: TempTarget?,
|
||||
val carbs: Int,
|
||||
val cob: Double,
|
||||
val bg: Double,
|
||||
val correction: Double,
|
||||
val percentageCorrection: Double = 100.0,
|
||||
val useBg: Boolean,
|
||||
val useCob: Boolean,
|
||||
val includeBolusIOB: Boolean,
|
||||
val includeBasalIOB: Boolean,
|
||||
val useSuperBolus: Boolean,
|
||||
val useTT: Boolean,
|
||||
val useTrend: Boolean) {
|
||||
|
||||
private val log = LoggerFactory.getLogger(L.CORE)
|
||||
|
||||
// Intermediate
|
||||
var sens = 0.0
|
||||
var ic = 0.0
|
||||
|
||||
var glucoseStatus: GlucoseStatus? = null
|
||||
|
||||
var targetBGLow = 0.0
|
||||
var targetBGHigh = 0.0
|
||||
var bgDiff = 0.0
|
||||
|
||||
var insulinFromBG = 0.0
|
||||
var insulinFromCarbs = 0.0
|
||||
var insulingFromBolusIOB = 0.0
|
||||
var insulingFromBasalsIOB = 0.0
|
||||
var insulinFromCorrection = 0.0
|
||||
var insulinFromSuperBolus = 0.0
|
||||
var insulinFromCOB = 0.0
|
||||
var insulinFromTrend = 0.0
|
||||
|
||||
var trend = 0.0
|
||||
var carbTime = 0;
|
||||
|
||||
var notes = ""
|
||||
var accepted = false
|
||||
|
||||
// Result
|
||||
var calculatedTotalInsulin: Double = 0.0
|
||||
var totalBeforePercentageAdjustment: Double = 0.0
|
||||
var carbsEquivalent: Double = 0.0
|
||||
|
||||
var insulinAfterConstraints: Double = 0.0
|
||||
|
||||
fun doCalc(): Double {
|
||||
|
||||
// Insulin from BG
|
||||
sens = profile.isf
|
||||
targetBGLow = profile.targetLow
|
||||
targetBGHigh = profile.targetHigh
|
||||
if (useTT && tempTarget != null) {
|
||||
targetBGLow = Profile.fromMgdlToUnits(tempTarget.low, profile.units)
|
||||
targetBGHigh = Profile.fromMgdlToUnits(tempTarget.high, profile.units)
|
||||
}
|
||||
if (useBg && bg > 0) {
|
||||
if (bg >= targetBGLow && bg <= targetBGHigh) {
|
||||
bgDiff = 0.0
|
||||
} else if (bg <= targetBGLow) {
|
||||
bgDiff = bg - targetBGLow
|
||||
} else {
|
||||
bgDiff = bg - targetBGHigh
|
||||
}
|
||||
insulinFromBG = bgDiff / sens
|
||||
}
|
||||
|
||||
// Insulin from 15 min trend
|
||||
glucoseStatus = GlucoseStatus.getGlucoseStatusData()
|
||||
if (glucoseStatus != null && useTrend) {
|
||||
trend = glucoseStatus!!.short_avgdelta
|
||||
insulinFromTrend = Profile.fromMgdlToUnits(trend, profile.units) * 3 / sens
|
||||
}
|
||||
|
||||
// Insuling from carbs
|
||||
ic = profile.ic
|
||||
insulinFromCarbs = carbs / ic
|
||||
insulinFromCOB = if (useCob) (cob / ic) else 0.0
|
||||
|
||||
// Insulin from IOB
|
||||
// IOB calculation
|
||||
val treatments = TreatmentsPlugin.getPlugin()
|
||||
treatments.updateTotalIOBTreatments()
|
||||
val bolusIob = treatments.lastCalculationTreatments.round()
|
||||
treatments.updateTotalIOBTempBasals()
|
||||
val basalIob = treatments.lastCalculationTempBasals.round()
|
||||
|
||||
insulingFromBolusIOB = if (includeBolusIOB) -bolusIob.iob else 0.0
|
||||
insulingFromBasalsIOB = if (includeBasalIOB) -basalIob.basaliob else 0.0
|
||||
|
||||
// Insulin from correction
|
||||
insulinFromCorrection = correction
|
||||
|
||||
// Insulin from superbolus for 2h. Get basal rate now and after 1h
|
||||
if (useSuperBolus) {
|
||||
insulinFromSuperBolus = profile.basal
|
||||
var timeAfter1h = System.currentTimeMillis()
|
||||
timeAfter1h += T.hours(1).msecs()
|
||||
insulinFromSuperBolus += profile.getBasal(timeAfter1h)
|
||||
}
|
||||
|
||||
// Total
|
||||
calculatedTotalInsulin = insulinFromBG + insulinFromTrend + insulinFromCarbs + insulingFromBolusIOB + insulingFromBasalsIOB + insulinFromCorrection + insulinFromSuperBolus + insulinFromCOB
|
||||
|
||||
// Percentage adjustment
|
||||
totalBeforePercentageAdjustment = calculatedTotalInsulin
|
||||
if (calculatedTotalInsulin > 0) {
|
||||
calculatedTotalInsulin = calculatedTotalInsulin * percentageCorrection / 100.0
|
||||
}
|
||||
|
||||
if (calculatedTotalInsulin < 0) {
|
||||
carbsEquivalent = (-calculatedTotalInsulin) * ic
|
||||
calculatedTotalInsulin = 0.0
|
||||
}
|
||||
|
||||
val bolusStep = ConfigBuilderPlugin.getPlugin().activePump.pumpDescription.bolusStep
|
||||
calculatedTotalInsulin = Round.roundTo(calculatedTotalInsulin, bolusStep)
|
||||
|
||||
insulinAfterConstraints = MainApp.getConstraintChecker().applyBolusConstraints(Constraint(calculatedTotalInsulin)).value()
|
||||
|
||||
log.debug(this.toString())
|
||||
|
||||
return calculatedTotalInsulin
|
||||
}
|
||||
/*
|
||||
fun log(): String {
|
||||
val sb = StringBuilder()
|
||||
|
||||
sb.append("TempTarget=").append(tempTarget?.toString() ?: "null").append("; ")
|
||||
sb.append("Carbs=").append(carbs).append("; ")
|
||||
sb.append("Bg=").append(bg).append("; ")
|
||||
sb.append("Cob=").append(cob).append("; ")
|
||||
sb.append("Correction=").append(correction).append("; ")
|
||||
sb.append("PercentageCorrection=").append(percentageCorrection).append("; ")
|
||||
sb.append("IncludeBolusIOB=").append(includeBolusIOB).append("; ")
|
||||
sb.append("IncludeBasalIOB=").append(includeBasalIOB).append("; ")
|
||||
sb.append("Superbolus=").append(useSuperBolus).append("; ")
|
||||
sb.append("Trend=").append(useTrend).append("; ")
|
||||
sb.append("Profile=").append(profile.data?.toString()).append("; ")
|
||||
sb.append("\n")
|
||||
|
||||
sb.append("targetBGLow=").append(targetBGLow).append("; ")
|
||||
sb.append("targetBGHigh=").append(targetBGHigh).append("; ")
|
||||
sb.append("bgDiff=").append(bgDiff).append("; ")
|
||||
sb.append("insulinFromBG=").append(insulinFromBG).append("; ")
|
||||
sb.append("insulinFromCarbs=").append(insulinFromCarbs).append("; ")
|
||||
sb.append("insulingFromBolusIOB=").append(insulingFromBolusIOB).append("; ")
|
||||
sb.append("insulingFromBasalsIOB=").append(insulingFromBasalsIOB).append("; ")
|
||||
sb.append("insulinFromCorrection=").append(insulinFromCorrection).append("; ")
|
||||
sb.append("insulinFromSuperBolus=").append(insulinFromSuperBolus).append("; ")
|
||||
sb.append("insulinFromCOB=").append(insulinFromCOB).append("; ")
|
||||
sb.append("insulinFromTrend=").append(insulinFromTrend).append("; ")
|
||||
sb.append("\n")
|
||||
|
||||
sb.append("calculatedTotalInsulin=").append(calculatedTotalInsulin).append("; ")
|
||||
sb.append("totalBeforePercentageAdjustment=").append(totalBeforePercentageAdjustment).append("; ")
|
||||
sb.append("carbsEquivalent=").append(carbsEquivalent).append("; ")
|
||||
|
||||
return sb.toString()
|
||||
}
|
||||
*/
|
||||
fun nsJSON(): JSONObject {
|
||||
val boluscalcJSON = JSONObject()
|
||||
try {
|
||||
boluscalcJSON.put("profile", profileName)
|
||||
boluscalcJSON.put("notes", notes)
|
||||
boluscalcJSON.put("eventTime", DateUtil.toISOString(Date()))
|
||||
boluscalcJSON.put("targetBGLow", targetBGLow)
|
||||
boluscalcJSON.put("targetBGHigh", targetBGHigh)
|
||||
boluscalcJSON.put("isf", sens)
|
||||
boluscalcJSON.put("ic", ic)
|
||||
boluscalcJSON.put("iob", -(insulingFromBolusIOB + insulingFromBasalsIOB))
|
||||
boluscalcJSON.put("bolusiob", insulingFromBolusIOB)
|
||||
boluscalcJSON.put("basaliob", insulingFromBasalsIOB)
|
||||
boluscalcJSON.put("bolusiobused", includeBolusIOB)
|
||||
boluscalcJSON.put("basaliobused", includeBasalIOB)
|
||||
boluscalcJSON.put("bg", bg)
|
||||
boluscalcJSON.put("insulinbg", insulinFromBG)
|
||||
boluscalcJSON.put("insulinbgused", useBg)
|
||||
boluscalcJSON.put("bgdiff", bgDiff)
|
||||
boluscalcJSON.put("insulincarbs", insulinFromCarbs)
|
||||
boluscalcJSON.put("carbs", carbs)
|
||||
boluscalcJSON.put("cob", cob)
|
||||
boluscalcJSON.put("cobused", useCob)
|
||||
boluscalcJSON.put("insulincob", insulinFromCOB)
|
||||
boluscalcJSON.put("othercorrection", correction)
|
||||
boluscalcJSON.put("insulinsuperbolus", insulinFromSuperBolus)
|
||||
boluscalcJSON.put("insulintrend", insulinFromTrend)
|
||||
boluscalcJSON.put("insulin", calculatedTotalInsulin)
|
||||
boluscalcJSON.put("superbolusused", useSuperBolus)
|
||||
boluscalcJSON.put("insulinsuperbolus", insulinFromSuperBolus)
|
||||
boluscalcJSON.put("trendused", useTrend)
|
||||
boluscalcJSON.put("insulintrend", insulinFromTrend)
|
||||
boluscalcJSON.put("trend", trend)
|
||||
boluscalcJSON.put("ttused", useTT)
|
||||
} catch (e: JSONException) {
|
||||
log.error("Unhandled exception", e)
|
||||
}
|
||||
return boluscalcJSON
|
||||
}
|
||||
|
||||
fun confirmMessageAfterConstraints(pump: PumpInterface): String {
|
||||
|
||||
var confirmMessage = MainApp.gs(R.string.entertreatmentquestion)
|
||||
if (insulinAfterConstraints > 0)
|
||||
confirmMessage += "<br/>" + MainApp.gs(R.string.bolus) + ": " + "<font color='" + MainApp.gc(R.color.bolus) + "'>" + DecimalFormatter.toPumpSupportedBolus(insulinAfterConstraints) + "U" + "</font>"
|
||||
if (carbs > 0)
|
||||
confirmMessage += "<br/>" + MainApp.gs(R.string.carbs) + ": " + "<font color='" + MainApp.gc(R.color.carbs) + "'>" + carbs + "g" + "</font>"
|
||||
|
||||
if (Math.abs(insulinAfterConstraints - calculatedTotalInsulin) > pump.getPumpDescription().pumpType.determineCorrectBolusSize(insulinAfterConstraints)) {
|
||||
confirmMessage += "<br/><font color='" + MainApp.gc(R.color.warning) + "'>" + MainApp.gs(R.string.bolusconstraintapplied) + "</font>"
|
||||
}
|
||||
|
||||
return confirmMessage
|
||||
}
|
||||
|
||||
fun confirmAndExecute(context: Context) {
|
||||
val profile = ProfileFunctions.getInstance().profile
|
||||
val pump = ConfigBuilderPlugin.getPlugin().activePump
|
||||
|
||||
if (pump != null && profile != null && (calculatedTotalInsulin > 0.0 || carbs > 0.0)) {
|
||||
val confirmMessage = confirmMessageAfterConstraints(pump)
|
||||
|
||||
val builder = AlertDialog.Builder(context)
|
||||
builder.setTitle(MainApp.gs(R.string.confirmation))
|
||||
builder.setMessage(Html.fromHtml(confirmMessage))
|
||||
builder.setPositiveButton(MainApp.gs(R.string.ok)) { dialog, id ->
|
||||
synchronized(builder) {
|
||||
if (accepted) {
|
||||
log.debug("guarding: already accepted")
|
||||
return@setPositiveButton
|
||||
}
|
||||
accepted = true
|
||||
if (insulinAfterConstraints > 0 || carbs > 0) {
|
||||
if (useSuperBolus) {
|
||||
val loopPlugin = LoopPlugin.getPlugin()
|
||||
if (loopPlugin.isEnabled(PluginType.LOOP)) {
|
||||
loopPlugin.superBolusTo(System.currentTimeMillis() + 2 * 60L * 60 * 1000)
|
||||
MainApp.bus().post(EventRefreshOverview("WizardDialog"))
|
||||
}
|
||||
|
||||
val pump1 = ConfigBuilderPlugin.getPlugin().activePump
|
||||
|
||||
if (pump1.pumpDescription.tempBasalStyle == PumpDescription.ABSOLUTE) {
|
||||
ConfigBuilderPlugin.getPlugin().commandQueue.tempBasalAbsolute(0.0, 120, true, profile, object : Callback() {
|
||||
override fun run() {
|
||||
if (!result.success) {
|
||||
val i = Intent(MainApp.instance(), ErrorHelperActivity::class.java)
|
||||
i.putExtra("soundid", R.raw.boluserror)
|
||||
i.putExtra("status", result.comment)
|
||||
i.putExtra("title", MainApp.gs(R.string.tempbasaldeliveryerror))
|
||||
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
MainApp.instance().startActivity(i)
|
||||
}
|
||||
}
|
||||
})
|
||||
} else {
|
||||
|
||||
ConfigBuilderPlugin.getPlugin().commandQueue.tempBasalPercent(0, 120, true, profile, object : Callback() {
|
||||
override fun run() {
|
||||
if (!result.success) {
|
||||
val i = Intent(MainApp.instance(), ErrorHelperActivity::class.java)
|
||||
i.putExtra("soundid", R.raw.boluserror)
|
||||
i.putExtra("status", result.comment)
|
||||
i.putExtra("title", MainApp.gs(R.string.tempbasaldeliveryerror))
|
||||
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
MainApp.instance().startActivity(i)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
val detailedBolusInfo = DetailedBolusInfo()
|
||||
detailedBolusInfo.eventType = CareportalEvent.BOLUSWIZARD
|
||||
detailedBolusInfo.insulin = insulinAfterConstraints
|
||||
detailedBolusInfo.carbs = carbs.toDouble()
|
||||
detailedBolusInfo.context = context
|
||||
detailedBolusInfo.glucose = bg
|
||||
detailedBolusInfo.glucoseType = "Manual"
|
||||
detailedBolusInfo.carbTime = carbTime
|
||||
detailedBolusInfo.boluscalc = nsJSON()
|
||||
detailedBolusInfo.source = Source.USER
|
||||
detailedBolusInfo.notes = notes
|
||||
if (detailedBolusInfo.insulin > 0 || ConfigBuilderPlugin.getPlugin().activePump.pumpDescription.storesCarbInfo) {
|
||||
ConfigBuilderPlugin.getPlugin().commandQueue.bolus(detailedBolusInfo, object : Callback() {
|
||||
override fun run() {
|
||||
if (!result.success) {
|
||||
val i = Intent(MainApp.instance(), ErrorHelperActivity::class.java)
|
||||
i.putExtra("soundid", R.raw.boluserror)
|
||||
i.putExtra("status", result.comment)
|
||||
i.putExtra("title", MainApp.gs(R.string.treatmentdeliveryerror))
|
||||
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
MainApp.instance().startActivity(i)
|
||||
}
|
||||
}
|
||||
})
|
||||
} else {
|
||||
TreatmentsPlugin.getPlugin().addToHistoryTreatment(detailedBolusInfo, false)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
builder.setNegativeButton(MainApp.gs(R.string.cancel), null)
|
||||
builder.show()
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,5 +1,8 @@
|
|||
package info.nightscout.androidaps.utils;
|
||||
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
|
||||
/**
|
||||
* class contains useful String functions
|
||||
*/
|
||||
|
@ -17,4 +20,8 @@ public class StringUtils {
|
|||
|
||||
return string;
|
||||
}
|
||||
|
||||
public static String formatInsulin(double insulin) {
|
||||
return String.format(MainApp.gs(R.string.formatinsulinunits), insulin);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1334,6 +1334,8 @@
|
|||
<string name="old_version">old version</string>
|
||||
<string name="very_old_version">very old version</string>
|
||||
<string name="new_version_warning">New version for at least %1$d days available! Fallback to LGS after 60 days, loop will be disabled after 90 days</string>
|
||||
<string name="twohours">2h</string>
|
||||
<string name="formatinsulinunits">%1$.2fU</string>
|
||||
|
||||
<plurals name="objective_days">
|
||||
<item quantity="one">%1$d day</item>
|
||||
|
|
|
@ -10,7 +10,6 @@ import com.squareup.otto.Bus;
|
|||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
import org.junit.Assert;
|
||||
import org.mockito.stubbing.Answer;
|
||||
import org.powermock.api.mockito.PowerMockito;
|
||||
|
||||
import java.util.Locale;
|
||||
|
@ -27,14 +26,12 @@ import info.nightscout.androidaps.logging.L;
|
|||
import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin;
|
||||
import info.nightscout.androidaps.plugins.configBuilder.ProfileFunctions;
|
||||
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload;
|
||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.CobInfo;
|
||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin;
|
||||
import info.nightscout.androidaps.plugins.pump.danaR.DanaRPlugin;
|
||||
import info.nightscout.androidaps.plugins.pump.danaRKorean.DanaRKoreanPlugin;
|
||||
import info.nightscout.androidaps.plugins.pump.danaRv2.DanaRv2Plugin;
|
||||
import info.nightscout.androidaps.plugins.treatments.TreatmentService;
|
||||
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin;
|
||||
import info.nightscout.androidaps.queue.Callback;
|
||||
import info.nightscout.androidaps.queue.CommandQueue;
|
||||
import info.nightscout.androidaps.utils.SP;
|
||||
|
||||
|
@ -42,7 +39,6 @@ import static org.mockito.ArgumentMatchers.any;
|
|||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||
import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.ArgumentMatchers.anyLong;
|
||||
import static org.mockito.Mockito.doAnswer;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
|
@ -59,6 +55,7 @@ public class AAPSMocker {
|
|||
public static Intent intentSent = null;
|
||||
|
||||
public static CommandQueue queue;
|
||||
public static ConstraintChecker constraintChecker;
|
||||
|
||||
public static void mockStrings() {
|
||||
Locale.setDefault(new Locale("en", "US"));
|
||||
|
@ -168,7 +165,7 @@ public class AAPSMocker {
|
|||
}
|
||||
|
||||
public static ConstraintChecker mockConstraintsChecker() {
|
||||
ConstraintChecker constraintChecker = mock(ConstraintChecker.class);
|
||||
constraintChecker = mock(ConstraintChecker.class);
|
||||
when(MainApp.getConstraintChecker()).thenReturn(constraintChecker);
|
||||
return constraintChecker;
|
||||
}
|
||||
|
|
|
@ -3,12 +3,15 @@ package info.nightscout.androidaps.utils;
|
|||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mockito;
|
||||
import org.powermock.api.mockito.PowerMockito;
|
||||
import org.powermock.core.classloader.annotations.PrepareForTest;
|
||||
import org.powermock.modules.junit4.PowerMockRunner;
|
||||
|
||||
import info.AAPSMocker;
|
||||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.data.ConstraintChecker;
|
||||
import info.nightscout.androidaps.interfaces.Constraint;
|
||||
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus;
|
||||
import info.nightscout.androidaps.data.IobTotal;
|
||||
import info.nightscout.androidaps.data.Profile;
|
||||
|
@ -17,6 +20,7 @@ import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin;
|
|||
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin;
|
||||
import info.nightscout.androidaps.plugins.pump.mdi.MDIPlugin;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
|
@ -24,38 +28,41 @@ import static org.mockito.Mockito.when;
|
|||
* Created by kuchjir on 12/12/2017.
|
||||
*/
|
||||
@RunWith(PowerMockRunner.class)
|
||||
@PrepareForTest({MainApp.class, GlucoseStatus.class, ConfigBuilderPlugin.class, TreatmentsPlugin.class})
|
||||
@PrepareForTest({MainApp.class, GlucoseStatus.class, ConfigBuilderPlugin.class, TreatmentsPlugin.class, ConstraintChecker.class})
|
||||
public class BolusWizardTest {
|
||||
private static final double PUMP_BOLUS_STEP = 0.1;
|
||||
|
||||
@Test
|
||||
/** Should calculate the same bolus when different blood glucose but both in target range */
|
||||
public void shuldCalculateTheSameBolusWhenBGsInRange() throws Exception {
|
||||
BolusWizard bw = new BolusWizard();
|
||||
public void shouldCalculateTheSameBolusWhenBGsInRange() throws Exception {
|
||||
Profile profile = setupProfile(4d, 8d, 20d, 12d);
|
||||
|
||||
Double bolusForBg42 = bw.doCalc(profile, null, 20, 0.0, 4.2, 0d, 100d, true, true, false, false);
|
||||
Double bolusForBg54 = bw.doCalc(profile, null, 20, 0.0, 5.4, 0d, 100d, true, true, false, false);
|
||||
BolusWizard bw = new BolusWizard(profile, "", null, 20, 0.0, 4.2, 0d, 100d, true, true, true, true, false, false, false);
|
||||
Double bolusForBg42 = bw.doCalc();
|
||||
bw = new BolusWizard(profile, "", null, 20, 0.0, 5.4, 0d, 100d, true, true, true, true, false, false, false);
|
||||
Double bolusForBg54 = bw.doCalc();
|
||||
Assert.assertEquals(bolusForBg42, bolusForBg54);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shuldCalculateHigherBolusWhenHighBG() throws Exception {
|
||||
BolusWizard bw = new BolusWizard();
|
||||
public void shouldCalculateHigherBolusWhenHighBG() throws Exception {
|
||||
Profile profile = setupProfile(4d, 8d, 20d, 12d);
|
||||
|
||||
Double bolusForHighBg = bw.doCalc(profile, null, 20, 0d, 9.8, 0d, 100d, true, true, false, false);
|
||||
Double bolusForBgInRange = bw.doCalc(profile, null, 20, 0.0, 5.4, 0d, 100d, true, true, false, false);
|
||||
BolusWizard bw = new BolusWizard(profile, "", null, 20, 0.0, 9.8, 0d, 100d, true, true, true, true, false, false, false);
|
||||
Double bolusForHighBg = bw.doCalc();
|
||||
bw = new BolusWizard(profile, "", null, 20, 0.0, 5.4, 0d, 100d, true, true, true, true, false, false, false);
|
||||
Double bolusForBgInRange = bw.doCalc();
|
||||
Assert.assertTrue(bolusForHighBg > bolusForBgInRange);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shuldCalculateLowerBolusWhenLowBG() throws Exception {
|
||||
BolusWizard bw = new BolusWizard();
|
||||
public void shouldCalculateLowerBolusWhenLowBG() throws Exception {
|
||||
Profile profile = setupProfile(4d, 8d, 20d, 12d);
|
||||
|
||||
Double bolusForLowBg = bw.doCalc(profile, null, 20, 0d, 3.6, 0d, 100d, true, true, false, false);
|
||||
Double bolusForBgInRange = bw.doCalc(profile, null, 20, 0.0, 5.4, 0d, 100d, true, true, false, false);
|
||||
BolusWizard bw = new BolusWizard(profile, "", null, 20, 0.0, 3.6, 0d, 100d, true, true, true, true, false, false, false);
|
||||
Double bolusForLowBg = bw.doCalc();
|
||||
bw = new BolusWizard(profile, "", null, 20, 0.0, 5.4, 0d, 100d, true, true, true, true, false, false, false);
|
||||
Double bolusForBgInRange = bw.doCalc();
|
||||
Assert.assertTrue(bolusForLowBg < bolusForBgInRange);
|
||||
}
|
||||
|
||||
|
@ -82,6 +89,12 @@ public class BolusWizardTest {
|
|||
pump.getPumpDescription().bolusStep = PUMP_BOLUS_STEP;
|
||||
when(ConfigBuilderPlugin.getPlugin().getActivePump()).thenReturn(pump);
|
||||
|
||||
AAPSMocker.mockConstraintsChecker();
|
||||
Mockito.doAnswer(invocation -> {
|
||||
Constraint<Double> constraint = invocation.getArgument(0);
|
||||
return constraint;
|
||||
}).when(AAPSMocker.constraintChecker).applyBolusConstraints(any(Constraint.class));
|
||||
|
||||
return profile;
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue