applyBasalPercentConstraints refactor & tests part2
This commit is contained in:
parent
e2ea44a8a8
commit
c68ab9f1ca
|
@ -37,34 +37,34 @@ public class Constraint<T extends Comparable> {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Constraint<T> set(T value, String reason) {
|
public Constraint<T> set(T value, String reason, Object from) {
|
||||||
this.value = value;
|
this.value = value;
|
||||||
reason(reason);
|
reason(reason, from);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Constraint<T> setIfSmaller(T value, String reason) {
|
public Constraint<T> setIfSmaller(T value, String reason, Object from) {
|
||||||
if (value.compareTo(this.value) < 0) {
|
if (value.compareTo(this.value) < 0) {
|
||||||
this.value = value;
|
this.value = value;
|
||||||
}
|
}
|
||||||
if (value.compareTo(this.originalValue) < 0) {
|
if (value.compareTo(this.originalValue) < 0) {
|
||||||
reason(reason);
|
reason(reason, from);
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Constraint<T> setIfGreater(T value, String reason) {
|
public Constraint<T> setIfGreater(T value, String reason, Object from) {
|
||||||
if (value.compareTo(this.value) > 0) {
|
if (value.compareTo(this.value) > 0) {
|
||||||
this.value = value;
|
this.value = value;
|
||||||
}
|
}
|
||||||
if (value.compareTo(this.originalValue) > 0) {
|
if (value.compareTo(this.originalValue) > 0) {
|
||||||
reason(reason);
|
reason(reason, from);
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Constraint reason(String reason) {
|
public Constraint reason(String reason, Object from) {
|
||||||
reasons.add(reason);
|
reasons.add(from.getClass().getSimpleName() + ": " + reason);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,4 +79,13 @@ public class Constraint<T extends Comparable> {
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<String> getReasonList() {
|
||||||
|
return reasons;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void copyReasons(Constraint<?> another) {
|
||||||
|
for (String s: another.getReasonList()) {
|
||||||
|
reasons.add(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -302,35 +302,35 @@ public class ObjectivesPlugin implements PluginBase, ConstraintsInterface {
|
||||||
@Override
|
@Override
|
||||||
public Constraint<Boolean> isLoopInvokationAllowed(Constraint<Boolean> value) {
|
public Constraint<Boolean> isLoopInvokationAllowed(Constraint<Boolean> value) {
|
||||||
if (objectives.get(0).started.getTime() == 0)
|
if (objectives.get(0).started.getTime() == 0)
|
||||||
value.set(false, String.format(MainApp.gs(R.string.objectivenotstarted), 1));
|
value.set(false, String.format(MainApp.gs(R.string.objectivenotstarted), 1), this);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Constraint<Boolean> isClosedLoopAllowed(Constraint<Boolean> value) {
|
public Constraint<Boolean> isClosedLoopAllowed(Constraint<Boolean> value) {
|
||||||
if (objectives.get(3).started.getTime() == 0)
|
if (objectives.get(3).started.getTime() == 0)
|
||||||
value.set(false, String.format(MainApp.gs(R.string.objectivenotstarted), 4));
|
value.set(false, String.format(MainApp.gs(R.string.objectivenotstarted), 4), this);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Constraint<Boolean> isAutosensModeEnabled(Constraint<Boolean> value) {
|
public Constraint<Boolean> isAutosensModeEnabled(Constraint<Boolean> value) {
|
||||||
if (objectives.get(5).started.getTime() == 0)
|
if (objectives.get(5).started.getTime() == 0)
|
||||||
value.set(false, String.format(MainApp.gs(R.string.objectivenotstarted), 6));
|
value.set(false, String.format(MainApp.gs(R.string.objectivenotstarted), 6), this);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Constraint<Boolean> isAMAModeEnabled(Constraint<Boolean> value) {
|
public Constraint<Boolean> isAMAModeEnabled(Constraint<Boolean> value) {
|
||||||
if (objectives.get(6).started.getTime() == 0)
|
if (objectives.get(6).started.getTime() == 0)
|
||||||
value.set(false, String.format(MainApp.gs(R.string.objectivenotstarted), 7));
|
value.set(false, String.format(MainApp.gs(R.string.objectivenotstarted), 7), this);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Constraint<Boolean> isSMBModeEnabled(Constraint<Boolean> value) {
|
public Constraint<Boolean> isSMBModeEnabled(Constraint<Boolean> value) {
|
||||||
if (objectives.get(7).started.getTime() == 0)
|
if (objectives.get(7).started.getTime() == 0)
|
||||||
value.set(false, String.format(MainApp.gs(R.string.objectivenotstarted), 8));
|
value.set(false, String.format(MainApp.gs(R.string.objectivenotstarted), 8), this);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,16 +3,12 @@ package info.nightscout.androidaps.plugins.ConstraintsSafety;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
import info.nightscout.androidaps.Config;
|
|
||||||
import info.nightscout.androidaps.Constants;
|
|
||||||
import info.nightscout.androidaps.MainApp;
|
import info.nightscout.androidaps.MainApp;
|
||||||
import info.nightscout.androidaps.R;
|
import info.nightscout.androidaps.R;
|
||||||
import info.nightscout.androidaps.data.Profile;
|
import info.nightscout.androidaps.data.Profile;
|
||||||
|
import info.nightscout.androidaps.interfaces.Constraint;
|
||||||
import info.nightscout.androidaps.interfaces.ConstraintsInterface;
|
import info.nightscout.androidaps.interfaces.ConstraintsInterface;
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
import info.nightscout.androidaps.interfaces.Constraint;
|
|
||||||
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
|
||||||
import info.nightscout.utils.DecimalFormatter;
|
import info.nightscout.utils.DecimalFormatter;
|
||||||
import info.nightscout.utils.HardLimits;
|
import info.nightscout.utils.HardLimits;
|
||||||
|
@ -99,18 +95,18 @@ public class SafetyPlugin implements PluginBase, ConstraintsInterface {
|
||||||
@Override
|
@Override
|
||||||
public Constraint<Boolean> isLoopInvokationAllowed(Constraint<Boolean> value) {
|
public Constraint<Boolean> isLoopInvokationAllowed(Constraint<Boolean> value) {
|
||||||
if (!ConfigBuilderPlugin.getActivePump().getPumpDescription().isTempBasalCapable)
|
if (!ConfigBuilderPlugin.getActivePump().getPumpDescription().isTempBasalCapable)
|
||||||
value.set(false, MainApp.gs(R.string.pumpisnottempbasalcapable));
|
value.set(false, MainApp.gs(R.string.pumpisnottempbasalcapable), this);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Constraint<Boolean> isClosedLoopAllowed(Constraint<Boolean> value) {
|
public Constraint<Boolean> isClosedLoopAllowed(Constraint<Boolean> value) {
|
||||||
if (!MainApp.isEngineeringModeOrRelease())
|
if (!MainApp.isEngineeringModeOrRelease())
|
||||||
value.set(false, MainApp.gs(R.string.closed_loop_disabled_on_dev_branch));
|
value.set(false, MainApp.gs(R.string.closed_loop_disabled_on_dev_branch), this);
|
||||||
|
|
||||||
String mode = SP.getString("aps_mode", "open");
|
String mode = SP.getString("aps_mode", "open");
|
||||||
if (!mode.equals("closed"))
|
if (!mode.equals("closed"))
|
||||||
value.set(false, MainApp.gs(R.string.closedmodedisabledinpreferences));
|
value.set(false, MainApp.gs(R.string.closedmodedisabledinpreferences), this);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,7 +119,7 @@ public class SafetyPlugin implements PluginBase, ConstraintsInterface {
|
||||||
public Constraint<Boolean> isAMAModeEnabled(Constraint<Boolean> value) {
|
public Constraint<Boolean> isAMAModeEnabled(Constraint<Boolean> value) {
|
||||||
boolean enabled = SP.getBoolean("openapsama_useautosens", false);
|
boolean enabled = SP.getBoolean("openapsama_useautosens", false);
|
||||||
if (!enabled)
|
if (!enabled)
|
||||||
value.set(false, MainApp.gs(R.string.amadisabledinpreferences));
|
value.set(false, MainApp.gs(R.string.amadisabledinpreferences), this);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,26 +127,26 @@ public class SafetyPlugin implements PluginBase, ConstraintsInterface {
|
||||||
public Constraint<Boolean> isSMBModeEnabled(Constraint<Boolean> value) {
|
public Constraint<Boolean> isSMBModeEnabled(Constraint<Boolean> value) {
|
||||||
boolean enabled = SP.getBoolean(R.string.key_use_smb, false);
|
boolean enabled = SP.getBoolean(R.string.key_use_smb, false);
|
||||||
if (!enabled)
|
if (!enabled)
|
||||||
value.set(false, MainApp.gs(R.string.smbdisabledinpreferences));
|
value.set(false, MainApp.gs(R.string.smbdisabledinpreferences), this);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Constraint<Double> applyBasalConstraints(Constraint<Double> absoluteRate, Profile profile) {
|
public Constraint<Double> applyBasalConstraints(Constraint<Double> absoluteRate, Profile profile) {
|
||||||
|
|
||||||
absoluteRate.setIfGreater(0d, String.format(MainApp.gs(R.string.limitingbasalratio), 0d, MainApp.gs(R.string.basalmustbepositivevalue)));
|
absoluteRate.setIfGreater(0d, String.format(MainApp.gs(R.string.limitingbasalratio), 0d, MainApp.gs(R.string.basalmustbepositivevalue)), this);
|
||||||
|
|
||||||
double maxBasal = SP.getDouble(R.string.key_openapsma_max_basal, 1d);
|
double maxBasal = SP.getDouble(R.string.key_openapsma_max_basal, 1d);
|
||||||
absoluteRate.setIfSmaller(maxBasal, String.format(MainApp.gs(R.string.limitingbasalratio), maxBasal, MainApp.gs(R.string.maxbasalinpreferences)));
|
absoluteRate.setIfSmaller(maxBasal, String.format(MainApp.gs(R.string.limitingbasalratio), maxBasal, MainApp.gs(R.string.maxbasalinpreferences)), this);
|
||||||
|
|
||||||
// Check percentRate but absolute rate too, because we know real current basal in pump
|
// Check percentRate but absolute rate too, because we know real current basal in pump
|
||||||
Double maxBasalMult = SP.getDouble(R.string.key_openapsama_current_basal_safety_multiplier, 4d);
|
Double maxBasalMult = SP.getDouble(R.string.key_openapsama_current_basal_safety_multiplier, 4d);
|
||||||
double maxFromBasalMult = Math.floor(maxBasalMult * profile.getBasal() * 100) / 100;
|
double maxFromBasalMult = Math.floor(maxBasalMult * profile.getBasal() * 100) / 100;
|
||||||
absoluteRate.setIfSmaller(maxFromBasalMult, String.format(MainApp.gs(R.string.limitingbasalratio), maxFromBasalMult, MainApp.gs(R.string.maxbasalmultiplier)));
|
absoluteRate.setIfSmaller(maxFromBasalMult, String.format(MainApp.gs(R.string.limitingbasalratio), maxFromBasalMult, MainApp.gs(R.string.maxbasalmultiplier)), this);
|
||||||
|
|
||||||
Double maxBasalFromDaily = SP.getDouble(R.string.key_openapsama_max_daily_safety_multiplier, 3d);
|
Double maxBasalFromDaily = SP.getDouble(R.string.key_openapsama_max_daily_safety_multiplier, 3d);
|
||||||
double maxFromDaily = Math.floor(profile.getMaxDailyBasal() * maxBasalFromDaily * 100) / 100;
|
double maxFromDaily = Math.floor(profile.getMaxDailyBasal() * maxBasalFromDaily * 100) / 100;
|
||||||
absoluteRate.setIfSmaller(maxFromDaily, String.format(MainApp.gs(R.string.limitingbasalratio), maxFromDaily, MainApp.gs(R.string.maxdailybasalmultiplier)));
|
absoluteRate.setIfSmaller(maxFromDaily, String.format(MainApp.gs(R.string.limitingbasalratio), maxFromDaily, MainApp.gs(R.string.maxdailybasalmultiplier)), this);
|
||||||
return absoluteRate;
|
return absoluteRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -160,18 +156,18 @@ public class SafetyPlugin implements PluginBase, ConstraintsInterface {
|
||||||
Double currentBasal = profile.getBasal();
|
Double currentBasal = profile.getBasal();
|
||||||
Double absoluteRate = currentBasal * ((double) percentRate.originalValue() / 100);
|
Double absoluteRate = currentBasal * ((double) percentRate.originalValue() / 100);
|
||||||
|
|
||||||
percentRate.reason("Percent rate " + percentRate.originalValue() + "% recalculated to " + DecimalFormatter.to2Decimal(absoluteRate) + " U/h with current basal " + DecimalFormatter.to2Decimal(currentBasal) + " U/h");
|
percentRate.reason("Percent rate " + percentRate.originalValue() + "% recalculated to " + DecimalFormatter.to2Decimal(absoluteRate) + " U/h with current basal " + DecimalFormatter.to2Decimal(currentBasal) + " U/h", this);
|
||||||
|
|
||||||
Constraint<Double> absoluteConstraint = new Constraint<>(absoluteRate);
|
Constraint<Double> absoluteConstraint = new Constraint<>(absoluteRate);
|
||||||
applyBasalConstraints(absoluteConstraint, profile);
|
applyBasalConstraints(absoluteConstraint, profile);
|
||||||
|
percentRate.copyReasons(absoluteConstraint);
|
||||||
|
|
||||||
Integer percentRateAfterConst = Double.valueOf(absoluteConstraint.value() / currentBasal * 100).intValue();
|
Integer percentRateAfterConst = Double.valueOf(absoluteConstraint.value() / currentBasal * 100).intValue();
|
||||||
if (percentRateAfterConst < 100)
|
if (percentRateAfterConst < 100)
|
||||||
percentRateAfterConst = Round.ceilTo((double) percentRateAfterConst, 10d).intValue();
|
percentRateAfterConst = Round.ceilTo((double) percentRateAfterConst, 10d).intValue();
|
||||||
else percentRateAfterConst = Round.floorTo((double) percentRateAfterConst, 10d).intValue();
|
else percentRateAfterConst = Round.floorTo((double) percentRateAfterConst, 10d).intValue();
|
||||||
|
|
||||||
percentRate.set(percentRateAfterConst, String.format(MainApp.gs(R.string.limitingpercentrate), percentRateAfterConst, MainApp.gs(R.string.pumplimit)));
|
percentRate.set(percentRateAfterConst, String.format(MainApp.gs(R.string.limitingpercentrate), percentRateAfterConst, MainApp.gs(R.string.pumplimit)), this);
|
||||||
|
|
||||||
return percentRate;
|
return percentRate;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1428,7 +1428,7 @@ public class ComboPlugin implements PluginBase, PumpInterface, ConstraintsInterf
|
||||||
@Override
|
@Override
|
||||||
public Constraint<Boolean> isLoopInvokationAllowed(Constraint<Boolean> value) {
|
public Constraint<Boolean> isLoopInvokationAllowed(Constraint<Boolean> value) {
|
||||||
if (!validBasalRateProfileSelectedOnPump)
|
if (!validBasalRateProfileSelectedOnPump)
|
||||||
value.set(false, MainApp.gs(R.string.novalidbasalrate));
|
value.set(false, MainApp.gs(R.string.novalidbasalrate), this);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,6 @@ import org.json.JSONObject;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
import info.nightscout.androidaps.BuildConfig;
|
import info.nightscout.androidaps.BuildConfig;
|
||||||
import info.nightscout.androidaps.Config;
|
import info.nightscout.androidaps.Config;
|
||||||
|
@ -19,13 +18,13 @@ import info.nightscout.androidaps.data.ProfileStore;
|
||||||
import info.nightscout.androidaps.data.PumpEnactResult;
|
import info.nightscout.androidaps.data.PumpEnactResult;
|
||||||
import info.nightscout.androidaps.db.ExtendedBolus;
|
import info.nightscout.androidaps.db.ExtendedBolus;
|
||||||
import info.nightscout.androidaps.db.TemporaryBasal;
|
import info.nightscout.androidaps.db.TemporaryBasal;
|
||||||
|
import info.nightscout.androidaps.interfaces.Constraint;
|
||||||
import info.nightscout.androidaps.interfaces.ConstraintsInterface;
|
import info.nightscout.androidaps.interfaces.ConstraintsInterface;
|
||||||
import info.nightscout.androidaps.interfaces.DanaRInterface;
|
import info.nightscout.androidaps.interfaces.DanaRInterface;
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
import info.nightscout.androidaps.interfaces.ProfileInterface;
|
import info.nightscout.androidaps.interfaces.ProfileInterface;
|
||||||
import info.nightscout.androidaps.interfaces.PumpDescription;
|
import info.nightscout.androidaps.interfaces.PumpDescription;
|
||||||
import info.nightscout.androidaps.interfaces.PumpInterface;
|
import info.nightscout.androidaps.interfaces.PumpInterface;
|
||||||
import info.nightscout.androidaps.interfaces.Constraint;
|
|
||||||
import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification;
|
import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification;
|
||||||
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
|
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
|
||||||
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
|
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
|
||||||
|
@ -462,14 +461,14 @@ public abstract class AbstractDanaRPlugin implements PluginBase, PumpInterface,
|
||||||
@Override
|
@Override
|
||||||
public Constraint<Double> applyBasalConstraints(Constraint<Double> absoluteRate, Profile profile) {
|
public Constraint<Double> applyBasalConstraints(Constraint<Double> absoluteRate, Profile profile) {
|
||||||
if (pump != null)
|
if (pump != null)
|
||||||
absoluteRate.setIfSmaller(pump.maxBasal, String.format(MainApp.gs(R.string.limitingbasalratio), pump.maxBasal, MainApp.gs(R.string.pumplimit)));
|
absoluteRate.setIfSmaller(pump.maxBasal, String.format(MainApp.gs(R.string.limitingbasalratio), pump.maxBasal, MainApp.gs(R.string.pumplimit)), this);
|
||||||
return absoluteRate;
|
return absoluteRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Constraint<Integer> applyBasalPercentConstraints(Constraint<Integer> percentRate, Profile profile) {
|
public Constraint<Integer> applyBasalPercentConstraints(Constraint<Integer> percentRate, Profile profile) {
|
||||||
percentRate.setIfGreater(0, String.format(MainApp.gs(R.string.limitingpercentrate), 0, MainApp.gs(R.string.basalmustbepositivevalue)));
|
percentRate.setIfGreater(0, String.format(MainApp.gs(R.string.limitingpercentrate), 0, MainApp.gs(R.string.basalmustbepositivevalue)), this);
|
||||||
percentRate.setIfSmaller(getPumpDescription().maxTempPercent, String.format(MainApp.gs(R.string.limitingpercentrate), getPumpDescription().maxTempPercent, MainApp.gs(R.string.pumplimit)));
|
percentRate.setIfSmaller(getPumpDescription().maxTempPercent, String.format(MainApp.gs(R.string.limitingpercentrate), getPumpDescription().maxTempPercent, MainApp.gs(R.string.pumplimit)), this);
|
||||||
|
|
||||||
return percentRate;
|
return percentRate;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,6 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Objects;
|
|
||||||
|
|
||||||
import info.nightscout.androidaps.BuildConfig;
|
import info.nightscout.androidaps.BuildConfig;
|
||||||
import info.nightscout.androidaps.Config;
|
import info.nightscout.androidaps.Config;
|
||||||
|
@ -30,13 +29,13 @@ import info.nightscout.androidaps.db.ExtendedBolus;
|
||||||
import info.nightscout.androidaps.db.TemporaryBasal;
|
import info.nightscout.androidaps.db.TemporaryBasal;
|
||||||
import info.nightscout.androidaps.db.Treatment;
|
import info.nightscout.androidaps.db.Treatment;
|
||||||
import info.nightscout.androidaps.events.EventAppExit;
|
import info.nightscout.androidaps.events.EventAppExit;
|
||||||
|
import info.nightscout.androidaps.interfaces.Constraint;
|
||||||
import info.nightscout.androidaps.interfaces.ConstraintsInterface;
|
import info.nightscout.androidaps.interfaces.ConstraintsInterface;
|
||||||
import info.nightscout.androidaps.interfaces.DanaRInterface;
|
import info.nightscout.androidaps.interfaces.DanaRInterface;
|
||||||
import info.nightscout.androidaps.interfaces.PluginBase;
|
import info.nightscout.androidaps.interfaces.PluginBase;
|
||||||
import info.nightscout.androidaps.interfaces.ProfileInterface;
|
import info.nightscout.androidaps.interfaces.ProfileInterface;
|
||||||
import info.nightscout.androidaps.interfaces.PumpDescription;
|
import info.nightscout.androidaps.interfaces.PumpDescription;
|
||||||
import info.nightscout.androidaps.interfaces.PumpInterface;
|
import info.nightscout.androidaps.interfaces.PumpInterface;
|
||||||
import info.nightscout.androidaps.interfaces.Constraint;
|
|
||||||
import info.nightscout.androidaps.plugins.ConfigBuilder.DetailedBolusInfoStorage;
|
import info.nightscout.androidaps.plugins.ConfigBuilder.DetailedBolusInfoStorage;
|
||||||
import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification;
|
import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification;
|
||||||
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
|
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
|
||||||
|
@ -301,14 +300,14 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface,
|
||||||
@Override
|
@Override
|
||||||
public Constraint<Double> applyBasalConstraints(Constraint<Double> absoluteRate, Profile profile) {
|
public Constraint<Double> applyBasalConstraints(Constraint<Double> absoluteRate, Profile profile) {
|
||||||
if (pump != null)
|
if (pump != null)
|
||||||
absoluteRate.setIfSmaller(pump.maxBasal, String.format(MainApp.gs(R.string.limitingbasalratio), pump.maxBasal, MainApp.gs(R.string.pumplimit)));
|
absoluteRate.setIfSmaller(pump.maxBasal, String.format(MainApp.gs(R.string.limitingbasalratio), pump.maxBasal, MainApp.gs(R.string.pumplimit)), this);
|
||||||
return absoluteRate;
|
return absoluteRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Constraint<Integer> applyBasalPercentConstraints(Constraint<Integer> percentRate, Profile profile) {
|
public Constraint<Integer> applyBasalPercentConstraints(Constraint<Integer> percentRate, Profile profile) {
|
||||||
percentRate.setIfGreater(0, String.format(MainApp.gs(R.string.limitingpercentrate), 0, MainApp.gs(R.string.basalmustbepositivevalue)));
|
percentRate.setIfGreater(0, String.format(MainApp.gs(R.string.limitingpercentrate), 0, MainApp.gs(R.string.basalmustbepositivevalue)), this);
|
||||||
percentRate.setIfSmaller(getPumpDescription().maxTempPercent, String.format(MainApp.gs(R.string.limitingpercentrate), getPumpDescription().maxTempPercent, MainApp.gs(R.string.pumplimit)));
|
percentRate.setIfSmaller(getPumpDescription().maxTempPercent, String.format(MainApp.gs(R.string.limitingpercentrate), getPumpDescription().maxTempPercent, MainApp.gs(R.string.pumplimit)), this);
|
||||||
|
|
||||||
return percentRate;
|
return percentRate;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1116,15 +1116,15 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints
|
||||||
@Override
|
@Override
|
||||||
public Constraint<Double> applyBasalConstraints(Constraint<Double> absoluteRate, Profile profile) {
|
public Constraint<Double> applyBasalConstraints(Constraint<Double> absoluteRate, Profile profile) {
|
||||||
if (statusResult != null) {
|
if (statusResult != null) {
|
||||||
absoluteRate.setIfSmaller(statusResult.maximumBasalAmount, String.format(MainApp.gs(R.string.limitingbasalratio), statusResult.maximumBasalAmount, MainApp.gs(R.string.pumplimit)));
|
absoluteRate.setIfSmaller(statusResult.maximumBasalAmount, String.format(MainApp.gs(R.string.limitingbasalratio), statusResult.maximumBasalAmount, MainApp.gs(R.string.pumplimit)), this);
|
||||||
}
|
}
|
||||||
return absoluteRate;
|
return absoluteRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Constraint<Integer> applyBasalPercentConstraints(Constraint<Integer> percentRate, Profile profile) {
|
public Constraint<Integer> applyBasalPercentConstraints(Constraint<Integer> percentRate, Profile profile) {
|
||||||
percentRate.setIfGreater(0, String.format(MainApp.gs(R.string.limitingpercentrate), 0, MainApp.gs(R.string.basalmustbepositivevalue)));
|
percentRate.setIfGreater(0, String.format(MainApp.gs(R.string.limitingpercentrate), 0, MainApp.gs(R.string.basalmustbepositivevalue)), this);
|
||||||
percentRate.setIfSmaller(getPumpDescription().maxTempPercent, String.format(MainApp.gs(R.string.limitingpercentrate), getPumpDescription().maxTempPercent, MainApp.gs(R.string.pumplimit)));
|
percentRate.setIfSmaller(getPumpDescription().maxTempPercent, String.format(MainApp.gs(R.string.limitingpercentrate), getPumpDescription().maxTempPercent, MainApp.gs(R.string.pumplimit)), this);
|
||||||
|
|
||||||
return percentRate;
|
return percentRate;
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,23 +21,23 @@ public class ConstraintTest {
|
||||||
b.set(false);
|
b.set(false);
|
||||||
Assert.assertEquals(Boolean.FALSE, b.value());
|
Assert.assertEquals(Boolean.FALSE, b.value());
|
||||||
Assert.assertEquals("", b.getReasons());
|
Assert.assertEquals("", b.getReasons());
|
||||||
b.set(true, "Set true");
|
b.set(true, "Set true", this);
|
||||||
Assert.assertEquals(Boolean.TRUE, b.value());
|
Assert.assertEquals(Boolean.TRUE, b.value());
|
||||||
Assert.assertEquals("Set true", b.getReasons());
|
Assert.assertEquals("ConstraintTest: Set true", b.getReasons());
|
||||||
b.set(false, "Set false");
|
b.set(false, "Set false", this);
|
||||||
Assert.assertEquals(Boolean.FALSE, b.value());
|
Assert.assertEquals(Boolean.FALSE, b.value());
|
||||||
Assert.assertEquals("Set true\nSet false", b.getReasons());
|
Assert.assertEquals("ConstraintTest: Set true\nConstraintTest: Set false", b.getReasons());
|
||||||
|
|
||||||
Constraint<Double> d = new Constraint<>(10d);
|
Constraint<Double> d = new Constraint<>(10d);
|
||||||
d.set(5d, "Set 5d");
|
d.set(5d, "Set 5d", this);
|
||||||
Assert.assertEquals(5d, d.value());
|
Assert.assertEquals(5d, d.value());
|
||||||
Assert.assertEquals("Set 5d", d.getReasons());
|
Assert.assertEquals("ConstraintTest: Set 5d", d.getReasons());
|
||||||
d.setIfSmaller(6d, "Set 6d");
|
d.setIfSmaller(6d, "Set 6d", this);
|
||||||
Assert.assertEquals(5d, d.value());
|
Assert.assertEquals(5d, d.value());
|
||||||
Assert.assertEquals("Set 5d\nSet 6d", d.getReasons());
|
Assert.assertEquals("ConstraintTest: Set 5d\nConstraintTest: Set 6d", d.getReasons());
|
||||||
d.setIfSmaller(4d, "Set 4d");
|
d.setIfSmaller(4d, "Set 4d", this);
|
||||||
Assert.assertEquals(4d, d.value());
|
Assert.assertEquals(4d, d.value());
|
||||||
Assert.assertEquals("Set 5d\nSet 6d\nSet 4d", d.getReasons());
|
Assert.assertEquals("ConstraintTest: Set 5d\nConstraintTest: Set 6d\nConstraintTest: Set 4d", d.getReasons());
|
||||||
Assert.assertEquals(10d, d.originalValue());
|
Assert.assertEquals(10d, d.originalValue());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -200,18 +200,18 @@ public class ConstraintsCheckerTest {
|
||||||
Constraint<Double> d = new Constraint<>(-0.5d);
|
Constraint<Double> d = new Constraint<>(-0.5d);
|
||||||
constraintChecker.applyBasalConstraints(d, profile);
|
constraintChecker.applyBasalConstraints(d, profile);
|
||||||
Assert.assertEquals(0d, d.value());
|
Assert.assertEquals(0d, d.value());
|
||||||
Assert.assertEquals("Limiting basal rate to 0.00 U/h because of basal must be positive value", d.getReasons());
|
Assert.assertEquals("SafetyPlugin: Limiting basal rate to 0.00 U/h because of basal must be positive value", d.getReasons());
|
||||||
|
|
||||||
// Apply all limits
|
// Apply all limits
|
||||||
d = new Constraint<>(Constants.REALLYHIGHBASALRATE);
|
d = new Constraint<>(Constants.REALLYHIGHBASALRATE);
|
||||||
constraintChecker.applyBasalConstraints(d, profile);
|
constraintChecker.applyBasalConstraints(d, profile);
|
||||||
Assert.assertEquals(0.8d, d.value());
|
Assert.assertEquals(0.8d, d.value());
|
||||||
Assert.assertEquals("Limiting basal rate to 1.00 U/h because of max basal settings in preferences\n" +
|
Assert.assertEquals("SafetyPlugin: Limiting basal rate to 1.00 U/h because of max basal settings in preferences\n" +
|
||||||
"Limiting basal rate to 4.00 U/h because of max basal multiplier\n" +
|
"SafetyPlugin: Limiting basal rate to 4.00 U/h because of max basal multiplier\n" +
|
||||||
"Limiting basal rate to 3.00 U/h because of max daily basal multiplier\n" +
|
"SafetyPlugin: Limiting basal rate to 3.00 U/h because of max daily basal multiplier\n" +
|
||||||
"Limiting basal rate to 0.80 U/h because of pump limit\n" +
|
"DanaRPlugin: Limiting basal rate to 0.80 U/h because of pump limit\n" +
|
||||||
"Limiting basal rate to 0.80 U/h because of pump limit\n" +
|
"DanaRSPlugin: Limiting basal rate to 0.80 U/h because of pump limit\n" +
|
||||||
"Limiting basal rate to 1.10 U/h because of pump limit", d.getReasons());
|
"InsightPumpPlugin: Limiting basal rate to 1.10 U/h because of pump limit", d.getReasons());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -239,21 +239,25 @@ public class ConstraintsCheckerTest {
|
||||||
Constraint<Integer> i = new Constraint<>(-22);
|
Constraint<Integer> i = new Constraint<>(-22);
|
||||||
constraintChecker.applyBasalPercentConstraints(i, profile);
|
constraintChecker.applyBasalPercentConstraints(i, profile);
|
||||||
Assert.assertEquals((Integer)0, i.value());
|
Assert.assertEquals((Integer)0, i.value());
|
||||||
Assert.assertEquals("Percent rate -22% recalculated to -0.22 U/h with current basal 1.00 U/h\n" + // SafetyPlugin
|
Assert.assertEquals("SafetyPlugin: Percent rate -22% recalculated to -0.22 U/h with current basal 1.00 U/h\n" +
|
||||||
"Limiting percent rate to 0% because of pump limit\n" + // SafetyPlugin
|
"SafetyPlugin: Limiting basal rate to 0.00 U/h because of basal must be positive value\n" +
|
||||||
"Limiting percent rate to 0% because of basal must be positive value\n" + // DanaRPlugin
|
"SafetyPlugin: Limiting percent rate to 0% because of pump limit\n" +
|
||||||
"Limiting percent rate to 0% because of basal must be positive value\n" + // DanaRSPlugin
|
"DanaRPlugin: Limiting percent rate to 0% because of basal must be positive value\n" +
|
||||||
"Limiting percent rate to 0% because of basal must be positive value", i.getReasons()); // InsightPlugin
|
"DanaRSPlugin: Limiting percent rate to 0% because of basal must be positive value\n" +
|
||||||
|
"InsightPumpPlugin: Limiting percent rate to 0% because of basal must be positive value", i.getReasons()); // InsightPlugin
|
||||||
|
|
||||||
// Apply all limits
|
// Apply all limits
|
||||||
i = new Constraint<>(Constants.REALLYHIGHPERCENTBASALRATE);
|
i = new Constraint<>(Constants.REALLYHIGHPERCENTBASALRATE);
|
||||||
constraintChecker.applyBasalPercentConstraints(i, profile);
|
constraintChecker.applyBasalPercentConstraints(i, profile);
|
||||||
Assert.assertEquals((Integer)100, i.value());
|
Assert.assertEquals((Integer)100, i.value());
|
||||||
Assert.assertEquals("Percent rate 1111111% recalculated to 11111.11 U/h with current basal 1.00 U/h\n" + // SafetyPlugin
|
Assert.assertEquals("SafetyPlugin: Percent rate 1111111% recalculated to 11111.11 U/h with current basal 1.00 U/h\n" +
|
||||||
"Limiting percent rate to 100% because of pump limit\n" +
|
"SafetyPlugin: Limiting basal rate to 1.00 U/h because of max basal settings in preferences\n" +
|
||||||
"Limiting percent rate to 200% because of pump limit\n" +
|
"SafetyPlugin: Limiting basal rate to 4.00 U/h because of max basal multiplier\n" +
|
||||||
"Limiting percent rate to 200% because of pump limit\n" +
|
"SafetyPlugin: Limiting basal rate to 3.00 U/h because of max daily basal multiplier\n" +
|
||||||
"Limiting percent rate to 250% because of pump limit", i.getReasons());
|
"SafetyPlugin: Limiting percent rate to 100% because of pump limit\n" +
|
||||||
|
"DanaRPlugin: Limiting percent rate to 200% because of pump limit\n" +
|
||||||
|
"DanaRSPlugin: Limiting percent rate to 200% because of pump limit\n" +
|
||||||
|
"InsightPumpPlugin: Limiting percent rate to 250% because of pump limit", i.getReasons());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue