Merge branch 'dev' into sdk28
This commit is contained in:
commit
61097b3ac6
24 changed files with 634 additions and 624 deletions
|
@ -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,8 +124,7 @@ public class QuickWizardEntry {
|
|||
trend = true;
|
||||
}
|
||||
|
||||
wizard.doCalc(profile, tempTarget, carbs(), cob, bg, 0d, bolusIOB, basalIOB, superBolus, trend);
|
||||
return wizard;
|
||||
return new BolusWizard(profile, profileName, tempTarget, carbs(), cob, bg, 0d, 100, true, useCOB() == YES, bolusIOB, basalIOB, superBolus, useTempTarget() == YES, trend, "QuickWizard");
|
||||
}
|
||||
|
||||
public String buttonText() {
|
||||
|
|
|
@ -644,14 +644,27 @@ public class LoopPlugin extends PluginBase {
|
|||
TreatmentsInterface activeTreatments = TreatmentsPlugin.getPlugin();
|
||||
|
||||
LoopPlugin.getPlugin().disconnectTo(System.currentTimeMillis() + durationInMinutes * 60 * 1000L);
|
||||
ConfigBuilderPlugin.getPlugin().getCommandQueue().tempBasalPercent(0, durationInMinutes, true, profile, new Callback() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (!result.success) {
|
||||
ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.tempbasaldeliveryerror));
|
||||
|
||||
if (pump.getPumpDescription().tempBasalStyle == PumpDescription.ABSOLUTE) {
|
||||
ConfigBuilderPlugin.getPlugin().getCommandQueue().tempBasalAbsolute(0, durationInMinutes, true, profile, new Callback() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (!result.success) {
|
||||
ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.tempbasaldeliveryerror));
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
} else {
|
||||
ConfigBuilderPlugin.getPlugin().getCommandQueue().tempBasalPercent(0, durationInMinutes, true, profile, new Callback() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (!result.success) {
|
||||
ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.tempbasaldeliveryerror));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (pump.getPumpDescription().isExtendedBolusCapable && activeTreatments.isInHistoryExtendedBoluslInProgress()) {
|
||||
ConfigBuilderPlugin.getPlugin().getCommandQueue().cancelExtended(new Callback() {
|
||||
@Override
|
||||
|
|
|
@ -13,10 +13,10 @@ import info.nightscout.androidaps.interfaces.PluginDescription;
|
|||
import info.nightscout.androidaps.interfaces.PluginType;
|
||||
import info.nightscout.androidaps.interfaces.PumpDescription;
|
||||
import info.nightscout.androidaps.interfaces.PumpInterface;
|
||||
import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin;
|
||||
import info.nightscout.androidaps.plugins.aps.openAPSAMA.OpenAPSAMAPlugin;
|
||||
import info.nightscout.androidaps.plugins.aps.openAPSMA.OpenAPSMAPlugin;
|
||||
import info.nightscout.androidaps.plugins.aps.openAPSSMB.OpenAPSSMBPlugin;
|
||||
import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin;
|
||||
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification;
|
||||
import info.nightscout.androidaps.plugins.general.overview.notifications.Notification;
|
||||
import info.nightscout.androidaps.plugins.sensitivity.SensitivityOref1Plugin;
|
||||
|
@ -196,7 +196,7 @@ public class SafetyPlugin extends PluginBase implements ConstraintsInterface {
|
|||
|
||||
PumpInterface pump = ConfigBuilderPlugin.getPlugin().getActivePump();
|
||||
if (pump != null) {
|
||||
double rounded = Round.roundTo(insulin.value(), pump.getPumpDescription().pumpType.determineCorrectBolusSize(insulin.value()));
|
||||
double rounded = pump.getPumpDescription().pumpType.determineCorrectBolusSize(insulin.value());
|
||||
insulin.setIfDifferent(rounded, MainApp.gs(R.string.pumplimit), this);
|
||||
}
|
||||
return insulin;
|
||||
|
@ -213,7 +213,7 @@ public class SafetyPlugin extends PluginBase implements ConstraintsInterface {
|
|||
|
||||
PumpInterface pump = ConfigBuilderPlugin.getPlugin().getActivePump();
|
||||
if (pump != null) {
|
||||
double rounded = Round.roundTo(insulin.value(), pump.getPumpDescription().pumpType.determineCorrectExtendedBolusSize(insulin.value()));
|
||||
double rounded = pump.getPumpDescription().pumpType.determineCorrectExtendedBolusSize(insulin.value());
|
||||
insulin.setIfDifferent(rounded, MainApp.gs(R.string.pumplimit), this);
|
||||
}
|
||||
return insulin;
|
||||
|
|
|
@ -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;
|
||||
|
@ -785,122 +780,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.determineCorrectBolusStepSize(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"));
|
||||
}
|
||||
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();
|
||||
wizard.confirmAndExecute(getContext());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -1085,6 +983,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);
|
||||
|
@ -1282,10 +1181,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);
|
||||
|
|
|
@ -225,7 +225,7 @@ public class NewInsulinDialog extends DialogFragment implements OnClickListener
|
|||
}
|
||||
}
|
||||
|
||||
if (Math.abs(insulinAfterConstraints - insulin) > pump.getPumpDescription().pumpType.determineCorrectBolusSize(insulinAfterConstraints))
|
||||
if (Math.abs(insulinAfterConstraints - insulin) > pump.getPumpDescription().pumpType.determineCorrectBolusStepSize(insulinAfterConstraints))
|
||||
actions.add("<font color='" + MainApp.gc(R.color.warning) + "'>" + MainApp.gs(R.string.bolusconstraintapplied) + "</font>");
|
||||
|
||||
int eatingSoonTTDuration = SP.getInt(R.string.key_eatingsoon_duration, Constants.defaultEatingSoonTTDuration);
|
||||
|
|
|
@ -141,7 +141,7 @@ public class NewTreatmentDialog extends DialogFragment implements OnClickListene
|
|||
if (recordOnlyCheckbox.isChecked()) {
|
||||
confirmMessage += "<br/><font color='" + MainApp.gc(R.color.warning) + "'>" + MainApp.gs(R.string.bolusrecordedonly) + "</font>";
|
||||
}
|
||||
if (Math.abs(insulinAfterConstraints - insulin) > pump.getPumpDescription().pumpType.determineCorrectBolusSize(insulinAfterConstraints) || !Objects.equals(carbsAfterConstraints, carbs))
|
||||
if (Math.abs(insulinAfterConstraints - insulin) > pump.getPumpDescription().pumpType.determineCorrectBolusStepSize(insulinAfterConstraints) || !Objects.equals(carbsAfterConstraints, carbs))
|
||||
confirmMessage += "<br/><font color='" + MainApp.gc(R.color.warning) + "'>" + MainApp.gs(R.string.bolusconstraintapplied) + "</font>";
|
||||
}
|
||||
if (carbsAfterConstraints > 0)
|
||||
|
|
|
@ -2,13 +2,10 @@ 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 androidx.fragment.app.DialogFragment;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import android.text.Editable;
|
||||
import android.text.Html;
|
||||
import android.text.TextWatcher;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
|
@ -28,46 +25,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.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 {
|
||||
|
@ -108,8 +94,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com
|
|||
EditText notesEdit;
|
||||
|
||||
Integer calculatedCarbs = 0;
|
||||
Double calculatedTotalInsulin = 0d;
|
||||
JSONObject boluscalcJSON;
|
||||
BolusWizard wizard;
|
||||
|
||||
Context context;
|
||||
|
||||
|
@ -311,99 +296,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"));
|
||||
}
|
||||
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();
|
||||
dismiss();
|
||||
}
|
||||
wizard.confirmAndExecute(context);
|
||||
dismiss();
|
||||
break;
|
||||
case R.id.cancel:
|
||||
dismiss();
|
||||
|
@ -450,8 +344,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();
|
||||
}
|
||||
|
@ -460,13 +354,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());
|
||||
|
@ -494,104 +388,61 @@ 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(), notesEdit.getText().toString(), 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.getInsulinFromBolusIOB()));
|
||||
basalIobInsulin.setText(StringUtils.formatInsulin(wizard.getInsulinFromBasalsIOB()));
|
||||
|
||||
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());
|
||||
} else {
|
||||
bgTrend.setText("");
|
||||
}
|
||||
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("");
|
||||
}
|
||||
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,38 @@ 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);
|
||||
|
||||
Double insulinAfterConstraints = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(bolusWizard.calculatedTotalInsulin)).value();
|
||||
if (Math.abs(insulinAfterConstraints - bolusWizard.calculatedTotalInsulin) >= 0.01) {
|
||||
if (Math.abs(bolusWizard.getInsulinAfterConstraints() - 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.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.getInsulinFromBolusIOB()) + "U";
|
||||
if (useBasalIOB)
|
||||
rMessage += "\nBasal IOB: " + format.format(bolusWizard.insulingFromBasalsIOB) + "U";
|
||||
rMessage += "\nBasal IOB: " + format.format(bolusWizard.getInsulinFromBasalsIOB()) + "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 +622,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])) {
|
||||
|
|
|
@ -7,83 +7,83 @@ import java.util.Map;
|
|||
import info.nightscout.androidaps.MainApp;
|
||||
import info.nightscout.androidaps.R;
|
||||
import info.nightscout.androidaps.plugins.pump.common.data.DoseSettings;
|
||||
|
||||
import info.nightscout.androidaps.utils.Round;
|
||||
|
||||
|
||||
/**
|
||||
* Created by andy on 02/05/2018.
|
||||
*
|
||||
* <p>
|
||||
* Most of this defintions is intended for VirtualPump only, but they can be used by other plugins.
|
||||
*/
|
||||
|
||||
public enum PumpType {
|
||||
|
||||
GenericAAPS("Generic AAPS", 0.1d, null, //
|
||||
new DoseSettings(0.05d, 30, 8*60, 0.05d), //
|
||||
new DoseSettings(0.05d, 30, 8 * 60, 0.05d), //
|
||||
PumpTempBasalType.Percent, //
|
||||
new DoseSettings(10,30, 24*60, 0d, 500d), PumpCapability.BasalRate_Duration15and30minAllowed, //
|
||||
new DoseSettings(10, 30, 24 * 60, 0d, 500d), PumpCapability.BasalRate_Duration15and30minAllowed, //
|
||||
0.01d, 0.01d, null, PumpCapability.VirtualPumpCapabilities), //
|
||||
|
||||
// Cellnovo
|
||||
|
||||
Cellnovo1("Cellnovo", 0.05d, null, //
|
||||
new DoseSettings(0.05d, 30, 24*60, 1d, null),
|
||||
new DoseSettings(0.05d, 30, 24 * 60, 1d, null),
|
||||
PumpTempBasalType.Percent,
|
||||
new DoseSettings(5,30, 24*60, 0d, 200d), PumpCapability.BasalRate_Duration30minAllowed, //
|
||||
new DoseSettings(5, 30, 24 * 60, 0d, 200d), PumpCapability.BasalRate_Duration30minAllowed, //
|
||||
0.05d, 0.05d, null, PumpCapability.VirtualPumpCapabilities), //
|
||||
|
||||
// Accu-Chek
|
||||
|
||||
AccuChekCombo("Accu-Chek Combo", 0.1d, null, //
|
||||
new DoseSettings(0.1d, 15, 12*60, 0.1d), //
|
||||
new DoseSettings(0.1d, 15, 12 * 60, 0.1d), //
|
||||
PumpTempBasalType.Percent,
|
||||
new DoseSettings(10, 15, 12*60,0d, 500d), PumpCapability.BasalRate_Duration15and30minAllowed, //
|
||||
new DoseSettings(10, 15, 12 * 60, 0d, 500d), PumpCapability.BasalRate_Duration15and30minAllowed, //
|
||||
0.01d, 0.01d, DoseStepSize.ComboBasal, PumpCapability.ComboCapabilities), //
|
||||
|
||||
AccuChekSpirit("Accu-Chek Spirit", 0.1d, null, //
|
||||
new DoseSettings(0.1d, 15, 12*60, 0.1d), //
|
||||
new DoseSettings(0.1d, 15, 12 * 60, 0.1d), //
|
||||
PumpTempBasalType.Percent,
|
||||
new DoseSettings(10, 15, 12*60,0d, 500d), PumpCapability.BasalRate_Duration15and30minAllowed, //
|
||||
new DoseSettings(10, 15, 12 * 60, 0d, 500d), PumpCapability.BasalRate_Duration15and30minAllowed, //
|
||||
0.01d, 0.1d, null, PumpCapability.VirtualPumpCapabilities), //
|
||||
|
||||
AccuChekInsight("Accu-Chek Insight", 0.05d, DoseStepSize.InsightBolus, //
|
||||
new DoseSettings(0.05d, 15, 24*60, 0.05d), //
|
||||
new DoseSettings(0.05d, 15, 24 * 60, 0.05d), //
|
||||
PumpTempBasalType.Percent,
|
||||
new DoseSettings(10, 15, 24*60,0d, 250d), PumpCapability.BasalRate_Duration15and30minAllowed, //
|
||||
new DoseSettings(10, 15, 24 * 60, 0d, 250d), PumpCapability.BasalRate_Duration15and30minAllowed, //
|
||||
0.02d, 0.01d, null, PumpCapability.InsightCapabilities), //
|
||||
|
||||
AccuChekInsightBluetooth("Accu-Chek Insight", 0.01d, null, //
|
||||
new DoseSettings(0.01d, 15, 24*60, 0.05d), //
|
||||
new DoseSettings(0.01d, 15, 24 * 60, 0.05d), //
|
||||
PumpTempBasalType.Percent,
|
||||
new DoseSettings(10, 15, 24*60,0d, 250d), PumpCapability.BasalRate_Duration15and30minAllowed, //
|
||||
new DoseSettings(10, 15, 24 * 60, 0d, 250d), PumpCapability.BasalRate_Duration15and30minAllowed, //
|
||||
0.02d, 0.01d, DoseStepSize.InsightBolus, PumpCapability.InsightCapabilities), //
|
||||
|
||||
// Animas
|
||||
AnimasVibe("Animas Vibe", 0.05d, null, // AnimasBolus?
|
||||
new DoseSettings(0.05d, 30, 12*60, 0.05d), //
|
||||
new DoseSettings(0.05d, 30, 12 * 60, 0.05d), //
|
||||
PumpTempBasalType.Percent, //
|
||||
new DoseSettings(10, 30, 24*60, 0d, 300d), PumpCapability.BasalRate_Duration30minAllowed, //
|
||||
new DoseSettings(10, 30, 24 * 60, 0d, 300d), PumpCapability.BasalRate_Duration30minAllowed, //
|
||||
0.025d, 5d, 0d, null, PumpCapability.VirtualPumpCapabilities), //
|
||||
|
||||
AnimasPing("Animas Ping", AnimasVibe),
|
||||
|
||||
// Dana
|
||||
DanaR("DanaR", 0.05d, null, //
|
||||
new DoseSettings(0.05d, 30, 8*60, 0.05d), //
|
||||
new DoseSettings(0.05d, 30, 8 * 60, 0.05d), //
|
||||
PumpTempBasalType.Percent, //
|
||||
new DoseSettings(10d, 60, 24*60, 0d, 200d), PumpCapability.BasalRate_Duration15and30minNotAllowed, //
|
||||
new DoseSettings(10d, 60, 24 * 60, 0d, 200d), PumpCapability.BasalRate_Duration15and30minNotAllowed, //
|
||||
0.04d, 0.01d, null, PumpCapability.DanaCapabilities),
|
||||
|
||||
DanaRKorean("DanaR Korean", 0.05d, null, //
|
||||
new DoseSettings(0.05d, 30, 8*60, 0.05d), //
|
||||
new DoseSettings(0.05d, 30, 8 * 60, 0.05d), //
|
||||
PumpTempBasalType.Percent, //
|
||||
new DoseSettings(10d, 60, 24*60, 0d, 200d), PumpCapability.BasalRate_Duration15and30minNotAllowed, //
|
||||
new DoseSettings(10d, 60, 24 * 60, 0d, 200d), PumpCapability.BasalRate_Duration15and30minNotAllowed, //
|
||||
0.1d, 0.01d, null, PumpCapability.DanaCapabilities),
|
||||
|
||||
DanaRS("DanaRS", 0.05d, null, //
|
||||
new DoseSettings(0.05d, 30, 8*60, 0.05d), //
|
||||
new DoseSettings(0.05d, 30, 8 * 60, 0.05d), //
|
||||
PumpTempBasalType.Percent, //
|
||||
new DoseSettings(10d, 60, 24*60, 0d, 200d), PumpCapability.BasalRate_Duration15and30minAllowed, //
|
||||
new DoseSettings(10d, 60, 24 * 60, 0d, 200d), PumpCapability.BasalRate_Duration15and30minAllowed, //
|
||||
0.04d, 0.01d, null, PumpCapability.DanaWithHistoryCapabilities),
|
||||
|
||||
DanaRv2("DanaRv2", DanaRS),
|
||||
|
@ -91,40 +91,40 @@ public enum PumpType {
|
|||
|
||||
// Insulet
|
||||
Insulet_Omnipod("Insulet Omnipod", 0.05d, null, //
|
||||
new DoseSettings(0.05d, 30, 8*60, 0.05d), //
|
||||
new DoseSettings(0.05d, 30, 8 * 60, 0.05d), //
|
||||
PumpTempBasalType.Absolute, //
|
||||
new DoseSettings(0.05d, 30, 12*60, 0d, 30.0d), PumpCapability.BasalRate_Duration30minAllowed, // cannot exceed max basal rate 30u/hr
|
||||
new DoseSettings(0.05d, 30, 12 * 60, 0d, 30.0d), PumpCapability.BasalRate_Duration30minAllowed, // cannot exceed max basal rate 30u/hr
|
||||
0.05d, 0.05d, null, PumpCapability.VirtualPumpCapabilities),
|
||||
|
||||
// Medtronic
|
||||
Medtronic_512_712("Medtronic 512/712", 0.05d, null, //
|
||||
new DoseSettings(0.05d, 30, 8*60, 0.05d), //
|
||||
new DoseSettings(0.05d, 30, 8 * 60, 0.05d), //
|
||||
PumpTempBasalType.Absolute, //
|
||||
new DoseSettings(0.05d, 30, 24*60, 0d, 35d), PumpCapability.BasalRate_Duration30minAllowed, //
|
||||
new DoseSettings(0.05d, 30, 24 * 60, 0d, 35d), PumpCapability.BasalRate_Duration30minAllowed, //
|
||||
0.05d, 0.05d, null, PumpCapability.VirtualPumpCapabilities), // TODO
|
||||
|
||||
Medtronic_515_715("Medtronic 515/715", Medtronic_512_712),
|
||||
Medtronic_522_722("Medtronic 522/722", Medtronic_512_712),
|
||||
|
||||
Medtronic_523_723_Revel("Medtronic 523/723 (Revel)", 0.05d, null, //
|
||||
new DoseSettings(0.05d, 30, 8*60, 0.05d), //
|
||||
new DoseSettings(0.05d, 30, 8 * 60, 0.05d), //
|
||||
PumpTempBasalType.Absolute, //
|
||||
new DoseSettings(0.05d, 30, 24*60, 0d, 35d), PumpCapability.BasalRate_Duration30minAllowed, //
|
||||
new DoseSettings(0.05d, 30, 24 * 60, 0d, 35d), PumpCapability.BasalRate_Duration30minAllowed, //
|
||||
0.025d, 0.025d, DoseStepSize.MedtronicVeoBasal, PumpCapability.VirtualPumpCapabilities), //
|
||||
|
||||
Medtronic_554_754_Veo("Medtronic 554/754 (Veo)", Medtronic_523_723_Revel), // TODO
|
||||
|
||||
Medtronic_640G("Medtronic 640G", 0.025d, null, //
|
||||
new DoseSettings(0.05d, 30, 8*60, 0.05d), //
|
||||
new DoseSettings(0.05d, 30, 8 * 60, 0.05d), //
|
||||
PumpTempBasalType.Absolute, //
|
||||
new DoseSettings(0.05d, 30, 24*60, 0d, 35d), PumpCapability.BasalRate_Duration30minAllowed, //
|
||||
new DoseSettings(0.05d, 30, 24 * 60, 0d, 35d), PumpCapability.BasalRate_Duration30minAllowed, //
|
||||
0.025d, 0.025d, DoseStepSize.MedtronicVeoBasal, PumpCapability.VirtualPumpCapabilities), //
|
||||
|
||||
// Tandem
|
||||
TandemTSlim("Tandem t:slim", 0.01d, null, //
|
||||
new DoseSettings(0.01d,15, 8*60, 0.4d),
|
||||
new DoseSettings(0.01d, 15, 8 * 60, 0.4d),
|
||||
PumpTempBasalType.Percent,
|
||||
new DoseSettings(1,15, 8*60, 0d, 250d), PumpCapability.BasalRate_Duration15and30minAllowed, //
|
||||
new DoseSettings(1, 15, 8 * 60, 0d, 250d), PumpCapability.BasalRate_Duration15and30minAllowed, //
|
||||
0.1d, 0.001d, null, PumpCapability.VirtualPumpCapabilities),
|
||||
|
||||
TandemTFlex("Tandem t:flex", TandemTSlim), //
|
||||
|
@ -146,10 +146,9 @@ public enum PumpType {
|
|||
private PumpCapability pumpCapability;
|
||||
|
||||
private PumpType parent;
|
||||
private static Map<String,PumpType> mapByDescription;
|
||||
private static Map<String, PumpType> mapByDescription;
|
||||
|
||||
static
|
||||
{
|
||||
static {
|
||||
mapByDescription = new HashMap<>();
|
||||
|
||||
for (PumpType pumpType : values()) {
|
||||
|
@ -158,14 +157,12 @@ public enum PumpType {
|
|||
}
|
||||
|
||||
|
||||
PumpType(String description, PumpType parent)
|
||||
{
|
||||
PumpType(String description, PumpType parent) {
|
||||
this.description = description;
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
PumpType(String description, PumpType parent, PumpCapability pumpCapability)
|
||||
{
|
||||
PumpType(String description, PumpType parent, PumpCapability pumpCapability) {
|
||||
this.description = description;
|
||||
this.parent = parent;
|
||||
this.pumpCapability = pumpCapability;
|
||||
|
@ -173,17 +170,15 @@ public enum PumpType {
|
|||
|
||||
PumpType(String description, double bolusSize, DoseStepSize specialBolusSize, //
|
||||
DoseSettings extendedBolusSettings, //
|
||||
PumpTempBasalType pumpTempBasalType, DoseSettings tbrSettings, PumpCapability specialBasalDurations, //
|
||||
double baseBasalMinValue, double baseBasalStep, DoseStepSize baseBasalSpecialSteps, PumpCapability pumpCapability)
|
||||
{
|
||||
PumpTempBasalType pumpTempBasalType, DoseSettings tbrSettings, PumpCapability specialBasalDurations, //
|
||||
double baseBasalMinValue, double baseBasalStep, DoseStepSize baseBasalSpecialSteps, PumpCapability pumpCapability) {
|
||||
this(description, bolusSize, specialBolusSize, extendedBolusSettings, pumpTempBasalType, tbrSettings, specialBasalDurations, baseBasalMinValue, null, baseBasalStep, baseBasalSpecialSteps, pumpCapability);
|
||||
}
|
||||
|
||||
PumpType(String description, double bolusSize, DoseStepSize specialBolusSize, //
|
||||
DoseSettings extendedBolusSettings, //
|
||||
PumpTempBasalType pumpTempBasalType, DoseSettings tbrSettings, PumpCapability specialBasalDurations, //
|
||||
double baseBasalMinValue, Double baseBasalMaxValue, double baseBasalStep, DoseStepSize baseBasalSpecialSteps, PumpCapability pumpCapability)
|
||||
{
|
||||
double baseBasalMinValue, Double baseBasalMaxValue, double baseBasalStep, DoseStepSize baseBasalSpecialSteps, PumpCapability pumpCapability) {
|
||||
this.description = description;
|
||||
this.bolusSize = bolusSize;
|
||||
this.specialBolusSize = specialBolusSize;
|
||||
|
@ -261,20 +256,15 @@ public enum PumpType {
|
|||
}
|
||||
|
||||
|
||||
private boolean isParentSet()
|
||||
{
|
||||
return this.parent!=null;
|
||||
private boolean isParentSet() {
|
||||
return this.parent != null;
|
||||
}
|
||||
|
||||
|
||||
public static PumpType getByDescription(String desc)
|
||||
{
|
||||
if (mapByDescription.containsKey(desc))
|
||||
{
|
||||
public static PumpType getByDescription(String desc) {
|
||||
if (mapByDescription.containsKey(desc)) {
|
||||
return mapByDescription.get(desc);
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return PumpType.GenericAAPS;
|
||||
}
|
||||
}
|
||||
|
@ -282,7 +272,7 @@ public enum PumpType {
|
|||
|
||||
public String getFullDescription(String i18nTemplate, boolean hasExtendedBasals) {
|
||||
|
||||
String unit = getPumpTempBasalType()==PumpTempBasalType.Percent ? "%" : "";
|
||||
String unit = getPumpTempBasalType() == PumpTempBasalType.Percent ? "%" : "";
|
||||
|
||||
DoseSettings eb = getExtendedBolusSettings();
|
||||
DoseSettings tbr = getTbrSettings();
|
||||
|
@ -291,24 +281,22 @@ public enum PumpType {
|
|||
|
||||
return String.format(i18nTemplate, //
|
||||
getStep("" + getBolusSize(), getSpecialBolusSize()), //
|
||||
eb.getStep(), eb.getDurationStep(), eb.getMaxDuration()/60, //
|
||||
eb.getStep(), eb.getDurationStep(), eb.getMaxDuration() / 60, //
|
||||
getStep(getBaseBasalRange(), getBaseBasalSpecialSteps()), //
|
||||
tbr.getMinDose() + unit + "-" + tbr.getMaxDose() + unit, tbr.getStep() + unit,
|
||||
tbr.getDurationStep(), tbr.getMaxDuration()/60, extendedNote);
|
||||
tbr.getDurationStep(), tbr.getMaxDuration() / 60, extendedNote);
|
||||
}
|
||||
|
||||
|
||||
private String getBaseBasalRange()
|
||||
{
|
||||
private String getBaseBasalRange() {
|
||||
Double maxValue = getBaseBasalMaxValue();
|
||||
|
||||
return maxValue==null ? "" + getBaseBasalMinValue() : getBaseBasalMinValue() + "-" + maxValue;
|
||||
return maxValue == null ? "" + getBaseBasalMinValue() : getBaseBasalMinValue() + "-" + maxValue;
|
||||
}
|
||||
|
||||
|
||||
private String getStep(String step, DoseStepSize stepSize)
|
||||
{
|
||||
if (stepSize!=null)
|
||||
private String getStep(String step, DoseStepSize stepSize) {
|
||||
if (stepSize != null)
|
||||
return step + " [" + stepSize.getDescription() + "] *";
|
||||
else
|
||||
return "" + step;
|
||||
|
@ -316,18 +304,15 @@ public enum PumpType {
|
|||
|
||||
|
||||
public boolean hasExtendedBasals() {
|
||||
return ((getBaseBasalSpecialSteps() !=null) || (getSpecialBolusSize() != null));
|
||||
return ((getBaseBasalSpecialSteps() != null) || (getSpecialBolusSize() != null));
|
||||
}
|
||||
|
||||
|
||||
public PumpCapability getSpecialBasalDurations() {
|
||||
|
||||
if (isParentSet())
|
||||
{
|
||||
if (isParentSet()) {
|
||||
return parent.getSpecialBasalDurations();
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
return specialBasalDurations == null ? //
|
||||
PumpCapability.BasalRate_Duration15and30minNotAllowed : specialBasalDurations;
|
||||
}
|
||||
|
@ -338,20 +323,24 @@ public enum PumpType {
|
|||
return bolusAmount;
|
||||
}
|
||||
|
||||
double bolusStepSize;
|
||||
double bolusStepSize = getBolusSize();
|
||||
|
||||
if (getSpecialBolusSize() == null) {
|
||||
bolusStepSize = getBolusSize();
|
||||
} else {
|
||||
if (getSpecialBolusSize() != null) {
|
||||
DoseStepSize specialBolusSize = getSpecialBolusSize();
|
||||
|
||||
bolusStepSize = specialBolusSize.getStepSizeForAmount((double)bolusAmount);
|
||||
bolusStepSize = specialBolusSize.getStepSizeForAmount(bolusAmount);
|
||||
}
|
||||
|
||||
return Math.round(bolusAmount / bolusStepSize) * bolusStepSize;
|
||||
return Round.roundTo(bolusAmount, bolusStepSize);
|
||||
}
|
||||
|
||||
|
||||
public double determineCorrectBolusStepSize(double bolusAmount) {
|
||||
DoseStepSize specialBolusSize = getSpecialBolusSize();
|
||||
if (specialBolusSize != null)
|
||||
return specialBolusSize.getStepSizeForAmount(bolusAmount);
|
||||
return getBolusSize();
|
||||
}
|
||||
|
||||
public double determineCorrectExtendedBolusSize(double bolusAmount) {
|
||||
if (bolusAmount == 0.0d) {
|
||||
return bolusAmount;
|
||||
|
@ -371,7 +360,7 @@ public enum PumpType {
|
|||
bolusAmount = extendedBolusSettings.getMaxDose();
|
||||
}
|
||||
|
||||
return Math.round(bolusAmount / bolusStepSize) * bolusStepSize;
|
||||
return Round.roundTo(bolusAmount, bolusStepSize);
|
||||
}
|
||||
|
||||
|
||||
|
@ -393,7 +382,7 @@ public enum PumpType {
|
|||
if (basalAmount > getTbrSettings().getMaxDose())
|
||||
basalAmount = getTbrSettings().getMaxDose().doubleValue();
|
||||
|
||||
return Math.round(basalAmount / basalStepSize) * basalStepSize;
|
||||
return Round.roundTo(basalAmount, basalStepSize);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -40,7 +40,7 @@ public class InsightAlertActivity extends AppCompatActivity {
|
|||
alertService.setAlertActivity(InsightAlertActivity.this);
|
||||
alert = alertService.getAlert();
|
||||
if (alert == null) finish();
|
||||
update(alert);
|
||||
else update(alert);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -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,344 @@
|
|||
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 @JvmOverloads constructor(val profile: Profile,
|
||||
val profileName: String,
|
||||
val tempTarget: TempTarget?,
|
||||
val carbs: Int,
|
||||
val cob: Double,
|
||||
val bg: Double,
|
||||
val correction: Double,
|
||||
private val percentageCorrection: Double = 100.0,
|
||||
private val useBg: Boolean,
|
||||
private val useCob: Boolean,
|
||||
private val includeBolusIOB: Boolean,
|
||||
private val includeBasalIOB: Boolean,
|
||||
private val useSuperBolus: Boolean,
|
||||
private val useTT: Boolean,
|
||||
private val useTrend: Boolean,
|
||||
val notes: String = "",
|
||||
private val carbTime: Int = 0
|
||||
) {
|
||||
|
||||
private val log = LoggerFactory.getLogger(L.CORE)
|
||||
|
||||
// Intermediate
|
||||
var sens = 0.0
|
||||
private set
|
||||
|
||||
var ic = 0.0
|
||||
private set
|
||||
|
||||
var glucoseStatus: GlucoseStatus? = null
|
||||
private set
|
||||
|
||||
var targetBGLow = 0.0
|
||||
private set
|
||||
|
||||
var targetBGHigh = 0.0
|
||||
private set
|
||||
|
||||
var bgDiff = 0.0
|
||||
private set
|
||||
|
||||
var insulinFromBG = 0.0
|
||||
private set
|
||||
|
||||
var insulinFromCarbs = 0.0
|
||||
private set
|
||||
|
||||
var insulinFromBolusIOB = 0.0
|
||||
private set
|
||||
|
||||
var insulinFromBasalsIOB = 0.0
|
||||
private set
|
||||
|
||||
var insulinFromCorrection = 0.0
|
||||
private set
|
||||
|
||||
var insulinFromSuperBolus = 0.0
|
||||
private set
|
||||
|
||||
var insulinFromCOB = 0.0
|
||||
private set
|
||||
|
||||
var insulinFromTrend = 0.0
|
||||
private set
|
||||
|
||||
var trend = 0.0
|
||||
private set
|
||||
|
||||
var accepted = false
|
||||
private set
|
||||
|
||||
// Result
|
||||
var calculatedTotalInsulin: Double = 0.0
|
||||
private set
|
||||
|
||||
var totalBeforePercentageAdjustment: Double = 0.0
|
||||
private set
|
||||
|
||||
var carbsEquivalent: Double = 0.0
|
||||
private set
|
||||
|
||||
var insulinAfterConstraints: Double = 0.0
|
||||
private set
|
||||
|
||||
init {
|
||||
doCalc()
|
||||
}
|
||||
|
||||
private fun doCalc() {
|
||||
|
||||
// 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()
|
||||
glucoseStatus?.let {
|
||||
if (useTrend) {
|
||||
trend = it.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()
|
||||
|
||||
insulinFromBolusIOB = if (includeBolusIOB) -bolusIob.iob else 0.0
|
||||
insulinFromBasalsIOB = 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 + insulinFromBolusIOB + insulinFromBasalsIOB + 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())
|
||||
}
|
||||
|
||||
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", -(insulinFromBolusIOB + insulinFromBasalsIOB))
|
||||
boluscalcJSON.put("bolusiob", insulinFromBolusIOB)
|
||||
boluscalcJSON.put("basaliob", insulinFromBasalsIOB)
|
||||
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
|
||||
}
|
||||
|
||||
private 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.determineCorrectBolusStepSize(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)) { _, _ ->
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -147,6 +147,8 @@
|
|||
<string name="constraints_violation">Beperkings skending</string>
|
||||
<string name="treatmentdeliveryerror">Bolus aflewering fout</string>
|
||||
<string name="tempbasaldeliveryerror">Tempbasal aflewering fout</string>
|
||||
<string name="overview_newtempbasal_basalpercent">Basale waarde [%%]</string>
|
||||
<string name="overview_newtempbasal_percent_label">%% (100%% = huidig)</string>
|
||||
<string name="setbasalquestion">Aanvaar nuwe tydelike basale:</string>
|
||||
<string name="overview_treatment_label">Behandeling</string>
|
||||
<string name="overview_calculator_label">Rekenaar</string>
|
||||
|
@ -246,6 +248,7 @@
|
|||
<string name="danar_iob_label">Pomp IAB</string>
|
||||
<string name="danar_dailyunits">Daaglikse eenhede</string>
|
||||
<string name="pump_lastbolus_label">Laaste bolus</string>
|
||||
<string name="hoursago">%1$.1fh terug</string>
|
||||
<string name="danar_invalidinput">Ongeldige invoer</string>
|
||||
<string name="danar_valuenotsetproperly">Waarde nie behoorlik gestel</string>
|
||||
<string name="reloadprofile">Herlaai profiel</string>
|
||||
|
@ -525,6 +528,7 @@
|
|||
<string name="resistantadult">Insulien weerstandige volwasse</string>
|
||||
<string name="patientage_summary">Kies asseblief pasiënt ouderdom om veiligheids limiete te stel</string>
|
||||
<string name="Glimp">Glimp</string>
|
||||
<string name="needwhitelisting">%1$s benodig battery optimisering bemagtiging vir beter werksverrigting</string>
|
||||
<string name="loopsuspended">Lus opgeskort</string>
|
||||
<string name="loopsuspendedfor">Opgeskort (%1$d m)</string>
|
||||
<string name="loopsuperbolusfor">Superbolus (%1$d m)</string>
|
||||
|
@ -560,6 +564,8 @@
|
|||
<string name="show_statuslights_summary">Wys status vlae vir cage, iage, sage, stoor en battery vlak op tuisskerm.</string>
|
||||
<string name="statuslights_res_warning">Drempel waarskuwings stoor vlak [U]</string>
|
||||
<string name="statuslights_res_critical">Drempel kritieke stoor vlak [U]</string>
|
||||
<string name="statuslights_bat_warning">Drempel waarskuwing battery vlak [%%]</string>
|
||||
<string name="statuslights_bat_critical">Drempel kritieke battery vlak [%%]</string>
|
||||
<string name="iob">IAB</string>
|
||||
<string name="cob">KOB</string>
|
||||
<string name="virtualpump_firmware_label">Firmware</string>
|
||||
|
@ -758,6 +764,7 @@
|
|||
<string name="combo_pump_state_running">Loop tans</string>
|
||||
<string name="combo_pump_action_cancelling_tbr">Kanselleer TBR</string>
|
||||
<string name="combo_pump_action_setting_tbr">Stel TBR (%1$d%% / %2$d min)</string>
|
||||
<string name="combo_pump_action_bolusing">Bolusing (%1$.1f U)</string>
|
||||
<string name="combo_pump_action_refreshing">Verfris</string>
|
||||
<string name="combo_pump_unsupported_operation">Versoekte bewerking nie ondersteun deur pomp</string>
|
||||
<string name="combo_low_suspend_forced_notification">Onveilige gebruik: uitgebreide of multigolf boluses is aktief. Lus modus is gestel om laag te opskort net 6 ure. Net gewone boluses is ondersteun in lus modus</string>
|
||||
|
@ -1149,6 +1156,12 @@
|
|||
<string name="sms_wrongcode">Verkeerde kode. Opdrag gekanselleer.</string>
|
||||
<string name="notconfigured">Nie gekonfigureer nie</string>
|
||||
<string name="profileswitchcreated">Profiel skakelaar geskep</string>
|
||||
<string name="versionChecker">Weergawe Navolger</string>
|
||||
<string name="old_version">ou weergawe</string>
|
||||
<string name="very_old_version">baie ou weergawe</string>
|
||||
<string name="new_version_warning">Nuwe weergawe reeds beskikbaar vir %1$d! Sal na 60 dae terugval na LGS, lus sal ongeldig gemaak word na 90 dae</string>
|
||||
<string name="twohours">2h</string>
|
||||
<string name="formatinsulinunits">%1$.2fU</string>
|
||||
<plurals name="objective_days">
|
||||
<item quantity="one">%1$d dae</item>
|
||||
<item quantity="other">%1$d dae</item>
|
||||
|
|
|
@ -1160,6 +1160,8 @@
|
|||
<string name="old_version">стара версия</string>
|
||||
<string name="very_old_version">много стара версия</string>
|
||||
<string name="new_version_warning">Има нова версия от най-малко %1$d дни! Връщане към LGS след 60 дни, цикълът ще бъде изключен след 90 дни</string>
|
||||
<string name="twohours">2ч</string>
|
||||
<string name="formatinsulinunits">%1$.2fЕ</string>
|
||||
<plurals name="objective_days">
|
||||
<item quantity="one">%1$d дeн</item>
|
||||
<item quantity="other">%1$d дни</item>
|
||||
|
|
|
@ -1162,6 +1162,8 @@ Unerwartetes Verhalten.</string>
|
|||
<string name="old_version">Vorherige Version</string>
|
||||
<string name="very_old_version">sehr alte Version</string>
|
||||
<string name="new_version_warning">Neue Version für mindestens %1$d Tage verfügbar! Rückfall zur sensorunterstützten Pumpentherapie nach 60 Tagen, Loop wird nach 90 Tagen deaktiviert</string>
|
||||
<string name="twohours">2h</string>
|
||||
<string name="formatinsulinunits">%1$.2f IE</string>
|
||||
<plurals name="objective_days">
|
||||
<item quantity="one">%1$d Tag</item>
|
||||
<item quantity="other">%1$d Tage</item>
|
||||
|
|
|
@ -1161,6 +1161,8 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
|
|||
<string name="old_version">ancienne version</string>
|
||||
<string name="very_old_version">très ancienne version</string>
|
||||
<string name="new_version_warning">Une nouvelle version est disponible depuis au moins %1$d jours ! Retour au traitement par pompe assistée par capteur (Arrêt par Glycémie Basse (AGB), Low Glucose Suspend (LGS) ) après 60 jours et la Boucle sera désactivée après 90 jours</string>
|
||||
<string name="twohours">2 h</string>
|
||||
<string name="formatinsulinunits">%1$.2fU</string>
|
||||
<plurals name="objective_days">
|
||||
<item quantity="one">%1$d jour</item>
|
||||
<item quantity="other">%1$d jours</item>
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
<string name="nav_resetdb">Reset database</string>
|
||||
<string name="reset_db_confirm">Wil je echt de database wissen?</string>
|
||||
<string name="nav_exit">Afsluiten</string>
|
||||
<string name="danar_useextended_title">Gebruik vertraagde bolussen voor >200%%</string>
|
||||
<string name="danar_bt_name_title">DanaR Bluetooth apparaat</string>
|
||||
<string name="ns_sync_use_absolute_title">Gebruik altijd absolute basale waarden</string>
|
||||
<string name="alert_dialog_storage_permission_text">Herstart je telefoon of herstart AndroidAPS vanuit de systeem instellingen a. u. b. \nanders zal AndroidAPS geen logboek hebben (Belangrijk om te controleren of de algoritmes correct werken)!</string>
|
||||
|
@ -53,6 +54,7 @@
|
|||
<string name="description_wear">AndroidAPS controleren en bedienen met behulp van uw WearOS-horloge.</string>
|
||||
<string name="description_xdrip_status_line">Toon informatie over de Loop op jouw xDrip+ wijzerplaat.</string>
|
||||
<string name="description_sms_communicator">Bedien AndroidAPS op afstand met SMS commando\'s.</string>
|
||||
<string name="objectives_button_back">Terug</string>
|
||||
<string name="objectives_button_start">Start</string>
|
||||
<string name="objectives_button_verify">Controleer</string>
|
||||
<string name="nsprofileview_units_label">Eénheden</string>
|
||||
|
@ -145,6 +147,8 @@
|
|||
<string name="constraints_violation">In strijd met beperkingen</string>
|
||||
<string name="treatmentdeliveryerror">Bolus toedien storing</string>
|
||||
<string name="tempbasaldeliveryerror">Tijdelijk basaal toedien storing</string>
|
||||
<string name="overview_newtempbasal_basalpercent">Basaal waarde [%%]</string>
|
||||
<string name="overview_newtempbasal_percent_label">%% (100%% = huidig)</string>
|
||||
<string name="setbasalquestion">Accepteer nieuw tijdelijk basaal:</string>
|
||||
<string name="overview_treatment_label">Bolus</string>
|
||||
<string name="overview_calculator_label">Bolus wizard</string>
|
||||
|
@ -244,6 +248,7 @@
|
|||
<string name="danar_iob_label">Pomp IOB</string>
|
||||
<string name="danar_dailyunits">Dag totaal</string>
|
||||
<string name="pump_lastbolus_label">Laatste bolus</string>
|
||||
<string name="hoursago">%1$.1fu geleden</string>
|
||||
<string name="danar_invalidinput">Verkeerde ingave</string>
|
||||
<string name="danar_valuenotsetproperly">Waarde niet correct ingesteld</string>
|
||||
<string name="reloadprofile">Herlaad profiel</string>
|
||||
|
@ -261,6 +266,10 @@
|
|||
<string name="smscommunicator_bolusreplywithcode">Om de bolus %1$.2fU toe te dienen antwoord met de code %2$s</string>
|
||||
<string name="smscommunicator_calibrationreplywithcode">Om calibratie %1$.2f te verzenden antwoord met de code %2$s</string>
|
||||
<string name="smscommunicator_bolusfailed">Bolus mislukt</string>
|
||||
<string name="bolusdelivered">Bolus van %1$.2fE succesvol toegediend</string>
|
||||
<string name="bolusrequested">Er worden %1$.2fE toegediend</string>
|
||||
<string name="smscommunicator_bolusdelivered">Bolus van %1$.2fE succesvol toegediend</string>
|
||||
<string name="bolusdelivering">Toedienen van %1$.2fE</string>
|
||||
<string name="smscommunicator_remotecommandsallowed">Sta SMS commando\'s toe</string>
|
||||
<string name="glucosetype_finger">Vingerprik</string>
|
||||
<string name="glucosetype_sensor">Sensor</string>
|
||||
|
@ -305,6 +314,7 @@
|
|||
<string name="overview_bolusprogress_stop">Stop</string>
|
||||
<string name="overview_bolusprogress_stoppressed">STOP INGEDRUKT</string>
|
||||
<string name="waitingforpump">Wacht op pomp</string>
|
||||
<string name="overview_bolusprogress_goingtodeliver">Er worden %1$.2fE toegediend</string>
|
||||
<string name="objectives_0_objective">Opzetten van visualisatie en monitoring en analyzeren van basaal en ratio\'s</string>
|
||||
<string name="objectives_0_gate">Controleren van beschikbaarheid BG en insuline pomp data op Nightscout</string>
|
||||
<string name="objectives_1_objective">Starten met de Open Loop modus</string>
|
||||
|
@ -328,12 +338,26 @@ Stel in en gebruik tijdelijk en standaard tijdelijke streefdoelen (bv. bij sport
|
|||
<string name="smscommunicator_loopisdisabled">Loop is uitgeschakeld</string>
|
||||
<string name="smscommunicator_loopisenabled">Loop is ingeschakeld</string>
|
||||
<string name="valuelimitedto">%1$.2f gelimiteerd tot %2$.2f</string>
|
||||
<string name="valueoutofrange">Waarde %1$s valt buiten de toegestane harde limieten</string>
|
||||
<string name="smscommunicator_remotecommandnotallowed">Commando\'s op afstand zijn niet toegestaan</string>
|
||||
<string name="smscommunicator_remotebolusnotallowed">Bolus op afstand niet beschikbaar. Probeer het later opnieuw.</string>
|
||||
<string name="smscommunicator_basalreplywithcode">Om een basaal van %1$.2fE/u voor %2$d min te starten antwoord met code %3$s</string>
|
||||
<string name="smscommunicator_profilereplywithcode">Om naar profiel %1$s %2$d%% te wisselen antwoord met code %3$s</string>
|
||||
<string name="smscommunicator_extendedreplywithcode">Om een vertraagde bolus van %1$.2fE voor %2$d min te starten antwoord met code %3$s</string>
|
||||
<string name="smscommunicator_basalpctreplywithcode">Om een basaal van %1$d% voor %2$d min te starten antwoord met code %3$s</string>
|
||||
<string name="smscommunicator_suspendreplywithcode">Om de loop te onderbreken voor %1$d minuten antwoord met de code %2$s</string>
|
||||
<string name="smscommunicator_tempbasalset">Tijdelijk basaal %1$.2fE/u voor %2$d minuten succesvol gestart</string>
|
||||
<string name="smscommunicator_extendedset">Vertraagde bolus %1$.2fE voor %2$d minuten succesvol gestart</string>
|
||||
<string name="smscommunicator_tempbasalset_percent">Tijdelijk basaal van %1$d%% voor %2$d minuten succesvol gestart</string>
|
||||
<string name="smscommunicator_tempbasalfailed">Start tijdelijk basaal mislukt</string>
|
||||
<string name="smscommunicator_extendedfailed">Starten vertraagde bolus is mislukt</string>
|
||||
<string name="smscommunicator_basalstopreplywithcode">Om het tijdelijke basaal te stoppen antwoord met de code %1$s</string>
|
||||
<string name="smscommunicator_extendedstopreplywithcode">Om de vertraagde bolus te stoppen antwoord met de code %1$s</string>
|
||||
<string name="smscommunicator_tempbasalcanceled">Tijdelijk basaal afgebroken</string>
|
||||
<string name="smscommunicator_extendedcanceled">Vertraagde bolus is geannuleerd</string>
|
||||
<string name="smscommunicator_tempbasalcancelfailed">Afbreken van tijdelijk basaal mislukt</string>
|
||||
<string name="smscommunicator_extendedcancelfailed">Annuleren van vertraagde bolus is mislukt</string>
|
||||
<string name="smscommunicator_unknowncommand">Onbekende opdracht of verkeerd antwoord</string>
|
||||
<string name="quickwizard">Vaste maaltijd</string>
|
||||
<string name="quickwizardsettings">Vaste maaltijd instellingen</string>
|
||||
<string name="overview_editquickwizard_buttontext">Naam:</string>
|
||||
|
@ -441,6 +465,7 @@ Stel in en gebruik tijdelijk en standaard tijdelijke streefdoelen (bv. bij sport
|
|||
<string name="profile">Profiel</string>
|
||||
<string name="openapsama_max_daily_safety_multiplier_summary">Standaard waarde: 3.0 Dit is een belangrijke veiligheid parameter van OpenAPS. Dit limiteert je basaal met een max van 3 maal je hoogste basale dosis. Normaal hoef je deze niet te veranderen. Het is echter belangrijk dat je de ingebouwde limieten kent.</string>
|
||||
<string name="openapsama_current_basal_safety_multiplier_summary">Standaard waarde: 4 Dit is een combinatie van enerzijds het OpenAPS veiligheid limieten en anderzijds van “3 x max dagelijks basaal; 4x actueel”. Dit betekent dat het basaal niet hoger kan ingesteld worden dan het ingestelde nummer keer het actueel basaal waarbij de limiet in de pomp geen invloed heeft. Dit is een veiligheidsmaatregel om te voorkomen dat patiënten in gevaarlijke laag bereik komen zonder te snappen hoe het algoritme werkt. Nogmaals de standaard waarde is 4x; de meeste zullen deze waarde nooit moeten aanpassen maar zullen eerder andere waardes moeten aanpassen als ze tegen een limiet aanstoten.</string>
|
||||
<string name="openapsama_autosens_max_summary">Standaard waarde: 1.2\nDit is een vermenigvuldigingsfactor voor autosense (en binnenkort autotune) die zorgt dat de autosens ratio maximaal 20%% kan zijn. Dit maximum bepaalt in hoeverre je basaal kan worden verhoogd, en hoeveel je ISF en BG doel verlaagd kunnen worden.</string>
|
||||
<string name="openapsama_autosens_min_summary">Standaard waarde: 0.7\nDit is de andere kan van de autosens veiligheid limiet. Dit zet een limiet op hoe laag het basaal kan aangepast worden, en hoe hoog het ISF en het streef BG.</string>
|
||||
<string name="openapsama_autosens_adjusttargets">Autosens past de streefwaardes ook aan</string>
|
||||
<string name="openapsama_autosens_adjusttargets_summary">Standaardwaarde: waar Dit wordt gebruikt om autosens de bevoegdheid te geven BG doelen aan te passen alsook ISF en basalen</string>
|
||||
|
@ -453,6 +478,7 @@ Stel in en gebruik tijdelijk en standaard tijdelijke streefdoelen (bv. bij sport
|
|||
<string name="error_phone_not_valid">Telefoon nummer niet conform</string>
|
||||
<string name="smscommunicator_invalidphonennumber">Foutief SMS telefoon nummer</string>
|
||||
<string name="overview_calibration">Kalibratie</string>
|
||||
<string name="send_calibration">Calibratie %1$.1f naar xDrip verzenden?</string>
|
||||
<string name="xdripnotinstalled">xDrip+ niet geïnstalleerd</string>
|
||||
<string name="calibrationsent">Kalibratie naar xDrip verzonden</string>
|
||||
<string name="smscommunicator_calibrationsent">Kalibratie verzonden. Het ontvangen van kalibraties moet actief zijn in xDrip.</string>
|
||||
|
@ -503,6 +529,7 @@ Stel in en gebruik tijdelijk en standaard tijdelijke streefdoelen (bv. bij sport
|
|||
<string name="resistantadult">insuline resistente volwassene</string>
|
||||
<string name="patientage_summary">Kies leeftijd van de patient voor veiligheids limieten</string>
|
||||
<string name="Glimp">Glimp</string>
|
||||
<string name="needwhitelisting">Voor een goede werking van %1$s moeten de accubesparing-opties zijn uitgeschakeld in de telefooninstellingen</string>
|
||||
<string name="loopsuspended">Loop pauzeren</string>
|
||||
<string name="loopsuspendedfor">Gepauzeerd (%1$d m)</string>
|
||||
<string name="loopsuperbolusfor">Superbolus (%1$d m)</string>
|
||||
|
@ -538,6 +565,8 @@ Stel in en gebruik tijdelijk en standaard tijdelijke streefdoelen (bv. bij sport
|
|||
<string name="show_statuslights_summary">Statusindicatoren inschakelen voor cage, iage, sage, reservoir en batterijniveau op het beginscherm.</string>
|
||||
<string name="statuslights_res_warning">Drempel waarschuwing reservoir niveau [E]</string>
|
||||
<string name="statuslights_res_critical">Drempel alarm reservoir niveau [E]</string>
|
||||
<string name="statuslights_bat_warning">Drempel waarschuwing batterij niveau [%%]</string>
|
||||
<string name="statuslights_bat_critical">Drempel alarm voor batterij niveau [%%]</string>
|
||||
<string name="iob">IOB</string>
|
||||
<string name="cob">COB</string>
|
||||
<string name="virtualpump_firmware_label">Firmware</string>
|
||||
|
@ -590,6 +619,7 @@ Stel in en gebruik tijdelijk en standaard tijdelijke streefdoelen (bv. bij sport
|
|||
<string name="absorptionsettings_title">Opname instellingen</string>
|
||||
<string name="absorption_maxtime_title">Max absorptietijd maaltijd [uur]</string>
|
||||
<string name="absorption_maxtime_summary">Verwachte tijd in uren totdat alle koolhydraten opgenomen zijn</string>
|
||||
<string name="danar_visualizeextendedaspercentage_title">Geef vertraagde bolus weer in %%</string>
|
||||
<string name="careportal_sensorage_label_short">SAGE</string>
|
||||
<string name="careportal_insulinage_label_short">IAGE</string>
|
||||
<string name="careportal_canulaage_label_short">CAGE</string>
|
||||
|
@ -702,6 +732,8 @@ Stel in en gebruik tijdelijk en standaard tijdelijke streefdoelen (bv. bij sport
|
|||
<string name="dexcomg5_xdripupload_title">Stuur BG data naar xDrip+</string>
|
||||
<string name="dexcomg5_xdripupload_summary">In xDrip+ kies 640g/Eversense data bron</string>
|
||||
<string name="nsclientbg">NSClient BG</string>
|
||||
<string name="minimalbasalvaluereplaced">Basale waarde vervangen door minimaal ondersteunde waarde; %1$s</string>
|
||||
<string name="maximumbasalvaluereplaced">Basale waarde vervangen door maximale ondersteunde waarde: %1$s</string>
|
||||
<string name="overview_editquickwizard_usebg">BG berekening</string>
|
||||
<string name="overview_editquickwizard_usebolusiob">Bolus IOB berekening</string>
|
||||
<string name="overview_editquickwizard_usebasaliob">Basaal IOB berekening</string>
|
||||
|
@ -719,6 +751,8 @@ Stel in en gebruik tijdelijk en standaard tijdelijke streefdoelen (bv. bij sport
|
|||
<string name="closedmodeenabled">Closed modus actief</string>
|
||||
<string name="maxiobset">Maximum IOB juist ingesteld</string>
|
||||
<string name="hasbgdata">BG beschikbaar op gekozen bron</string>
|
||||
<string name="basalprofilenotaligned">Basaalstanden niet ingesteld in hele uren: %1$s</string>
|
||||
<string name="zerovalueinprofile">Ongeldig profiel: %1$s</string>
|
||||
<string name="combo_programming_bolus">Bolus in pomp programmeren </string>
|
||||
<string name="combo_refresh">Vernieuw</string>
|
||||
<string name="combo_pump_state_label">Status</string>
|
||||
|
@ -731,6 +765,7 @@ Stel in en gebruik tijdelijk en standaard tijdelijke streefdoelen (bv. bij sport
|
|||
<string name="combo_pump_state_running">Actief</string>
|
||||
<string name="combo_pump_action_cancelling_tbr">Annuleren van TB</string>
|
||||
<string name="combo_pump_action_setting_tbr">Instellen TBR (%1$d%% / %2$d min)</string>
|
||||
<string name="combo_pump_action_bolusing">Toedienen bolus (%1$.1f E)</string>
|
||||
<string name="combo_pump_action_refreshing">Vernieuwen</string>
|
||||
<string name="combo_pump_unsupported_operation">Gevraagde is niet mogelijk met de pomp</string>
|
||||
<string name="combo_low_suspend_forced_notification">Opgelet: verlengde en multi wave bolussen zijn actief. Loop is overgeschakeld naar low-suspend modus gedurende 6 uur. Alleen gewone bolussen worden ondersteund in loop modus</string>
|
||||
|
@ -1053,11 +1088,13 @@ Stel in en gebruik tijdelijk en standaard tijdelijke streefdoelen (bv. bij sport
|
|||
<string name="mute_alert">Geluid dempen</string>
|
||||
<string name="pump_alert">Pomp alarm</string>
|
||||
<string name="log_site_changes">Infuuswissel noteren</string>
|
||||
<string name="log_reservoir_changes">Reservoirwissel noteren</string>
|
||||
<string name="log_tube_changes">Slangwissel noteren</string>
|
||||
<string name="log_battery_changes">Batterijwissel noteren</string>
|
||||
<string name="log_operating_mode_changes">Werkingsmodus-wissel noteren</string>
|
||||
<string name="log_alerts">Alarm noteren</string>
|
||||
<string name="log_alerts">Alarmen noteren</string>
|
||||
<string name="enable_tbr_emulation">TBR-emulatie inschakelen</string>
|
||||
<string name="enable_tbr_emulation_summary">Gebruik vertraagde bolus ipv TBRs om de limiet van 250%% te omzeilen</string>
|
||||
<string name="disconnect_delay">Verbindingsvertraging [s]</string>
|
||||
<string name="serial_number">Serienummer</string>
|
||||
<string name="release_software_version">Release softwareversie</string>
|
||||
|
@ -1113,8 +1150,17 @@ Stel in en gebruik tijdelijk en standaard tijdelijke streefdoelen (bv. bij sport
|
|||
<string name="tomato">Tomato (MiaoMiao)</string>
|
||||
<string name="tomato_short">Tomato</string>
|
||||
<string name="dst_in_24h_warning">Zomer/wintertijd omschakeling binnen 24 uur</string>
|
||||
<string name="dst_loop_disabled_warning">Omschakeling zomer/wintertijd minder dan 3 uur geleden - Closed Loop modus gedeactiveerd</string>
|
||||
<string name="storage">interne opslag bijna vol</string>
|
||||
<string name="diskfull">Maak minstens %1$d MB vrij in interne opslag! Loop is uitgeschakeld!</string>
|
||||
<string name="wrongformat">Verkeerde invoer</string>
|
||||
<string name="sms_wrongcode">Verkeerde code. Opdracht geannuleerd.</string>
|
||||
<string name="notconfigured">Niet ingesteld</string>
|
||||
<string name="profileswitchcreated">Profiel wissel aangemaakt</string>
|
||||
<string name="versionChecker">Versie Checker</string>
|
||||
<string name="old_version">oude versie</string>
|
||||
<string name="very_old_version">zeer oude versie</string>
|
||||
<string name="new_version_warning">Er is als sinds ten minste %1$d dagen een nieuwe versie beschikbaar! Na 60 dagen wordt de loop beperkt tot LGS, na 90 dagen zal de loop worden uitgeschakeld</string>
|
||||
<plurals name="objective_days">
|
||||
<item quantity="one">%1$d dag</item>
|
||||
<item quantity="other">%1$d dag</item>
|
||||
|
|
|
@ -1160,6 +1160,8 @@
|
|||
<string name="old_version">versão antiga</string>
|
||||
<string name="very_old_version">versão muito antiga</string>
|
||||
<string name="new_version_warning">Nova versão para pelo menos %1$d dias disponíveis! Voltar para o LGS após 60 dias, o loop será desativado após 90 dias</string>
|
||||
<string name="twohours">2h</string>
|
||||
<string name="formatinsulinunits">%1$.2fU</string>
|
||||
<plurals name="objective_days">
|
||||
<item quantity="one">%1$d dia</item>
|
||||
<item quantity="other">%1$d dias</item>
|
||||
|
|
|
@ -1162,4 +1162,6 @@ Context | Edit Context</string>
|
|||
<string name="old_version">старая версия</string>
|
||||
<string name="very_old_version">очень старая версия</string>
|
||||
<string name="new_version_warning">Новая версия доступна не менее %1$d дней! После 60 дней переход на остановку при низкой гликемии LGS, замкнутый цикл будет отключен через 90 дней</string>
|
||||
<string name="twohours">2ч</string>
|
||||
<string name="formatinsulinunits">%1$.2f ед</string>
|
||||
</resources>
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
<string name="nav_resetdb">重置数据库</string>
|
||||
<string name="reset_db_confirm">你真的想重置数据库吗?</string>
|
||||
<string name="nav_exit">退出</string>
|
||||
<string name="danar_useextended_title">使用>200%%的扩展大剂量(extended boluses)</string>
|
||||
<string name="danar_bt_name_title">DanaR 蓝牙设备</string>
|
||||
<string name="ns_sync_use_absolute_title">总是使用基础率的绝对值</string>
|
||||
<string name="alert_dialog_storage_permission_text">请重启你的手机或者从系统设置里重启AndroidAPS软件 \n 否则 Android APS将不会记录日志 (这对于跟踪和检查算法是否正确很重要)!</string>
|
||||
|
@ -146,6 +147,8 @@
|
|||
<string name="constraints_violation">违反约束条件</string>
|
||||
<string name="treatmentdeliveryerror">大剂量输注错误</string>
|
||||
<string name="tempbasaldeliveryerror">临时基础输注错误</string>
|
||||
<string name="overview_newtempbasal_basalpercent">基础率值 [%%]</string>
|
||||
<string name="overview_newtempbasal_percent_label">%% (100%% = 当前)</string>
|
||||
<string name="setbasalquestion">接受新的临时基础率</string>
|
||||
<string name="overview_treatment_label">治疗</string>
|
||||
<string name="overview_calculator_label">计算器</string>
|
||||
|
@ -245,6 +248,7 @@
|
|||
<string name="danar_iob_label">泵 IOB</string>
|
||||
<string name="danar_dailyunits">每日单位数</string>
|
||||
<string name="pump_lastbolus_label">上次大剂量</string>
|
||||
<string name="hoursago">%1$.1f小时前</string>
|
||||
<string name="danar_invalidinput">无效的输入数据</string>
|
||||
<string name="danar_valuenotsetproperly">数值设定的不正确</string>
|
||||
<string name="reloadprofile">重新加载配置文件</string>
|
||||
|
@ -310,6 +314,7 @@
|
|||
<string name="overview_bolusprogress_stop">停止</string>
|
||||
<string name="overview_bolusprogress_stoppressed">停止键按下了</string>
|
||||
<string name="waitingforpump">正在等待泵</string>
|
||||
<string name="overview_bolusprogress_goingtodeliver">将要输注 %1$.2fU</string>
|
||||
<string name="objectives_0_objective">设置可视化和监视, 并分析基础率和比率</string>
|
||||
<string name="objectives_0_gate">验证 Nightscout 中的血糖是否可用, 并且正在上传泵的胰岛素数据</string>
|
||||
<string name="objectives_1_objective">开始开环</string>
|
||||
|
@ -332,6 +337,7 @@
|
|||
<string name="smscommunicator_loopisdisabled">闭环被禁用</string>
|
||||
<string name="smscommunicator_loopisenabled">闭环被启用</string>
|
||||
<string name="valuelimitedto">%1$.2f 超过 %2$.2f的限制</string>
|
||||
<string name="valueoutofrange">值 %1$s 超过了硬限制</string>
|
||||
<string name="smscommunicator_remotecommandnotallowed">远程命令没有被允许</string>
|
||||
<string name="smscommunicator_remotebolusnotallowed">远程大剂量不可用。请稍后再试。</string>
|
||||
<string name="smscommunicator_basalreplywithcode">要开始基础率 %1$.2fU/h 持续时间%2$d 分钟,请回复如下代码 %3$s</string>
|
||||
|
@ -458,6 +464,7 @@
|
|||
<string name="profile">配置文件</string>
|
||||
<string name="openapsama_max_daily_safety_multiplier_summary">默认值: 3 这是一个关键的 OpenAPS 安全阀值。这是限制你的闭环可以最大扩张3倍的日最大基础率。你可能不需要改变这个值 但你应该这个值的含义。日最大基础率的3倍,当前基础率的4倍,这是建议的安全阀值</string>
|
||||
<string name="openapsama_current_basal_safety_multiplier_summary">默认值: 4 这是另一个的关键 OpenAPS 安全阀值, 日最大基础率的3倍,当前基础率的4倍,这是建议的安全阀值。这意味着你的基础率, 无论你的泵上的最大基础率设置的多少,也 不能超过你的当前基础率的4倍。这是为了防止人们在了解该算法的工作原理之前进入危险的领域 。同样, 默认值为 4倍; 大多数人将永远不需要调整, 而是更有可能需要调整其他设置,</string>
|
||||
<string name="openapsama_autosens_max_summary">默认值: 1.2 \n 这是 autosens 的安全阀值 对 autosens ( 很快autotune) 比率的高值设置最大增加20%% 最大限制, 这反过来决定了 autosens 可以调整的基础率的上限值, 可以调整的胰岛素敏感系数的下限值, 以及它可以设置血糖目标的下限值。</string>
|
||||
<string name="openapsama_autosens_min_summary">默认值: 0.7 \n 这是autosens 的另一个安全阈值, 。这个值决定了 autosens 可以调整的基础率的下限值, 可以调整的胰岛素敏感系数的上限值, 以及它可以设置血糖目标的上限值。</string>
|
||||
<string name="openapsama_autosens_adjusttargets">Autosens 也调整目标血糖</string>
|
||||
<string name="openapsama_autosens_adjusttargets_summary">缺省值:是\n 这是用来允许 autosens调整血糖目标,还有 ISF胰岛素敏感系数和基础率这些参数。</string>
|
||||
|
@ -470,6 +477,7 @@
|
|||
<string name="error_phone_not_valid">电话号码无效</string>
|
||||
<string name="smscommunicator_invalidphonennumber">无效的SMS手机号码</string>
|
||||
<string name="overview_calibration">校准</string>
|
||||
<string name="send_calibration">确认将校准值 %1$.1f 发送到 xDrip 吗?</string>
|
||||
<string name="xdripnotinstalled">没有安装xDrip+</string>
|
||||
<string name="calibrationsent">校准发送到 xDrip</string>
|
||||
<string name="smscommunicator_calibrationsent">校准值发送了,必须在xDrip开启允许通过其他app使用它的校准功能</string>
|
||||
|
@ -520,6 +528,7 @@
|
|||
<string name="resistantadult">胰岛素抵抗成人</string>
|
||||
<string name="patientage_summary">请选择患者年龄以设置安全限制</string>
|
||||
<string name="Glimp">Glimp</string>
|
||||
<string name="needwhitelisting">%1$s 需要加入电池优化白名单才能正常运行</string>
|
||||
<string name="loopsuspended">闭环暂停了</string>
|
||||
<string name="loopsuspendedfor">暂停了 (%1$d m)</string>
|
||||
<string name="loopsuperbolusfor">超级大剂量 (%1$d m)</string>
|
||||
|
@ -555,6 +564,8 @@
|
|||
<string name="show_statuslights_summary">在主屏幕上启用cage(碳水时间)、iage(胰岛素时间)、sage(探头使用时间)、储药器和电池电量的状态指示灯。</string>
|
||||
<string name="statuslights_res_warning">储药器药量低于阈值[U] 警告</string>
|
||||
<string name="statuslights_res_critical">储药器药量低于阈值[U] 严重警告</string>
|
||||
<string name="statuslights_bat_warning">电池电量低于阈值[%%] 警告</string>
|
||||
<string name="statuslights_bat_critical">电池电量低于阈值[%%] 严重警告</string>
|
||||
<string name="iob">IOB活性胰岛素</string>
|
||||
<string name="cob">COB活性碳水</string>
|
||||
<string name="virtualpump_firmware_label">固件</string>
|
||||
|
@ -607,6 +618,7 @@
|
|||
<string name="absorptionsettings_title">食物吸收设置</string>
|
||||
<string name="absorption_maxtime_title">膳食最大吸收时间 [h]</string>
|
||||
<string name="absorption_maxtime_summary">预计膳食中所有的碳水化合物被吸收的时间,以小时为单位</string>
|
||||
<string name="danar_visualizeextendedaspercentage_title">用百分比的形式显示扩展 %%</string>
|
||||
<string name="careportal_sensorage_label_short">探头AGE</string>
|
||||
<string name="careportal_insulinage_label_short">胰岛素AGE</string>
|
||||
<string name="careportal_canulaage_label_short">管路AGE</string>
|
||||
|
@ -719,6 +731,8 @@
|
|||
<string name="dexcomg5_xdripupload_title">将血糖数据发送到 xDrip +</string>
|
||||
<string name="dexcomg5_xdripupload_summary">在 xDrip + 选择640g/Eversense 数据源</string>
|
||||
<string name="nsclientbg">NSClient 血糖</string>
|
||||
<string name="minimalbasalvaluereplaced">基础率值被泵支持的最小值: %1$s 替换了</string>
|
||||
<string name="maximumbasalvaluereplaced">基础率值被泵支持的最大值:%1$s 替换了</string>
|
||||
<string name="overview_editquickwizard_usebg">血糖计算</string>
|
||||
<string name="overview_editquickwizard_usebolusiob">大剂量IOB (活性胰岛素) 计算</string>
|
||||
<string name="overview_editquickwizard_usebasaliob">基础率IOB (活性胰岛素) 计算</string>
|
||||
|
@ -736,6 +750,8 @@
|
|||
<string name="closedmodeenabled">闭环模式启用了</string>
|
||||
<string name="maxiobset">合理地设置最大 IOB</string>
|
||||
<string name="hasbgdata">所选的血糖值来源的血糖是可用的</string>
|
||||
<string name="basalprofilenotaligned">基础率值与小时不一致:%1$s</string>
|
||||
<string name="zerovalueinprofile">无效的配置文件:%1$s</string>
|
||||
<string name="combo_programming_bolus">正在调用泵上的大剂量输注程序</string>
|
||||
<string name="combo_refresh">刷新</string>
|
||||
<string name="combo_pump_state_label">状态</string>
|
||||
|
@ -748,6 +764,7 @@
|
|||
<string name="combo_pump_state_running">正在运行</string>
|
||||
<string name="combo_pump_action_cancelling_tbr">正在取消临时基础率</string>
|
||||
<string name="combo_pump_action_setting_tbr">正在设置临时基础率 (%1$d%% / %2$d 分钟)</string>
|
||||
<string name="combo_pump_action_bolusing">正在输注大剂量 (%1$.1f U)</string>
|
||||
<string name="combo_pump_action_refreshing">正在刷新</string>
|
||||
<string name="combo_pump_unsupported_operation">泵不支持请求的操作</string>
|
||||
<string name="combo_low_suspend_forced_notification">不安全的用法: 扩展大剂量(方波) 或者双波被启用了,闭环只支持常规大剂量, 闭环已经被设置为6个小时的低血糖暂停模式(low-suspend only 6 hours).</string>
|
||||
|
@ -1076,6 +1093,7 @@
|
|||
<string name="log_operating_mode_changes">记录操作模式更改</string>
|
||||
<string name="log_alerts">记录报警</string>
|
||||
<string name="enable_tbr_emulation">启用 TBR (临时基础率) 模拟</string>
|
||||
<string name="enable_tbr_emulation_summary">使用扩展大剂量而不是TBRs(临时基础率) 绕过250%%的限制</string>
|
||||
<string name="disconnect_delay">断开连接延迟 [s]</string>
|
||||
<string name="serial_number">序列号</string>
|
||||
<string name="release_software_version">发行软件版本</string>
|
||||
|
@ -1138,6 +1156,10 @@
|
|||
<string name="sms_wrongcode">错误的代码。命令取消</string>
|
||||
<string name="notconfigured">未配置</string>
|
||||
<string name="profileswitchcreated">配置文件切换已创建</string>
|
||||
<string name="versionChecker">版本检查器</string>
|
||||
<string name="old_version">旧版本</string>
|
||||
<string name="very_old_version">非常旧版本</string>
|
||||
<string name="new_version_warning">至少可用 %1$d 天的新版本!60 天后返回 LGS,90 天后循环将被禁用</string>
|
||||
<plurals name="objective_days">
|
||||
<item quantity="other">%1$d 天</item>
|
||||
</plurals>
|
||||
|
|
|
@ -1335,6 +1335,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>
|
||||
|
||||
<string name="dexcom_app_patched">Dexcom App (patched)</string>
|
||||
<string name="dexcom_short">DXCM</string>
|
||||
|
|
|
@ -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.getCalculatedTotalInsulin();
|
||||
bw = new BolusWizard(profile, "", null, 20, 0.0, 5.4, 0d, 100d, true, true, true, true, false, false, false);
|
||||
Double bolusForBg54 = bw.getCalculatedTotalInsulin();
|
||||
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.getCalculatedTotalInsulin();
|
||||
bw = new BolusWizard(profile, "", null, 20, 0.0, 5.4, 0d, 100d, true, true, true, true, false, false, false);
|
||||
Double bolusForBgInRange = bw.getCalculatedTotalInsulin();
|
||||
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.getCalculatedTotalInsulin();
|
||||
bw = new BolusWizard(profile, "", null, 20, 0.0, 5.4, 0d, 100d, true, true, true, true, false, false, false);
|
||||
Double bolusForBgInRange = bw.getCalculatedTotalInsulin();
|
||||
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