Merge branch 'dev' into insightfix

This commit is contained in:
Milos Kozak 2018-09-10 20:31:33 +02:00
commit a97c66169b
98 changed files with 2687 additions and 804 deletions

View file

@ -63,7 +63,7 @@ android {
targetSdkVersion 25
multiDexEnabled true
versionCode 1500
version "2.0f-dev"
version "2.0g-dev"
buildConfigField "String", "VERSION", '"' + version + '"'
buildConfigField "String", "BUILDVERSION", '"' + generateGitBuild() + '-' + generateDate() + '"'
buildConfigField "String", "HEAD", '"' + generateGitBuild() + '"'

View file

@ -5,6 +5,7 @@ import org.slf4j.LoggerFactory;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ConcurrentModificationException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
@ -75,16 +76,19 @@ public class LoggingBus extends Bus {
log.debug(" receiver: <unknown>");
}
if (everyMinute < System.currentTimeMillis()) {
log.debug("***************** Event -> receiver pairings seen so far ****************");
for (Map.Entry<String, Set<String>> stringSetEntry : event2Receiver.entrySet()) {
log.debug(" " + stringSetEntry.getKey());
for (String s : stringSetEntry.getValue()) {
log.debug(" -> " + s);
try {
if (everyMinute < System.currentTimeMillis()) {
log.debug("***************** Event -> receiver pairings seen so far ****************");
for (Map.Entry<String, Set<String>> stringSetEntry : event2Receiver.entrySet()) {
log.debug(" " + stringSetEntry.getKey());
for (String s : stringSetEntry.getValue()) {
log.debug(" -> " + s);
}
}
log.debug("*************************************************************************");
everyMinute = System.currentTimeMillis() + 60 * 1000;
}
log.debug("*************************************************************************");
everyMinute = System.currentTimeMillis() + 60 * 1000;
} catch (ConcurrentModificationException ignored) {
}
super.dispatch(event, wrapper);

View file

@ -58,6 +58,10 @@ public class ConstraintChecker implements ConstraintsInterface {
return applyBolusConstraints(new Constraint<>(Constants.REALLYHIGHBOLUS));
}
public Constraint<Double> getMaxExtendedBolusAllowed() {
return applyExtendedBolusConstraints(new Constraint<>(Constants.REALLYHIGHBOLUS));
}
public Constraint<Integer> getMaxCarbsAllowed() {
return applyCarbsConstraints(new Constraint<>(Constants.REALLYHIGHCARBS));
}
@ -170,6 +174,17 @@ public class ConstraintChecker implements ConstraintsInterface {
return insulin;
}
@Override
public Constraint<Double> applyExtendedBolusConstraints(Constraint<Double> insulin) {
ArrayList<PluginBase> constraintsPlugins = mainApp.getSpecificPluginsListByInterface(ConstraintsInterface.class);
for (PluginBase p : constraintsPlugins) {
ConstraintsInterface constrain = (ConstraintsInterface) p;
if (!p.isEnabled(PluginType.CONSTRAINTS)) continue;
constrain.applyExtendedBolusConstraints(insulin);
}
return insulin;
}
@Override
public Constraint<Integer> applyCarbsConstraints(Constraint<Integer> carbs) {
ArrayList<PluginBase> constraintsPlugins = mainApp.getSpecificPluginsListByInterface(ConstraintsInterface.class);

View file

@ -167,6 +167,11 @@ public class BgReading implements DataPointWithLabelInterface {
return this;
}
public BgReading date(Date date) {
this.date = date.getTime();
return this;
}
public BgReading value(double value) {
this.value = value;
return this;

View file

@ -144,7 +144,6 @@ public class CareportalEvent implements DataPointWithLabelInterface, Interval {
return true;
}
}
//log.debug("No found event for time: " + DateUtil.dateAndTimeString(time));
return false;
}

View file

@ -41,6 +41,7 @@ import info.nightscout.androidaps.events.EventReloadTempBasalData;
import info.nightscout.androidaps.events.EventReloadTreatmentData;
import info.nightscout.androidaps.events.EventTempBasalChange;
import info.nightscout.androidaps.events.EventTempTargetChange;
import info.nightscout.androidaps.interfaces.ProfileInterface;
import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventNewHistoryData;
@ -200,7 +201,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
} catch (SQLException e) {
log.error("Unhandled exception", e);
}
VirtualPumpPlugin.setFakingStatus(true);
VirtualPumpPlugin.getPlugin().setFakingStatus(true);
scheduleBgChange(null); // trigger refresh
scheduleTemporaryBasalChange();
scheduleExtendedBolusChange();
@ -236,7 +237,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
} catch (SQLException e) {
log.error("Unhandled exception", e);
}
VirtualPumpPlugin.setFakingStatus(false);
VirtualPumpPlugin.getPlugin().setFakingStatus(false);
scheduleTemporaryBasalChange();
}
@ -968,8 +969,8 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
extendedBolus.insulin = trJson.getDouble("originalExtendedAmount");
extendedBolus._id = trJson.getString("_id");
// if faking found in NS, adapt AAPS to use it too
if (!VirtualPumpPlugin.getFakingStatus()) {
VirtualPumpPlugin.setFakingStatus(true);
if (!VirtualPumpPlugin.getPlugin().getFakingStatus()) {
VirtualPumpPlugin.getPlugin().setFakingStatus(true);
updateEarliestDataChange(0);
scheduleTemporaryBasalChange();
}
@ -983,8 +984,8 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
extendedBolus.insulin = 0;
extendedBolus._id = trJson.getString("_id");
// if faking found in NS, adapt AAPS to use it too
if (!VirtualPumpPlugin.getFakingStatus()) {
VirtualPumpPlugin.setFakingStatus(true);
if (!VirtualPumpPlugin.getPlugin().getFakingStatus()) {
VirtualPumpPlugin.getPlugin().setFakingStatus(true);
updateEarliestDataChange(0);
scheduleTemporaryBasalChange();
}
@ -1446,6 +1447,24 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
return new ArrayList<>();
}
public List<ProfileSwitch> getProfileSwitchEventsFromTime(long mills, boolean ascending) {
try {
Dao<ProfileSwitch, Long> daoProfileSwitch = getDaoProfileSwitch();
List<ProfileSwitch> profileSwitches;
QueryBuilder<ProfileSwitch, Long> queryBuilder = daoProfileSwitch.queryBuilder();
queryBuilder.orderBy("date", ascending);
queryBuilder.limit(100L);
Where where = queryBuilder.where();
where.ge("date", mills);
PreparedQuery<ProfileSwitch> preparedQuery = queryBuilder.prepare();
profileSwitches = daoProfileSwitch.query(preparedQuery);
return profileSwitches;
} catch (SQLException e) {
log.error("Unhandled exception", e);
}
return new ArrayList<>();
}
public boolean createOrUpdate(ProfileSwitch profileSwitch) {
try {
ProfileSwitch old;
@ -1565,23 +1584,30 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
if (trJson.has("profileJson"))
profileSwitch.profileJson = trJson.getString("profileJson");
else {
ProfileStore store = MainApp.getConfigBuilder().getActiveProfileInterface().getProfile();
if (store != null) {
Profile profile = store.getSpecificProfile(profileSwitch.profileName);
if (profile != null) {
profileSwitch.profileJson = profile.getData().toString();
if (L.isEnabled(L.DATABASE))
log.debug("Profile switch prefilled with JSON from local store");
// Update data in NS
NSUpload.updateProfileSwitch(profileSwitch);
ProfileInterface profileInterface = MainApp.getConfigBuilder().getActiveProfileInterface();
if (profileInterface != null) {
ProfileStore store = profileInterface.getProfile();
if (store != null) {
Profile profile = store.getSpecificProfile(profileSwitch.profileName);
if (profile != null) {
profileSwitch.profileJson = profile.getData().toString();
if (L.isEnabled(L.DATABASE))
log.debug("Profile switch prefilled with JSON from local store");
// Update data in NS
NSUpload.updateProfileSwitch(profileSwitch);
} else {
if (L.isEnabled(L.DATABASE))
log.debug("JSON for profile switch doesn't exist. Ignoring: " + trJson.toString());
return;
}
} else {
if (L.isEnabled(L.DATABASE))
log.debug("JSON for profile switch doesn't exist. Ignoring: " + trJson.toString());
log.debug("Store for profile switch doesn't exist. Ignoring: " + trJson.toString());
return;
}
} else {
if (L.isEnabled(L.DATABASE))
log.debug("Store for profile switch doesn't exist. Ignoring: " + trJson.toString());
log.debug("No active profile interface. Ignoring: " + trJson.toString());
return;
}
}

View file

@ -11,6 +11,7 @@ import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.Objects;
import info.nightscout.androidaps.MainApp;
@ -25,6 +26,7 @@ import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
import info.nightscout.androidaps.plugins.ProfileLocal.LocalProfilePlugin;
import info.nightscout.utils.DateUtil;
import info.nightscout.utils.DecimalFormatter;
import info.nightscout.utils.T;
@DatabaseTable(tableName = DatabaseHelper.DATABASE_PROFILESWITCHES)
public class ProfileSwitch implements Interval, DataPointWithLabelInterface {
@ -218,6 +220,26 @@ public class ProfileSwitch implements Interval, DataPointWithLabelInterface {
MainApp.bus().post(new EventNewNotification(notification));
}
public static boolean isEvent5minBack(List<ProfileSwitch> list, long time, boolean zeroDurationOnly) {
for (int i = 0; i < list.size(); i++) {
ProfileSwitch event = list.get(i);
if (event.date <= time && event.date > (time - T.mins(5).msecs())) {
if (zeroDurationOnly) {
if (event.durationInMinutes == 0) {
if (L.isEnabled(L.DATABASE))
log.debug("Found ProfileSwitch event for time: " + DateUtil.dateAndTimeFullString(time) + " " + event.toString());
return true;
}
} else {
if (L.isEnabled(L.DATABASE))
log.debug("Found ProfileSwitch event for time: " + DateUtil.dateAndTimeFullString(time) + " " + event.toString());
return true;
}
}
}
return false;
}
// -------- Interval interface end ---------
// ----------------- DataPointInterface --------------------

View file

@ -221,7 +221,7 @@ public class TemporaryBasal implements Interval {
public IobTotal iobCalc(long time, Profile profile) {
if(isFakeExtended){
if (isFakeExtended) {
log.error("iobCalc should only be called on Extended boluses separately");
return new IobTotal(time);
}
@ -229,7 +229,7 @@ public class TemporaryBasal implements Interval {
IobTotal result = new IobTotal(time);
InsulinInterface insulinInterface = ConfigBuilderPlugin.getActiveInsulin();
int realDuration = getDurationToTime(time);
int realDuration = getDurationToTime(time);
double netBasalAmount = 0d;
if (realDuration > 0) {
@ -292,12 +292,22 @@ public class TemporaryBasal implements Interval {
}
public double tempBasalConvertedToAbsolute(long time, Profile profile) {
if(isFakeExtended){
if (isFakeExtended) {
return profile.getBasal(time) + netExtendedRate;
} else if (isAbsolute) {
return absoluteRate;
} else {
return profile.getBasal(time) * percentRate / 100;
return profile.getBasal(time) * percentRate / 100;
}
}
public int tempBasalConvertedToPercent(long time, Profile profile) {
if (isFakeExtended) {
return (int) ((profile.getBasal(time) + netExtendedRate) / profile.getBasal(time)) * 100;
} else if (isAbsolute) {
return (int) (absoluteRate / profile.getBasal(time)) * 100;
} else {
return percentRate;
}
}
@ -318,12 +328,12 @@ public class TemporaryBasal implements Interval {
}
public String toStringFull() {
if(isFakeExtended){
if (isFakeExtended) {
Profile profile = ProfileFunctions.getInstance().getProfile();
Double currentBasalRate = profile.getBasal();
double rate = (currentBasalRate == null)?0d:(currentBasalRate+netExtendedRate);
return getCalcuatedPercentageIfNeeded() + DecimalFormatter.to2Decimal(rate) + "U/h ("+DecimalFormatter.to2Decimal(netExtendedRate)+"E) @" +
double rate = (currentBasalRate == null) ? 0d : (currentBasalRate + netExtendedRate);
return getCalcuatedPercentageIfNeeded() + DecimalFormatter.to2Decimal(rate) + "U/h (" + DecimalFormatter.to2Decimal(netExtendedRate) + "E) @" +
DateUtil.timeString(date) +
" " + getRealDuration() + "/" + durationInMinutes + "'";
} else if (isAbsolute) {
@ -340,21 +350,21 @@ public class TemporaryBasal implements Interval {
public String toStringShort() {
if (isAbsolute || isFakeExtended) {
double rate = 0d;
double rate = 0d;
if (isFakeExtended) {
Profile profile = ProfileFunctions.getInstance().getProfile();
Double currentBasalRate = profile.getBasal();
rate = (currentBasalRate == null)?0d:(currentBasalRate+netExtendedRate);
} else if (isAbsolute){
rate = (currentBasalRate == null) ? 0d : (currentBasalRate + netExtendedRate);
} else if (isAbsolute) {
rate = absoluteRate;
}
if(SP.getBoolean(R.string.key_danar_visualizeextendedaspercentage, false) && SP.getBoolean(R.string.key_danar_useextended, false)){
if (SP.getBoolean(R.string.key_danar_visualizeextendedaspercentage, false) && SP.getBoolean(R.string.key_danar_useextended, false)) {
Profile profile = ProfileFunctions.getInstance().getProfile();
if(profile != null) {
if (profile != null) {
double basal = profile.getBasal();
if(basal != 0){
return Math.round(rate*100d/basal) + "%";
if (basal != 0) {
return Math.round(rate * 100d / basal) + "%";
}
}
}
@ -364,24 +374,24 @@ public class TemporaryBasal implements Interval {
}
}
private String getCalcuatedPercentageIfNeeded(){
private String getCalcuatedPercentageIfNeeded() {
if (isAbsolute || isFakeExtended) {
double rate = 0d;
double rate = 0d;
if (isFakeExtended) {
Profile profile = ProfileFunctions.getInstance().getProfile();
Double currentBasalRate = profile.getBasal();
rate = (currentBasalRate == null)?0d:(currentBasalRate+netExtendedRate);
} else if (isAbsolute){
rate = (currentBasalRate == null) ? 0d : (currentBasalRate + netExtendedRate);
} else if (isAbsolute) {
rate = absoluteRate;
}
if(SP.getBoolean(R.string.key_danar_visualizeextendedaspercentage, false) && SP.getBoolean(R.string.key_danar_useextended, false)){
if (SP.getBoolean(R.string.key_danar_visualizeextendedaspercentage, false) && SP.getBoolean(R.string.key_danar_useextended, false)) {
Profile profile = ProfileFunctions.getInstance().getProfile();
if(profile != null) {
if (profile != null) {
double basal = profile.getBasal();
if(basal != 0){
return Math.round(rate*100d/basal) + "% ";
if (basal != 0) {
return Math.round(rate * 100d / basal) + "% ";
}
}
}
@ -392,12 +402,12 @@ public class TemporaryBasal implements Interval {
public String toStringVeryShort() {
if (isAbsolute || isFakeExtended) {
double rate = 0d;
double rate = 0d;
if (isFakeExtended) {
Profile profile = ProfileFunctions.getInstance().getProfile();
Double currentBasalRate = profile.getBasal();
rate = (currentBasalRate == null)?0d:(currentBasalRate+netExtendedRate);
} else if (isAbsolute){
rate = (currentBasalRate == null) ? 0d : (currentBasalRate + netExtendedRate);
} else if (isAbsolute) {
rate = absoluteRate;
}
return DecimalFormatter.to2Decimal(rate) + "U/h ";

View file

@ -47,6 +47,15 @@ public class Constraint<T extends Comparable> {
return this;
}
public Constraint<T> setIfDifferent(T value, String reason, Object from) {
if (!this.value.equals(value)) {
this.value = value;
addReason(reason, from);
addMostLimingReason(reason, from);
}
return this;
}
public Constraint<T> setIfSmaller(T value, String reason, Object from) {
if (value.compareTo(this.value) < 0) {
this.value = value;

View file

@ -43,6 +43,10 @@ public interface ConstraintsInterface {
return insulin;
}
default Constraint<Double> applyExtendedBolusConstraints(Constraint<Double> insulin) {
return insulin;
}
default Constraint<Integer> applyCarbsConstraints(Constraint<Integer> carbs) {
return carbs;
}

View file

@ -10,6 +10,7 @@ import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.queue.CommandQueue;
/**
* Created by mike on 09.06.2016.
@ -168,7 +169,9 @@ public abstract class PluginBase {
if (getType() == PluginType.PUMP) {
new Thread(() -> {
SystemClock.sleep(3000);
ConfigBuilderPlugin.getCommandQueue().readStatus("Pump driver changed.", null);
CommandQueue commandQueue = ConfigBuilderPlugin.getCommandQueue();
if (commandQueue != null)
commandQueue.readStatus("Pump driver changed.", null);
}).start();
}
}

View file

@ -1,54 +1,62 @@
package info.nightscout.androidaps.interfaces;
import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpCapability;
import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpTempBasalType;
import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpType;
/**
* Created by mike on 08.12.2016.
*/
public class PumpDescription {
public PumpType pumpType = PumpType.GenericAAPS;
public PumpDescription () {
resetSettings();
}
public static final int NONE = 0;
public static final int PERCENT = 0x01;
public static final int ABSOLUTE = 0x02;
public boolean isBolusCapable = true;
public double bolusStep = 0.1d;
public boolean isBolusCapable;
public double bolusStep;
public boolean isExtendedBolusCapable = true;
public double extendedBolusStep = 0.1d;
public double extendedBolusDurationStep = 30;
public double extendedBolusMaxDuration = 12 * 60;
public boolean isExtendedBolusCapable;
public double extendedBolusStep;
public double extendedBolusDurationStep;
public double extendedBolusMaxDuration;
public boolean isTempBasalCapable = true;
public int tempBasalStyle = PERCENT;
public boolean isTempBasalCapable;
public int tempBasalStyle;
public int maxTempPercent = 200;
public int tempPercentStep = 10;
public int maxTempPercent;
public int tempPercentStep;
public double maxTempAbsolute = 10;
public double tempAbsoluteStep = 0.05d;
public double maxTempAbsolute;
public double tempAbsoluteStep;
public int tempDurationStep = 60;
public boolean tempDurationStep15mAllowed = false;
public boolean tempDurationStep30mAllowed = false;
public int tempMaxDuration = 12 * 60;
public int tempDurationStep;
public boolean tempDurationStep15mAllowed;
public boolean tempDurationStep30mAllowed;
public int tempMaxDuration;
public boolean isSetBasalProfileCapable;
public double basalStep;
public double basalMinimumRate;
public double basalMaximumRate;
public boolean isRefillingCapable;
public boolean storesCarbInfo;
public boolean is30minBasalRatesCapable;
public boolean supportsTDDs;
public boolean needsManualTDDLoad;
public boolean isSetBasalProfileCapable = true;
public double basalStep = 0.01d;
public double basalMinimumRate = 0.04d;
public double basalMaximumRate = 25d;
public boolean isRefillingCapable = false;
public boolean storesCarbInfo = true;
public boolean is30minBasalRatesCapable = false;
public boolean supportsTDDs = false;
public boolean needsManualTDDLoad = true;
public void resetSettings()
{
public void resetSettings() {
isBolusCapable = true;
bolusStep = 0.1d;
@ -71,6 +79,7 @@ public class PumpDescription {
isSetBasalProfileCapable = true;
basalStep = 0.01d;
basalMinimumRate = 0.04d;
basalMaximumRate = 25d;
is30minBasalRatesCapable = false;
isRefillingCapable = false;
@ -78,6 +87,53 @@ public class PumpDescription {
supportsTDDs = false;
needsManualTDDLoad = true;
}
public void setPumpDescription(PumpType pumpType) {
resetSettings();
this.pumpType = pumpType;
PumpCapability pumpCapability = pumpType.getPumpCapability();
isBolusCapable = pumpCapability.hasCapability(PumpCapability.Bolus);
bolusStep = pumpType.getBolusSize();
isExtendedBolusCapable = pumpCapability.hasCapability(PumpCapability.ExtendedBolus);
extendedBolusStep = pumpType.getExtendedBolusSettings().getStep();
extendedBolusDurationStep = pumpType.getExtendedBolusSettings().getDurationStep();
extendedBolusMaxDuration = pumpType.getExtendedBolusSettings().getMaxDuration();
isTempBasalCapable = pumpCapability.hasCapability(PumpCapability.TempBasal);
if (pumpType.getPumpTempBasalType() == PumpTempBasalType.Percent) {
tempBasalStyle = PERCENT;
maxTempPercent = pumpType.getTbrSettings().getMaxDose().intValue();
tempPercentStep = (int) pumpType.getTbrSettings().getStep();
} else {
tempBasalStyle = ABSOLUTE;
maxTempAbsolute = pumpType.getTbrSettings().getMaxDose();
tempAbsoluteStep = pumpType.getTbrSettings().getStep();
}
tempDurationStep = pumpType.getTbrSettings().getDurationStep();
tempMaxDuration = pumpType.getTbrSettings().getMaxDuration();
tempDurationStep15mAllowed = pumpType.getSpecialBasalDurations()
.hasCapability(PumpCapability.BasalRate_Duration15minAllowed);
tempDurationStep30mAllowed = pumpType.getSpecialBasalDurations()
.hasCapability(PumpCapability.BasalRate_Duration30minAllowed);
isSetBasalProfileCapable = pumpCapability.hasCapability(PumpCapability.BasalProfileSet);
basalStep = pumpType.getBaseBasalStep();
basalMinimumRate = pumpType.getBaseBasalMinValue();
isRefillingCapable = pumpCapability.hasCapability(PumpCapability.Refill);
storesCarbInfo = pumpCapability.hasCapability(PumpCapability.StoreCarbInfo);
supportsTDDs = pumpCapability.hasCapability(PumpCapability.TDD);
needsManualTDDLoad = pumpCapability.hasCapability(PumpCapability.ManualTDDLoad);
is30minBasalRatesCapable = pumpCapability.hasCapability(PumpCapability.BasalRate30min);
}
}

View file

@ -91,7 +91,7 @@ public class FillDialog extends DialogFragment implements OnClickListener {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.actions_fill_dialog, null, false);
View view = inflater.inflate(R.layout.actions_fill_dialog, container, false);
view.findViewById(R.id.ok).setOnClickListener(this);
view.findViewById(R.id.cancel).setOnClickListener(this);

View file

@ -44,7 +44,7 @@ public class NewExtendedBolusDialog extends DialogFragment implements View.OnCli
View view = inflater.inflate(R.layout.overview_newextendedbolus_dialog, container, false);
Double maxInsulin = MainApp.getConstraintChecker().getMaxBolusAllowed().value();
Double maxInsulin = MainApp.getConstraintChecker().getMaxExtendedBolusAllowed().value();
editInsulin = (NumberPicker) view.findViewById(R.id.overview_newextendedbolus_insulin);
editInsulin.setParams(0d, 0d, maxInsulin, 0.1d, new DecimalFormat("0.00"), false);
@ -71,10 +71,10 @@ public class NewExtendedBolusDialog extends DialogFragment implements View.OnCli
String confirmMessage = MainApp.gs(R.string.setextendedbolusquestion);
Double insulinAfterConstraint = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(insulin)).value();
Double insulinAfterConstraint = MainApp.getConstraintChecker().applyExtendedBolusConstraints(new Constraint<>(insulin)).value();
confirmMessage += " " + insulinAfterConstraint + " U ";
confirmMessage += MainApp.gs(R.string.duration) + " " + durationInMinutes + "min ?";
if (insulinAfterConstraint - insulin != 0d)
if (Math.abs(insulinAfterConstraint - insulin) > 0.01d)
confirmMessage += "\n" + MainApp.gs(R.string.constraintapllied);
insulin = insulinAfterConstraint;

View file

@ -136,7 +136,7 @@ public class NewTempBasalDialog extends DialogFragment implements View.OnClickLi
absolute = MainApp.getConstraintChecker().applyBasalConstraints(new Constraint<>(basalAbsoluteInput), profile).value();
confirmMessage += "\n" + absolute + " U/h ";
confirmMessage += "\n" + MainApp.gs(R.string.duration) + " " + durationInMinutes + "min ?";
if (absolute - basalAbsoluteInput != 0d)
if (Math.abs(absolute - basalAbsoluteInput) > 0.01d)
confirmMessage += "\n" + MainApp.gs(R.string.constraintapllied);
}

View file

@ -55,7 +55,7 @@ public class ObjectivesFragment extends SubscriberFragment {
enableFake.setOnClickListener(v -> updateGUI());
reset.setOnClickListener(v -> {
ObjectivesPlugin.getPlugin().reset();
ObjectivesPlugin.saveProgress();
ObjectivesPlugin.getPlugin().saveProgress();
recyclerView.getAdapter().notifyDataSetChanged();
scrollToCurrentObjective();
});
@ -77,7 +77,7 @@ public class ObjectivesFragment extends SubscriberFragment {
private void startUpdateTimer() {
handler.removeCallbacks(objectiveUpdater);
for (Objective objective : ObjectivesPlugin.getObjectives()) {
for (Objective objective : ObjectivesPlugin.getPlugin().getObjectives()) {
if (objective.isStarted() && !objective.isAccomplished()) {
long timeTillNextMinute = (System.currentTimeMillis() - objective.getStartedOn().getTime()) % (60 * 1000);
handler.postDelayed(objectiveUpdater, timeTillNextMinute);
@ -87,8 +87,8 @@ public class ObjectivesFragment extends SubscriberFragment {
}
private void scrollToCurrentObjective() {
for (int i = 0; i < ObjectivesPlugin.getObjectives().size(); i++) {
Objective objective = ObjectivesPlugin.getObjectives().get(i);
for (int i = 0; i < ObjectivesPlugin.getPlugin().getObjectives().size(); i++) {
Objective objective = ObjectivesPlugin.getPlugin().getObjectives().get(i);
if (!objective.isStarted() || !objective.isAccomplished()) {
RecyclerView.SmoothScroller smoothScroller = new LinearSmoothScroller(getContext()) {
@Override
@ -118,7 +118,7 @@ public class ObjectivesFragment extends SubscriberFragment {
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Objective objective = ObjectivesPlugin.getObjectives().get(position);
Objective objective = ObjectivesPlugin.getPlugin().getObjectives().get(position);
holder.title.setText(MainApp.gs(R.string.nth_objective, position + 1));
if (objective.getObjective() != 0) {
holder.objective.setVisibility(View.VISIBLE);
@ -132,7 +132,7 @@ public class ObjectivesFragment extends SubscriberFragment {
holder.gate.setTextColor(0xFFFFFFFF);
holder.verify.setVisibility(View.GONE);
holder.progress.setVisibility(View.GONE);
if (position == 0 || ObjectivesPlugin.getObjectives().get(position - 1).isAccomplished())
if (position == 0 || ObjectivesPlugin.getPlugin().getObjectives().get(position - 1).isAccomplished())
holder.start.setVisibility(View.VISIBLE);
else holder.start.setVisibility(View.GONE);
} else if (objective.isAccomplished()) {
@ -173,7 +173,7 @@ public class ObjectivesFragment extends SubscriberFragment {
@Override
public int getItemCount() {
return ObjectivesPlugin.getObjectives().size();
return ObjectivesPlugin.getPlugin().getObjectives().size();
}
public class ViewHolder extends RecyclerView.ViewHolder {

View file

@ -37,10 +37,10 @@ public class ObjectivesPlugin extends PluginBase implements ConstraintsInterface
private static ObjectivesPlugin objectivesPlugin;
public static List<Objective> objectives = new ArrayList<>();
public static boolean bgIsAvailableInNS = false;
public static boolean pumpStatusIsAvailableInNS = false;
public static Integer manualEnacts = 0;
public List<Objective> objectives = new ArrayList<>();
public boolean bgIsAvailableInNS = false;
public boolean pumpStatusIsAvailableInNS = false;
public Integer manualEnacts = 0;
public static ObjectivesPlugin getPlugin() {
if (objectivesPlugin == null) {
@ -91,7 +91,7 @@ public class ObjectivesPlugin extends PluginBase implements ConstraintsInterface
saveProgress();
}
public static void saveProgress() {
public void saveProgress() {
SP.putBoolean("Objectives" + "bgIsAvailableInNS", bgIsAvailableInNS);
SP.putBoolean("Objectives" + "pumpStatusIsAvailableInNS", pumpStatusIsAvailableInNS);
SP.putString("Objectives" + "manualEnacts", Integer.toString(manualEnacts));
@ -112,7 +112,7 @@ public class ObjectivesPlugin extends PluginBase implements ConstraintsInterface
log.debug("Objectives loaded");
}
public static List<Objective> getObjectives() {
public List<Objective> getObjectives() {
return objectives;
}

View file

@ -9,6 +9,7 @@ import java.util.List;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.utils.SP;
import info.nightscout.utils.T;
public abstract class Objective {
@ -128,9 +129,9 @@ public abstract class Objective {
}
private String getDurationText(long duration) {
int days = (int) Math.floor((double) duration / (24D * 60D * 60D * 1000D));
int hours = (int) Math.floor((double) duration / (60D * 60D * 1000D));
int minutes = (int) Math.floor((double) duration / (60D * 1000D));
int days = (int) Math.floor((double) duration / T.days(1).msecs());
int hours = (int) Math.floor((double) duration / T.hours(1).msecs());
int minutes = (int) Math.floor((double) duration / T.mins(1).msecs());
if (days > 0) return MainApp.gq(R.plurals.objective_days, days, days);
else if (hours > 0) return MainApp.gq(R.plurals.objective_hours, hours, hours);
else return MainApp.gq(R.plurals.objective_minutes, minutes, minutes);

View file

@ -27,7 +27,7 @@ public class Objective1 extends Objective {
tasks.add(new Task(R.string.objectives_bgavailableinns) {
@Override
public boolean isCompleted() {
return ObjectivesPlugin.bgIsAvailableInNS;
return ObjectivesPlugin.getPlugin().bgIsAvailableInNS;
}
});
tasks.add(new Task(R.string.nsclienthaswritepermission) {
@ -50,7 +50,7 @@ public class Objective1 extends Objective {
tasks.add(new Task(R.string.objectives_pumpstatusavailableinns) {
@Override
public boolean isCompleted() {
return ObjectivesPlugin.pumpStatusIsAvailableInNS;
return ObjectivesPlugin.getPlugin().pumpStatusIsAvailableInNS;
}
});
tasks.add(new Task(R.string.hasbgdata) {

View file

@ -5,10 +5,11 @@ import java.util.List;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.plugins.ConstraintsObjectives.ObjectivesPlugin;
import info.nightscout.utils.T;
public class Objective2 extends Objective {
public static final int MANUAL_ENACTS_NEEDED = 20;
public final int MANUAL_ENACTS_NEEDED = 20;
public Objective2() {
super(1, R.string.objectives_1_objective, R.string.objectives_1_gate);
@ -16,17 +17,19 @@ public class Objective2 extends Objective {
@Override
protected void setupTasks(List<Task> tasks) {
tasks.add(new MinimumDurationTask(7L * 24L * 60L * 60L * 1000L));
tasks.add(new MinimumDurationTask(T.days(7).msecs()));
tasks.add(new Task(R.string.objectives_manualenacts) {
@Override
public boolean isCompleted() {
return ObjectivesPlugin.manualEnacts >= MANUAL_ENACTS_NEEDED;
return ObjectivesPlugin.getPlugin().manualEnacts >= MANUAL_ENACTS_NEEDED;
}
@Override
public String getProgress() {
if (ObjectivesPlugin.manualEnacts >= MANUAL_ENACTS_NEEDED) return MainApp.gs(R.string.completed_well_done);
else return ObjectivesPlugin.manualEnacts + " / " + MANUAL_ENACTS_NEEDED;
if (ObjectivesPlugin.getPlugin().manualEnacts >= MANUAL_ENACTS_NEEDED)
return MainApp.gs(R.string.completed_well_done);
else
return ObjectivesPlugin.getPlugin().manualEnacts + " / " + MANUAL_ENACTS_NEEDED;
}
});
}

View file

@ -5,6 +5,7 @@ import java.util.List;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.interfaces.Constraint;
import info.nightscout.androidaps.plugins.ConstraintsSafety.SafetyPlugin;
import info.nightscout.utils.T;
public class Objective4 extends Objective {
@ -14,7 +15,7 @@ public class Objective4 extends Objective {
@Override
protected void setupTasks(List<Task> tasks) {
tasks.add(new MinimumDurationTask(5L * 24L * 60L * 60L * 1000L));
tasks.add(new MinimumDurationTask(T.days(5).msecs()));
tasks.add(new Task(R.string.closedmodeenabled) {
@Override
public boolean isCompleted() {

View file

@ -4,6 +4,7 @@ import java.util.List;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.utils.T;
public class Objective5 extends Objective {
@ -13,7 +14,7 @@ public class Objective5 extends Objective {
@Override
protected void setupTasks(List<Task> tasks) {
tasks.add(new MinimumDurationTask(24L * 60L * 60L * 1000L));
tasks.add(new MinimumDurationTask(T.days(1).msecs()));
tasks.add(new Task(R.string.maxiobset) {
@Override
public boolean isCompleted() {

View file

@ -3,6 +3,7 @@ package info.nightscout.androidaps.plugins.ConstraintsObjectives.objectives;
import java.util.List;
import info.nightscout.androidaps.R;
import info.nightscout.utils.T;
public class Objective6 extends Objective {
@ -12,6 +13,6 @@ public class Objective6 extends Objective {
@Override
protected void setupTasks(List<Task> tasks) {
tasks.add(new MinimumDurationTask(7L * 24L * 60L * 60L * 1000L));
tasks.add(new MinimumDurationTask(T.days(7).msecs()));
}
}

View file

@ -3,6 +3,7 @@ package info.nightscout.androidaps.plugins.ConstraintsObjectives.objectives;
import java.util.List;
import info.nightscout.androidaps.R;
import info.nightscout.utils.T;
public class Objective7 extends Objective {
@ -12,6 +13,6 @@ public class Objective7 extends Objective {
@Override
protected void setupTasks(List<Task> tasks) {
tasks.add(new MinimumDurationTask(28L * 24L * 60L * 60L * 1000L));
tasks.add(new MinimumDurationTask(T.days(28).msecs()));
}
}

View file

@ -3,6 +3,7 @@ package info.nightscout.androidaps.plugins.ConstraintsObjectives.objectives;
import java.util.List;
import info.nightscout.androidaps.R;
import info.nightscout.utils.T;
public class Objective8 extends Objective {
@ -12,6 +13,6 @@ public class Objective8 extends Objective {
@Override
protected void setupTasks(List<Task> tasks) {
tasks.add(new MinimumDurationTask(28L * 24L * 60L * 60L * 1000L));
tasks.add(new MinimumDurationTask(T.days(28).msecs()));
}
}

View file

@ -10,6 +10,8 @@ import info.nightscout.androidaps.interfaces.ConstraintsInterface;
import info.nightscout.androidaps.interfaces.PluginBase;
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.OpenAPSAMA.OpenAPSAMAPlugin;
import info.nightscout.androidaps.plugins.OpenAPSMA.OpenAPSMAPlugin;
@ -121,6 +123,18 @@ public class SafetyPlugin extends PluginBase implements ConstraintsInterface {
absoluteRate.setIfSmaller(maxFromDaily, String.format(MainApp.gs(R.string.limitingbasalratio), maxFromDaily, MainApp.gs(R.string.maxdailybasalmultiplier)), this);
absoluteRate.setIfSmaller(HardLimits.maxBasal(), String.format(MainApp.gs(R.string.limitingbasalratio), HardLimits.maxBasal(), MainApp.gs(R.string.hardlimit)), this);
PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
// check for pump max
if (pump != null && pump.getPumpDescription().tempBasalStyle == PumpDescription.ABSOLUTE) {
double pumpLimit = pump.getPumpDescription().pumpType.getTbrSettings().getMaxDose();
absoluteRate.setIfSmaller(pumpLimit, String.format(MainApp.gs(R.string.limitingbasalratio), pumpLimit, MainApp.gs(R.string.pumplimit)), this);
}
// do rounding
if (pump != null && pump.getPumpDescription().tempBasalStyle == PumpDescription.ABSOLUTE) {
absoluteRate.set(Round.roundTo(absoluteRate.value(), pump.getPumpDescription().tempAbsoluteStep));
}
return absoluteRate;
}
@ -136,13 +150,23 @@ public class SafetyPlugin extends PluginBase implements ConstraintsInterface {
applyBasalConstraints(absoluteConstraint, profile);
percentRate.copyReasons(absoluteConstraint);
PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
Integer percentRateAfterConst = Double.valueOf(absoluteConstraint.value() / currentBasal * 100).intValue();
if (percentRateAfterConst < 100)
percentRateAfterConst = Round.ceilTo((double) percentRateAfterConst, 10d).intValue();
else percentRateAfterConst = Round.floorTo((double) percentRateAfterConst, 10d).intValue();
if (pump != null) {
if (percentRateAfterConst < 100)
percentRateAfterConst = Round.ceilTo((double) percentRateAfterConst, (double) pump.getPumpDescription().tempPercentStep).intValue();
else
percentRateAfterConst = Round.floorTo((double) percentRateAfterConst, (double) pump.getPumpDescription().tempPercentStep).intValue();
}
percentRate.set(percentRateAfterConst, String.format(MainApp.gs(R.string.limitingpercentrate), percentRateAfterConst, MainApp.gs(R.string.pumplimit)), this);
if (pump != null && pump.getPumpDescription().tempBasalStyle == PumpDescription.PERCENT) {
double pumpLimit = pump.getPumpDescription().pumpType.getTbrSettings().getMaxDose();
percentRate.setIfSmaller((int) pumpLimit, String.format(MainApp.gs(R.string.limitingbasalratio), pumpLimit, MainApp.gs(R.string.pumplimit)), this);
}
return percentRate;
}
@ -154,6 +178,29 @@ public class SafetyPlugin extends PluginBase implements ConstraintsInterface {
insulin.setIfSmaller(maxBolus, String.format(MainApp.gs(R.string.limitingbolus), maxBolus, MainApp.gs(R.string.maxvalueinpreferences)), this);
insulin.setIfSmaller(HardLimits.maxBolus(), String.format(MainApp.gs(R.string.limitingbolus), HardLimits.maxBolus(), MainApp.gs(R.string.hardlimit)), this);
PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
if (pump != null) {
double rounded = Round.roundTo(insulin.value(), pump.getPumpDescription().pumpType.determineCorrectBolusSize(insulin.value()));
insulin.setIfDifferent(rounded, MainApp.gs(R.string.pumplimit), this);
}
return insulin;
}
@Override
public Constraint<Double> applyExtendedBolusConstraints(Constraint<Double> insulin) {
insulin.setIfGreater(0d, String.format(MainApp.gs(R.string.limitingextendedbolus), 0d, MainApp.gs(R.string.itmustbepositivevalue)), this);
Double maxBolus = SP.getDouble(R.string.key_treatmentssafety_maxbolus, 3d);
insulin.setIfSmaller(maxBolus, String.format(MainApp.gs(R.string.limitingextendedbolus), maxBolus, MainApp.gs(R.string.maxvalueinpreferences)), this);
insulin.setIfSmaller(HardLimits.maxBolus(), String.format(MainApp.gs(R.string.limitingextendedbolus), HardLimits.maxBolus(), MainApp.gs(R.string.hardlimit)), this);
PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
if (pump != null) {
double rounded = Round.roundTo(insulin.value(), pump.getPumpDescription().pumpType.determineCorrectExtendedBolusSize(insulin.value()));
insulin.setIfDifferent(rounded, MainApp.gs(R.string.pumplimit), this);
}
return insulin;
}

View file

@ -146,7 +146,7 @@ public class IobCobCalculatorPlugin extends PluginBase {
return false;
}
}
double averageDiff = totalDiff / (bgReadings.size() -1) / 1000d;
double averageDiff = totalDiff / (bgReadings.size() - 1) / 1000d;
boolean is5mindata = averageDiff < 10;
if (L.isEnabled(L.AUTOSENS))
log.debug("Interval detection: values: " + bgReadings.size() + " averageDiff: " + averageDiff + "[s] is5minData: " + is5mindata);
@ -168,7 +168,7 @@ public class IobCobCalculatorPlugin extends PluginBase {
for (int i = 1; i < bgReadings.size(); ++i) {
if (bgReadings.get(i).date == time) return bgReadings.get(i);
if (bgReadings.get(i).date > time) continue;
lastFound = bgReadings.get(i-1);
lastFound = bgReadings.get(i - 1);
if (bgReadings.get(i).date < time) break;
}
return lastFound;
@ -258,7 +258,8 @@ public class IobCobCalculatorPlugin extends PluginBase {
newBgreading.value = Math.round(nextbg);
//console.error("Interpolated", bucketed_data[j]);
bucketed_data.add(newBgreading);
//log.error("******************************************************************************************************* Adding:" + new Date(newBgreading.date).toString() + " " + newBgreading.value);
if (L.isEnabled(L.AUTOSENS))
log.debug("Adding. bgTime: " + DateUtil.toISOString(bgTime) + " lastbgTime: " + DateUtil.toISOString(lastbgTime) + " " + newBgreading.toString());
elapsed_minutes = elapsed_minutes - 5;
lastbg = nextbg;
@ -269,14 +270,16 @@ public class IobCobCalculatorPlugin extends PluginBase {
newBgreading.value = bgReadings.get(i).value;
newBgreading.date = bgTime;
bucketed_data.add(newBgreading);
//log.error("******************************************************************************************************* Copying:" + new Date(newBgreading.date).toString() + " " + newBgreading.value);
if (L.isEnabled(L.AUTOSENS))
log.debug("Adding. bgTime: " + DateUtil.toISOString(bgTime) + " lastbgTime: " + DateUtil.toISOString(lastbgTime) + " " + newBgreading.toString());
} else if (Math.abs(elapsed_minutes) > 2) {
j++;
BgReading newBgreading = new BgReading();
newBgreading.value = bgReadings.get(i).value;
newBgreading.date = bgTime;
bucketed_data.add(newBgreading);
//log.error("******************************************************************************************************* Copying:" + new Date(newBgreading.date).toString() + " " + newBgreading.value);
if (L.isEnabled(L.AUTOSENS))
log.debug("Adding. bgTime: " + DateUtil.toISOString(bgTime) + " lastbgTime: " + DateUtil.toISOString(lastbgTime) + " " + newBgreading.toString());
} else {
bucketed_data.get(j).value = (bucketed_data.get(j).value + bgReadings.get(i).value) / 2;
//log.error("***** Average");
@ -289,7 +292,8 @@ public class IobCobCalculatorPlugin extends PluginBase {
BgReading previous = bucketed_data.get(i + 1);
long msecDiff = current.date - previous.date;
long adjusted = (msecDiff - T.mins(5).msecs()) / 1000;
log.debug("Adjusting bucketed data time. Current: " + DateUtil.toISOString(current.date) + " to: " + DateUtil.toISOString(previous.date + T.mins(5).msecs()) + " by " + adjusted + " sec");
if (L.isEnabled(L.AUTOSENS))
log.debug("Adjusting bucketed data time. Current: " + DateUtil.toISOString(current.date) + " to: " + DateUtil.toISOString(previous.date + T.mins(5).msecs()) + " by " + adjusted + " sec");
current.date = previous.date + T.mins(5).msecs();
}

View file

@ -15,12 +15,18 @@ import java.util.List;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.IobTotal;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.db.BgReading;
import info.nightscout.androidaps.db.TemporaryBasal;
import info.nightscout.androidaps.interfaces.Constraint;
import info.nightscout.androidaps.interfaces.PumpDescription;
import info.nightscout.androidaps.interfaces.PumpInterface;
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.Treatments.TreatmentsPlugin;
import info.nightscout.utils.DecimalFormatter;
import info.nightscout.utils.SP;
/**
* Created by mike on 09.06.2016.
@ -31,6 +37,8 @@ public class APSResult {
public long date = 0;
public String reason;
public double rate;
public int percent;
public boolean usePercent = false;
public int duration;
public boolean tempBasalRequested = false;
public boolean bolusRequested = false;
@ -43,8 +51,39 @@ public class APSResult {
public Constraint<Double> inputConstraints;
public Constraint<Double> rateConstraint;
public Constraint<Integer> percentConstraint;
public Constraint<Double> smbConstraint;
public APSResult rate(double rate) {
this.rate = rate;
return this;
}
public APSResult duration(int duration) {
this.duration = duration;
return this;
}
public APSResult percent(int percent) {
this.percent = percent;
return this;
}
public APSResult tempBasalRequested(boolean tempBasalRequested) {
this.tempBasalRequested = tempBasalRequested;
return this;
}
public APSResult usePercent(boolean usePercent) {
this.usePercent = usePercent;
return this;
}
public APSResult json(JSONObject json) {
this.json = json;
return this;
}
@Override
public String toString() {
final PumpInterface pump = ConfigBuilderPlugin.getActivePump();
@ -55,6 +94,10 @@ public class APSResult {
ret = MainApp.gs(R.string.canceltemp) + "\n";
else if (rate == -1)
ret = MainApp.gs(R.string.let_temp_basal_run) + "\n";
else if (usePercent)
ret = MainApp.gs(R.string.rate) + ": " + DecimalFormatter.to2Decimal(percent) + "% " +
"(" + DecimalFormatter.to2Decimal(percent * pump.getBaseBasalRate() / 100d) + " U/h)\n" +
MainApp.gs(R.string.duration) + ": " + DecimalFormatter.to2Decimal(duration) + " min\n";
else
ret = MainApp.gs(R.string.rate) + ": " + DecimalFormatter.to2Decimal(rate) + " U/h " +
"(" + DecimalFormatter.to2Decimal(rate / pump.getBaseBasalRate() * 100) + "%) \n" +
@ -80,6 +123,10 @@ public class APSResult {
ret = MainApp.gs(R.string.canceltemp) + "<br>";
else if (rate == -1)
ret = MainApp.gs(R.string.let_temp_basal_run) + "<br>";
else if (usePercent)
ret = "<b>" + MainApp.gs(R.string.rate) + "</b>: " + DecimalFormatter.to2Decimal(percent) + "% " +
"(" + DecimalFormatter.to2Decimal(percent * pump.getBaseBasalRate() / 100d) + " U/h)<br>" +
"<b>" + MainApp.gs(R.string.duration) + "</b>: " + DecimalFormatter.to2Decimal(duration) + " min<br>";
else
ret = "<b>" + MainApp.gs(R.string.rate) + "</b>: " + DecimalFormatter.to2Decimal(rate) + " U/h " +
"(" + DecimalFormatter.to2Decimal(rate / pump.getBaseBasalRate() * 100) + "%) <br>" +
@ -101,21 +148,33 @@ public class APSResult {
public APSResult clone() {
APSResult newResult = new APSResult();
newResult.reason = reason;
doClone(newResult);
return newResult;
}
protected void doClone(APSResult newResult) {
newResult.date = date;
newResult.reason = reason != null ? new String(reason) : null;
newResult.rate = rate;
newResult.duration = duration;
newResult.tempBasalRequested = tempBasalRequested;
newResult.bolusRequested = bolusRequested;
newResult.iob = iob;
newResult.json = json;
try {
newResult.json = new JSONObject(json.toString());
} catch (JSONException e) {
log.error("Unhandled exception", e);
}
newResult.hasPredictions = hasPredictions;
newResult.smb = smb;
newResult.deliverAt = deliverAt;
newResult.rateConstraint = rateConstraint;
newResult.smbConstraint = smbConstraint;
return newResult;
newResult.percent = percent;
newResult.usePercent = usePercent;
}
public JSONObject json() {
JSONObject json = new JSONObject();
try {
@ -228,6 +287,112 @@ public class APSResult {
}
public boolean isChangeRequested() {
return tempBasalRequested || bolusRequested;
Constraint<Boolean> closedLoopEnabled = MainApp.getConstraintChecker().isClosedLoopAllowed();
// closed loop mode: handle change at driver level
if (closedLoopEnabled.value()) {
if (L.isEnabled(L.APS))
log.debug("DEFAULT: Closed mode");
return tempBasalRequested || bolusRequested;
}
// open loop mode: try to limit request
if (!tempBasalRequested && !bolusRequested) {
if (L.isEnabled(L.APS))
log.debug("FALSE: No request");
return false;
}
long now = System.currentTimeMillis();
TemporaryBasal activeTemp = TreatmentsPlugin.getPlugin().getTempBasalFromHistory(now);
PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
Profile profile = ProfileFunctions.getInstance().getProfile();
if (usePercent) {
if (activeTemp == null && percent == 100) {
if (L.isEnabled(L.APS))
log.debug("FALSE: No temp running, asking cancel temp");
return false;
}
if (activeTemp != null && Math.abs(percent - activeTemp.tempBasalConvertedToPercent(now, profile)) < pump.getPumpDescription().basalStep) {
if (L.isEnabled(L.APS))
log.debug("FALSE: Temp equal");
return false;
}
// always report zerotemp
if (percent == 0) {
if (L.isEnabled(L.APS))
log.debug("TRUE: Zero temp");
return true;
}
// always report hightemp
if (pump != null && pump.getPumpDescription().tempBasalStyle == PumpDescription.PERCENT) {
double pumpLimit = pump.getPumpDescription().pumpType.getTbrSettings().getMaxDose();
if (percent == pumpLimit) {
if (L.isEnabled(L.APS))
log.debug("TRUE: Pump limit");
return true;
}
}
// report change bigger than 30%
if (activeTemp != null) {
double percentToBeSmallChange = 30;
percentToBeSmallChange /= 100;
double change = percent / (double) activeTemp.tempBasalConvertedToPercent(now, profile);
double lowThreshold = 1 - percentToBeSmallChange;
double highThreshold = 1 + percentToBeSmallChange;
if (change < lowThreshold || change > highThreshold) {
if (L.isEnabled(L.APS))
log.debug("TRUE: Outside allowed range " + (change * 100) + "%");
return true;
}
}
if (L.isEnabled(L.APS))
log.debug("FALSE");
return false;
} else {
if (activeTemp == null && rate == pump.getBaseBasalRate()) {
if (L.isEnabled(L.APS))
log.debug("FALSE: No temp running, asking cancel temp");
return false;
}
if (activeTemp != null && Math.abs(rate - activeTemp.tempBasalConvertedToAbsolute(now, profile)) < pump.getPumpDescription().basalStep) {
if (L.isEnabled(L.APS))
log.debug("FALSE: Temp equal");
return false;
}
// always report zerotemp
if (rate == 0) {
if (L.isEnabled(L.APS))
log.debug("TRUE: Zero temp");
return true;
}
// always report hightemp
if (pump != null && pump.getPumpDescription().tempBasalStyle == PumpDescription.ABSOLUTE) {
double pumpLimit = pump.getPumpDescription().pumpType.getTbrSettings().getMaxDose();
if (rate == pumpLimit) {
if (L.isEnabled(L.APS))
log.debug("TRUE: Pump limit");
return true;
}
}
// report change bigger than 30%
if (activeTemp != null) {
double percentMinChangeChange = SP.getDouble(R.string.key_loop_openmode_min_change, 30d);
percentMinChangeChange /= 100;
double change = rate / activeTemp.tempBasalConvertedToAbsolute(now, profile);
double lowThreshold = 1 - percentMinChangeChange;
double highThreshold = 1 + percentMinChangeChange;
if (change < lowThreshold || change > highThreshold) {
if (L.isEnabled(L.APS))
log.debug("TRUE: Outside allowed range " + (change * 100) + "%");
return true;
}
}
if (L.isEnabled(L.APS))
log.debug("FALSE");
return false;
}
}
}

View file

@ -33,13 +33,13 @@ import info.nightscout.androidaps.db.CareportalEvent;
import info.nightscout.androidaps.db.DatabaseHelper;
import info.nightscout.androidaps.db.Source;
import info.nightscout.androidaps.db.TemporaryBasal;
import info.nightscout.androidaps.events.Event;
import info.nightscout.androidaps.events.EventNewBG;
import info.nightscout.androidaps.interfaces.APSInterface;
import info.nightscout.androidaps.interfaces.Constraint;
import info.nightscout.androidaps.interfaces.PluginBase;
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.interfaces.TreatmentsInterface;
import info.nightscout.androidaps.logging.L;
@ -51,6 +51,7 @@ import info.nightscout.androidaps.plugins.Loop.events.EventLoopSetLastRunGui;
import info.nightscout.androidaps.plugins.Loop.events.EventLoopUpdateGui;
import info.nightscout.androidaps.plugins.Loop.events.EventNewOpenLoopNotification;
import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.androidaps.plugins.PumpVirtual.VirtualPumpPlugin;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.androidaps.plugins.Wear.ActionStringHandler;
import info.nightscout.androidaps.events.EventAcceptOpenLoopChange;
@ -58,6 +59,7 @@ import info.nightscout.androidaps.queue.Callback;
import info.nightscout.androidaps.queue.commands.Command;
import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.SP;
import info.nightscout.utils.T;
import info.nightscout.utils.ToastUtils;
/**
@ -103,7 +105,7 @@ public class LoopPlugin extends PluginBase {
.fragmentClass(LoopFragment.class.getName())
.pluginName(R.string.loop)
.shortName(R.string.loop_shortname)
.preferencesId(R.xml.pref_closedmode)
.preferencesId(R.xml.pref_loop)
.description(R.string.description_loop)
);
loopSuspendedTill = SP.getLong("loopSuspendedTill", 0L);
@ -148,8 +150,6 @@ public class LoopPlugin extends PluginBase {
* sources and currently only a new BG should trigger a loop run. Hence we return early if
* the event causing the calculation is not EventNewBg.
* <p>
* Callers of {@link info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin#runCalculation(String, long, boolean, Event)}
* are sources triggering a calculation which triggers this method upon completion.
*/
@Subscribe
public void onStatusEvent(final EventAutosensCalculationFinished ev) {
@ -305,16 +305,26 @@ public class LoopPlugin extends PluginBase {
return;
}
// Prepare for pumps using % basals
if (pump.getPumpDescription().tempBasalStyle == PumpDescription.PERCENT) {
result.usePercent = true;
}
result.percent = (int) (result.rate / profile.getBasal() * 100);
// check rate for constrais
final APSResult resultAfterConstraints = result.clone();
resultAfterConstraints.rateConstraint = new Constraint<>(resultAfterConstraints.rate);
resultAfterConstraints.rate = MainApp.getConstraintChecker().applyBasalConstraints(resultAfterConstraints.rateConstraint, profile).value();
resultAfterConstraints.percentConstraint = new Constraint<>(resultAfterConstraints.percent);
resultAfterConstraints.percent = MainApp.getConstraintChecker().applyBasalPercentConstraints(resultAfterConstraints.percentConstraint, profile).value();
resultAfterConstraints.smbConstraint = new Constraint<>(resultAfterConstraints.smb);
resultAfterConstraints.smb = MainApp.getConstraintChecker().applyBolusConstraints(resultAfterConstraints.smbConstraint).value();
// safety check for multiple SMBs
long lastBolusTime = TreatmentsPlugin.getPlugin().getLastBolusTime();
if (lastBolusTime != 0 && lastBolusTime + 3 * 60 * 1000 > System.currentTimeMillis()) {
if (lastBolusTime != 0 && lastBolusTime + T.mins(3).msecs() > System.currentTimeMillis()) {
if (L.isEnabled(L.APS))
log.debug("SMB requsted but still in 3 min interval");
resultAfterConstraints.smb = 0;
@ -347,7 +357,7 @@ public class LoopPlugin extends PluginBase {
Constraint<Boolean> closedLoopEnabled = MainApp.getConstraintChecker().isClosedLoopAllowed();
if (closedLoopEnabled.value()) {
if (result.isChangeRequested()
if (resultAfterConstraints.isChangeRequested()
&& !ConfigBuilderPlugin.getCommandQueue().bolusInQueue()
&& !ConfigBuilderPlugin.getCommandQueue().isRunning(Command.CommandType.BOLUS)) {
final PumpEnactResult waiting = new PumpEnactResult();
@ -390,7 +400,7 @@ public class LoopPlugin extends PluginBase {
lastRun.smbSetByPump = null;
}
} else {
if (result.isChangeRequested() && allowNotification) {
if (resultAfterConstraints.isChangeRequested() && allowNotification) {
NotificationCompat.Builder builder =
new NotificationCompat.Builder(MainApp.instance().getApplicationContext(), CHANNEL_ID);
builder.setSmallIcon(R.drawable.notif_icon)
@ -454,8 +464,8 @@ public class LoopPlugin extends PluginBase {
NSUpload.uploadDeviceStatus();
ObjectivesPlugin objectivesPlugin = MainApp.getSpecificPlugin(ObjectivesPlugin.class);
if (objectivesPlugin != null) {
ObjectivesPlugin.manualEnacts++;
ObjectivesPlugin.saveProgress();
ObjectivesPlugin.getPlugin().manualEnacts++;
ObjectivesPlugin.getPlugin().saveProgress();
}
}
MainApp.bus().post(new EventAcceptOpenLoopChange());
@ -466,8 +476,12 @@ public class LoopPlugin extends PluginBase {
/**
* expect absolute request and allow both absolute and percent response based on pump capabilities
* TODO: update pump drivers to support APS request in %
*/
public void applyTBRRequest(APSResult request, Profile profile, Callback callback) {
boolean allowPercentage = VirtualPumpPlugin.getPlugin().isEnabled(PluginType.PUMP);
if (!request.tempBasalRequested) {
if (callback != null) {
callback.result(new PumpEnactResult().enacted(false).success(true).comment(MainApp.gs(R.string.nochangerequested))).run();
@ -478,9 +492,6 @@ public class LoopPlugin extends PluginBase {
PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
TreatmentsInterface activeTreatments = TreatmentsPlugin.getPlugin();
request.rateConstraint = new Constraint<>(request.rate);
request.rate = MainApp.getConstraintChecker().applyBasalConstraints(request.rateConstraint, profile).value();
if (!pump.isInitialized()) {
if (L.isEnabled(L.APS))
log.debug("applyAPSRequest: " + MainApp.gs(R.string.pumpNotInitialized));
@ -504,34 +515,66 @@ public class LoopPlugin extends PluginBase {
long now = System.currentTimeMillis();
TemporaryBasal activeTemp = activeTreatments.getTempBasalFromHistory(now);
if ((request.rate == 0 && request.duration == 0) || Math.abs(request.rate - pump.getBaseBasalRate()) < pump.getPumpDescription().basalStep) {
if (activeTemp != null) {
if (request.usePercent && allowPercentage) {
if (request.percent == 100 && request.duration == 0) {
if (activeTemp != null) {
if (L.isEnabled(L.APS))
log.debug("applyAPSRequest: cancelTempBasal()");
MainApp.getConfigBuilder().getCommandQueue().cancelTempBasal(false, callback);
} else {
if (L.isEnabled(L.APS))
log.debug("applyAPSRequest: Basal set correctly");
if (callback != null) {
callback.result(new PumpEnactResult().percent(request.percent).duration(0)
.enacted(false).success(true).comment(MainApp.gs(R.string.basal_set_correctly))).run();
}
}
} else if (activeTemp != null
&& activeTemp.getPlannedRemainingMinutes() > 5
&& request.duration - activeTemp.getPlannedRemainingMinutes() < 30
&& request.percent == activeTemp.percentRate) {
if (L.isEnabled(L.APS))
log.debug("applyAPSRequest: cancelTempBasal()");
MainApp.getConfigBuilder().getCommandQueue().cancelTempBasal(false, callback);
log.debug("applyAPSRequest: Temp basal set correctly");
if (callback != null) {
callback.result(new PumpEnactResult().percent(request.percent)
.enacted(false).success(true).duration(activeTemp.getPlannedRemainingMinutes())
.comment(MainApp.gs(R.string.let_temp_basal_run))).run();
}
} else {
if (L.isEnabled(L.APS))
log.debug("applyAPSRequest: Basal set correctly");
if (callback != null) {
callback.result(new PumpEnactResult().absolute(request.rate).duration(0)
.enacted(false).success(true).comment(MainApp.gs(R.string.basal_set_correctly))).run();
}
}
} else if (activeTemp != null
&& activeTemp.getPlannedRemainingMinutes() > 5
&& request.duration - activeTemp.getPlannedRemainingMinutes() < 30
&& Math.abs(request.rate - activeTemp.tempBasalConvertedToAbsolute(now, profile)) < pump.getPumpDescription().basalStep) {
if (L.isEnabled(L.APS))
log.debug("applyAPSRequest: Temp basal set correctly");
if (callback != null) {
callback.result(new PumpEnactResult().absolute(activeTemp.tempBasalConvertedToAbsolute(now, profile))
.enacted(false).success(true).duration(activeTemp.getPlannedRemainingMinutes())
.comment(MainApp.gs(R.string.let_temp_basal_run))).run();
log.debug("applyAPSRequest: tempBasalPercent()");
MainApp.getConfigBuilder().getCommandQueue().tempBasalPercent(request.percent, request.duration, false, profile, callback);
}
} else {
if (L.isEnabled(L.APS))
log.debug("applyAPSRequest: setTempBasalAbsolute()");
MainApp.getConfigBuilder().getCommandQueue().tempBasalAbsolute(request.rate, request.duration, false, profile, callback);
if ((request.rate == 0 && request.duration == 0) || Math.abs(request.rate - pump.getBaseBasalRate()) < pump.getPumpDescription().basalStep) {
if (activeTemp != null) {
if (L.isEnabled(L.APS))
log.debug("applyAPSRequest: cancelTempBasal()");
MainApp.getConfigBuilder().getCommandQueue().cancelTempBasal(false, callback);
} else {
if (L.isEnabled(L.APS))
log.debug("applyAPSRequest: Basal set correctly");
if (callback != null) {
callback.result(new PumpEnactResult().absolute(request.rate).duration(0)
.enacted(false).success(true).comment(MainApp.gs(R.string.basal_set_correctly))).run();
}
}
} else if (activeTemp != null
&& activeTemp.getPlannedRemainingMinutes() > 5
&& request.duration - activeTemp.getPlannedRemainingMinutes() < 30
&& Math.abs(request.rate - activeTemp.tempBasalConvertedToAbsolute(now, profile)) < pump.getPumpDescription().basalStep) {
if (L.isEnabled(L.APS))
log.debug("applyAPSRequest: Temp basal set correctly");
if (callback != null) {
callback.result(new PumpEnactResult().absolute(activeTemp.tempBasalConvertedToAbsolute(now, profile))
.enacted(false).success(true).duration(activeTemp.getPlannedRemainingMinutes())
.comment(MainApp.gs(R.string.let_temp_basal_run))).run();
}
} else {
if (L.isEnabled(L.APS))
log.debug("applyAPSRequest: setTempBasalAbsolute()");
MainApp.getConfigBuilder().getCommandQueue().tempBasalAbsolute(request.rate, request.duration, false, profile, callback);
}
}
}

View file

@ -21,10 +21,13 @@ import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import info.nightscout.androidaps.BuildConfig;
import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSSettingsStatus;
import info.nightscout.utils.SP;
public class MaintenancePlugin extends PluginBase {
@ -203,6 +206,23 @@ public class MaintenancePlugin extends PluginBase {
out.close();
}
public static Intent sendMail(Uri attachementUri, String recipient, String subject) {
StringBuilder builder =new StringBuilder();
builder.append(MainApp.gs(R.string.app_name) + " " + BuildConfig.VERSION + System.lineSeparator());
if (Config.NSCLIENT)
builder.append("NSCLIENT" + System.lineSeparator());
builder.append("Build: " + BuildConfig.BUILDVERSION + System.lineSeparator());
builder.append("Flavor: " + BuildConfig.FLAVOR + BuildConfig.BUILD_TYPE + System.lineSeparator());
builder.append(MainApp.gs(R.string.configbuilder_nightscoutversion_label) + " " + NSSettingsStatus.getInstance().nightscoutVersionName + System.lineSeparator());
if (MainApp.engineeringMode)
builder.append(MainApp.gs(R.string.engineering_mode_enabled));
return sendMail(attachementUri, recipient, subject, builder.toString());
}
/**
* send a mail with the given file to the recipients with the given subject.
*
@ -213,16 +233,18 @@ public class MaintenancePlugin extends PluginBase {
* @param attachementUri
* @param recipient
* @param subject
* @param body
*
* @return
*/
public static Intent sendMail(Uri attachementUri, String recipient, String subject) {
public static Intent sendMail(Uri attachementUri, String recipient, String subject, String body) {
LOG.debug("sending email to {} with subject {}", recipient, subject);
Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.setType("text/plain");
emailIntent.putExtra(Intent.EXTRA_EMAIL , new String[]{recipient});
emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
emailIntent.putExtra(Intent.EXTRA_TEXT, "");
emailIntent.putExtra(Intent.EXTRA_TEXT, body);
LOG.debug("put path {}", attachementUri.toString());
emailIntent.putExtra(Intent.EXTRA_STREAM, attachementUri);

View file

@ -108,8 +108,8 @@ public class NSDeviceStatus {
setData(devicestatusJson);
if (devicestatusJson.has("pump")) {
// Objectives 0
ObjectivesPlugin.pumpStatusIsAvailableInNS = true;
ObjectivesPlugin.saveProgress();
ObjectivesPlugin.getPlugin().pumpStatusIsAvailableInNS = true;
ObjectivesPlugin.getPlugin().saveProgress();
}
}
if (bundle.containsKey("devicestatuses")) {
@ -120,8 +120,8 @@ public class NSDeviceStatus {
setData(devicestatusJson);
if (devicestatusJson.has("pump")) {
// Objectives 0
ObjectivesPlugin.pumpStatusIsAvailableInNS = true;
ObjectivesPlugin.saveProgress();
ObjectivesPlugin.getPlugin().pumpStatusIsAvailableInNS = true;
ObjectivesPlugin.getPlugin().saveProgress();
}
}
}

View file

@ -324,7 +324,8 @@ public class NSClientService extends Service {
return;
}
MainApp.bus().post(new EventNSClientNewLog("AUTH", "requesting auth"));
mSocket.emit("authorize", authMessage, ack);
if (mSocket != null)
mSocket.emit("authorize", authMessage, ack);
}
@Subscribe

View file

@ -55,21 +55,10 @@ public class DetermineBasalResultAMA extends APSResult {
@Override
public DetermineBasalResultAMA clone() {
DetermineBasalResultAMA newResult = new DetermineBasalResultAMA();
newResult.reason = reason;
newResult.rate = rate;
newResult.duration = duration;
newResult.tempBasalRequested = tempBasalRequested;
newResult.rate = rate;
newResult.duration = duration;
doClone(newResult);
try {
newResult.json = new JSONObject(json.toString());
} catch (JSONException e) {
log.error("Unhandled exception", e);
}
newResult.eventualBG = eventualBG;
newResult.snoozeBG = snoozeBG;
newResult.date = date;
return newResult;
}

View file

@ -203,17 +203,6 @@ public class OpenAPSAMAPlugin extends PluginBase implements APSInterface {
// Fix bug determine basal
if (determineBasalResultAMA.rate == 0d && determineBasalResultAMA.duration == 0 && !TreatmentsPlugin.getPlugin().isTempBasalInProgress())
determineBasalResultAMA.tempBasalRequested = false;
// limit requests on openloop mode
if (!MainApp.getConstraintChecker().isClosedLoopAllowed().value()) {
long now = System.currentTimeMillis();
TemporaryBasal activeTemp = TreatmentsPlugin.getPlugin().getTempBasalFromHistory(now);
if (activeTemp != null && determineBasalResultAMA.rate == 0 && determineBasalResultAMA.duration == 0) {
// going to cancel
} else if (activeTemp != null && Math.abs(determineBasalResultAMA.rate - activeTemp.tempBasalConvertedToAbsolute(now, profile)) < 0.1) {
determineBasalResultAMA.tempBasalRequested = false;
} else if (activeTemp == null && Math.abs(determineBasalResultAMA.rate - ConfigBuilderPlugin.getActivePump().getBaseBasalRate()) < 0.1)
determineBasalResultAMA.tempBasalRequested = false;
}
determineBasalResultAMA.iob = iobArray[0];

View file

@ -12,7 +12,6 @@ import info.nightscout.androidaps.plugins.Loop.APSResult;
public class DetermineBasalResultMA extends APSResult {
private static Logger log = LoggerFactory.getLogger(L.APS);
public JSONObject json = new JSONObject();
private double eventualBG;
private double snoozeBG;
private String mealAssist;
@ -56,19 +55,8 @@ public class DetermineBasalResultMA extends APSResult {
@Override
public DetermineBasalResultMA clone() {
DetermineBasalResultMA newResult = new DetermineBasalResultMA();
newResult.reason = new String(reason);
newResult.rate = rate;
newResult.duration = duration;
newResult.tempBasalRequested = isChangeRequested();
newResult.rate = rate;
newResult.duration = duration;
newResult.tempBasalRequested = isChangeRequested();
doClone(newResult);
try {
newResult.json = new JSONObject(json.toString());
} catch (JSONException e) {
log.error("Unhandled exception", e);
}
newResult.eventualBG = eventualBG;
newResult.snoozeBG = snoozeBG;
newResult.mealAssist = mealAssist;

View file

@ -182,16 +182,6 @@ public class OpenAPSMAPlugin extends PluginBase implements APSInterface {
// Fix bug determinef basal
if (determineBasalResultMA.rate == 0d && determineBasalResultMA.duration == 0 && !TreatmentsPlugin.getPlugin().isTempBasalInProgress())
determineBasalResultMA.tempBasalRequested = false;
// limit requests on openloop mode
if (!MainApp.getConstraintChecker().isClosedLoopAllowed().value()) {
TemporaryBasal activeTemp = TreatmentsPlugin.getPlugin().getTempBasalFromHistory(now);
if (activeTemp != null && determineBasalResultMA.rate == 0 && determineBasalResultMA.duration == 0) {
// going to cancel
} else if (activeTemp != null && Math.abs(determineBasalResultMA.rate - activeTemp.tempBasalConvertedToAbsolute(now, profile)) < 0.1) {
determineBasalResultMA.tempBasalRequested = false;
} else if (activeTemp == null && Math.abs(determineBasalResultMA.rate - ConfigBuilderPlugin.getActivePump().getBaseBasalRate()) < 0.1)
determineBasalResultMA.tempBasalRequested = false;
}
determineBasalResultMA.iob = iobTotal;

View file

@ -14,8 +14,6 @@ public class DetermineBasalResultSMB extends APSResult {
private double eventualBG;
private double snoozeBG;
//public double insulinReq;
//public double carbsReq;
DetermineBasalResultSMB(JSONObject result) {
this();
@ -70,24 +68,10 @@ public class DetermineBasalResultSMB extends APSResult {
@Override
public DetermineBasalResultSMB clone() {
DetermineBasalResultSMB newResult = new DetermineBasalResultSMB();
newResult.reason = reason;
newResult.rate = rate;
newResult.duration = duration;
newResult.tempBasalRequested = tempBasalRequested;
newResult.bolusRequested = bolusRequested;
newResult.rate = rate;
newResult.duration = duration;
newResult.smb = smb;
newResult.deliverAt = deliverAt;
doClone(newResult);
try {
newResult.json = new JSONObject(json.toString());
} catch (JSONException e) {
log.error("Error clone parsing determine-basal result", e);
}
newResult.eventualBG = eventualBG;
newResult.snoozeBG = snoozeBG;
newResult.date = date;
return newResult;
}

View file

@ -225,16 +225,6 @@ public class OpenAPSSMBPlugin extends PluginBase implements APSInterface {
// Fix bug determine basal
if (determineBasalResultSMB.rate == 0d && determineBasalResultSMB.duration == 0 && !TreatmentsPlugin.getPlugin().isTempBasalInProgress())
determineBasalResultSMB.tempBasalRequested = false;
// limit requests on openloop mode
if (!MainApp.getConstraintChecker().isClosedLoopAllowed().value()) {
TemporaryBasal activeTemp = TreatmentsPlugin.getPlugin().getTempBasalFromHistory(now);
if (activeTemp != null && determineBasalResultSMB.rate == 0 && determineBasalResultSMB.duration == 0) {
// going to cancel
} else if (activeTemp != null && Math.abs(determineBasalResultSMB.rate - activeTemp.tempBasalConvertedToAbsolute(now, profile)) < 0.1) {
determineBasalResultSMB.tempBasalRequested = false;
} else if (activeTemp == null && Math.abs(determineBasalResultSMB.rate - ConfigBuilderPlugin.getActivePump().getBaseBasalRate()) < 0.1)
determineBasalResultSMB.tempBasalRequested = false;
}
determineBasalResultSMB.iob = iobArray[0];

View file

@ -218,13 +218,13 @@ public class NewInsulinDialog extends DialogFragment implements OnClickListener
List<String> actions = new LinkedList<>();
if (insulin > 0) {
actions.add(MainApp.gs(R.string.bolus) + ": " + "<font color='" + MainApp.gc(R.color.bolus) + "'>" + insulinAfterConstraints + "U" + "</font>");
actions.add(MainApp.gs(R.string.bolus) + ": " + "<font color='" + MainApp.gc(R.color.bolus) + "'>" + DecimalFormatter.to2Decimal(insulinAfterConstraints) + "U" + "</font>");
if (recordOnlyCheckbox.isChecked()) {
actions.add("<font color='" + MainApp.gc(R.color.warning) + "'>" + MainApp.gs(R.string.bolusrecordedonly) + "</font>");
}
}
if (!insulinAfterConstraints.equals(insulin))
if (Math.abs(insulinAfterConstraints - insulin) > 0.01d)
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);

View file

@ -141,7 +141,7 @@ public class NewTreatmentDialog extends DialogFragment implements OnClickListene
}
if (carbsAfterConstraints > 0)
confirmMessage += "<br/>" + MainApp.gs(R.string.carbs) + ": " + carbsAfterConstraints + "g";
if (insulinAfterConstraints - insulin != 0 || !Objects.equals(carbsAfterConstraints, carbs))
if (Math.abs(insulinAfterConstraints - insulin) > 0.01d || !Objects.equals(carbsAfterConstraints, carbs))
confirmMessage += "<br/>" + MainApp.gs(R.string.constraintapllied);

View file

@ -207,7 +207,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.overview_wizard_dialog, null, false);
View view = inflater.inflate(R.layout.overview_wizard_dialog, container, false);
getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
@ -339,7 +339,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com
if (carbsAfterConstraints > 0)
confirmMessage += "<br/>" + MainApp.gs(R.string.carbs) + ": " + "<font color='" + MainApp.gc(R.color.carbs) + "'>" + carbsAfterConstraints + "g" + "</font>";
if (insulinAfterConstraints - calculatedTotalInsulin != 0 || !carbsAfterConstraints.equals(calculatedCarbs)) {
if (Math.abs(insulinAfterConstraints - calculatedTotalInsulin) > 0.01d || !carbsAfterConstraints.equals(calculatedCarbs)) {
okClicked = false;
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle(MainApp.gs(R.string.treatmentdeliveryerror));
@ -496,13 +496,13 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com
Double corrAfterConstraint = c_correction;
if (c_correction > 0)
c_correction = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(c_correction)).value();
if (c_correction - corrAfterConstraint != 0) { // c_correction != corrAfterConstraint doesn't work
if (Math.abs(c_correction - corrAfterConstraint) > 0.01d) { // c_correction != corrAfterConstraint doesn't work
editCorr.setValue(0d);
ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.bolusconstraintapplied));
return;
}
Integer carbsAfterConstraint = MainApp.getConstraintChecker().applyCarbsConstraints(new Constraint<>(c_carbs)).value();
if (c_carbs - carbsAfterConstraint != 0) {
if (Math.abs(c_carbs - carbsAfterConstraint) > 0.01d) {
editCarbs.setValue(0d);
ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.carbsconstraintapplied));
return;

View file

@ -60,7 +60,6 @@ import info.nightscout.androidaps.plugins.PumpCombo.ruffyscripter.history.PumpHi
import info.nightscout.androidaps.plugins.PumpCombo.ruffyscripter.history.PumpHistoryRequest;
import info.nightscout.androidaps.plugins.PumpCombo.ruffyscripter.history.Tdd;
import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpType;
import info.nightscout.androidaps.plugins.PumpCommon.utils.PumpUtil;
import info.nightscout.androidaps.plugins.Treatments.Treatment;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.utils.DateUtil;
@ -136,7 +135,7 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
.description(R.string.description_pump_combo)
);
ruffyScripter = new RuffyScripter(MainApp.instance().getApplicationContext());
PumpUtil.setPumpDescription(pumpDescription, PumpType.getByDescription("Accu-Chek Combo"));
pumpDescription.setPumpDescription(PumpType.AccuChekCombo);
}
public ComboPump getPump() {

View file

@ -6,13 +6,13 @@ package info.nightscout.androidaps.plugins.PumpCommon.data;
public class DoseSettings {
private float step;
private double step;
private int durationStep;
private int maxDuration;
private float minDose;
private Float maxDose;
private double minDose;
private Double maxDose;
public DoseSettings(float step, int durationStep, int maxDuration, float minDose, Float maxDose)
public DoseSettings(double step, int durationStep, int maxDuration, double minDose, Double maxDose)
{
this.step = step;
this.durationStep = durationStep;
@ -21,13 +21,13 @@ public class DoseSettings {
this.maxDose = maxDose;
}
public DoseSettings(float step, int durationStep, int maxDuration, float minDose)
public DoseSettings(double step, int durationStep, int maxDuration, double minDose)
{
this(step, durationStep, maxDuration, minDose, null);
this(step, durationStep, maxDuration, minDose, Double.MAX_VALUE);
}
public float getStep() {
public double getStep() {
return step;
}
@ -39,11 +39,11 @@ public class DoseSettings {
return maxDuration;
}
public float getMinDose() {
public double getMinDose() {
return minDose;
}
public Float getMaxDose() {
public Double getMaxDose() {
return maxDose;
}
}

View file

@ -10,18 +10,18 @@ public enum DoseStepSize
ComboBasal( //
new DoseStepSizeEntry(0f, 1f, 0.01f), //
new DoseStepSizeEntry(1f, 10f, 0.05f), //
new DoseStepSizeEntry(10f, Float.MAX_VALUE, 0.1f)), //
new DoseStepSizeEntry(10f, Double.MAX_VALUE, 0.1f)), //
InsightBolus(
new DoseStepSizeEntry(0f, 2f, 0.05f), //
new DoseStepSizeEntry(2f, 5f, 0.1f), //
new DoseStepSizeEntry(5f, 10f, 0.2f), //
new DoseStepSizeEntry(10f, Float.MAX_VALUE, 0.5f)),
new DoseStepSizeEntry(10f, Double.MAX_VALUE, 0.5f)),
MedtronicVeoBasal( //
new DoseStepSizeEntry(0f, 1f, 0.025f), //
new DoseStepSizeEntry(1f, 10f, 0.05f), //
new DoseStepSizeEntry(10f, Float.MAX_VALUE, 0.1f)), //
new DoseStepSizeEntry(10f, Double.MAX_VALUE, 0.1f)), //
;
@ -35,7 +35,7 @@ public enum DoseStepSize
}
public float getStepSizeForAmount(float amount)
public double getStepSizeForAmount(double amount)
{
for (DoseStepSizeEntry entry : entries) {
if (entry.from <= amount && entry.to > amount)
@ -57,7 +57,7 @@ public enum DoseStepSize
sb.append(entry.from);
sb.append("-");
if (entry.to == Float.MAX_VALUE)
if (entry.to == Double.MAX_VALUE)
{
sb.append("~}");
}
@ -74,12 +74,12 @@ public enum DoseStepSize
static class DoseStepSizeEntry
{
float from;
float to;
float value;
double from;
double to;
double value;
// to = this value is not included, but would actually mean <, so for rates between 0.025-0.975 u/h, we would have [from=0, to=10]
DoseStepSizeEntry(float from, float to, float value)
DoseStepSizeEntry(double from, double to, double value)
{
this.from = from;
this.to = to;

View file

@ -18,108 +18,108 @@ import info.nightscout.androidaps.plugins.PumpCommon.data.DoseSettings;
public enum PumpType {
GenericAAPS("Generic AAPS", 0.1f, null, //
new DoseSettings(0.05f, 30, 8*60, 0.05f), //
GenericAAPS("Generic AAPS", 0.1d, null, //
new DoseSettings(0.05d, 30, 8*60, 0.05d), //
PumpTempBasalType.Percent, //
new DoseSettings(10,30, 24*60, 0f, 500f), PumpCapability.BasalRate_Duration15and30minAllowed, //
0.01f, 0.01f, null, PumpCapability.VirtualPumpCapabilities), //
new DoseSettings(10,30, 24*60, 0d, 500d), PumpCapability.BasalRate_Duration15and30minAllowed, //
0.01d, 0.01d, null, PumpCapability.VirtualPumpCapabilities), //
// Cellnovo
Cellnovo1("Cellnovo", 0.05f, null, //
new DoseSettings(0.05f, 30, 24*60, 1f, null),
Cellnovo1("Cellnovo", 0.05d, null, //
new DoseSettings(0.05d, 30, 24*60, 1d, null),
PumpTempBasalType.Percent,
new DoseSettings(5,30, 24*60, 0f, 200f), PumpCapability.BasalRate_Duration30minAllowed, //
0.05f, 0.05f, null, PumpCapability.VirtualPumpCapabilities), //
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.1f, null, //
new DoseSettings(0.1f, 15, 12*60, 0.1f), //
AccuChekCombo("Accu-Chek Combo", 0.1d, null, //
new DoseSettings(0.1d, 15, 12*60, 0.1d), //
PumpTempBasalType.Percent,
new DoseSettings(10, 15, 12*60,0f, 500f), PumpCapability.BasalRate_Duration15and30minAllowed, //
0.01f, 0.1f, DoseStepSize.ComboBasal, PumpCapability.ComboCapabilities), //
new DoseSettings(10, 15, 12*60,0d, 500d), PumpCapability.BasalRate_Duration15and30minAllowed, //
0.01d, 0.1d, DoseStepSize.ComboBasal, PumpCapability.ComboCapabilities), //
AccuChekSpirit("Accu-Chek Spirit", 0.1f, null, //
new DoseSettings(0.1f, 15, 12*60, 0.1f), //
AccuChekSpirit("Accu-Chek Spirit", 0.1d, null, //
new DoseSettings(0.1d, 15, 12*60, 0.1d), //
PumpTempBasalType.Percent,
new DoseSettings(10, 15, 12*60,0f, 500f), PumpCapability.BasalRate_Duration15and30minAllowed, //
0.01f, 0.1f, null, PumpCapability.VirtualPumpCapabilities), //
new DoseSettings(10, 15, 12*60,0d, 500d), PumpCapability.BasalRate_Duration15and30minAllowed, //
0.01d, 0.1d, null, PumpCapability.VirtualPumpCapabilities), //
AccuChekInsight("Accu-Chek Insight", 0.05f, DoseStepSize.InsightBolus, //
new DoseSettings(0.05f, 15, 24*60, 0.05f), //
AccuChekInsight("Accu-Chek Insight", 0.05d, DoseStepSize.InsightBolus, //
new DoseSettings(0.05d, 15, 24*60, 0.05d), //
PumpTempBasalType.Percent,
new DoseSettings(10, 15, 12*60,0f, 250f), PumpCapability.BasalRate_Duration15and30minAllowed, //
0.02f, 0.1f, null, PumpCapability.InsightCapabilities), //
new DoseSettings(10, 15, 12*60,0d, 250d), PumpCapability.BasalRate_Duration15and30minAllowed, //
0.02d, 0.1d, null, PumpCapability.InsightCapabilities), //
// Animas
AnimasVibe("Animas Vibe", 0.05f, null, // AnimasBolus?
new DoseSettings(0.05f, 30, 12*60, 0.05f), //
AnimasVibe("Animas Vibe", 0.05d, null, // AnimasBolus?
new DoseSettings(0.05d, 30, 12*60, 0.05d), //
PumpTempBasalType.Percent, //
new DoseSettings(10, 30, 24*60, 0f, 200f), PumpCapability.BasalRate_Duration30minAllowed, //
0.025f, 5f, 0f, null, PumpCapability.VirtualPumpCapabilities), //
new DoseSettings(10, 30, 24*60, 0d, 200d), PumpCapability.BasalRate_Duration30minAllowed, //
0.025d, 5d, 0d, null, PumpCapability.VirtualPumpCapabilities), //
AnimasPing("Animas Ping", AnimasVibe),
// Dana
DanaR("DanaR", 0.05f, null, //
new DoseSettings(0.05f, 30, 8*60, 0.05f), //
DanaR("DanaR", 0.05d, null, //
new DoseSettings(0.05d, 30, 8*60, 0.05d), //
PumpTempBasalType.Percent, //
new DoseSettings(10f, 60, 24*60, 0f, 200f), PumpCapability.BasalRate_Duration15and30minNotAllowed, //
0.04f, 0.01f, null, PumpCapability.DanaCapabilities),
new DoseSettings(10d, 60, 24*60, 0d, 200d), PumpCapability.BasalRate_Duration15and30minNotAllowed, //
0.04d, 0.01d, null, PumpCapability.DanaCapabilities),
DanaRKorean("DanaR Korean", 0.05f, null, //
new DoseSettings(0.05f, 30, 8*60, 0.05f), //
DanaRKorean("DanaR Korean", 0.05d, null, //
new DoseSettings(0.05d, 30, 8*60, 0.05d), //
PumpTempBasalType.Percent, //
new DoseSettings(10f, 60, 24*60, 0f, 200f), PumpCapability.BasalRate_Duration15and30minNotAllowed, //
0.1f, 0.01f, null, PumpCapability.DanaCapabilities),
new DoseSettings(10d, 60, 24*60, 0d, 200d), PumpCapability.BasalRate_Duration15and30minNotAllowed, //
0.1d, 0.01d, null, PumpCapability.DanaCapabilities),
DanaRS("DanaRS", 0.05f, null, //
new DoseSettings(0.05f, 30, 8*60, 0.05f), //
DanaRS("DanaRS", 0.05d, null, //
new DoseSettings(0.05d, 30, 8*60, 0.05d), //
PumpTempBasalType.Percent, //
new DoseSettings(10f, 60, 24*60, 0f, 200f), PumpCapability.BasalRate_Duration15and30minAllowed, //
0.04f, 0.01f, null, PumpCapability.DanaWithHistoryCapabilities),
new DoseSettings(10d, 60, 24*60, 0d, 200d), PumpCapability.BasalRate_Duration15and30minAllowed, //
0.04d, 0.01d, null, PumpCapability.DanaWithHistoryCapabilities),
DanaRv2("DanaRv2", DanaRS),
// Insulet
Insulet_Omnipod("Insulet Omnipod", 0.05f, null, //
new DoseSettings(0.05f, 30, 8*60, 0.05f), //
Insulet_Omnipod("Insulet Omnipod", 0.05d, null, //
new DoseSettings(0.05d, 30, 8*60, 0.05d), //
PumpTempBasalType.Absolute, //
new DoseSettings(0.05f, 30, 12*60, 0f, 5.0f), PumpCapability.BasalRate_Duration30minAllowed, // cannot exceed max basal rate 30u/hr
0.05f, 0.05f, null, PumpCapability.VirtualPumpCapabilities),
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.05f, null, //
new DoseSettings(0.05f, 30, 8*60, 0.05f), //
Medtronic_512_712("Medtronic 512/712", 0.05d, null, //
new DoseSettings(0.05d, 30, 8*60, 0.05d), //
PumpTempBasalType.Absolute, //
new DoseSettings(0.05f, 30, 24*60, 0f, 35f), PumpCapability.BasalRate_Duration30minAllowed, //
0.05f, 0.05f, null, PumpCapability.VirtualPumpCapabilities), // TODO
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.05f, null, //
new DoseSettings(0.05f, 30, 8*60, 0.05f), //
Medtronic_523_723_Revel("Medtronic 523/723 (Revel)", 0.05d, null, //
new DoseSettings(0.05d, 30, 8*60, 0.05d), //
PumpTempBasalType.Absolute, //
new DoseSettings(0.05f, 30, 24*60, 0f, 35f), PumpCapability.BasalRate_Duration30minAllowed, //
0.025f, 0.025f, DoseStepSize.MedtronicVeoBasal, PumpCapability.VirtualPumpCapabilities), //
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.025f, null, //
new DoseSettings(0.05f, 30, 8*60, 0.05f), //
Medtronic_640G("Medtronic 640G", 0.025d, null, //
new DoseSettings(0.05d, 30, 8*60, 0.05d), //
PumpTempBasalType.Absolute, //
new DoseSettings(0.05f, 30, 24*60, 0f, 35f), PumpCapability.BasalRate_Duration30minAllowed, //
0.025f, 0.025f, DoseStepSize.MedtronicVeoBasal, PumpCapability.VirtualPumpCapabilities), //
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.01f, null, //
new DoseSettings(0.01f,15, 8*60, 0.4f),
TandemTSlim("Tandem t:slim", 0.01d, null, //
new DoseSettings(0.01d,15, 8*60, 0.4d),
PumpTempBasalType.Percent,
new DoseSettings(1,15, 8*60, 0f, 250f), PumpCapability.BasalRate_Duration15and30minAllowed, //
0.1f, 0.001f, null, PumpCapability.VirtualPumpCapabilities),
new DoseSettings(1,15, 8*60, 0d, 250d), PumpCapability.BasalRate_Duration15and30minAllowed, //
0.1d, 0.001d, null, PumpCapability.VirtualPumpCapabilities),
TandemTFlex("Tandem t:flex", TandemTSlim), //
TandemTSlimG4("Tandem t:slim G4", TandemTSlim), //
@ -127,15 +127,15 @@ public enum PumpType {
;
private String description;
private float bolusSize;
private double bolusSize;
private DoseStepSize specialBolusSize;
private DoseSettings extendedBolusSettings;
private PumpTempBasalType pumpTempBasalType;
private DoseSettings tbrSettings;
private PumpCapability specialBasalDurations;
private float baseBasalMinValue; //
private Float baseBasalMaxValue;
private float baseBasalStep; //
private double baseBasalMinValue; //
private Double baseBasalMaxValue;
private double baseBasalStep; //
private DoseStepSize baseBasalSpecialSteps; //
private PumpCapability pumpCapability;
@ -165,18 +165,18 @@ public enum PumpType {
this.pumpCapability = pumpCapability;
}
PumpType(String description, float bolusSize, DoseStepSize specialBolusSize, //
PumpType(String description, double bolusSize, DoseStepSize specialBolusSize, //
DoseSettings extendedBolusSettings, //
PumpTempBasalType pumpTempBasalType, DoseSettings tbrSettings, PumpCapability specialBasalDurations, //
float baseBasalMinValue, float baseBasalStep, DoseStepSize baseBasalSpecialSteps, PumpCapability pumpCapability)
double baseBasalMinValue, double baseBasalStep, DoseStepSize baseBasalSpecialSteps, PumpCapability pumpCapability)
{
this(description, bolusSize, specialBolusSize, extendedBolusSettings, pumpTempBasalType, tbrSettings, specialBasalDurations, baseBasalMinValue, null, baseBasalStep, baseBasalSpecialSteps, pumpCapability);
}
PumpType(String description, float bolusSize, DoseStepSize specialBolusSize, //
PumpType(String description, double bolusSize, DoseStepSize specialBolusSize, //
DoseSettings extendedBolusSettings, //
PumpTempBasalType pumpTempBasalType, DoseSettings tbrSettings, PumpCapability specialBasalDurations, //
float baseBasalMinValue, Float baseBasalMaxValue, float baseBasalStep, DoseStepSize baseBasalSpecialSteps, PumpCapability pumpCapability)
double baseBasalMinValue, Double baseBasalMaxValue, double baseBasalStep, DoseStepSize baseBasalSpecialSteps, PumpCapability pumpCapability)
{
this.description = description;
this.bolusSize = bolusSize;
@ -205,7 +205,7 @@ public enum PumpType {
return this.pumpCapability;
}
public float getBolusSize() {
public double getBolusSize() {
return isParentSet() ? parent.bolusSize : bolusSize;
}
@ -230,17 +230,17 @@ public enum PumpType {
}
public float getBaseBasalMinValue() {
public double getBaseBasalMinValue() {
return isParentSet() ? parent.baseBasalMinValue : baseBasalMinValue;
}
public Float getBaseBasalMaxValue() {
public Double getBaseBasalMaxValue() {
return isParentSet() ? parent.baseBasalMaxValue : baseBasalMaxValue;
}
public float getBaseBasalStep() {
public double getBaseBasalStep() {
return isParentSet() ? parent.baseBasalStep : baseBasalStep;
}
@ -294,7 +294,7 @@ public enum PumpType {
private String getBaseBasalRange()
{
Float maxValue = getBaseBasalMaxValue();
Double maxValue = getBaseBasalMaxValue();
return maxValue==null ? "" + getBaseBasalMinValue() : getBaseBasalMinValue() + "-" + maxValue;
}
@ -326,4 +326,68 @@ public enum PumpType {
PumpCapability.BasalRate_Duration15and30minNotAllowed : specialBasalDurations;
}
}
public double determineCorrectBolusSize(double bolusAmount) {
if (bolusAmount == 0.0d) {
return bolusAmount;
}
double bolusStepSize;
if (getSpecialBolusSize() == null) {
bolusStepSize = getBolusSize();
} else {
DoseStepSize specialBolusSize = getSpecialBolusSize();
bolusStepSize = specialBolusSize.getStepSizeForAmount((double)bolusAmount);
}
return Math.round(bolusAmount / bolusStepSize) * bolusStepSize;
}
public double determineCorrectExtendedBolusSize(double bolusAmount) {
if (bolusAmount == 0.0d) {
return bolusAmount;
}
double bolusStepSize;
if (getExtendedBolusSettings() == null) { // this should be never null
return 0.0d;
}
DoseSettings extendedBolusSettings = getExtendedBolusSettings();
bolusStepSize = extendedBolusSettings.getStep();
if (bolusAmount > extendedBolusSettings.getMaxDose()) {
bolusAmount = extendedBolusSettings.getMaxDose();
}
return Math.round(bolusAmount / bolusStepSize) * bolusStepSize;
}
public double determineCorrectBasalSize(double basalAmount) {
if (basalAmount == 0.0d) {
return basalAmount;
}
double basalStepSize;
if (getBaseBasalSpecialSteps() == null) {
basalStepSize = getBaseBasalStep();
} else {
DoseStepSize specialBolusSize = getBaseBasalSpecialSteps();
basalStepSize = specialBolusSize.getStepSizeForAmount((double) basalAmount);
}
if (basalAmount > getTbrSettings().getMaxDose())
basalAmount = getTbrSettings().getMaxDose().doubleValue();
return Math.round(basalAmount / basalStepSize) * basalStepSize;
}
}

View file

@ -1,66 +0,0 @@
package info.nightscout.androidaps.plugins.PumpCommon.utils;
import info.nightscout.androidaps.interfaces.PumpDescription;
import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpCapability;
import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpTempBasalType;
import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpType;
/**
* Created by andy on 02/05/2018.
*/
public class PumpUtil {
public static void setPumpDescription(PumpDescription pumpDescription, PumpType pumpType)
{
// reset
pumpDescription.resetSettings();
PumpCapability pumpCapability = pumpType.getPumpCapability();
pumpDescription.isBolusCapable = pumpCapability.hasCapability(PumpCapability.Bolus);
pumpDescription.bolusStep = pumpType.getBolusSize();
pumpDescription.isExtendedBolusCapable = pumpCapability.hasCapability(PumpCapability.ExtendedBolus);
pumpDescription.extendedBolusStep = pumpType.getExtendedBolusSettings().getStep();
pumpDescription.extendedBolusDurationStep = pumpType.getExtendedBolusSettings().getDurationStep();
pumpDescription.extendedBolusMaxDuration = pumpType.getExtendedBolusSettings().getMaxDuration();
pumpDescription.isTempBasalCapable = pumpCapability.hasCapability(PumpCapability.TempBasal);
if (pumpType.getPumpTempBasalType()==PumpTempBasalType.Percent)
{
pumpDescription.tempBasalStyle = PumpDescription.PERCENT;
pumpDescription.maxTempPercent = pumpType.getTbrSettings().getMaxDose().intValue();
pumpDescription.tempPercentStep = (int)pumpType.getTbrSettings().getStep();
}
else
{
pumpDescription.tempBasalStyle = PumpDescription.ABSOLUTE;
pumpDescription.maxTempAbsolute = pumpType.getTbrSettings().getMaxDose();
pumpDescription.tempAbsoluteStep = pumpType.getTbrSettings().getStep();
}
pumpDescription.tempDurationStep = pumpType.getTbrSettings().getDurationStep();
pumpDescription.tempMaxDuration = pumpType.getTbrSettings().getMaxDuration();
pumpDescription.tempDurationStep15mAllowed = pumpType.getSpecialBasalDurations().hasCapability(PumpCapability.BasalRate_Duration15minAllowed);
pumpDescription.tempDurationStep30mAllowed = pumpType.getSpecialBasalDurations().hasCapability(PumpCapability.BasalRate_Duration30minAllowed);
pumpDescription.isSetBasalProfileCapable = pumpCapability.hasCapability(PumpCapability.BasalProfileSet);
pumpDescription.basalStep = pumpType.getBaseBasalStep();
pumpDescription.basalMinimumRate = pumpType.getBaseBasalMinValue();
pumpDescription.isRefillingCapable = pumpCapability.hasCapability(PumpCapability.Refill);
pumpDescription.storesCarbInfo = pumpCapability.hasCapability(PumpCapability.StoreCarbInfo);
pumpDescription.supportsTDDs = pumpCapability.hasCapability(PumpCapability.TDD);
pumpDescription.needsManualTDDLoad = pumpCapability.hasCapability(PumpCapability.ManualTDDLoad);
pumpDescription.is30minBasalRatesCapable = pumpCapability.hasCapability(PumpCapability.BasalRate30min);
}
}

View file

@ -214,7 +214,7 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte
@Override
public PumpEnactResult setExtendedBolus(Double insulin, Integer durationInMinutes) {
DanaRPump pump = DanaRPump.getInstance();
insulin = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(insulin)).value();
insulin = MainApp.getConstraintChecker().applyExtendedBolusConstraints(new Constraint<>(insulin)).value();
// needs to be rounded
int durationInHalfHours = Math.max(durationInMinutes / 30, 1);
insulin = Round.roundTo(insulin, getPumpDescription().extendedBolusStep);
@ -409,6 +409,11 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte
return insulin;
}
@Override
public Constraint<Double> applyExtendedBolusConstraints(Constraint<Double> insulin) {
return applyBolusConstraints(insulin);
}
@Nullable
@Override
public ProfileStore getProfile() {

View file

@ -274,8 +274,9 @@ public class DanaRFragment extends SubscriberFragment {
}
}
//hide user options button if not an RS pump or old firmware
// also excludes pump with model 03 because of untested error
boolean isKorean = DanaRKoreanPlugin.getPlugin().isEnabled(PluginType.PUMP);
if (isKorean || firmwareView.getText() == "OLD") {
if (isKorean || firmwareView.getText() == "OLD" || pump.model == 3) {
danar_user_options.setVisibility(View.GONE);
}
}

View file

@ -24,7 +24,6 @@ import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpType;
import info.nightscout.androidaps.plugins.PumpCommon.utils.PumpUtil;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MsgBolusStartWithSpeed;
import info.nightscout.androidaps.plugins.PumpDanaR.services.DanaRExecutionService;
import info.nightscout.androidaps.plugins.Treatments.Treatment;
@ -48,7 +47,7 @@ public class DanaRPlugin extends AbstractDanaRPlugin {
public DanaRPlugin() {
super();
useExtendedBoluses = SP.getBoolean(R.string.key_danar_useextended, false);
PumpUtil.setPumpDescription(pumpDescription, PumpType.getByDescription("DanaR"));
pumpDescription.setPumpDescription(PumpType.DanaR);
}
@Override

View file

@ -22,7 +22,7 @@ public class MsgSetExtendedBolusStart extends MessageBase {
// HARDCODED LIMITS
if (halfhours < 1) halfhours = 1;
if (halfhours > 16) halfhours = 16;
amount = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(amount)).value();
amount = MainApp.getConstraintChecker().applyExtendedBolusConstraints(new Constraint<>(amount)).value();
AddParamInt((int) (amount * 100));
AddParamByte(halfhours);

View file

@ -24,7 +24,6 @@ import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpType;
import info.nightscout.androidaps.plugins.PumpCommon.utils.PumpUtil;
import info.nightscout.androidaps.plugins.PumpDanaR.AbstractDanaRPlugin;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MsgBolusStart;
@ -51,7 +50,7 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin {
pluginDescription.description(R.string.description_pump_dana_r_korean);
useExtendedBoluses = SP.getBoolean(R.string.key_danar_useextended, false);
PumpUtil.setPumpDescription(pumpDescription, PumpType.getByDescription("DanaR Korean"));
pumpDescription.setPumpDescription(PumpType.DanaRKorean);
}
@Override

View file

@ -44,7 +44,6 @@ import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
import info.nightscout.androidaps.plugins.ProfileNS.NSProfilePlugin;
import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpType;
import info.nightscout.androidaps.plugins.PumpCommon.utils.PumpUtil;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRFragment;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.RecordTypes;
@ -90,7 +89,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
.description(R.string.description_pump_dana_rs)
);
PumpUtil.setPumpDescription(pumpDescription, PumpType.getByDescription("DanaRS"));
pumpDescription.setPumpDescription(PumpType.DanaRS);
}
@Override
@ -264,6 +263,11 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
return insulin;
}
@Override
public Constraint<Double> applyExtendedBolusConstraints(Constraint<Double> insulin) {
return applyBolusConstraints(insulin);
}
// Profile interface
@Nullable
@ -616,7 +620,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
@Override
public synchronized PumpEnactResult setExtendedBolus(Double insulin, Integer durationInMinutes) {
DanaRPump pump = DanaRPump.getInstance();
insulin = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(insulin)).value();
insulin = MainApp.getConstraintChecker().applyExtendedBolusConstraints(new Constraint<>(insulin)).value();
// needs to be rounded
int durationInHalfHours = Math.max(durationInMinutes / 30, 1);
insulin = Round.roundTo(insulin, getPumpDescription().extendedBolusStep);

View file

@ -22,7 +22,6 @@ import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
import info.nightscout.androidaps.plugins.ConfigBuilder.DetailedBolusInfoStorage;
import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpType;
import info.nightscout.androidaps.plugins.PumpCommon.utils.PumpUtil;
import info.nightscout.androidaps.plugins.PumpDanaR.AbstractDanaRPlugin;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MsgBolusStartWithSpeed;
@ -51,7 +50,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin {
pluginDescription.description(R.string.description_pump_dana_r_v2);
useExtendedBoluses = false;
PumpUtil.setPumpDescription(pumpDescription, PumpType.getByDescription("DanaRv2"));
pumpDescription.setPumpDescription(PumpType.DanaRv2);
}
@Override

View file

@ -9,7 +9,6 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import com.squareup.otto.Subscribe;
import org.slf4j.Logger;
@ -18,6 +17,7 @@ import org.slf4j.LoggerFactory;
import java.util.List;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
import info.nightscout.androidaps.plugins.PumpInsight.events.EventInsightUpdateGui;
import info.nightscout.androidaps.plugins.PumpInsight.utils.StatusItem;
@ -26,7 +26,7 @@ import info.nightscout.utils.FabricPrivacy;
public class InsightFragment extends SubscriberFragment {
private static final Logger log = LoggerFactory.getLogger(InsightFragment.class);
private static final Logger log = LoggerFactory.getLogger(L.PUMP);
private static final Handler sLoopHandler = new Handler();
private static volatile boolean refresh = false;
private static volatile boolean pending = false;

View file

@ -1,6 +1,7 @@
package info.nightscout.androidaps.plugins.PumpInsight;
import android.content.DialogInterface;
import android.os.SystemClock;
import android.support.v4.app.FragmentActivity;
import android.support.v7.app.AlertDialog;
@ -39,7 +40,6 @@ import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress;
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpType;
import info.nightscout.androidaps.plugins.PumpCommon.utils.PumpUtil;
import info.nightscout.androidaps.plugins.PumpInsight.connector.CancelBolusSilentlyTaskRunner;
import info.nightscout.androidaps.plugins.PumpInsight.connector.CancelTBRSilentlyTaskRunner;
import info.nightscout.androidaps.plugins.PumpInsight.connector.Connector;
@ -86,6 +86,7 @@ import static info.nightscout.androidaps.plugins.PumpInsight.history.PumpIdCache
@SuppressWarnings("AccessStaticViaInstance")
public class InsightPlugin extends PluginBase implements PumpInterface, ConstraintsInterface {
private Logger log = LoggerFactory.getLogger(L.PUMP);
private static volatile InsightPlugin plugin;
@ -101,7 +102,6 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
private static Integer reservoirInUnits = 0;
private static boolean initialized = false;
private static volatile boolean update_pending = false;
private static Logger log = LoggerFactory.getLogger(InsightPlugin.class);
private StatusTaskRunner.Result statusResult;
private long statusResultTime = -1;
private long lastDataTime = 0;
@ -121,16 +121,12 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
.preferencesId(R.xml.pref_insightpump)
.description(R.string.description_pump_insight)
);
log("InsightPlugin instantiated");
PumpUtil.setPumpDescription(pumpDescription, PumpType.getByDescription("Accu-Chek Insight"));
if (L.isEnabled(L.PUMP))
log.debug("InsightPlugin instantiated");
pumpDescription.setPumpDescription(PumpType.AccuChekInsight);
}
// just log during debugging
private static void log(String msg) {
android.util.Log.e("INSIGHTPUMP", msg);
}
private static void updateGui() {
update_pending = false;
MainApp.bus().post(new EventInsightUpdateGui());
@ -145,7 +141,8 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
if (!connector_enabled) {
synchronized (this) {
if (!connector_enabled) {
log("Instantiating connector");
if (L.isEnabled(L.PUMP))
log.debug("Instantiating connector");
connector_enabled = true;
this.connector = Connector.get();
this.connector.init();
@ -159,7 +156,8 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
if (connector_enabled) {
synchronized (this) {
if (connector_enabled) {
log("Shutting down connector");
if (L.isEnabled(L.PUMP))
log.debug("Shutting down connector");
Connector.get().shutdown();
connector_enabled = false;
}
@ -240,18 +238,21 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
@Override
public void connect(String reason) {
log("InsightPlugin::connect()");
if (L.isEnabled(L.PUMP))
log.debug("InsightPlugin::connect()");
try {
if (!connector.isPumpConnected()) {
if (Helpers.ratelimit("insight-connect-timer", 40)) {
log("Actually requesting a connect");
if (L.isEnabled(L.PUMP))
log.debug("Actually requesting a connect");
connector.connectToPump();
}
} else {
log("Already connected");
if (L.isEnabled(L.PUMP))
log.debug("Already connected");
}
} catch (NullPointerException e) {
log("Could not sconnect - null pointer: " + e);
log.error("Could not sconnect - null pointer: " + e);
}
// TODO review
@ -261,54 +262,63 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
@Override
public void disconnect(String reason) {
log("InsightPlugin::disconnect()");
if (L.isEnabled(L.PUMP))
log.debug("InsightPlugin::disconnect()");
try {
if (!SP.getBoolean("insight_always_connected", false)) {
log("Requesting disconnect");
if (L.isEnabled(L.PUMP))
log.debug("Requesting disconnect");
connector.disconnectFromPump();
} else {
log("Not disconnecting due to preference");
if (L.isEnabled(L.PUMP))
log.debug("Not disconnecting due to preference");
}
} catch (NullPointerException e) {
log("Could not disconnect - null pointer: " + e);
log.error("Could not disconnect - null pointer: " + e);
}
}
@Override
public void stopConnecting() {
log("InsightPlugin::stopConnecting()");
if (L.isEnabled(L.PUMP))
log.debug("InsightPlugin::stopConnecting()");
try {
if (isConnecting()) {
if (!SP.getBoolean("insight_always_connected", false)) {
log("Requesting disconnect");
if (L.isEnabled(L.PUMP))
log.debug("Requesting disconnect");
connector.disconnectFromPump();
} else {
log("Not disconnecting due to preference");
if (L.isEnabled(L.PUMP))
log.debug("Not disconnecting due to preference");
}
} else {
log("Not currently trying to connect so not stopping connection");
if (L.isEnabled(L.PUMP))
log.debug("Not currently trying to connect so not stopping connection");
}
} catch (NullPointerException e) {
log("Could not stop connecting - null pointer: " + e);
log.error("Could not stop connecting - null pointer: " + e);
}
}
@Override
public void getPumpStatus() {
log("getPumpStatus");
if (L.isEnabled(L.PUMP))
log.debug("getPumpStatus");
if (Connector.get().isPumpConnected()) {
log("is connected.. requesting status");
if (L.isEnabled(L.PUMP))
log.debug("is connected.. requesting status");
try {
setStatusResult(fetchTaskRunner(new StatusTaskRunner(connector.getServiceConnector()), StatusTaskRunner.Result.class));
log("GOT STATUS RESULT!!! PARTY WOOHOO!!!");
if (L.isEnabled(L.PUMP))
log.debug("GOT STATUS RESULT!!! PARTY WOOHOO!!!");
statusResultTime = Helpers.tsl();
processStatusResult();
updateGui();
connector.requestHistoryReSync();
connector.requestHistorySync();
} catch (Exception e) {
log("StatusTaskRunner wasn't successful.");
log.error("StatusTaskRunner wasn't successful.");
if (connector.getServiceConnector().isConnectedToService() && connector.getServiceConnector().getStatus() != Status.CONNECTED) {
if (Helpers.ratelimit("insight-reconnect", 2)) {
Connector.connectToPump();
@ -317,7 +327,8 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
}
}
} else {
log("not connected.. not requesting status");
if (L.isEnabled(L.PUMP))
log.debug("not connected.. not requesting status");
}
}
@ -345,7 +356,8 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
if (profile.getBasalValues().length > i + 1)
nextValue = profile.getBasalValues()[i + 1];
profileBlocks.add(new BRProfileBlock.ProfileBlock((((nextValue != null ? nextValue.timeAsSeconds : 24 * 60 * 60) - basalValue.timeAsSeconds) / 60), Helpers.roundDouble(basalValue.value, 2)));
log("setNewBasalProfile: " + basalValue.value + " for " + Integer.toString(((nextValue != null ? nextValue.timeAsSeconds : 24 * 60 * 60) - basalValue.timeAsSeconds) / 60));
if (L.isEnabled(L.PUMP))
log.debug("setNewBasalProfile: " + basalValue.value + " for " + Integer.toString(((nextValue != null ? nextValue.timeAsSeconds : 24 * 60 * 60) - basalValue.timeAsSeconds) / 60));
}
try {
fetchTaskRunner(new WriteBasalProfileTaskRunner(connector.getServiceConnector(), profileBlocks));
@ -374,8 +386,9 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
Profile.BasalValue nextValue = null;
if (profile.getBasalValues().length > i + 1)
nextValue = profile.getBasalValues()[i + 1];
log("isThisProfileSet - Comparing block: Pump: " + profileBlock.getAmount() + " for " + profileBlock.getDuration()
+ " Profile: " + basalValue.value + " for " + Integer.toString(((nextValue != null ? nextValue.timeAsSeconds : 24 * 60 * 60) - basalValue.timeAsSeconds) / 60));
if (L.isEnabled(L.PUMP))
log.debug("isThisProfileSet - Comparing block: Pump: " + profileBlock.getAmount() + " for " + profileBlock.getDuration()
+ " Profile: " + basalValue.value + " for " + Integer.toString(((nextValue != null ? nextValue.timeAsSeconds : 24 * 60 * 60) - basalValue.timeAsSeconds) / 60));
if (profileBlock.getDuration() * 60 != (nextValue != null ? nextValue.timeAsSeconds : 24 * 60 * 60) - basalValue.timeAsSeconds)
return false;
//Allow a little imprecision due to rounding errors
@ -426,7 +439,8 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
}
if (result.success) {
log("Success!");
if (L.isEnabled(L.PUMP))
log.debug("Success!");
Treatment t = new Treatment();
t.isSMB = detailedBolusInfo.isSMB;
@ -438,10 +452,11 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
MainApp.bus().post(bolusingEvent);
TreatmentsPlugin.getPlugin().addToHistoryTreatment(detailedBolusInfo, true);
} else {
log.debug("Failure to deliver treatment");
if (L.isEnabled(L.PUMP))
log.debug("Failure to deliver treatment");
}
if (L.isEnabled(L.PUMPCOMM))
if (L.isEnabled(L.PUMP))
log.debug("Delivering treatment insulin: " + detailedBolusInfo.insulin + "U carbs: " + detailedBolusInfo.carbs + "g " + result);
updateGui();
@ -490,25 +505,31 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
@Override
public PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes, Profile profile, boolean enforceNew) {
log("Set TBR absolute: " + absoluteRate);
if (L.isEnabled(L.PUMP))
log.debug("Set TBR absolute: " + absoluteRate);
if (getBaseBasalRate() == 0) {
log("Base basal rate appears to be zero!");
if (L.isEnabled(L.PUMP))
log.debug("Base basal rate appears to be zero!");
return pumpEnactFailure();
}
double percent = 100D / getBaseBasalRate() * absoluteRate;
log("Calculated requested rate: " + absoluteRate + " base rate: " + getBaseBasalRate() + " percentage: " + percent + "%");
if (L.isEnabled(L.PUMP))
log.debug("Calculated requested rate: " + absoluteRate + " base rate: " + getBaseBasalRate() + " percentage: " + percent + "%");
try {
if (percent > 250) {
log("Calculated rate is above 250%, switching to emulation using extended boluses");
if (L.isEnabled(L.PUMP))
log.debug("Calculated rate is above 250%, switching to emulation using extended boluses");
cancelTempBasal(true);
if (!setExtendedBolus((absoluteRate - getBaseBasalRate()) / 60D * ((double) durationInMinutes), durationInMinutes).success) {
//Fallback to TBR if setting an extended bolus didn't work
log("Setting an extended bolus didn't work, falling back to normal TBR");
if (L.isEnabled(L.PUMP))
log.debug("Setting an extended bolus didn't work, falling back to normal TBR");
return setTempBasalPercent((int) percent, durationInMinutes, profile, true);
}
return new PumpEnactResult().success(true).enacted(true).absolute(absoluteRate).duration(durationInMinutes);
} else {
log("Calculated rate is below or equal to 250%, using normal TBRs");
if (L.isEnabled(L.PUMP))
log.debug("Calculated rate is below or equal to 250%, using normal TBRs");
cancelExtendedBolus();
return setTempBasalPercent((int) percent, durationInMinutes, profile, true);
}
@ -520,7 +541,8 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
@Override
public PumpEnactResult setTempBasalPercent(Integer percent, Integer durationInMinutes, Profile profile, boolean enforceNew) {
log("Set TBR %");
if (L.isEnabled(L.PUMP))
log.debug("Set TBR %");
percent = (int) Math.round(((double) percent) / 10d) * 10;
if (percent == 100) {
@ -537,7 +559,7 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
.source(Source.USER);
TreatmentsPlugin.getPlugin().addToHistoryTempBasal(tempBasal);
updateGui();
if (L.isEnabled(L.PUMPCOMM))
if (L.isEnabled(L.PUMP))
log.debug("Set temp basal " + percent + "% for " + durationInMinutes + "m");
connector.requestHistorySync(5000);
connector.tryToGetPumpStatusAgain();
@ -550,13 +572,16 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
@Override
public PumpEnactResult cancelTempBasal(boolean enforceNew) {
log("Cancel TBR");
if (L.isEnabled(L.PUMP))
log.debug("Cancel TBR");
try {
cancelExtendedBolus();
SystemClock.sleep(1100); // to be sure db records are at least 1 sec off (for NS)
realTBRCancel();
SystemClock.sleep(1100); // to be sure db records are at least 1 sec off (for NS)
updateGui();
if (L.isEnabled(L.PUMPCOMM)) log.debug("Canceling temp basal");
if (L.isEnabled(L.PUMP)) log.debug("Canceling temp basal");
connector.requestHistorySync(5000);
connector.tryToGetPumpStatusAgain();
return new PumpEnactResult().success(true).enacted(true).isTempCancel(true);
@ -577,7 +602,8 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
@Override
public PumpEnactResult setExtendedBolus(Double insulin, Integer durationInMinutes) {
log("Set Extended bolus " + insulin + " " + durationInMinutes);
if (L.isEnabled(L.PUMP))
log.debug("Set Extended bolus " + insulin + " " + durationInMinutes);
try {
ExtendedBolusMessage extendedBolusMessage = new ExtendedBolusMessage();
extendedBolusMessage.setAmount(insulin);
@ -593,7 +619,7 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
updateGui();
connector.requestHistorySync(30000);
connector.tryToGetPumpStatusAgain();
if (L.isEnabled(L.PUMPCOMM))
if (L.isEnabled(L.PUMP))
log.debug("Setting extended bolus: " + insulin + " mins:" + durationInMinutes);
return new PumpEnactResult().success(true).enacted(true).duration(durationInMinutes).bolusDelivered(insulin);
} catch (Exception e) {
@ -603,7 +629,8 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
@Override
public PumpEnactResult cancelExtendedBolus() {
log("Cancel Extended bolus");
if (L.isEnabled(L.PUMP))
log.debug("Cancel Extended bolus");
Integer bolusId = null;
@ -614,7 +641,7 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
exStop.source = Source.USER;
TreatmentsPlugin.getPlugin().addToHistoryExtendedBolus(exStop);
}
if (L.isEnabled(L.PUMPCOMM)) log.debug("Cancel extended bolus:");
if (L.isEnabled(L.PUMP)) log.debug("Cancel extended bolus:");
if (bolusId != null) connector.requestHistorySync(5000);
connector.tryToGetPumpStatusAgain();
updateGui();
@ -626,7 +653,8 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
private int deliverBolus(double bolusValue) throws Exception {
log("DeliverBolus: " + bolusValue);
if (L.isEnabled(L.PUMP))
log.debug("DeliverBolus: " + bolusValue);
final StandardBolusMessage message = new StandardBolusMessage();
message.setAmount(bolusValue);
@ -638,7 +666,8 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
public JSONObject getJSONStatus(Profile profile, String profileName) {
long now = System.currentTimeMillis();
if (Helpers.msSince(connector.getLastContactTime()) > (60 * 60 * 1000)) {
log("getJSONStatus not returning as data likely stale");
if (L.isEnabled(L.PUMP))
log.debug("getJSONStatus not returning as data likely stale");
return null;
}
@ -842,7 +871,7 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
break;
default:
log("ERROR: unknown bolus type! " + activeBolus.getBolusType());
log.error("ERROR: unknown bolus type! " + activeBolus.getBolusType());
}
}
@ -860,7 +889,7 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
lastDataTime = System.currentTimeMillis();
return result;
} catch (Exception e) {
log("Error while fetching " + taskRunner.getClass().getSimpleName() + ": " + e.getClass().getSimpleName());
log.error("Error while fetching " + taskRunner.getClass().getSimpleName() + ": " + e.getClass().getSimpleName());
throw e;
}
}
@ -871,7 +900,7 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
lastDataTime = System.currentTimeMillis();
return result;
} catch (Exception e) {
log("Error while fetching " + message.getClass().getSimpleName() + ": " + e.getClass().getSimpleName());
log.error("Error while fetching " + message.getClass().getSimpleName() + ": " + e.getClass().getSimpleName());
throw e;
}
}

View file

@ -5,6 +5,9 @@ import android.os.PowerManager;
import com.squareup.otto.Subscribe;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Formatter;
import java.util.HashMap;
@ -14,6 +17,7 @@ import java.util.Map;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.events.EventFeatureRunning;
import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpInsight.events.EventInsightUpdateGui;
import info.nightscout.androidaps.plugins.PumpInsight.history.HistoryReceiver;
import info.nightscout.androidaps.plugins.PumpInsight.history.LiveHistory;
@ -31,16 +35,16 @@ import static sugar.free.sightparser.handling.SightService.COMPATIBILITY_VERSION
/**
* Created by jamorham on 23/01/2018.
*
* <p>
* Connects to SightRemote app service using SightParser library
*
* <p>
* SightRemote and SightParser created by Tebbe Ubben
*
* <p>
* Original proof of concept SightProxy by jamorham
*
*/
public class Connector {
private static Logger log = LoggerFactory.getLogger(L.PUMP);
// TODO connection statistics
@ -65,7 +69,8 @@ public class Connector {
public synchronized void onStatusChange(Status status, long statusTime, long waitTime) {
if ((status != lastStatus) || (Helpers.msSince(lastStatusTime) > 2000)) {
log("Status change: " + status);
if (L.isEnabled(L.PUMP))
log.debug("Status change: " + status);
updateStatusStatistics(lastStatus, lastStatusTime);
lastStatus = status;
@ -78,7 +83,8 @@ public class Connector {
MainApp.bus().post(new EventInsightUpdateGui());
} else {
log("Same status as before: " + status);
if (L.isEnabled(L.PUMP))
log.debug("Same status as before: " + status);
}
}
@ -87,29 +93,32 @@ public class Connector {
@Override
public synchronized void onServiceConnected() {
log("On service connected");
if (L.isEnabled(L.PUMP))
log.debug("On service connected");
try {
final String remoteVersion = serviceConnector.getRemoteVersion();
if (remoteVersion.equals(COMPATIBILITY_VERSION)) {
serviceConnector.connect();
} else {
log("PROTOCOL VERSION MISMATCH! local: " + COMPATIBILITY_VERSION + " remote: " + remoteVersion);
log.error("PROTOCOL VERSION MISMATCH! local: " + COMPATIBILITY_VERSION + " remote: " + remoteVersion);
statusCallback.onStatusChange(Status.INCOMPATIBLE, 0, 0);
compatabilityMessage = MainApp.gs(R.string.insight_incompatible_compantion_app_we_need_version) + " " + getLocalVersion();
serviceConnector.disconnectFromService();
}
} catch (NullPointerException e) {
log("ERROR: null pointer when trying to connect to pump");
log.error("ERROR: null pointer when trying to connect to pump");
}
statusCallback.onStatusChange(safeGetStatus(), 0, 0);
}
@Override
public synchronized void onServiceDisconnected() {
log("Disconnected from service");
if (L.isEnabled(L.PUMP))
log.debug("Disconnected from service");
if (Helpers.ratelimit("insight-automatic-reconnect", 30)) {
log("Scheduling automatic service reconnection");
if (L.isEnabled(L.PUMP))
log.debug("Scheduling automatic service reconnection");
Helpers.runOnUiThreadDelayed(new Runnable() {
@Override
public void run() {
@ -147,11 +156,13 @@ public class Connector {
}
public synchronized static void connectToPump(long keep_alive) {
log("Attempting to connect to pump.");
if (L.isEnabled(L.PUMP))
log.debug("Attempting to connect to pump.");
if (keep_alive > 0 && Helpers.tsl() + keep_alive > stayConnectedTill) {
stayConnectedTime = keep_alive;
stayConnectedTill = Helpers.tsl() + keep_alive;
log("Staying connected till: " + Helpers.dateTimeText(stayConnectedTill));
if (L.isEnabled(L.PUMP))
log.debug("Staying connected till: " + Helpers.dateTimeText(stayConnectedTill));
delayedDisconnectionThread();
}
get().getServiceConnector().connect();
@ -159,18 +170,16 @@ public class Connector {
public static void disconnectFromPump() {
if (Helpers.tsl() >= stayConnectedTill) {
log("Requesting real pump disconnect");
if (L.isEnabled(L.PUMP))
log.debug("Requesting real pump disconnect");
get().getServiceConnector().disconnect();
} else {
log("Cannot disconnect as due to keep alive till: " + Helpers.dateTimeText(stayConnectedTill));
if (L.isEnabled(L.PUMP))
log.debug("Cannot disconnect as due to keep alive till: " + Helpers.dateTimeText(stayConnectedTill));
// TODO set a disconnection timer?
}
}
static void log(String msg) {
android.util.Log.e("INSIGHTPUMP", msg);
}
static String getLocalVersion() {
return COMPATIBILITY_VERSION;
}
@ -206,7 +215,8 @@ public class Connector {
if (keepAliveActive()) {
if (Helpers.ratelimit("extend-insight-keepalive", 10)) {
stayConnectedTill = Helpers.tsl() + stayConnectedTime;
log("Keep-alive extended until: " + Helpers.dateTimeText(stayConnectedTill));
if (L.isEnabled(L.PUMP))
log.debug("Keep-alive extended until: " + Helpers.dateTimeText(stayConnectedTill));
}
}
}
@ -236,7 +246,8 @@ public class Connector {
try {
while (disconnect_thread_running && keepAliveActive()) {
if (Helpers.ratelimit("insight-expiry-notice", 5)) {
log("Staying connected thread expires: " + Helpers.dateTimeText(stayConnectedTill));
if (L.isEnabled(L.PUMP))
log.debug("Staying connected thread expires: " + Helpers.dateTimeText(stayConnectedTill));
}
try {
Thread.sleep(1000);
@ -246,10 +257,12 @@ public class Connector {
}
if (disconnect_thread_running) {
log("Sending the real delayed disconnect");
if (L.isEnabled(L.PUMP))
log.debug("Sending the real delayed disconnect");
get().getServiceConnector().disconnect();
} else {
log("Disconnect thread already terminating");
if (L.isEnabled(L.PUMP))
log.debug("Disconnect thread already terminating");
}
} finally {
Helpers.releaseWakeLock(wl);
@ -258,7 +271,8 @@ public class Connector {
}
}).start();
} else {
log("Disconnect thread already running");
if (L.isEnabled(L.PUMP))
log.debug("Disconnect thread already running");
}
}
}
@ -269,7 +283,8 @@ public class Connector {
public synchronized void shutdown() {
if (instance != null) {
log("Attempting to shut down connector");
if (L.isEnabled(L.PUMP))
log.debug("Attempting to shut down connector");
try {
disconnect_thread_running = false;
try {
@ -285,17 +300,17 @@ public class Connector {
try {
instance.serviceConnector.disconnect();
} catch (Exception e) {
log("Exception disconnecting: " + e);
log.error("Exception disconnecting: " + e);
}
try {
instance.serviceConnector.disconnectFromService();
} catch (Exception e) {
log("Excpetion disconnecting service: " + e);
log.error("Excpetion disconnecting service: " + e);
}
instance.serviceConnector = null;
instance = null;
} catch (Exception e) {
log("Exception shutting down: " + e);
log.error("Exception shutting down: " + e);
}
}
}
@ -309,7 +324,8 @@ public class Connector {
}
public synchronized void init() {
log("Connector::init()");
if (L.isEnabled(L.PUMP))
log.debug("Connector::init()");
if (serviceConnector == null) {
companionAppInstalled = isCompanionAppInstalled();
if (companionAppInstalled) {
@ -318,9 +334,11 @@ public class Connector {
serviceConnector.addStatusCallback(statusCallback);
serviceConnector.setConnectionCallback(connectionCallback);
serviceConnector.connectToService();
log("Trying to connect");
if (L.isEnabled(L.PUMP))
log.debug("Trying to connect");
} else {
log("Not trying init due to missing companion app");
if (L.isEnabled(L.PUMP))
log.debug("Not trying init due to missing companion app");
}
} else {
if (!serviceConnector.isConnectedToService()) {
@ -328,7 +346,8 @@ public class Connector {
serviceConnector = null;
init();
} else {
log("Trying to reconnect to service (" + serviceReconnects + ")");
if (L.isEnabled(L.PUMP))
log.debug("Trying to reconnect to service (" + serviceReconnects + ")");
serviceConnector.connectToService();
serviceReconnects++;
}
@ -384,7 +403,8 @@ public class Connector {
}
if (!isConnected()) {
log("Not connected to companion");
if (L.isEnabled(L.PUMP))
log.debug("Not connected to companion");
if (Helpers.ratelimit("insight-app-not-connected", 5)) {
init();
}
@ -499,7 +519,8 @@ public class Connector {
Long total = statistics.get(last);
if (total == null) total = 0L;
statistics.put(last, total + Helpers.msSince(since));
log("Updated statistics for: " + last + " total: " + Helpers.niceTimeScalar(statistics.get(last)));
if (L.isEnabled(L.PUMP))
log.debug("Updated statistics for: " + last + " total: " + Helpers.niceTimeScalar(statistics.get(last)));
// TODO persist data
}
}
@ -534,11 +555,13 @@ public class Connector {
if (SP.getBoolean("insight_preemptive_connect", true)) {
switch (ev.getFeature()) {
case WIZARD:
log("Wizard feature detected, preconnecting to pump");
if (L.isEnabled(L.PUMP))
log.debug("Wizard feature detected, preconnecting to pump");
connectToPump(120 * 1000);
break;
case MAIN:
log("Main feature detected, preconnecting to pump");
if (L.isEnabled(L.PUMP))
log.debug("Main feature detected, preconnecting to pump");
connectToPump(30 * 1000);
break;
}

View file

@ -12,7 +12,6 @@ public class EventInsightCallback extends Event {
public UUID request_uuid;
public boolean success = false;
public String message = null;
public int response_id = -1;
public Object response_object = null;
public EventInsightCallback() {

View file

@ -1,15 +1,22 @@
package info.nightscout.androidaps.plugins.PumpInsight.history;
import android.content.Intent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.db.CareportalEvent;
import info.nightscout.androidaps.db.TDD;
import info.nightscout.androidaps.logging.L;
import info.nightscout.utils.DateUtil;
import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.utils.SP;
import org.json.JSONException;
import org.json.JSONObject;
import sugar.free.sightparser.handling.HistoryBroadcast;
import java.util.Date;
@ -23,6 +30,7 @@ import static info.nightscout.androidaps.plugins.PumpInsight.history.PumpIdCache
*/
class HistoryIntentAdapter {
private Logger log = LoggerFactory.getLogger(L.PUMP);
private HistoryLogAdapter logAdapter = new HistoryLogAdapter();
@ -30,10 +38,6 @@ class HistoryIntentAdapter {
return (Date) intent.getSerializableExtra(name);
}
private static void log(String msg) {
android.util.Log.e("HistoryIntentAdapter", msg);
}
static long getRecordUniqueID(long pump_serial_number, long pump_record_id) {
updatePumpSerialNumber(pump_serial_number);
return (pump_serial_number * 10000000) + pump_record_id;
@ -52,13 +56,14 @@ class HistoryIntentAdapter {
final Date start_time = getDateExtra(intent, HistoryBroadcast.EXTRA_START_TIME);
if ((pump_tbr_duration == -1) || (pump_tbr_percent == -1) || (pump_record_id == -1)) {
log("Invalid TBR record!!!");
log.error("Invalid TBR record!!!");
return;
}
final long record_unique_id = getRecordUniqueID(pump_serial_number, pump_record_id);
log("Creating TBR record: " + pump_tbr_percent + "% " + pump_tbr_duration + "m" + " id:" + record_unique_id);
if (L.isEnabled(L.PUMP))
log.debug("Creating TBR record: " + pump_tbr_percent + "% " + pump_tbr_duration + "m" + " id:" + record_unique_id);
logAdapter.createTBRrecord(start_time, pump_tbr_percent, pump_tbr_duration, record_unique_id);
}
@ -82,7 +87,7 @@ class HistoryIntentAdapter {
switch (bolus_type) {
case "STANDARD":
if (immediate_amount == -1) {
log("ERROR Standard bolus fails sanity check");
log.error("ERROR Standard bolus fails sanity check");
return;
}
LiveHistory.setStatus(bolus_type + " BOLUS\n" + immediate_amount + "U ", event_time.getTime());
@ -91,7 +96,7 @@ class HistoryIntentAdapter {
case "EXTENDED":
if ((extended_insulin == -1) || (extended_minutes == -1)) {
log("ERROR: Extended bolus fails sanity check");
log.error("ERROR: Extended bolus fails sanity check");
return;
}
LiveHistory.setStatus(bolus_type + " BOLUS\n" + extended_insulin + "U over " + extended_minutes + " min, ", event_time.getTime());
@ -100,7 +105,7 @@ class HistoryIntentAdapter {
case "MULTIWAVE":
if ((immediate_amount == -1) || (extended_insulin == -1) || (extended_minutes == -1)) {
log("ERROR: Multiwave bolus fails sanity check");
log.error("ERROR: Multiwave bolus fails sanity check");
return;
}
LiveHistory.setStatus(bolus_type + " BOLUS\n" + immediate_amount + "U + " + extended_insulin + "U over " + extended_minutes + " min, ", event_time.getTime());
@ -108,7 +113,7 @@ class HistoryIntentAdapter {
logAdapter.createExtendedBolusRecord(start_time, extended_insulin, extended_minutes, record_unique_id);
break;
default:
log("ERROR, UNKNWON BOLUS TYPE: " + bolus_type);
log.error("ERROR, UNKNWON BOLUS TYPE: " + bolus_type);
}
}
@ -137,7 +142,8 @@ class HistoryIntentAdapter {
private void uploadCareportalEvent(Date date, String event) {
if (SP.getBoolean("insight_automatic_careportal_events", false)) {
if (MainApp.getDbHelper().getCareportalEventFromTimestamp(date.getTime()) != null) return;
if (MainApp.getDbHelper().getCareportalEventFromTimestamp(date.getTime()) != null)
return;
try {
JSONObject data = new JSONObject();
String enteredBy = SP.getString("careportal_enteredby", "");
@ -157,7 +163,8 @@ class HistoryIntentAdapter {
String alertType = intent.getStringExtra(HistoryBroadcast.EXTRA_ALERT_TYPE);
int alertText = getAlertText(alertType);
if (alertText == 0) return;
if (MainApp.getDbHelper().getCareportalEventFromTimestamp(date.getTime()) != null) return;
if (MainApp.getDbHelper().getCareportalEventFromTimestamp(date.getTime()) != null)
return;
logNote(date, MainApp.gs(alertText));
}
}
@ -195,7 +202,8 @@ class HistoryIntentAdapter {
private void logNote(Date date, String note) {
try {
if (MainApp.getDbHelper().getCareportalEventFromTimestamp(date.getTime()) != null) return;
if (MainApp.getDbHelper().getCareportalEventFromTimestamp(date.getTime()) != null)
return;
JSONObject data = new JSONObject();
String enteredBy = SP.getString("careportal_enteredby", "");
if (!enteredBy.equals("")) data.put("enteredBy", enteredBy);

View file

@ -1,5 +1,8 @@
package info.nightscout.androidaps.plugins.PumpInsight.history;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Date;
import info.nightscout.androidaps.MainApp;
@ -7,6 +10,7 @@ import info.nightscout.androidaps.data.DetailedBolusInfo;
import info.nightscout.androidaps.db.ExtendedBolus;
import info.nightscout.androidaps.db.Source;
import info.nightscout.androidaps.db.TemporaryBasal;
import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
/**
@ -16,13 +20,10 @@ import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
*/
class HistoryLogAdapter {
private Logger log = LoggerFactory.getLogger(L.PUMP);
private static final long MAX_TIME_DIFFERENCE = 61000;
private static void log(String msg) {
android.util.Log.e("HISTORYLOG", msg);
}
void createTBRrecord(Date eventDate, int percent, int duration, long record_id) {
TemporaryBasal temporaryBasal = new TemporaryBasal().date(eventDate.getTime());
@ -30,23 +31,29 @@ class HistoryLogAdapter {
final TemporaryBasal temporaryBasalFromHistory = TreatmentsPlugin.getPlugin().getTempBasalFromHistory(eventDate.getTime());
if (temporaryBasalFromHistory == null) {
log("Create new TBR: " + eventDate + " " + percent + " " + duration);
if (L.isEnabled(L.PUMP))
log.debug("Create new TBR: " + eventDate + " " + percent + " " + duration);
} else {
log("Loaded existing TBR record: " + temporaryBasalFromHistory.toString());
if (L.isEnabled(L.PUMP))
log.debug("Loaded existing TBR record: " + temporaryBasalFromHistory.toString());
if (Math.abs(eventDate.getTime() - temporaryBasalFromHistory.date) < MAX_TIME_DIFFERENCE) {
if (temporaryBasalFromHistory.source != Source.PUMP) {
if (temporaryBasalFromHistory.percentRate == percent) {
log("Things seem to match: %" + percent);
if (L.isEnabled(L.PUMP))
log.debug("Things seem to match: %" + percent);
temporaryBasal = temporaryBasalFromHistory;
MainApp.getDbHelper().delete(temporaryBasalFromHistory);
} else {
log("This record has different percent rates: " + temporaryBasalFromHistory.percentRate + " vs us: " + percent);
if (L.isEnabled(L.PUMP))
log.debug("This record has different percent rates: " + temporaryBasalFromHistory.percentRate + " vs us: " + percent);
}
} else {
log("This record is already a pump record!");
if (L.isEnabled(L.PUMP))
log.debug("This record is already a pump record!");
}
} else {
log("Time difference too great! : " + (eventDate.getTime() - temporaryBasalFromHistory.date));
if (L.isEnabled(L.PUMP))
log.debug("Time difference too great! : " + (eventDate.getTime() - temporaryBasalFromHistory.date));
}
}

View file

@ -54,10 +54,6 @@ public class HistoryReceiver {
// History
private static void log(String msg) {
android.util.Log.e("INSIGHTPUMPHR", msg);
}
public static String getStatusString() {
return status.toString();
}

View file

@ -1,5 +1,9 @@
package info.nightscout.androidaps.plugins.PumpInsight.history;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.logging.L;
import info.nightscout.utils.SP;
/**
@ -7,18 +11,16 @@ import info.nightscout.utils.SP;
*/
public class PumpIdCache {
private static Logger log = LoggerFactory.getLogger(L.PUMP);
private static final String INSIGHT_PUMP_ID_PREF = "insight-pump-id";
private static long cachedPumpSerialNumber = -1;
private static void log(String msg) {
android.util.Log.e("PumpIdCache", msg);
}
static void updatePumpSerialNumber(long pump_serial_number) {
if (pump_serial_number != cachedPumpSerialNumber) {
cachedPumpSerialNumber = pump_serial_number;
log("Updating pump serial number: " + pump_serial_number);
if (L.isEnabled(L.PUMP))
log.debug("Updating pump serial number: " + pump_serial_number);
SP.putLong(INSIGHT_PUMP_ID_PREF, cachedPumpSerialNumber);
}
}

View file

@ -7,6 +7,9 @@ import android.os.Handler;
import android.os.PowerManager;
import android.util.Log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
@ -16,17 +19,17 @@ import java.util.Map;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.logging.L;
/**
* Created by jamorham on 24/01/2018.
*
* <p>
* Useful utility methods from xDrip+
*
*/
public class Helpers {
private static Logger log = LoggerFactory.getLogger(L.PUMP);
private static final String TAG = "InsightHelpers";
private static final Map<String, Long> rateLimits = new HashMap<>();
// singletons to avoid repeated allocation
@ -37,7 +40,8 @@ public class Helpers {
public static synchronized boolean ratelimit(String name, int seconds) {
// check if over limit
if ((rateLimits.containsKey(name)) && (tsl() - rateLimits.get(name) < (seconds * 1000))) {
Log.d(TAG, name + " rate limited: " + seconds + " seconds");
if (L.isEnabled(L.PUMP))
log.debug(name + " rate limited: " + seconds + " seconds");
return false;
}
// not over limit
@ -65,7 +69,7 @@ public class Helpers {
} catch (PackageManager.NameNotFoundException e) {
return false;
} catch (Exception e) {
Log.wtf(TAG, "Exception trying to determine packages! " + e);
log.error("Exception trying to determine packages! " + e);
return false;
}
}
@ -160,7 +164,7 @@ public class Helpers {
public static String niceTimeScalarBrief(long t) {
// TODO i18n wont work for non-latin characterset
return niceTimeScalar(t).replaceFirst("([a-z])[a-z]*", "$1").replace(" ","");
return niceTimeScalar(t).replaceFirst("([a-z])[a-z]*", "$1").replace(" ", "");
}
public static String hourMinuteString(long timestamp) {

View file

@ -32,7 +32,6 @@ import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress;
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpType;
import info.nightscout.androidaps.plugins.PumpCommon.utils.PumpUtil;
import info.nightscout.androidaps.plugins.PumpVirtual.events.EventVirtualPumpUpdateGui;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.utils.DateUtil;
@ -42,42 +41,16 @@ import info.nightscout.utils.SP;
* Created by mike on 05.08.2016.
*/
public class VirtualPumpPlugin extends PluginBase implements PumpInterface {
private static Logger log = LoggerFactory.getLogger(VirtualPumpPlugin.class);
private Logger log = LoggerFactory.getLogger(L.PUMP);
Integer batteryPercent = 50;
Integer reservoirInUnits = 50;
private static VirtualPumpPlugin plugin = null;
public static VirtualPumpPlugin getPlugin() {
loadFakingStatus();
if (plugin == null)
plugin = new VirtualPumpPlugin();
return plugin;
}
static Integer batteryPercent = 50;
static Integer reservoirInUnits = 50;
private boolean fromNSAreCommingFakedExtendedBoluses = false;
private PumpType pumpType = null;
private long lastDataTime = 0;
private static boolean fromNSAreCommingFakedExtendedBoluses = false;
private PumpDescription pumpDescription = new PumpDescription();
PumpType pumpType = null;
private static void loadFakingStatus() {
fromNSAreCommingFakedExtendedBoluses = SP.getBoolean(R.string.key_fromNSAreCommingFakedExtendedBoluses, false);
}
public static void setFakingStatus(boolean newStatus) {
fromNSAreCommingFakedExtendedBoluses = newStatus;
SP.putBoolean(R.string.key_fromNSAreCommingFakedExtendedBoluses, fromNSAreCommingFakedExtendedBoluses);
}
public static boolean getFakingStatus() {
return fromNSAreCommingFakedExtendedBoluses;
}
public VirtualPumpPlugin() {
super(new PluginDescription()
.mainType(PluginType.PUMP)
@ -118,6 +91,26 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface {
pumpDescription.is30minBasalRatesCapable = true;
}
public static VirtualPumpPlugin getPlugin() {
if (plugin == null)
plugin = new VirtualPumpPlugin();
plugin.loadFakingStatus();
return plugin;
}
private void loadFakingStatus() {
fromNSAreCommingFakedExtendedBoluses = SP.getBoolean(R.string.key_fromNSAreCommingFakedExtendedBoluses, false);
}
public boolean getFakingStatus() {
return fromNSAreCommingFakedExtendedBoluses;
}
public void setFakingStatus(boolean newStatus) {
fromNSAreCommingFakedExtendedBoluses = newStatus;
SP.putBoolean(R.string.key_fromNSAreCommingFakedExtendedBoluses, fromNSAreCommingFakedExtendedBoluses);
}
@Override
protected void onStart() {
super.onStart();
@ -144,8 +137,7 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface {
@Override
public PumpEnactResult loadTDDs() {
//no result, could read DB in the future?
PumpEnactResult result = new PumpEnactResult();
return result;
return new PumpEnactResult();
}
@Override
@ -232,8 +224,10 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface {
return 0d;
}
@Override
public PumpEnactResult deliverTreatment(DetailedBolusInfo detailedBolusInfo) {
PumpEnactResult result = new PumpEnactResult();
result.success = true;
result.bolusDelivered = detailedBolusInfo.insulin;
@ -267,11 +261,11 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface {
@Override
public void stopBolusDelivering() {
}
@Override
public PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes, Profile profile, boolean enforceNew) {
TemporaryBasal tempBasal = new TemporaryBasal()
.date(System.currentTimeMillis())
.absolute(absoluteRate)
@ -325,6 +319,7 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface {
PumpEnactResult result = cancelExtendedBolus();
if (!result.success)
return result;
ExtendedBolus extendedBolus = new ExtendedBolus();
extendedBolus.date = System.currentTimeMillis();
extendedBolus.insulin = insulin;
@ -398,7 +393,7 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface {
extended.put("Version", BuildConfig.VERSION_NAME + "-" + BuildConfig.BUILDVERSION);
try {
extended.put("ActiveProfile", profileName);
} catch (Exception e) {
} catch (Exception ignored) {
}
TemporaryBasal tb = TreatmentsPlugin.getPlugin().getTempBasalFromHistory(now);
if (tb != null) {
@ -459,7 +454,7 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface {
if (L.isEnabled(L.PUMP))
log.debug("New pump configuration found ({}), changing from previous ({})", pumpTypeNew, pumpType);
PumpUtil.setPumpDescription(pumpDescription, pumpTypeNew);
pumpDescription.setPumpDescription(pumpTypeNew);
this.pumpType = pumpTypeNew;

View file

@ -14,6 +14,7 @@ import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.db.CareportalEvent;
import info.nightscout.androidaps.db.ProfileSwitch;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.logging.L;
@ -82,6 +83,7 @@ public class SensitivityAAPSPlugin extends AbstractSensitivityPlugin {
List<CareportalEvent> siteChanges = MainApp.getDbHelper().getCareportalEventsFromTime(fromTime, CareportalEvent.SITECHANGE, true);
List<ProfileSwitch> profileSwitches = MainApp.getDbHelper().getProfileSwitchEventsFromTime(fromTime, true);
List<Double> deviationsArray = new ArrayList<>();
String pastSensitivity = "";
@ -105,6 +107,12 @@ public class SensitivityAAPSPlugin extends AbstractSensitivityPlugin {
pastSensitivity += "(SITECHANGE)";
}
// reset deviations after profile switch
if (ProfileSwitch.isEvent5minBack(profileSwitches, autosensData.time, true)) {
deviationsArray.clear();
pastSensitivity += "(PROFILESWITCH)";
}
double deviation = autosensData.deviation;
//set positive deviations to zero if bg < 80

View file

@ -14,6 +14,7 @@ import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.db.CareportalEvent;
import info.nightscout.androidaps.db.ProfileSwitch;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.logging.L;
@ -77,6 +78,7 @@ public class SensitivityOref0Plugin extends AbstractSensitivityPlugin {
List<CareportalEvent> siteChanges = MainApp.getDbHelper().getCareportalEventsFromTime(fromTime, CareportalEvent.SITECHANGE, true);
List<ProfileSwitch> profileSwitches = MainApp.getDbHelper().getProfileSwitchEventsFromTime(fromTime, true);
List<Double> deviationsArray = new ArrayList<>();
String pastSensitivity = "";
@ -100,6 +102,12 @@ public class SensitivityOref0Plugin extends AbstractSensitivityPlugin {
pastSensitivity += "(SITECHANGE)";
}
// reset deviations after profile switch
if (ProfileSwitch.isEvent5minBack(profileSwitches, autosensData.time, true)) {
deviationsArray.clear();
pastSensitivity += "(PROFILESWITCH)";
}
double deviation = autosensData.deviation;
//set positive deviations to zero if bg < 80

View file

@ -14,6 +14,7 @@ import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.db.CareportalEvent;
import info.nightscout.androidaps.db.ProfileSwitch;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.logging.L;
@ -76,6 +77,7 @@ public class SensitivityOref1Plugin extends AbstractSensitivityPlugin {
}
List<CareportalEvent> siteChanges = MainApp.getDbHelper().getCareportalEventsFromTime(fromTime, CareportalEvent.SITECHANGE, true);
List<ProfileSwitch> profileSwitches = MainApp.getDbHelper().getProfileSwitchEventsFromTime(fromTime, true);
List<Double> deviationsArray = new ArrayList<>();
String pastSensitivity = "";
@ -99,6 +101,12 @@ public class SensitivityOref1Plugin extends AbstractSensitivityPlugin {
pastSensitivity += "(SITECHANGE)";
}
// reset deviations after profile switch
if (ProfileSwitch.isEvent5minBack(profileSwitches, autosensData.time, true)) {
deviationsArray.clear();
pastSensitivity += "(PROFILESWITCH)";
}
double deviation = autosensData.deviation;
//set positive deviations to zero if bg < 80

View file

@ -12,6 +12,7 @@ import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.db.CareportalEvent;
import info.nightscout.androidaps.db.ProfileSwitch;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.logging.L;
@ -80,6 +81,7 @@ public class SensitivityWeightedAveragePlugin extends AbstractSensitivityPlugin
}
List<CareportalEvent> siteChanges = MainApp.getDbHelper().getCareportalEventsFromTime(fromTime, CareportalEvent.SITECHANGE, true);
List<ProfileSwitch> profileSwitches = MainApp.getDbHelper().getProfileSwitchEventsFromTime(fromTime, true);
String pastSensitivity = "";
int index = 0;
@ -109,6 +111,12 @@ public class SensitivityWeightedAveragePlugin extends AbstractSensitivityPlugin
pastSensitivity += "(SITECHANGE)";
}
// reset deviations after profile switch
if (ProfileSwitch.isEvent5minBack(profileSwitches, autosensData.time, true)) {
data.clear();
pastSensitivity += "(PROFILESWITCH)";
}
double deviation = autosensData.deviation;
//set positive deviations to zero if bg < 80

View file

@ -86,8 +86,8 @@ public class SourceNSClientPlugin extends PluginBase implements BgSourceInterfac
}
// Objectives 0
ObjectivesPlugin.bgIsAvailableInNS = true;
ObjectivesPlugin.saveProgress();
ObjectivesPlugin.getPlugin().bgIsAvailableInNS = true;
ObjectivesPlugin.getPlugin().saveProgress();
}
private void storeSgv(JSONObject sgvJson) {

View file

@ -13,6 +13,7 @@ import android.widget.TextView;
import org.json.JSONObject;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.utils.DecimalFormatter;
import info.nightscout.utils.JsonHelper;
@ -31,7 +32,7 @@ public class WizardInfoDialog extends DialogFragment implements OnClickListener
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.treatments_wizardinfo_dialog, null, false);
View view = inflater.inflate(R.layout.treatments_wizardinfo_dialog, container, false);
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

View file

@ -20,10 +20,14 @@ import android.widget.TextView;
import com.squareup.otto.Subscribe;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.services.Intents;
import info.nightscout.androidaps.data.Profile;
@ -42,6 +46,7 @@ import info.nightscout.utils.SP;
*/
public class TreatmentsProfileSwitchFragment extends SubscriberFragment implements View.OnClickListener {
private Logger log = LoggerFactory.getLogger(L.UI);
RecyclerView recyclerView;
LinearLayoutManager llm;
@ -129,6 +134,10 @@ public class TreatmentsProfileSwitchFragment extends SubscriberFragment implemen
@Override
public void onClick(View v) {
final ProfileSwitch profileSwitch = (ProfileSwitch) v.getTag();
if (profileSwitch == null) {
log.error("profileSwitch == null");
return;
}
switch (v.getId()) {
case R.id.profileswitch_remove:
AlertDialog.Builder builder = new AlertDialog.Builder(context);

View file

@ -298,7 +298,7 @@ public class CommandQueue {
return false;
}
Double rateAfterConstraints = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(insulin)).value();
Double rateAfterConstraints = MainApp.getConstraintChecker().applyExtendedBolusConstraints(new Constraint<>(insulin)).value();
// remove all unfinished
removeAll(Command.CommandType.EXTENDEDBOLUS);

View file

@ -2,6 +2,7 @@ package info.nightscout.androidaps.queue;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.content.ContextWrapper;
import android.os.PowerManager;
import android.os.SystemClock;
@ -34,12 +35,15 @@ public class QueueThread extends Thread {
private PowerManager.WakeLock mWakeLock;
public QueueThread(CommandQueue queue) {
QueueThread(CommandQueue queue) {
super();
this.queue = queue;
PowerManager powerManager = (PowerManager) MainApp.instance().getApplicationContext().getSystemService(Context.POWER_SERVICE);
mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "QueueThread");
Context context = MainApp.instance().getApplicationContext();
if (context != null) {
PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "QueueThread");
}
}
@Override

View file

@ -208,6 +208,10 @@ public class DataService extends IntentService {
double insulin = JsonHelper.safeGetDouble(json, "insulin");
double carbs = JsonHelper.safeGetDouble(json, "carbs");
String eventType = JsonHelper.safeGetString(json, "eventType");
if (eventType == null) {
log.debug("Wrong treatment. Ignoring : " + json.toString());
return;
}
if (insulin > 0 || carbs > 0) {
EventNsTreatment evtTreatment = new EventNsTreatment(mode, json);
MainApp.bus().post(evtTreatment);

View file

@ -21,6 +21,15 @@
android:layout_marginTop="-15dp"
android:background="@color/listdelimiter" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:paddingBottom="10dp"
android:text="@string/wear_wizard_settings"
android:textAppearance="?android:attr/textAppearanceLarge" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View file

@ -21,10 +21,13 @@
<string name="description_insulin_rapid">Действие на инсулините Humalog и NovoRapid / NovoLog</string>
<string name="description_insulin_ultra_rapid">Действие на инсулин Fiasp</string>
<string name="description_insulin_free_peak">Позволява да зададете сами пика на инсулиновата активност (не използвайте, ако сте нови потребители)</string>
<string name="description_loop">Включва или изключва затворения кръг (loop).</string>
<string name="description_ns_client">Синхронизира локалните данни с Nightscout</string>
<string name="description_ma">Алгоритъма, какъвто е бил през 2016</string>
<string name="description_ama">Алгоритъма, какъвто е бил през 2017</string>
<string name="description_smb">Най-новият алгоритъм (само за напреднали потребители)</string>
<string name="description_overview">Показва текущото състояние на вашия APS и бутони за най-често използваните действия</string>
<string name="description_persistent_notification">Показва известие с резюме на това, което прави вашия APS</string>
<string name="description_profile_local">Работа с профил, който е наличен само на този телефон (локален).</string>
<string name="description_profile_nightscout">Работа с профила, които сте дефинирали в Nightscout</string>
<string name="description_profile_simple">Работа с профил със само една стойност за всички часове.</string>
@ -47,6 +50,7 @@
<string name="description_source_xdrip">Получава данни за КЗ от xDrip.</string>
<string name="description_treatments">Записва всички процедури, които са били направени</string>
<string name="description_wear">Наблюдавайте и контролирайте AndroidAPS, от вашия WearOS часовник.</string>
<string name="description_xdrip_status_line">Покажи информация за вашия APS на xDrip + циферблат на часовник.</string>
<string name="description_sms_communicator">Дистанционно управление AndroidAPS чрез използване на SMS команди.</string>
<string name="objectives_button_start">Стартирай</string>
<string name="objectives_button_verify">Провери</string>
@ -125,6 +129,8 @@
<string name="configbuilder_constraints_description">Кои ограничения да се прилагат?</string>
<string name="days">дни</string>
<string name="constraints">Ограничения</string>
<string name="loop">Кръг - Loop</string>
<string name="configbuilder_loop">Режим на APS - Loop</string>
<string name="configbuilder_loop_description">Използвайте това, за да активирате loop интеграцията в \'AndroidAPS.</string>
<string name="loop_aps_label">Алгоритъм за APS</string>
<string name="loop_constraintsprocessed_label">След ограничения</string>
@ -157,6 +163,8 @@
<string name="configbuilder_bgsource_description">От къде трябва да AndroidAPS да си взима данни?</string>
<string name="xdrip">xDrip</string>
<string name="apsmode_title">APS режим</string>
<string name="closedloop">Затворен кръг</string>
<string name="openloop">Отворен кръг</string>
<string name="disabledloop">Loop изключен</string>
<string name="disableloop">Изключи Loop</string>
<string name="enableloop">Включи Loop</string>
@ -307,7 +315,13 @@
<string name="overview_bolusprogress_goingtodeliver" formatted="false">Ще достави %.2fЕ</string>
<string name="objectives_0_objective">Настройка на визуализацията и наблюдението, а също и анализиране на базалните нужди и коефициенти</string>
<string name="objectives_0_gate">Потвърждаване, че КЗ е достъпна в Найтскаут и данните за помпата се качват там</string>
<string name="objectives_1_objective">Стартиране в режим Отворен кръг (Open loop)</string>
<string name="objectives_1_gate">Работа в режим \"Отворен кръг\" за няколко дни и ръчно въвеждане на много временни базали. Настройте и използвайте временни и стандартни временни цели (напр. за активни или хипо-третирани въглехидрати)</string>
<string name="objectives_2_objective">Опитайте се да разбирате по-добре вашият APS в режим \"Отворен кръг\", включително препоръчваните временни базали</string>
<string name="objectives_2_gate">Определяне на макс. лимит на базалния инсулин и настройване в помпата и програмата</string>
<string name="objectives_3_objective">Стартиране на \"Затворен кръг\" с изключване на базал при ниска КЗ</string>
<string name="objectives_3_gate">Стартиране на \"Затворен кръг\" с макс. IOB=0 без твърде много събития тип ниска КЗ</string>
<string name="objectives_4_objective">Настройване на \"Затворен кръг\" чрез повишаване на максималният IOB над 0 и понижаване на целевите нива на КЗ</string>
<string name="objectives_4_gate">Прекарайте няколко дни по този начин, като поне една нощ нямате аларма за ниска КЗ.</string>
<string name="objectives_5_objective">Настройване на базалния инсулин и коефициенти ако е необходимо и активиране на auto-sens</string>
<string name="objectives_5_gate">Една седмица успешно дневно използване с редовно въвеждане на въглехидрати</string>
@ -316,11 +330,16 @@
<string name="objectives_7_gate">Вие трябва да прочетете wiki и увеличите maxIOB за да може SMB да работи добре! Добро начало е maxIOB = средния болус за хранене + 3 x най-големия базал от профила</string>
<string name="youareonallowedlimit">Достигнахте лимита</string>
<string name="noprofileselected">Няма избран профил</string>
<string name="smscommunicator_loophasbeendisabled">APS е деактивиран</string>
<string name="smscommunicator_loophasbeenenabled">APS е активиран</string>
<string name="smscommunicator_loopisdisabled">APS е изключен</string>
<string name="smscommunicator_loopisenabled">APS е включен</string>
<string name="valuelimitedto">%1$.2f ограничен до %2$.2f</string>
<string name="valueoutofrange" formatted="false">Стойността %s е извън границите</string>
<string name="smscommunicator_remotebasalnotallowed">Отдалечено прилагане на базал е забранено</string>
<string name="smscommunicator_remotecommandnotallowed">Отдалеченото управление е забранено</string>
<string name="smscommunicator_basalreplywithcode">За да стартирате базал от %1$.2fЕ отговорете с код %2$s</string>
<string name="smscommunicator_suspendreplywithcode">За да спрете APS за %1$d минути отговорете с код %2$s</string>
<string name="smscommunicator_tempbasalset">Временен базал от %1$.2fЕ/ч за %2$d мин стартиран успешно</string>
<string name="smscommunicator_tempbasalfailed">Неуспешно стартиране на временен базал</string>
<string name="smscommunicator_basalstopreplywithcode" formatted="false">За да спрете времен базал отговорете с код %s</string>
@ -439,7 +458,7 @@
<string name="openapsama_autosens_adjusttargets">Да променя ли autosens и целевата КЗ</string>
<string name="openapsama_autosens_adjusttargets_summary">По подразбиране: разрешено\nТова позволява на autosens да променя и целевите КЗ(освен чувствителност и базал).</string>
<string name="openapsama_bolussnooze_dia_divisor_summary">По подразбиране: 2\nBolus snooze се активира след като поставите болус за основно хранене, така Loop няма да пуснка/намаля базалите веднага след като сте се хранили. Примерът тук е с 2; така при 3 часа DIA това ще означава че bolus snooze ще бъде внимателно изместен 1.5 часа (3DIA/2).</string>
<string name="openapsama_min_5m_carbimpact_summary">По подразбиране: 3.0\nТова е настройка на количеството на покачване на КЗ при усвояване на въглехидратите за всеки 5 минути. По подразбиране 3мг/дл/5мин. Това се отразява на това колко бързо се усвояват COB според алгоритъма, и как това се отразява в предвиждането на КЗ, когато тя не се покачва или пада с различен темп от очакваното.</string>
<string name="openapsama_min_5m_carbimpact_summary">Стойност по подразбиране: 3.0 (АМА) или 8.0 (SMB). Това е настройка на количеството на покачване на КЗ при усвояване на въглехидратите за всеки 5 минути. По подразбиране 3мг/дл за 5мин. Това се отразява на това колко бързо се усвояват COB според алгоритъма, и как това се отразява в предвиждането на КЗ, когато тя не се покачва или пада с различен темп от очакваното.</string>
<string name="openapsama_link_to_preferncejson_doc_txt">Внимание! Обикновено Вие не трябва да променяте тези стойности. Моля НАТИСНЕТЕ ТУК, прочетете текста и бъдете сигурни, че го РАЗБИРАТЕ преди да направите каквито и да е промени!</string>
<string name="error_only_numeric_digits_allowed">Позволени са само числа</string>
<string name="error_only_numeric_digits_range_allowed">Позволени са числа между %1$s - %2$s</string>
@ -503,6 +522,10 @@
<string name="loopsuspended">Loop изключен</string>
<string name="loopsuspendedfor">Изключен (%1$d мин)</string>
<string name="loopsuperbolusfor">Суперболус (%1$d мин)</string>
<string name="suspendloopfor1h">Изключи APS за 1ч</string>
<string name="suspendloopfor2h">Изключи APS за 2ч</string>
<string name="suspendloopfor3h">Изключи APS за 3ч</string>
<string name="suspendloopfor10h">Изключи APS за 10 ч</string>
<string name="disconnectpumpfor15m">Изключи помпата за 15 мин.</string>
<string name="disconnectpumpfor30m">Изключи помпата за 30 мин.</string>
<string name="disconnectpumpfor1h">Изключи помпата за 1 ч</string>
@ -510,6 +533,8 @@
<string name="disconnectpumpfor3h">Изключи помпата за 3 ч</string>
<string name="resume">Възстанови</string>
<string name="smscommunicator_wrongduration">Грешна продължителност</string>
<string name="smscommunicator_loopsuspended">APS забранен</string>
<string name="smscommunicator_loopresumed">APS възобновен</string>
<string name="treatments_wizard_bgtrend_label">Δ за 15мин</string>
<string name="treatments_wizard_cob_label">СОВ</string>
<string name="superbolus">Суперболус</string>
@ -700,8 +725,10 @@
<string name="negativeonly">Само отрицателни</string>
<string name="overview_editquickwizard_usecob">Калкулиране на COB</string>
<string name="overview_editquickwizard_usetemptarget">Калкулиране на временни цели</string>
<string name="loopenabled">APS разрешен</string>
<string name="apsselected">Избран APS</string>
<string name="nsclienthaswritepermission">NSClient има права за запис</string>
<string name="closedmodeenabled">APS - Затворен кръг е позволен</string>
<string name="maxiobset">Максимален IOB е зададен правилно</string>
<string name="hasbgdata">Има данни за КЗ от избрания източник</string>
<string name="basalprofilenotaligned" formatted="false">Няма базални стойности за някои часове: %s</string>
@ -835,6 +862,7 @@
<string name="overview_show_basals">Базали</string>
<string name="no_action_selected">Няма избрано действие, нищо няма да се изпълни</string>
<string name="start_hypo_tt">Старт на вр. цел при хипо</string>
<string name="closed_loop_disabled_on_dev_branch">Използвате dev версия. Затворения кръг е недостъпен за Вас.</string>
<string name="engineering_mode_enabled">Режим за раработчици (Engineering mode) включен</string>
<string name="not_eng_mode_or_release">Режим за раработчици (Engineering mode) не е активиран и не е release версия</string>
<string name="pump_basebasalrate">%.2f Е</string>
@ -857,6 +885,7 @@
<string name="objectivenotfinished">ЦЕЛ %1$d не е завършена</string>
<string name="pumpisnottempbasalcapable">Помпата не поддържа временен базал</string>
<string name="novalidbasalrate">Няма валиден базал в помпата</string>
<string name="closedmodedisabledinpreferences">Затворения кръг е забранен в настройките</string>
<string name="autosensdisabledinpreferences">Аутосенс е забранен в настройките</string>
<string name="smbdisabledinpreferences">SMB е забранен в настройките</string>
<string name="limitingbasalratio">Ограничаване на макс. базална стойност до %1$.2f Е/ч поради %2$s</string>
@ -868,6 +897,7 @@
<string name="basal_set_correctly">Базалът е зададен коректно</string>
<string name="limitingpercentrate">Ограничаване на максималната процентна стойност до %1$d%% поради %2$s</string>
<string name="limitingbolus">Ограничаване на болус до %1$.1f Е поради %2$s</string>
<string name="limitingextendedbolus">Ограничение на удължен болус до %1$.1f Е поради %2$s</string>
<string name="limitingmaxiob">Ограничаване на макс. IOB до %1$.1f Е поради %2$s</string>
<string name="limitingcarbs">Ограничаване на въглехидрати до %1$d гр. поради %2$s</string>
<string name="limitingiob">Ограничаване на IOB до %1$.1f Е поради %2$s</string>
@ -878,6 +908,7 @@
<string name="record_pump_site_change">Запис смяна на сет</string>
<string name="record_insulin_cartridge_change">Запис смяна на резервоар</string>
<string name="smbalwaysdisabled">SMB \"винаги включен\" и \"след въглехидрати\" е забранен, защото е активен източник на КЗ, който не поддържа необходимата филтрация</string>
<string name="smbnotallowedinopenloopmode">SMB не е позволен в режим Отворен кръг</string>
<string name="food_short">Храна</string>
<string name="reset">нулиране</string>
<string name="waitingfortimesynchronization">Изчаква синхронизация на времето (%1$d сек)</string>
@ -898,7 +929,7 @@
<string name="nav_setupwizard">Съветник за настройване</string>
<string name="setupwizard_finish">КРАЙ</string>
<string name="setupwizard_language_prompt">Избиране на език</string>
<string name="boluserrorcode">Поискано: %1$.2fU Доставено: %2$.2fU Error code: %3$d</string>
<string name="boluserrorcode">Стартирано: %1$.2fЕ Доставено: %2$.2fЕ Код на грешка: %3$s</string>
<string name="firstinsulinincrement">Стойност на първия бърз бутон [e]</string>
<string name="secondinsulinincrement">Стойност на втория бърз бутон [e]</string>
<string name="thirdinsulinincrement">Стойност на третия бърз бутон [e]</string>
@ -985,6 +1016,7 @@
<string name="combo_invalid_setup">Невалидни настройки на помпата, проверете wiki и се уверете че меню Quick Info се казва QUICK INFO, с помощта на 360 софтуера.</string>
<string name="custom">По избор</string>
<string name="largetimedifftitle">Голяма времева разлика</string>
<string name="largetimediff">Голяма времева разлика: Помпата е изключена за повече от 1,5 часа. Моля, регулирайте ръчно времето на помпата и се уверете, че четенето на историята от помпата не води до неочаквано поведение. Ако е възможно, премахнете историята от помпата, преди да промените времето или да изключите затворения кръг за едно DIA след последното погрешно влизане в историята, но поне едно DIA отсега.</string>
<string name="careportal_removestartedevents"> AndroidAPS стартира</string>
<string name="storedsettingsfound">Открити са предишни настройки</string>
<string name="allow_hardware_pump_text">Внимание: Ако активирате и свържете с хардуерна помпа, AndroidAPS ще копира основните настройки от профила в помпата, като презапише съществуващата базова скорост, съхранявана на помпата. Уверете се, че имате правилните основни настройки в AndroidAPS. Ако не сте сигурни или не искате да презапишете основните настройки на помпата, натиснете Cancel и повторете превключването към помпата по-късно.</string>
@ -1012,6 +1044,13 @@
<string name="treatments_wizard_total_label">Общо</string>
<string name="calculation_short">Калк</string>
<string name="handshaking">Сдвояване</string>
<string name="sendlogfiles">Изпрати последните лог файлове на разработчиците. Непредвидена ситуация.</string>
<string name="maxbolusviolation">Превишавате макс болус</string>
<string name="commanderror">Грешка при команда</string>
<string name="speederror">Скорост грешка</string>
<string name="insulinlimitviolation">Нарушение на макс дневен инсулин</string>
<string name="loop_openmode_min_change">Минимална стойност за промяна [%]</string>
<string name="loop_openmode_min_change_summary">AndroidAPS ще покаже запитването за промяна на базала само ако е по-голямо от тази стойност.(Стандартно 30%)</string>
<plurals name="objective_days">
<item quantity="one">%1$d дeн</item>
<item quantity="other">%1$d дни</item>

View file

@ -458,7 +458,7 @@
<string name="openapsama_autosens_adjusttargets">Úprava cílové glykémie pomocí Autosens</string>
<string name="openapsama_autosens_adjusttargets_summary">Výchozí hodnota: zapnuto\nToto nastavení říká, že autosens může měnit také cílové hodnoty glykémií.</string>
<string name="openapsama_bolussnooze_dia_divisor_summary">Výchozí hodnota: 2\nToto nastavení říká, po jakou část z hodnoty DIA smyčka po bolusu čeká a nereaguje na změny glykémií (zde 3DIA/2 = 1,5h).</string>
<string name="openapsama_min_5m_carbimpact_summary">Výchozí hodnota: 3.0 Tato hodnota definuje minimální část strávených sacharidů za každých 5 min. Výchozí hodnota je 3mg/dl/5min. Tato hodnota ovlivňuje výpočet COB.</string>
<string name="openapsama_min_5m_carbimpact_summary">Výchozí hodnota: 3.0 (AMA) nebo 8.0 (SMB) mg/dl/5min. Tato hodnota definuje minimální část strávených sacharidů za každých 5 min. Tato hodnota ovlivňuje výpočet COB.</string>
<string name="openapsama_link_to_preferncejson_doc_txt">Pozor!\nZa normálních okolností tyto hodnoty nemusíte měnit. Klikněte ZDE, PŘEČTĚTE si informace a UJISTĚTE se, že jim rozumíte dříve, než je začnete měnit.</string>
<string name="error_only_numeric_digits_allowed">Povoleny pouze číslice.</string>
<string name="error_only_numeric_digits_range_allowed">Povoleny pouze čísla v rozsahu %1$s - %2$s.</string>
@ -897,6 +897,7 @@
<string name="basal_set_correctly">Bazál nastaven správně</string>
<string name="limitingpercentrate">Bazál omezen na %1$d%%: %2$s</string>
<string name="limitingbolus">Bolus omezen na %1$.1f U: %2$s</string>
<string name="limitingextendedbolus">Prodloužený bolus omezen na %1$.1f U: %2$s</string>
<string name="limitingmaxiob">Max IOB omezeno na %1$.1f U: %2$s</string>
<string name="limitingcarbs">Sacharidy omezeny na %1$d g: %2$s</string>
<string name="limitingiob">IOB omezeno na %1$.1f U: %2$s</string>
@ -928,7 +929,7 @@
<string name="nav_setupwizard">Průvodce nastavením</string>
<string name="setupwizard_finish">Dokončit</string>
<string name="setupwizard_language_prompt">Vyberte jazyk</string>
<string name="boluserrorcode">Požadováno: %1$.2fU Doručeno: %2$.2fU Chyba: %3$d</string>
<string name="boluserrorcode">Požadováno: %1$.2fU Doručeno: %2$.2fU Chyba: %3$s</string>
<string name="firstinsulinincrement">První přídavek inzulínu</string>
<string name="secondinsulinincrement">Druhý přídavek inzulínu</string>
<string name="thirdinsulinincrement">Třetí přídavek inzulínu</string>
@ -1043,6 +1044,10 @@
<string name="calculation_short">Kalk</string>
<string name="handshaking">Navazování spojení</string>
<string name="sendlogfiles">Odešlete dnešní soubory protokolů vývojářům spolu s tímto časem. Neočekávaná situace.</string>
<string name="maxbolusviolation">Překročen maximální bolus</string>
<string name="commanderror">Chyba příkazu</string>
<string name="speederror">Chyba rychlosti</string>
<string name="insulinlimitviolation">Překročen limit inzulínu</string>
<plurals name="objective_days">
<item quantity="one">%1$d den</item>
<item quantity="few">%1$d dnů</item>

View file

@ -459,7 +459,7 @@ maxIOB = durchschnittlicher Essensbolus + 3 x maximale Basalrate</string>
<string name="openapsama_autosens_adjusttargets">Autosense passt Zielwerte an</string>
<string name="openapsama_autosens_adjusttargets_summary">Vorgabe: erlaubt.\nErlaubt Autosense den Ziel-BZ-Bereich in Verbindung mit ISF und Basal anzupassen.</string>
<string name="openapsama_bolussnooze_dia_divisor_summary">Standarwert: 2\nBolus snooze (\"Bolus-Schlummer\") bremst den Loop nach einem Mahleiten-Bolus, damit dieser nicht mit niedrigen TBR reagiert, wenn Du gerade gegessen hast. Beispiel: Der Standardwert 2 bewirkt, dass bei einem 3 Stunden DIA der Bolus snooze während 1.5 Stunden nach dem Bolus linear ausläuft (3 h Dia / 2 = 1.5 h Bolus snooze).</string>
<string name="openapsama_min_5m_carbimpact_summary">Standardwert: 3.0\nDies ist eine Einstellung für die Standard-Kohlenhydrat-Absorptionswirkung pro 5 Minuten. Der Standardwert ist 3mg/dl/5min. Dies wirkt sich darauf aus, wie schnell der COB-Wert fällt und wieviel KH-Absorption bei der Berechnung des vorhergesagten BZ angenommen wird, wenn der BZ stärker als erwartet fällt oder nicht so stark wie erwartet steigt.</string>
<string name="openapsama_min_5m_carbimpact_summary">Standardwert: 3.0 (AMA) or 8.0 (SMB)\nDies ist eine Einstellung für die Standard-Kohlenhydrat-Absorptionswirkung pro 5 Minuten. Der Standardwert ist 3 mg/dl/5min (AMA) bzw. 8 mg/dl/5min (SMB). Dies wirkt sich darauf aus, wie schnell der COB-Wert fällt und wieviel KH-Absorption bei der Berechnung des vorhergesagten BZ angenommen wird, wenn der BZ stärker als erwartet fällt oder nicht so stark wie erwartet steigt.</string>
<string name="openapsama_link_to_preferncejson_doc_txt">Achtung!\nNormalerweise musst Du diese Werte nicht ändern. Bitte KLICKE HIER und LESE den Text. Verändere Werte erst, wenn Du den Inhalt des Textes verstanden hast.</string>
<string name="error_only_numeric_digits_allowed">Bitte verwende nur Ziffern.</string>
<string name="error_only_numeric_digits_range_allowed">Bitte verwende nur Ziffern von %1$s - %2$s.</string>
@ -929,7 +929,7 @@ maxIOB = durchschnittlicher Essensbolus + 3 x maximale Basalrate</string>
<string name="nav_setupwizard">Einrichtungsassistent</string>
<string name="setupwizard_finish">FERTIG</string>
<string name="setupwizard_language_prompt">Wähle Deine Sprache.</string>
<string name="boluserrorcode">Angefragt: %1$.2f IE. Abgegeben: %2$.2f IE. Fehlercode: %3$d</string>
<string name="boluserrorcode">Angefragt: %1$.2f IE. Abgegeben: %2$.2f IE. Fehlercode: %3$s</string>
<string name="firstinsulinincrement">Erste Insulin-Erhöhung</string>
<string name="secondinsulinincrement">Zweite Insulin-Erhöhung</string>
<string name="thirdinsulinincrement">Dritte Insulin-Erhöhung</string>
@ -1027,6 +1027,7 @@ maxIOB = durchschnittlicher Essensbolus + 3 x maximale Basalrate</string>
<string name="send_all_logs">Logs als E-Mail versenden</string>
<string name="delete_logs">Logs löschen</string>
<string name="error_adding_treatment_message">Der Eintrag (Insulin: %1$.2f, Kohlenhydrate: %2$d, um: %3$s) konnte nicht als Behandlung gespeichert werden. Bitte überprüfe die aktuelle Liste und füge, falls notwendig, den Datensatz manuell hinzu.</string>
<string name="generated_ecarbs_note">eCarbs: %1$d g (%2$d h), Verzögerung: %3$d m</string>
<string name="openaps_noasdata">Keine Autosens-Daten verfügbar</string>
<string name="nav_logsettings">Log-Einstellungen</string>
<string name="resettodefaults">Auf Standardwerte zurücksetzen</string>
@ -1034,6 +1035,8 @@ maxIOB = durchschnittlicher Essensbolus + 3 x maximale Basalrate</string>
<string name="as">AS</string>
<string name="versionavailable">Version %1$s ist verfügbar.</string>
<string name="time_offset">Zeit Verschiebung</string>
<string name="setupwizard_preferred_aps_mode">Bevorzugter APS-Modus</string>
<string name="treatments_wizard_total_label">Gesamt</string>
<plurals name="objective_days">
<item quantity="one">%1$d Tag</item>
<item quantity="other">%1$d Tage</item>

View file

@ -458,7 +458,6 @@
<string name="openapsama_autosens_adjusttargets">Autosens también ajusta los objetivos</string>
<string name="openapsama_autosens_adjusttargets_summary">Ajuste por defecto: true\nEsto se usa para permitir a autosens el ajuste de objetivos BG además de ISF y bases.</string>
<string name="openapsama_bolussnooze_dia_divisor_summary">Ajuste por defecto: 2 \nEl retardo del bolo se realiza después de suministrar un bolo de comida, por lo que el lazo no se contrarrestará con bajas temporales cuando acaba de comer. Con el valor predeterminado de 2 y siendo DIA de 3 horas, el retardo del del bolo se realizará gradualmente durante 1,5 horas (3 DIA / 2).</string>
<string name="openapsama_min_5m_carbimpact_summary">Ajustes por defecto: 3.0\nEsto es un ajuste por defecto para la absorción de carbohidratos cada 5 minutos. Por defecto se espera 3mg/dl/5min. Esto afecta la velocidad de reducción de COB y cuanta absorción se usa para calcular el BG futuro previsto, cuando la glucosa disminuye más de lo previsto o aumenta más de lo previsto.</string>
<string name="openapsama_link_to_preferncejson_doc_txt">Atención!\nNormalmente no tienes que editar los valores a continuación. Por favor PINCHA AQUI y LEE el texto y asegúrate que lo has ENTENDIDO antes de cambiar alguno de estos valores.</string>
<string name="error_only_numeric_digits_allowed">Sólo se permiten caracteres numéricos.</string>
<string name="error_only_numeric_digits_range_allowed">Sólo se permiten dígitos en el rango %1$s - %2$s</string>
@ -928,7 +927,6 @@
<string name="nav_setupwizard">Asistente de configuración</string>
<string name="setupwizard_finish">FINALIZAR</string>
<string name="setupwizard_language_prompt">Selecciona tu idioma</string>
<string name="boluserrorcode">Solicitado: %1$.2fU Entregado: %2$.2fU Código de error: %3$d</string>
<string name="firstinsulinincrement">Primer incremento insulina</string>
<string name="secondinsulinincrement">Segundo incremento insulina</string>
<string name="thirdinsulinincrement">Tercer incremento insulina</string>

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources>
<string name="nav_refreshtreatments">רענן טיפול מ-Nightscout</string>
<string name="danar_useextended_title">השתמש בבולוס מורחב של 200%</string>
<string name="alert_dialog_storage_permission_text">בבקשה אתחל את הסמרטפון שלך או תרענן את אפלקצית AndroidAPS בהגדרות המערכת
אחרת AndroidAPS לא יוכל לבצע רישום (חשוב לעקוב אחר ולוודא כי האלגוריתמים פועלים כראוי)!</string>
<string name="description_food">מציג את ההגדרות הקבועות מראש עבור מזון המוגדר ב-Nightscout</string>
<string name="description_loop">להפעיל או לכבות את הלולאה.</string>
<string name="description_ns_client">מסנכרן את הנתונים שלך עם Nightscout</string>
<string name="description_profile_nightscout">יבא פרופיל מ- Nightscout</string>
</resources>

View file

@ -2,17 +2,17 @@
<!--Generated by crowdin.com-->
<resources>
<string name="treatmentssafety_title">관리 안전설정</string>
<string name="treatmentssafety_maxbolus_title">최대 허용 식사주입인슐린 [U]</string>
<string name="treatmentssafety_maxbolus_title">최대 허용 Bolus [U]</string>
<string name="treatmentssafety_maxcarbs_title">최대 허용 탄수화물 [g]</string>
<string name="nav_preferences">설정</string>
<string name="nav_refreshtreatments">NS에서 관리 새로고침</string>
<string name="nav_resetdb">데이터베이스 초기화</string>
<string name="reset_db_confirm">데이터 베이스를 정말 초기화하시겠습니까?</string>
<string name="nav_exit">종료</string>
<string name="danar_useextended_title">&gt;200% 주입위한 확장식사주입</string>
<string name="danar_useextended_title">&gt;200% 주입위한 확장Bolus 사용</string>
<string name="danar_bt_name_title">다나R 블루투스</string>
<string name="ns_sync_use_absolute_title">기초주입량 절대값 사용하기</string>
<string name="alert_dialog_storage_permission_text">폰을 재부팅하고나 AndroidAPS를 재시작하세요 \n그렇지 않으면 로그가 기록이되지 않습니다.(알고리즘이 제대로 작동하는지 확인하기 위해 로그가 필요합니다.)!</string>
<string name="ns_sync_use_absolute_title">Basal 절대값 사용하기</string>
<string name="alert_dialog_storage_permission_text">폰을 재부팅하거나 AndroidAPS를 재시작하세요 \n그렇지 않으면 로그 기록이 되지 않습니다.(알고리즘이 정상적인 작동하는지 확인하기 위해 로그가 필요합니다.)!</string>
<string name="description_actions">일반 기능을 빠르게 실행시킬 버튼</string>
<string name="description_careportal">고급 로그 항목을 입력합니다.</string>
<string name="description_config_builder">활성화된 플러그인을 구성하는 데 사용됩니다.</string>
@ -58,7 +58,7 @@
<string name="nsprofileview_dia_label">인슐린활동시간(DIA):</string>
<string name="nsprofileview_ic_label">인슐린 대 탄수화물 비율(IC):</string>
<string name="nsprofileview_isf_label">인슐린 민감도(ISF):</string>
<string name="nsprofileview_basal_label">기초주입:</string>
<string name="nsprofileview_basal_label">Basal</string>
<string name="nsprofileview_target_label">목표:</string>
<string name="noprofileset">프로파일이 설정되지 않았습니다.</string>
<string name="treatments_insulin_label_string">인슐린:</string>
@ -80,12 +80,12 @@
<string name="treatments_wizard_carbs_label">탄수화물</string>
<string name="treatments_wizard_correction_label">교정</string>
<string name="insulin_unit_shortname">U</string>
<string name="treatments_wizard_bolusiob_label">식사주입 IOB</string>
<string name="treatments_wizard_bolusiob_label">Bolus IOB</string>
<string name="openapsma_run">지금 실행</string>
<string name="vitualpump_label">가상 펌프</string>
<string name="pump_basebasalrate_label">기본 기초주입량</string>
<string name="pump_tempbasal_label">임시기초주입</string>
<string name="virtualpump_extendedbolus_label">확장식사주입</string>
<string name="pump_basebasalrate_label">기본 Basal양</string>
<string name="pump_tempbasal_label">임시Basal</string>
<string name="virtualpump_extendedbolus_label">확장Bolus</string>
<string name="pump_battery_label">배터리</string>
<string name="pump_reservoir_label">인슐린 잔량</string>
<string name="virtualpump_resultok"></string>
@ -112,7 +112,7 @@
<string name="overview">개요</string>
<string name="nsprofile">NS 프로파일</string>
<string name="simpleprofile">Simple 프로파일</string>
<string name="tempbasal">임시기초</string>
<string name="tempbasal">임시Basal</string>
<string name="treatments">관리</string>
<string name="virtualpump">가상펌프</string>
<string name="careportal">케어포털</string>
@ -134,7 +134,7 @@
<string name="configbuilder_loop_description">AndroidAPS의 Loop를 활성하기 위해서 이것을 사용하세요.</string>
<string name="loop_aps_label">APS</string>
<string name="loop_constraintsprocessed_label">제약 적용 후</string>
<string name="loop_tbrsetbypump_label">펌프에 의한 임시기초설정</string>
<string name="loop_tbrsetbypump_label">펌프에 의한 임시Basal 설정</string>
<string name="openapsma_lastenact_label">최근 실행</string>
<string name="ok"></string>
<string name="cancel">취소</string>
@ -142,23 +142,23 @@
<string name="safety">안전성</string>
<string name="openapsma_disabled">플러그인이 사용불가능 합니다</string>
<string name="constraints_violation">제한 위반</string>
<string name="treatmentdeliveryerror">식사주입 전송 에러</string>
<string name="tempbasaldeliveryerror">임시기초주입 전송 에러</string>
<string name="overview_newtempbasal_basalpercent">기초주입 양[%]</string>
<string name="treatmentdeliveryerror">Bolus 주입 에러</string>
<string name="tempbasaldeliveryerror">임시Basal 주입 에러</string>
<string name="overview_newtempbasal_basalpercent">Basal값[%]</string>
<string name="overview_newtempbasal_percent_label">% (100% = 현재)</string>
<string name="setbasalquestion">새 임시기초주입 적용:</string>
<string name="setbasalquestion">새 임시Basal 적용:</string>
<string name="overview_treatment_label">관리</string>
<string name="overview_calculator_label">계산기</string>
<string name="constraintapllied">제한 적용!</string>
<string name="confirmation">확인</string>
<string name="entertreatmentquestion">새 Treatment 입력:</string>
<string name="bolus">식사주입</string>
<string name="bolus">Bolus</string>
<string name="sms_bolus">Bolus:</string>
<string name="basal">기초주입</string>
<string name="basal">Basal</string>
<string name="sms_basal">Basal:</string>
<string name="carbs">탄수화물</string>
<string name="changeyourinput">입력값을 변경하세요!</string>
<string name="setextendedbolusquestion">새 확장식사주입 설정:</string>
<string name="setextendedbolusquestion">새 확장Bolus 설정:</string>
<string name="configbuilder_bgsource">혈당 소스</string>
<string name="configbuilder_bgsource_description">AndroidAPS가 어디에서 데이터를 가져옵니까?</string>
<string name="xdrip">xDrip</string>
@ -176,8 +176,8 @@
<string name="objectives_pumpstatusavailableinns">NS에서 펌프상태가 확인 가능합니다.</string>
<string name="objectives_manualenacts">수동 주입</string>
<string name="loopdisabled">제한으로 인해 LOOP가 사용불가합니다.</string>
<string name="treatments_wizard_basaliob_label">기초주입 IOB</string>
<string name="bolusconstraintapplied">식사주입 제한이 적용되었습니다</string>
<string name="treatments_wizard_basaliob_label">Basal IOB</string>
<string name="bolusconstraintapplied">Bolus 제한이 적용되었습니다</string>
<string name="carbsconstraintapplied">탄수화물 제한이 적용되었습니다</string>
<string name="careportal_bgcheck">혈당 체크</string>
<string name="careportal_announcement">알림</string>
@ -189,12 +189,12 @@
<string name="careportal_cgmsensorstart">CGM 센서 시작</string>
<string name="careportal_insulincartridgechange">인슐린 카트리지 교체</string>
<string name="careportal_profileswitch">프로파일 변경</string>
<string name="careportal_snackbolus">간식 주입</string>
<string name="careportal_mealbolus">식사 주입</string>
<string name="careportal_correctionbolus">교정 주입</string>
<string name="careportal_combobolus">콤보 주입</string>
<string name="careportal_tempbasalstart">임시 기초 시작</string>
<string name="careportal_tempbasalend">임시 기초 종료</string>
<string name="careportal_snackbolus">간식Bolus</string>
<string name="careportal_mealbolus">식사Bolus</string>
<string name="careportal_correctionbolus">교정Bolus</string>
<string name="careportal_combobolus">콤보Bolus</string>
<string name="careportal_tempbasalstart">임시Basal 시작</string>
<string name="careportal_tempbasalend">임시Basal 종료</string>
<string name="careportal_carbscorrection">탄수화물 교정</string>
<string name="careportal_openapsoffline">OpenAPS 오프라인</string>
<string name="careportal_newnstreatment_eventtype">이벤트 종류</string>
@ -214,8 +214,8 @@
<string name="careportal_newnstreatment_enteredby_title">입력자</string>
<string name="careportal_newnstreatment_glucosetype">혈당 종류</string>
<string name="noprofile">아직 NS에서 프로파일을 로드하지 못했습니다.</string>
<string name="overview_tempbasal_button">임시기초주입</string>
<string name="overview_extendedbolus_button">확장식사주입</string>
<string name="overview_tempbasal_button">임시Basal</string>
<string name="overview_extendedbolus_button">확장 Bolus</string>
<string name="configbuilder_nightscoutversion_label">Nightscout 버전:</string>
<string name="missing">누락</string>
<string name="exported">설정이 저장되었습니다</string>
@ -225,9 +225,9 @@
<string name="filenotfound">파일을 찾을 수 없습니다</string>
<string name="nav_export">설정 저장하기</string>
<string name="nav_import">설정 불러오기</string>
<string name="openapsma_maxbasal_title">임시기초주입 최대량 [U/hr]</string>
<string name="openapsma_maxbasal_summary">이 값은 OpenAPS에서 Max Basal(임시기초주입 최대량)로 설정되는 값입니다</string>
<string name="openapsma_maxiob_title">OpenAPS가 주입할수 있는 최대 기초주입 IOB [U]</string>
<string name="openapsma_maxbasal_title">임시Basal 최대량 [U/hr]</string>
<string name="openapsma_maxbasal_summary">이 값은 OpenAPS에서 Max Basal(최대 Basal)로 설정되는 값입니다</string>
<string name="openapsma_maxiob_title">OpenAPS가 주입할수 있는 최대 Basal IOB [U]</string>
<string name="openapsma_maxiob_summary">이 값은 OpenAPS에서 Max IOB라고 부르는 값입니다\n기본값은 0으로 설정되어 있습니다. 몇일 혹은 몇주 정도 사용 후 적절한 값으로 변경할 수 있습니다.</string>
<string name="dismiss">무시</string>
<string name="danarpump">다나R</string>
@ -236,9 +236,7 @@
<string name="disconnected">연결 끊김</string>
<string name="danar_pump_settings">다나R 펌프 설정</string>
<string name="end_user_license_agreement">최종 사용자 라이선스 동의서</string>
<string name="end_user_license_agreement_text">이 프로그램을 의학적 결정을 내리는 데 사용해서는 안되며, 여기에 대한 어떠한 보증도 없습니다. 이 프로그램의 품질과 성능에 관한 모든 위험은 사용자에게 있습니다.
MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</string>
<string name="end_user_license_agreement_text">이 프로그램을 의학적 결정을 내리는 데 사용해서는 안되며, 여기에 대한 어떠한 보증도 없습니다. 이 프로그램의 품질과 성능에 관한 모든 위험은 사용자에게 있습니다.\nMUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</string>
<string name="end_user_license_agreement_i_understand">모두 이해하였고 동의합니다.</string>
<string name="save">저장</string>
<string name="nobtadapter">블루투스 어댑터를 찾지 못했습니다</string>
@ -246,7 +244,7 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="connectionerror">펌프 연결 에러</string>
<string name="danar_iob_label">펌프 IOB</string>
<string name="danar_dailyunits">일 인슐린 총량</string>
<string name="pump_lastbolus_label">최근 식사주입:</string>
<string name="pump_lastbolus_label">최근 Bolus:</string>
<string name="hoursago">%.1f시간 전</string>
<string name="danar_invalidinput">사용할수 없는 입력 데이터</string>
<string name="danar_valuenotsetproperly">값이 제대로 설정되지 않았습니다</string>
@ -257,20 +255,20 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="success">성공</string>
<string name="percent">퍼센트</string>
<string name="absolute">절대값</string>
<string name="canceltemp">임시기초주입 취소하기</string>
<string name="canceltemp">임시Basal 취소하기</string>
<string name="smscommunicator">SMS 통신기</string>
<string name="waitingforpumpresult">결과 기다리는 중</string>
<string name="smscommunicator_allowednumbers">허가된 전화번호</string>
<string name="smscommunicator_allowednumbers_summary">+XXXXXXXXXX;+YYYYYYYYYY</string>
<string name="smscommunicator_bolusreplywithcode">식사주입 %1$.2fU 을 실행하려면 %2$s 를 입력하고 답장하세요</string>
<string name="smscommunicator_bolusreplywithcode">Bolus %1$.2fU 을 주입하려면 %2$s 를 입력하고 답장하세요</string>
<string name="smscommunicator_calibrationreplywithcode">보정값 %1$.2f을 전송하려면 %2$s 를 입력하고 답장하세요</string>
<string name="smscommunicator_bolusfailed">Bolus failed</string>
<string name="bolusdelivered" formatted="false">식사주입 %.2fU이 주입되었습니다.</string>
<string name="bolusdelivered" formatted="false">Bolus %.2fU이 주입되었습니다.</string>
<string name="bolusrequested" formatted="false">%.2fU 주입 예정입니다.</string>
<string name="smscommunicator_bolusdelivered" formatted="false">Bolus %.2fU delivered successfully</string>
<string name="bolusdelivering" formatted="false">%.2fU 주입중</string>
<string name="smscommunicator_remotecommandsallowed">SMS 원격 명령 사용하기</string>
<string name="smscommunicator_remotebolusnotallowed">원격 식사주입 허용되지 않음</string>
<string name="smscommunicator_remotebolusnotallowed">원격 Bolus 허용되지 않음</string>
<string name="glucosetype_finger">체혈</string>
<string name="glucosetype_sensor">센서</string>
<string name="manual">수동</string>
@ -279,7 +277,7 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="danarprofile">DanaR 프로파일 설정</string>
<string name="danarprofile_dia">인슐린활동시간(DIA) [h]</string>
<string name="danarprofile_dia_summary">인슐린 활동 기간</string>
<string name="failedupdatebasalprofile">기초주입 프로파일 갱신 실패</string>
<string name="failedupdatebasalprofile">Basal 프로파일 갱신 실패</string>
<string name="danar_historyreload">새로고침</string>
<string name="uploading">업로드중</string>
<string name="danar_ebolus">E bolus</string>
@ -287,15 +285,15 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="danar_debolus">DE bolus</string>
<string name="danar_error">에러</string>
<string name="danar_refill">교체</string>
<string name="danar_basalhour">기초주입 시간</string>
<string name="danar_basalhour">Basal 시간</string>
<string name="danar_glucose">혈당</string>
<string name="danar_carbohydrate">탄수화물</string>
<string name="danar_alarm">알람</string>
<string name="danar_totaluploaded">총 %1$d 기록들이 업로드되었습니다.</string>
<string name="danar_sbolus">S bolus</string>
<string name="danar_history_alarm">알람</string>
<string name="danar_history_basalhours">기초주입 시간</string>
<string name="danar_history_bolus">식사주입</string>
<string name="danar_history_basalhours">Basal 시간</string>
<string name="danar_history_bolus">Boluses</string>
<string name="danar_history_carbohydrates">탄수화물</string>
<string name="danar_history_dailyinsulin">일일 인슐린</string>
<string name="danar_history_errors">에러</string>
@ -308,28 +306,28 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="pumpbusy">펌프가 바쁩니다</string>
<string name="overview_bolusprogress_delivered">주입됨</string>
<string name="overview_bolusprogress_stoped">정지됨</string>
<string name="bolusstopped">식사주입 중지됨</string>
<string name="bolusstopping">식사주입 중지중</string>
<string name="bolusstopped">Bolus 중지됨</string>
<string name="bolusstopping">Bolus 중지중</string>
<string name="occlusion">막힘</string>
<string name="overview_bolusprogress_stop">정지</string>
<string name="overview_bolusprogress_stoppressed">정지 누름</string>
<string name="waitingforpump">펌프를 기다리는 중</string>
<string name="overview_bolusprogress_goingtodeliver" formatted="false">%.2fU을 주입합니다</string>
<string name="objectives_0_objective">표시설정과 모니터링설정을 완료하고, 기초주입과 비율을 분석한다.</string>
<string name="objectives_0_objective">표시설정과 모니터설정을 완료하고, Basal과 비율을 분석한다.</string>
<string name="objectives_0_gate">나이트스카우트에서 혈당 데이터가 잘 들어오는지, 펌프데이터가 업로드 되는지 확인한다.</string>
<string name="objectives_1_objective">Open Loop를 시작한다.</string>
<string name="objectives_1_gate">Open Loop 모드에서 몇일간 사용하여보고, 임시기초주입을 여러번 수동으로 실행하여본다. Set up and use temporary and default temporary targets (e.g. for activity or hypo treatment carbs)</string>
<string name="objectives_2_objective">임시기초주입 추천기능을 포함해서, Open Loop에 대해 이해한다.</string>
<string name="objectives_2_gate">이 경험을 토대로, 최대 기초주입량을 결정하고 이를 펌프와 설정에 입력한다.</string>
<string name="objectives_1_gate">Open Loop 모드에서 몇일간 사용하여보고, 임시Basal을 여러번 수동으로 주입해 본다. 임시목표와 기본임시목표(\'식사직전\', \'활동\',\'저혈당\' 임시목표)를 설정하고 사용해 본다.</string>
<string name="objectives_2_objective">임시Basal 추천기능을 포함해서, Open Loop에 대해 이해한다.</string>
<string name="objectives_2_gate">이 경험을 토대로, 최대 Basal을 결정하고 이를 펌프와 설정에 입력한다.</string>
<string name="objectives_3_objective">Closed Loop를 시작하고 저혈당인슐린 중지 기능을 사용해본다.</string>
<string name="objectives_3_gate">최대 IOB = 0 인 상태로 Closed Loop를 몇일동안 실행시켜 본다. 저혈당 인슐린일시중지가 많이 발생하지 않도록 한다.</string>
<string name="objectives_4_objective">Closed Loop를 조정하여 최대 IOB를 0 이상으로 올려서 서서히 혈당 목표치를 낮춘다.</string>
<string name="objectives_4_gate">혈당을 낮추기 전에 몇일간 사용해보되 최소한 하루는 저혈당 혈당 알람이 발생하지 않도록 해본다.</string>
<string name="objectives_5_objective">필요하면 기초주입과 비율을 조절하고, auto-sens를 활성화한다.</string>
<string name="objectives_5_objective">필요하면 Basal과 비율을 조절하고, auto-sens를 활성화한다.</string>
<string name="objectives_5_gate">평소의 탄수화물을 입력하면서 1주일동안 낮시간대에 loop를 성공적으로 사용해본다.</string>
<string name="objectives_6_objective">AMA(Advanced Meal Assist)같은 낮시간대를 위한 추가적인 기능들을 실행하여 본다.</string>
<string name="objectives_7_objective">낮시간대에 SMB(Super Micro Bolus)같은 추가기능을 활성화해 사용해본다.</string>
<string name="objectives_7_gate">SMB가 잘 작동하게 하기위해서 wiki를 반드시 읽은다음 maxIOB를 올려주세요. maxIOB=평균 식사주입 + 3 x 최대하루 기초주입량이면 괜찮은 시작값입니다.</string>
<string name="objectives_7_gate">SMB가 잘 작동하게 하기위해서 wiki를 반드시 읽은다음 maxIOB를 올려주세요. maxIOB=평균 식사 Bolus + 3 x 최대하루 Basal이면 괜찮은 시작값입니다.</string>
<string name="youareonallowedlimit">허용된 제한값에 도달하였습니다</string>
<string name="noprofileselected">프로파일이 선택되지 않았습니다</string>
<string name="smscommunicator_loophasbeendisabled">Loop가 중지되었습니다.</string>
@ -338,15 +336,15 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="smscommunicator_loopisenabled">Loop가 실행중입니다.</string>
<string name="valuelimitedto">%1$.2f, %2$.2f으로 제한됨</string>
<string name="valueoutofrange" formatted="false">%s값이 하드한계(Hard Limit)를 벗어났습니다</string>
<string name="smscommunicator_remotebasalnotallowed">원격 기초주입설정이 허가되지 않았습니다</string>
<string name="smscommunicator_remotebasalnotallowed">원격 Basal 설정이 허가되지 않았습니다</string>
<string name="smscommunicator_remotecommandnotallowed">원격 명령이 허가되지 않았습니다</string>
<string name="smscommunicator_basalreplywithcode">기초주입 %1$.2fU/h 을 실행하려면 %2$s 를 입력하고 답장하세요</string>
<string name="smscommunicator_basalreplywithcode">Basal %1$.2fU/h 을 주입하려면 %2$s 를 입력하고 답장하세요</string>
<string name="smscommunicator_suspendreplywithcode">%1$d분동안 Loop 일시중지하려면 %2$s 를 입력하고 답장하세요</string>
<string name="smscommunicator_tempbasalset">Temp basal %1$.2fU/h for %2$d min started successfully</string>
<string name="smscommunicator_tempbasalfailed">Temp basal start failed</string>
<string name="smscommunicator_basalstopreplywithcode" formatted="false">임시기초주입을 중지하려면 %s 를 입력하고 답장하세요</string>
<string name="smscommunicator_tempbasalcanceled">Temp basal canceled</string>
<string name="smscommunicator_tempbasalcancelfailed">Canceling temp basal failed</string>
<string name="smscommunicator_tempbasalset">Temp Basal %1$.2fU/h for %2$d min started successfully</string>
<string name="smscommunicator_tempbasalfailed">Temp Basal start failed</string>
<string name="smscommunicator_basalstopreplywithcode" formatted="false">임시Basal을 중지하려면 %s 를 입력하고 답장하세요</string>
<string name="smscommunicator_tempbasalcanceled">Temp Basal canceled</string>
<string name="smscommunicator_tempbasalcancelfailed">Canceling Temp Basal failed</string>
<string name="smscommunicator_unknowncommand">알려지지 않은 명령이거나 잘못된 답장입니다.</string>
<string name="quickwizard">빠른마법사</string>
<string name="quickwizardsettings">빠른마법사 설정</string>
@ -356,7 +354,7 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="overview_editquickwizardlistactivity_add">추가</string>
<string name="overview_quickwizard_item_edit_button">수정</string>
<string name="overview_quickwizard_item_remove_button">삭제</string>
<string name="mealbolus">식사주입</string>
<string name="mealbolus">식사</string>
<string name="correctionbous">교정주입</string>
<string name="actions">실행</string>
<string name="androidaps_start">AndroidAPS 시작</string>
@ -388,13 +386,13 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="pumpshutdown">펌프 종료</string>
<string name="batterydischarged">펌프배터리 방전</string>
<string name="danarkoreanpump">다나R 한글</string>
<string name="basal_rate">기초주입량:</string>
<string name="profile_set_failed">기초주입 프로파일 설정이 실패하였습니다</string>
<string name="profile_set_ok">기초주입 프로파일이 펌프에 업데이트 되었습니다</string>
<string name="basal_rate">Basal양:</string>
<string name="profile_set_failed">Basal 프로파일 설정이 실패하였습니다</string>
<string name="profile_set_ok">Basal 프로파일이 펌프에 업데이트 되었습니다</string>
<string name="danar_disableeasymode">펌프에서 이지모드(EasyUI)를 해제하세요</string>
<string name="danar_enableextendedbolus">펌프에서 확장식사기능을 활성화 하세요</string>
<string name="danar_enableextendedbolus">펌프에서 확장Bolus를 활성화 하세요</string>
<string name="danar_switchtouhmode">펌프에서 U/d에서 U/h로 모드를 변경하세요</string>
<string name="basalvaluebelowminimum">기초주입값이 최소값 이하입니다. 프로파일이 설정되지 않습니다!</string>
<string name="basalvaluebelowminimum">Basal값이 최소값 이하입니다. 프로파일이 설정되지 않습니다!</string>
<string name="sms_actualbg">BG:</string>
<string name="sms_lastbg">Last BG:</string>
<string name="mdi">MDI</string>
@ -420,16 +418,16 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="danar_stats">DanaR 통계</string>
<string name="danar_stats_cumulative_tdd">누적 일총량</string>
<string name="danar_stats_expweight">지수가중 일총량</string>
<string name="danar_stats_basalrate">기초주입</string>
<string name="danar_stats_bolus">식사주입</string>
<string name="danar_stats_basalrate">Basal</string>
<string name="danar_stats_bolus">Bolus</string>
<string name="danar_stats_tdd">일총량</string>
<string name="danar_stats_date">날짜</string>
<string name="danar_stats_ratio">비율</string>
<string name="danar_stats_amount_days">#일</string>
<string name="danar_stats_weight">가중</string>
<string name="danar_stats_warning_Message">교체/채움을 위해 식사주입을 사용한 경우 부정확할 수 있습니다!!</string>
<string name="danar_stats_warning_Message">교체/채움을 위해 Bolus를 사용한 경우 부정확할 수 있습니다!!</string>
<string name="danar_stats_olddata_Message">오래된 데이터입니다. \"새로고침\"을 누르세요.</string>
<string name="danar_stats_tbb">기초량</string>
<string name="danar_stats_tbb"> 기본 Basal</string>
<string name="danar_stats_tbb2">총기초량 * 2</string>
<string name="initializing">초기화중 ...</string>
<string name="actions_shortname">ACT</string>
@ -453,14 +451,14 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="advancedsettings_title">고급 설정</string>
<string name="danar_model">모델: %1$02X 프로토콜: %2$02X 코드: %3$02X</string>
<string name="profile">프로파일</string>
<string name="openapsama_max_daily_safety_multiplier_summary">기본값: 3\n이 값은 중요한 OpenAPS 안전장치입니다. 이 값의 역할은 펌프에 설정되어 있는 최대기초주입량보다 3배를 초과할 수 없게 제한하는 것입니다. 이 값을 변경할 필요는 없을 것이지만, 안전을 위해 \"3x max daily; 4x current\"이 의미하는 바를 알고 있어야 합니다.</string>
<string name="openapsama_current_basal_safety_multiplier_summary">기본값: 4\n이 값은 \"3x max daily; 4x current\"의 나머지 절반에 해당하는 또 다른 중요한 OpenAPS 안전장치입니다. 이 값은 펌프에 설정된 최대기초주입량과 관계없이, 설정된 현재시간의 기초주입량에 이 값을 곱한 양을 초과할 수 없게됩니다. 이는 알고리즘의 작동 방식을 이해하기 전에 과도하게 높은 최대 기본을 설정하여 위험한 상황에 빠지지 않도록 보호하기 위한 것입니다. 다시한번, 기본 값은 4배인 것을 알아두세요; 일반적으로 이것을 조정할 필요는 전혀 없으며, 대신 이 안전장치를 변경해야할것처럼 생각이 된다면, 다른 설정을 변경해야 할 가능성이 더 큽니다.</string>
<string name="openapsama_autosens_max_summary">기본값: 1.2\n이 값은 autosens가 autosens 비율을 얼마나 높게 할 수 있는지에 대한 최대 한계를 20%로 설정하는 승수장치입니다. 이는 autosens가 얼마나 높게 기초주입량을 조절할수 있는지, ISF를 얼마나 낮게 조절할수 있는지, 혈당 목표범위를 얼마나 낮게 설정할수 있는지를 결정합니다.</string>
<string name="openapsama_autosens_min_summary">기본값: 0.7\nautosens 안전 제한의 나머지 부분입니다. 이는 기초주입량을 얼마나 낮게 조절할 수 있는지, ISF와 혈당 목표범위를 얼마나 높게 설정할 수 있는지를 결정합니다.</string>
<string name="openapsama_max_daily_safety_multiplier_summary">기본값: 3\n이 값은 중요한 OpenAPS 안전장치입니다. 이 값의 역할은 펌프에 설정되어 있는 최대Basal보다 3배를 초과할 수 없게 제한하는 것입니다. 이 값을 변경할 필요는 없을 것이지만, 안전을 위해 \"3x max daily; 4x current\"이 의미하는 바를 알고 있어야 합니다.</string>
<string name="openapsama_current_basal_safety_multiplier_summary">기본값: 4\n이 값은 \"3x max daily; 4x current\"의 나머지 절반에 해당하는 또 다른 중요한 OpenAPS 안전장치입니다. 이것은, 펌프에 설정된 최대 Basal과는 관계없이, Basal이 설정된 현재시간의 Basal에 이 값을 곱한 양을 초과할 수 없다는 것을 의미합니다. 이는 알고리즘의 작동 방식을 이해하기 전에 과도하게 높은 최대 기본을 설정하여 위험한 상황에 빠지지 않도록 보호하기 위한 것입니다. 다시한번, 기본 값은 4배인 것을 알아두세요; 일반적으로 이것을 조정할 필요는 전혀 없으며, 대신 이 안전장치를 변경해야할것처럼 생각이 된다면, 다른 설정을 변경해야 할 가능성이 더 큽니다.</string>
<string name="openapsama_autosens_max_summary">기본값: 1.2\n이 값은 autosens가 autosens 비율을 얼마나 높게 할 수 있는지에 대한 최대 한계를 20%로 설정하는 승수장치입니다. 이는 autosens가 얼마나 높게 Basal을 조절할수 있는지, ISF를 얼마나 낮게 조절할수 있는지, 혈당 목표범위를 얼마나 낮게 설정할수 있는지를 결정합니다.</string>
<string name="openapsama_autosens_min_summary">기본값: 0.7\nautosens 안전 제한의 나머지 부분입니다. 이는 Basal을 얼마나 낮게 조절할 수 있는지, ISF와 혈당 목표범위를 얼마나 높게 설정할 수 있는지를 결정합니다.</string>
<string name="openapsama_autosens_adjusttargets">Autosens가 목표도 조절합니다.</string>
<string name="openapsama_autosens_adjusttargets_summary">기본값: 활성\n이것은 autosens가 ISF와 기초주입뿐만 아니라, 혈당 목표범위를 조절할 수 있게 합니다.</string>
<string name="openapsama_autosens_adjusttargets_summary">기본값: 활성\n이것은 autosens가 ISF와 Basal뿐만 아니라, 혈당 목표범위를 조절할 수 있게 합니다.</string>
<string name="openapsama_bolussnooze_dia_divisor_summary">기본값: 2\n식사주입 후 Bolus snooze가 수행되게 되고, 따라서 식사주입 직후엔 loop가 low temp에 대응하지 않게 됩니다. 기본값이 2일때 예제는 다음과 같습니다; DIA가 3시간일 경우 bolus snooz는 점차적으로 1.5시간에 걸쳐 단계적으로 사라지게 됩니다.(3DIA/2).</string>
<string name="openapsama_min_5m_carbimpact_summary">기본값: 3\n이것은 5분당 기본 탄수화물 흡수량에 대한 설정입니다. 예상되는 기본값은 3mg/dl/5min입니다. 이는 혈당이 예상보다 빨리 떨어지거나 오를때, 얼마나 빨리 COB가 감쇠하는지와 혈당예측을 위한 계산시 탄수화물 흡수량이 얼마나 될것으로 예상되는지에 영향을 미치게 됩니다.</string>
<string name="openapsama_min_5m_carbimpact_summary">기본값: 3.0 (AMA) 또는 8.0 (SMB). 5분당 탄수화물이 얼만큼 흡수되었는지에 대한 기본값 설정입니다. 기본값은 3mg/dl / 5분 입니다. 이는 혈당이 예상보다 빨리 떨어지거나 혹은 예상보다 오르지 않을때, COB가 얼마나 빨리 사라지게 되는지에 영향을 주게 되고, 추정된 탄수화물 흡수량이 미래 혈당 예측 계산시에도 영향을 주게 됩니다.</string>
<string name="openapsama_link_to_preferncejson_doc_txt">주의!\n보통의 경우 아래의 값을 변경하면 안됩니다. 이 값들을 변경하기 전에 반드시 이곳을 클릭하고 글을 정독해서 확실하게 이해를 하여야 합니다.</string>
<string name="error_only_numeric_digits_allowed">숫자만 입력가능합니다.</string>
<string name="error_only_numeric_digits_range_allowed">이 범위(%1$s - %2$s)안에 해당하는 숫자만 입력가능합니다.</string>
@ -476,11 +474,11 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="smscommunicator_calibrationfailed">xDrip에서 보정을 받지 못합니다.</string>
<string name="pumpsuspended">펌프 일시중지됨</string>
<string name="gettingpumpstatus">펌프 상태 가져오는중</string>
<string name="settingtempbasal">임시기초주입 설정중</string>
<string name="stoppingtempbasal">임시기초주입 취소중</string>
<string name="settingextendedbolus">확장식사주입 설정중</string>
<string name="stoppingextendedbolus">확장식사주입 취소중</string>
<string name="updatingbasalrates">기초주입량 업데이트중</string>
<string name="settingtempbasal">임시Basal 설정중</string>
<string name="stoppingtempbasal">임시Basal 취소중</string>
<string name="settingextendedbolus">확장Bolus 설정중</string>
<string name="stoppingextendedbolus">확장Bolus 취소중</string>
<string name="updatingbasalrates">Basal양 업데이트중</string>
<string name="disconnecting">연결끊기중</string>
<string name="executing">실행중</string>
<string name="virtualpump_settings">가상펌프 설정</string>
@ -510,7 +508,7 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="nowritepermission">NSCLIENT이 쓰기 권한이 없습니다. 잘못된 API secret인지 확인해보세요</string>
<string name="wear_settings">워치 설정</string>
<string name="wear_detailedIOB_title">IOB 자세하게 보여주기</string>
<string name="wear_detailedIOB_summary">워치페이스에 IOB를 식사주입IOB와 기초주입IOB로 나누어서 보여줍니다.</string>
<string name="wear_detailedIOB_summary">워치페이스에 IOB를 Bolus IOB와 Basal IOB로 나누어서 보여줍니다.</string>
<string name="nosuccess">성공하지 못했습니다. 폰을 확인하세요</string>
<string name="notavailable">알수없음</string>
<string name="patientage">나이</string>
@ -523,7 +521,7 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="needwhitelisting">최적의 성능을 위해 %s에서 배터리 최적화를 해제해야합니다.</string>
<string name="loopsuspended">Loop 일시중지</string>
<string name="loopsuspendedfor">일시중지중 (%d분)</string>
<string name="loopsuperbolusfor">수퍼 식사주입 (%d분)</string>
<string name="loopsuperbolusfor">Superbolus (%1$d 분)</string>
<string name="suspendloopfor1h">1시간동안 Loop 일시중지</string>
<string name="suspendloopfor2h">2시간동안 Loop 일시중지</string>
<string name="suspendloopfor3h">3시간동안 Loop 일시중지</string>
@ -539,7 +537,7 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="smscommunicator_loopresumed">Loop가 재실행 되었습니다.</string>
<string name="treatments_wizard_bgtrend_label">15분 추이</string>
<string name="treatments_wizard_cob_label">COB</string>
<string name="superbolus">수퍼 식사주입</string>
<string name="superbolus">Superbolus</string>
<string name="ns_logappstartedevent">앱시작을 NS에 기록하기</string>
<string name="restartingapp">설정을 적용하기위해 앱을 종료합니다.</string>
<string name="danarv2pump">다나R v2</string>
@ -549,8 +547,8 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="fastactinginsulincomment">노보래피드, 휴마로그, 에피드라</string>
<string name="ultrafastactinginsulincomment">피아스프(Fiasp)</string>
<string name="insulin_shortname">INS</string>
<string name="enablesuperbolus">마법사에서 수퍼 식사주입 활성화하기</string>
<string name="enablesuperbolus_summary">마법사에서 수퍼 식사주입 기능을 활성화합니다. 어떤 기능인지 확실히 알기전까지 활성화 하지 마세요. 제대로 알지 못하고 사용하면 일슐린이 과다 주입될 수 있습니다!</string>
<string name="enablesuperbolus">마법사에서 Superbolus 활성화하기</string>
<string name="enablesuperbolus_summary">마법사에서 Superbolus 기능을 활성화합니다. 어떤 기능인지 확실히 알기전까지 활성화 하지 마세요. 제대로 알지 못하고 사용하면 일슐린이 과다 주입될 수 있습니다!</string>
<string name="iob">IOB</string>
<string name="cob">COB</string>
<string name="virtualpump_firmware_label">펌웨어</string>
@ -565,16 +563,16 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="wear_showbgi_summary">BGI를 상태라인에 추가하기</string>
<string name="ns_noupload">NS에 업로드하지 않기</string>
<string name="ns_noupload_summary">NS로 보낼 모든 데이터가 버려집니다. AAPS는 NS에 연결되어 있지만 NS에는 변화가 없을것입니다.</string>
<string name="basal_step">기초주입 최소단위</string>
<string name="bolus_step">식사주입 최소단위</string>
<string name="extendedbolus">확장식사</string>
<string name="basal_step">Basal 단위</string>
<string name="bolus_step">Bolus 단위</string>
<string name="extendedbolus">확장Bolus</string>
<string name="temptarget">임시목표</string>
<string name="overview_extendedbolus_cancel_button">확장 식사주입 취소</string>
<string name="overview_extendedbolus_cancel_button">확장Bolus 취소</string>
<string name="careportal_sensorage_label">센서 사용기간</string>
<string name="careportal_canulaage_label">캐뉼라 사용기간</string>
<string name="careportal_insulinage_label">인슐린 사용기간</string>
<string name="hours">시간</string>
<string name="overview_newtempbasal_basaltype_label">기초주입 종류</string>
<string name="overview_newtempbasal_basaltype_label">Basal 종류</string>
<string name="invalidprofile">프로파일이 유효하지 않습니다!!!</string>
<string name="profileswitch">프로파일변경</string>
<string name="careportal_pbage_label">펌프배터리사용기간</string>
@ -602,7 +600,7 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<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="danar_visualizeextendedaspercentage_title">확장Bolus를 %로 표시하기</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>
@ -622,16 +620,16 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="ns_localbroadcasts">(xDrip 같은) 다른 앱으로의 브로드캐스트를 활성화합니다.</string>
<string name="ns_localbroadcasts_title">Local Broadcasts 활성화하기</string>
<string name="careportal_activity_label">활동 &amp; 피드백</string>
<string name="careportal_carbsandbolus_label">탄수화물 &amp; 식사주입</string>
<string name="careportal_carbsandbolus_label">탄수화물 &amp; Bolus</string>
<string name="careportal_cgm_label">CGM &amp; OPENAPS</string>
<string name="careportal_pump_label">펌프</string>
<string name="overview_newtempbasal_basalabsolute">기초주입량 [U/h]</string>
<string name="overview_newtempbasal_basalabsolute">Basal값 [U/h]</string>
<string name="careportal_newnstreatment_duration_min_label">기간 [min]</string>
<string name="openapssmb">OpenAPS SMB</string>
<string name="smb_shortname">SMB</string>
<string name="enableuam">UAM 활성화하기</string>
<string name="enablesmb">SMB 활성화하기</string>
<string name="enablesmb_summary">더 빠른 작용을 위해 임시기초주입 대신 SMB 사용</string>
<string name="enablesmb_summary">더 빠른 작용을 위해 임시Basal 대신 Super Micro Bolus 사용</string>
<string name="enableuam_summary">알리지 않은 식사 감지</string>
<string name="insulin_oref_peak">IOB 커브 피크 시간</string>
<string name="insulin_peak_time">피크 시간 [min]</string>
@ -654,8 +652,8 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="danarspump_shortname">Dana</string>
<string name="selectedpump">선택된 펌프</string>
<string name="pairpump">새 펌프와 연동</string>
<string name="bolusspeed">식사주입 속도</string>
<string name="danar_setbasalstep001">기초주입 단위를 0.01 U/h로 설정하세요</string>
<string name="bolusspeed">Bolus 속도</string>
<string name="danar_setbasalstep001">Basal 단위를 0.01 U/h로 설정하세요</string>
<string name="serialnumber">시리얼번호</string>
<string name="careportal_newnstreatment_percentage_label">퍼센트</string>
<string name="careportal_newnstreatment_timeshift_label">시간 이동</string>
@ -663,13 +661,13 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="eatingsoon_duration">식사직전 기간</string>
<string name="eatingsoon_target">식사직전 목표</string>
<string name="activity_duration">activity 기간</string>
<string name="activity_target">activity 목표</string>
<string name="activity_target">활동 목표</string>
<string name="hypo_duration">저혈당 기간</string>
<string name="hypo_target">저혈당 목표</string>
<string name="danar_history_prime">교체</string>
<string name="gettingextendedbolusstatus">확장식사주입 상태 가져오는중</string>
<string name="gettingbolusstatus">식사주입상태 가져오는중</string>
<string name="gettingtempbasalstatus">임시기초주입상태 가져오는중</string>
<string name="gettingextendedbolusstatus">확장Bolus 상태 가져오는중</string>
<string name="gettingbolusstatus">Bolus 상태 가져오는중</string>
<string name="gettingtempbasalstatus">임시Basal 상태 가져오는중</string>
<string name="gettingpumpsettings">펌프설정 가져오는중</string>
<string name="gettingpumptime">펌프시간 가져오는중</string>
<string name="reuse">재사용</string>
@ -686,9 +684,9 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="shortprotein">단백질</string>
<string name="shortfat">지방</string>
<string name="active"><![CDATA[<Active>]]></string>
<string name="waitingforestimatedbolusend">식사주입 종료를 기다리고 있습니다. %d초 남았습니다.</string>
<string name="waitingforestimatedbolusend">Bolus 종료를 기다리고 있습니다. %d초 남았습니다.</string>
<string name="processinghistory">이벤트 처리중</string>
<string name="startingbolus">식사주입을 시작합니다.</string>
<string name="startingbolus">Bolus 주입을 시작합니다.</string>
<string name="executingrightnow">명령을 지금 실행합니다.</string>
<string name="pumpdrivercorrected">펌프 드라이버가 수정되었습니다.</string>
<string name="pump_unreachable">펌프에 연결할 수 없습니다.</string>
@ -709,18 +707,18 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="poctech_upload">Poctech 업로드 설정</string>
<string name="wear_detailed_delta_title">델타(혈당증분값) 자세히 보여주기</string>
<string name="wear_detailed_delta_summary">소수점 자리 추가된 증분값 보여주기</string>
<string name="smbmaxminutes_summary">SMB가 기초주입량을 제한할 수 있는 최대 시간(분)</string>
<string name="smbmaxminutes_summary">SMB가 Basal을 제한할 수 있는 최대 시간(분)</string>
<string name="unsupportedfirmware">지원되지 않는 펌프 펌웨어</string>
<string name="dexcomg5_xdripupload_title">혈당 데이터를 xDrip+에 전송하기</string>
<string name="dexcomg5_xdripupload_summary">xDrip+ 데이터 소스에서 640g/Eversense을 선택하세요</string>
<string name="nsclientbg">NSClient 혈당</string>
<string name="minimalbasalvaluereplaced">지원되는 최소값으로 기초주입량이 대체되었습니다:%s</string>
<string name="maximumbasalvaluereplaced">지원되는 최대값으로 기초주입량이 대체되었습니다:%s</string>
<string name="minimalbasalvaluereplaced">지원되는 최소값으로 Basal값이 대체되었습니다:%s</string>
<string name="maximumbasalvaluereplaced">지원되는 최대값으로 Basal값이 대체되었습니다:%s</string>
<string name="overview_editquickwizard_usebg">혈당 계산</string>
<string name="overview_editquickwizard_usebolusiob">식사주입 IOB 계산</string>
<string name="overview_editquickwizard_usebasaliob">기초주입 IOB 계산</string>
<string name="overview_editquickwizard_usebolusiob">Bolus IOB 계산</string>
<string name="overview_editquickwizard_usebasaliob">Basal IOB 계산</string>
<string name="overview_editquickwizard_usetrend">추세계산</string>
<string name="overview_editquickwizard_usesuperbolus">수퍼 식사주입 계산</string>
<string name="overview_editquickwizard_usesuperbolus">Superbolus 계산</string>
<string name="yes"></string>
<string name="no">아니오</string>
<string name="positiveonly">양수만</string>
@ -733,9 +731,9 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="closedmodeenabled">Closed 모드가 활성화됨</string>
<string name="maxiobset">최대 IOB가 바르게 설정됨</string>
<string name="hasbgdata">선택한 소스에서 혈당이 들어옵니다.</string>
<string name="basalprofilenotaligned" formatted="false">기초주입값이 시간단위로 설정되지 않았습니다: %s</string>
<string name="basalprofilenotaligned" formatted="false">Basal값이 시간단위로 설정되지 않았습니다: %s</string>
<string name="zerovalueinprofile" formatted="false">유효하지 않은 프로파일: %s</string>
<string name="combo_programming_bolus">식사주입을 위한 펌프 프로그래밍</string>
<string name="combo_programming_bolus">Bolus 주입을 위한 펌프 프로그래밍</string>
<string name="combo_refresh">새로고침</string>
<string name="combo_pump_state_label">상태</string>
<string name="combo_pump_activity_label">활동</string>
@ -747,16 +745,16 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<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">식사주입중(%.1f U)</string>
<string name="combo_pump_action_bolusing">Bolus 주입중(%.1f U)</string>
<string name="combo_pump_action_refreshing">새로고침중</string>
<string name="combo_pump_unsupported_operation">요청하신 동작은 펌프에서 지원하지 않습니다.</string>
<string name="combo_low_suspend_forced_notification">위험한 사용: 확장식사주입 혹은 멀티웨이브 식사주입이 활성화 됩니다. Loop 모드가 저혈당 방지로 오직 6시간만 설정됩니다. Loop 모드에선 정상적인 식사주입만 지원합니다.</string>
<string name="combo_force_disabled_notification">위험한 사용: 펌프의 기초주입 프로파일이 펌프의 첫번째 기초주입 프로파일과 다릅니다. Loop가 비활성화되었습니다. 첫 번째 프로파일을 설정하고 새로 고침하십시오.</string>
<string name="bolus_frequency_exceeded">2개의 동일한 양의 식사주입이 요청되었습니다. 이중으로 식사주입이 되는 사고를 막고 버그로부터 보호하기 위하여 이는 금지됩니다.</string>
<string name="combo_low_suspend_forced_notification">위험한 사용: 확장Bolus 혹은 멀티웨이브Bolus가 활성화 됩니다. Loop 모드가 저혈당 방지로 오직 6시간만 설정됩니다. Loop 모드에선 일반 Bolus만 지원합니다.</string>
<string name="combo_force_disabled_notification">위험한 사용: 펌프의 Basal양 프로파일이 펌프의 첫번째 Basal양 프로파일과 다릅니다. Loop가 비활성화되었습니다. 첫 번째 프로파일을 설정하고 새로 고침하십시오.</string>
<string name="bolus_frequency_exceeded">2개의 동일한 양의 Bolus 주입이 요청되었습니다. 이중으로 Bolus가 주입 되는 사고를 막고 버그로부터 보호하기 위하여 이는 금지됩니다.</string>
<string name="combo_pump_connected_now">현재</string>
<string name="combo_activity_reading_pump_history">펌프 이력 읽기</string>
<string name="danar_history">펌프 이력</string>
<string name="combo_activity_setting_basal_profile">기초주입 프로파일 설정</string>
<string name="combo_activity_setting_basal_profile">Basal 프로파일 설정</string>
<string name="combo_pump_cartridge_low_warrning">펌프 카트리지 레벨이 낮습니다.</string>
<string name="combo_pump_battery_low_warrning">펌프배터리가 부족합니다.</string>
<string name="combo_is_in_error_state">펌프가 E%1$d: %2$s 에러를 보여줍니다.</string>
@ -766,12 +764,12 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="combo_notification_check_time_date">펌프 시간 업데이트가 필요합니다.</string>
<string name="combo_warning">경고</string>
<string name="combo_pump_tbr_cancelled_warrning">임시기초주입 취소 경고가 확인되었습니다.</string>
<string name="combo_error_no_connection_no_bolus_delivered">펌프를 사용할 수 없습니다. 식사주입이 실행되지 않았습니다.</string>
<string name="combo_error_no_bolus_delivered">식사주입이 실패하였습니다. 전송된 식사주입이 없는 것으로 보입니다. 이중으로 식사주입이 되는 것을 방지하기 위해 펌프를 확인한 다음 다시 식사주입을 하세요. 버그를 방지하기 위해 식사주입이 자동으로 재시도되지 않습니다.</string>
<string name="combo_error_partial_bolus_delivered">에러로 인해 요청된 식사주입 %2$.2f U중 오직 %1$.2f U만 전달되었습니다. 펌프에서 직접 확인후 적절한 조치를 취하세요.</string>
<string name="combo_error_bolus_verification_failed">식사주입을 실행하고 펌프 이력을 확인하는데 실패하였습니다. 펌프를 확인해보세요. 만약 식사주입이 실행되었다면 펌프와 다음번 연결시 그 내용이 관리에 추가될 것입니다.</string>
<string name="combo_reservoir_level_insufficient_for_bolus">식사주입 위한 인슐린이 주사기에 부족합니다.</string>
<string name="extendedbolusdeliveryerror">확장식사주입 에러</string>
<string name="combo_error_no_connection_no_bolus_delivered">펌프를 사용할 수 없습니다. Bolus 주입이 실행되지 않았습니다.</string>
<string name="combo_error_no_bolus_delivered">Bolus 주입이 실패하였습니다. 주입된 Bolus가 없는 것으로 보입니다. 이중으로 Bolus가 주입되는 것을 방지하기 위해 펌프를 확인한 다음 다시 Bolus를 주입하세요. 버그를 방지하기 위해 Bolus 주입이 자동으로 재시도되지 않습니다.</string>
<string name="combo_error_partial_bolus_delivered">에러로 인해 요청된 Bolus %2$.2f U중 오직 %1$.2f U만 주입되었습니다. 펌프에서 직접 확인후 적절한 조치를 취하세요.</string>
<string name="combo_error_bolus_verification_failed">Bolus를 주입하고 펌프 이력을 확인하는데 실패하였습니다. 펌프를 확인해보세요. 만약 Bolus 주입이 되었다면 펌프와 다음번 연결시 그 내용이 관리에 추가될 것입니다.</string>
<string name="combo_reservoir_level_insufficient_for_bolus">Bolus 주입 위한 인슐린이 주사기에 부족합니다.</string>
<string name="extendedbolusdeliveryerror">확장Bolus 주입 에러</string>
<string name="insightpump_shortname">Insight</string>
<string name="insightpump">Insight 펌프</string>
<string name="status_no_colon">상태</string>
@ -817,7 +815,7 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="automatically_connect_when">AndroidAPS 화면을 열면 펌프 명령이 요청되기 전에 자동으로 연결하여 연결 지연을 줄입니다.</string>
<string name="not_recommended_due_to_battery_drain">배터리 소모때문에 추천하지 않습니다.</string>
<string name="enablesmbalways">항상 SMB를 사용합니다.</string>
<string name="enablesmbalways_summary">식사주입과는 독립적으로 항상 SMB를 사용합니다. G5처럼 잘 필터된 혈당소스와만 사용이 가능합니다.</string>
<string name="enablesmbalways_summary">Bolus와 독립적으로 항상 SMB를 사용합니다. G5처럼 잘 필터된 혈당소스와만 사용이 가능합니다.</string>
<string name="enablesmbaftercarbs">탄수화물 이후 SMB를 사용합니다.</string>
<string name="enablesmbaftercarbs_summary">탄수화물 이후 6시간동안 SMB를 사용합니다, 0 COB이라도 적용됩니다. G5처럼 잘 필터된 혈당소스와만 사용이 가능합니다.</string>
<string name="enablesmbwithcob">COB와 SMB를 사용합니다.</string>
@ -826,7 +824,7 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="enablesmbwithtemptarget_summary">활성화된 임시 목표(식사직전, 운동)가 있으면 SMB를 사용합니다.</string>
<string name="enablesmbwithhightemptarget">높은임시 목표와 SMB를 사용합니다.</string>
<string name="enablesmbwithhightemptarget_summary">활성화된 높은 임시 목표(운동)가 있으면 SMB를 사용합니다.</string>
<string name="let_temp_basal_run">임시 기초 주입 실행 허용</string>
<string name="let_temp_basal_run">임시Basal 허용</string>
<string name="mute">음소거</string>
<string name="overview_insulin_label">인슐린</string>
<string name="overview_carbs_label">탄수화물</string>
@ -839,7 +837,7 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="overview_cgm">CGM</string>
<string name="nav_historybrowser">이력 브라우저</string>
<string name="wear_notifysmb_title">SMB 알림</string>
<string name="wear_notifysmb_summary">일반 식사주입처럼 워치에서 SMB 표시</string>
<string name="wear_notifysmb_summary">일반 Bolus처럼 워치에 SMB 표시</string>
<string name="ns_create_announcements_from_errors_title">에러 발생시 알림 생성</string>
<string name="ns_create_announcements_from_errors_summary">에러 발생에 대한 Nightscout 알림과 자체 경고를 생성합니다. (케어포털 관리에서도 표시됩니다.)</string>
<string name="wear_predictions_summary">워치페이스에서 예측치를 보여줍니다.</string>
@ -851,54 +849,55 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="start_activity_tt">활동 임시목표 시작</string>
<string name="start_eating_soon_tt">식사직전 임시목표 시작</string>
<string name="temptargetshort">TT</string>
<string name="do_not_bolus_record_only">실제주입않고, 기록만</string>
<string name="do_not_bolus_record_only">실제 Bolus 주입않고, 기록만 하기</string>
<string name="category">분류</string>
<string name="subcategory">하위 분류</string>
<string name="bolusrecordedonly">식사주입이 기록만 됩니다.</string>
<string name="bolusrecordedonly">Bolus가 기록만 됩니다.</string>
<string name="ns_autobackfill_summary">NS에서 누락된 혈당이 자동으로 채워집니다.</string>
<string name="loop_smbsetbypump_label">펌프에 의한 SMB 설정</string>
<string name="overview_show_sensitivity">민감도</string>
<string name="overview_show_deviations">편차</string>
<string name="overview_show_cob">체내탄수화물양(COB)</string>
<string name="overview_show_iob">체내인슐린양(IOB)</string>
<string name="overview_show_basals">기초주입</string>
<string name="overview_show_basals">Basal</string>
<string name="no_action_selected">선택한 실행이 없습니다. 아무런 실행이 되지 않습니다.</string>
<string name="start_hypo_tt">저혈당 임시목표 시작</string>
<string name="closed_loop_disabled_on_dev_branch">개발자버전을 실행중입니다. Closed Loop는 비활성화 됩니다.</string>
<string name="engineering_mode_enabled">전문가 모드 사용</string>
<string name="not_eng_mode_or_release">전문가 모드가 활성화되어 있지 않고 Release 버전이 실행되고 있지 않습니다.</string>
<string name="pump_basebasalrate">%.2f U/h</string>
<string name="combo_actvity_reading_basal_profile">기초주입 프로파일 읽는중</string>
<string name="combo_bolus_rejected_due_to_pump_history_change">식사주입 계산이 수행된 후 펌프 이력이 변경되었습니다. 식사주입이 전달되지 않았습니다. 식사주입이 필요하다면 다시 계산하세요.</string>
<string name="combo_error_updating_treatment_record">식사주입이 성공적으로 주입되었지만, 관리 항목에 추가하지 못했습니다. 이것은 동일한 양의 소량의 2개의 식사주입이 지난 2 분 이내에 주입되는 경우에 발생할 수 있습니다. 펌프 이력과 관리 항목을 확인하고 손실된 항목을 추가하기위해 케어포털을 이용하세요. 동일한 시간과 인슐린양의 항목을 추가하지 마세요.</string>
<string name="combo_actvity_reading_basal_profile">Basal 프로파일 읽는중</string>
<string name="combo_bolus_rejected_due_to_pump_history_change">Bolus 계산이 수행된 후 펌프 이력이 변경되었습니다. Bolus가 주입되지 않았습니다. Bolus가 여전히 필요하다면 다시 계산하세요.</string>
<string name="combo_error_updating_treatment_record">Bolus가 성공적으로 주입되었지만, 관리 항목에 추가하지 못했습니다. 이것은 동일한 양의 소량의 2개의 Bolus가 최근 2 분 이내에 주입되는 경우에 발생할 수 있습니다. 펌프 이력과 관리 항목을 확인하고 손실된 항목을 추가하기위해 케어포털을 이용하세요. 동일한 시간과 인슐린양의 항목을 추가하지 마세요.</string>
<string name="combo_high_temp_rejected_due_to_pump_history_changes">계산기가 최근 변경된 펌프 이력을 고려하지 못해 임시기초주입 추가를 거절했습니다.</string>
<string name="combo_activity_checking_pump_state">펌프상태 새로고침중</string>
<string name="combo_warning_pump_basal_rate_changed">펌프의 기초주입량이 변경되었고 곧 업데이트됩니다.</string>
<string name="combo_error_failure_reading_changed_basal_rate">펌프의 기초주입량이 변경되었지만 읽기를 실패했습니다.</string>
<string name="combo_warning_pump_basal_rate_changed">펌프의 Basal 양이 변경되었고 곧 업데이트됩니다.</string>
<string name="combo_error_failure_reading_changed_basal_rate">펌프의 Basal 양이 변경되었지만 읽기를 실패했습니다.</string>
<string name="combo_activity_checking_for_history_changes">이력 변경 확인중</string>
<string name="combo_error_multiple_boluses_with_identical_timestamp">같은 시간(분)에 동일한 양의 2개이상의 식사주입이 실행되었습니다. 오직 하나의 기록만이 관리에 입력될 수 있습니다. 펌프를 확인한 후 케어포털 탭에서 식사주입 기록을 수동으로 추가하세요. 동시에 같은 양의 식사주입이 없도록 하세요.</string>
<string name="combo_error_multiple_boluses_with_identical_timestamp">동일한 시간(분)에 동일한 양의 2개이상의 Bolus가 주입되었습니다. 오직 하나의 기록만이 관리에 입력될 수 있습니다. 펌프를 확인한 후 케어포털 탭에서 Bolus 기록을 수동으로 추가하세요. 동일한 시간에 동일한 양의 Bolus를 주입하지 않도록 하세요.</string>
<string name="about_link_urls">\n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de)</string>
<string name="combo_check_date">최근의 식사주입이 24시간 전 혹은 미래에 있습니다. 펌프의 날짜가 제대로 설정되어 있는지 확인해보세요.</string>
<string name="combo_suspious_bolus_time">펌프에서 전송된 식사주입의 시간/날짜가 잘못되었습니다. IOB가 부정확할 수 있습니다. 펌프 시간/날짜를 확인하세요.</string>
<string name="combo_check_date">최근 Bolus가 24시간 전 혹은 미래에 있습니다. 펌프의 날짜가 제대로 설정되어 있는지 확인해보세요.</string>
<string name="combo_suspious_bolus_time">펌프에서 주입된 Bolus의 시간/날짜가 잘못되었습니다. IOB가 부정확할 수 있습니다. 펌프 시간/날짜를 확인하세요.</string>
<string name="profileswitch_ismissing">프로파일변경 누락. 로컬 프로파일에서 프로파일 변경을 하거나 \"프로파일 활성화하기\"를 누르세요.</string>
<string name="combo_bolus_count">식사주입</string>
<string name="combo_bolus_count">Bolus</string>
<string name="combo_tbr_count">임시기초주입 수</string>
<string name="objectivenotstarted">목표%1$d이 시작되지 않았습니다.</string>
<string name="objectivenotfinished">목표%1$d이 완료되지 않았습니다.</string>
<string name="pumpisnottempbasalcapable">이 펌프 임시 기초 주입을 지원하지 않습니다.</string>
<string name="novalidbasalrate">펌프에서 유효한 기초주입량을 읽을 수 없습니다.</string>
<string name="pumpisnottempbasalcapable">이 펌프 임시Basal을 지원하지 않습니다.</string>
<string name="novalidbasalrate">펌프에서 유효한 Basal양을 읽을 수 없습니다.</string>
<string name="closedmodedisabledinpreferences">설정에서 Closed Loop 모드가 비활성화되었습니다.</string>
<string name="autosensdisabledinpreferences">설정에서 Autosens가 비활성화 되었습니다.</string>
<string name="smbdisabledinpreferences">설정에서 SMB가 비활성화 되었습니다.</string>
<string name="limitingbasalratio">%2$s로 인해 최대 기초주입량이 %1$.2f U/h으로 제한됩니다.</string>
<string name="limitingbasalratio">%2$s로 인해 최대 Basal양이 %1$.2f U/h으로 제한됩니다.</string>
<string name="pumplimit">펌프 제한</string>
<string name="itmustbepositivevalue">양의 값이어야 합니다.</string>
<string name="maxbasalmultiplier">최대 기초주입량 승수</string>
<string name="maxdailybasalmultiplier">최대 일 기초주입량 승수</string>
<string name="smb_frequency_exceeded">최근 3분이내에 식사주입이 실행되었습니다. SMB를 건너뜁니다.</string>
<string name="basal_set_correctly">기초주입이 정상적으로 설정되었습니다.</string>
<string name="maxbasalmultiplier">최대 Basal 승수</string>
<string name="maxdailybasalmultiplier">최대 일 Basal 승수</string>
<string name="smb_frequency_exceeded">최근 3분 이내에 Bolus가 주입되었습니다. SMB를 건너뜁니다.</string>
<string name="basal_set_correctly">Basal이 정상적으로 설정되었습니다.</string>
<string name="limitingpercentrate">%2$s로 인해 최대 비율이 %1$d%%로 제한됩니다.</string>
<string name="limitingbolus">%2$s로 인해 식사주입이 %1$.1f U로 제한됩니다.</string>
<string name="limitingbolus">%2$s로 인해 Bolus가 %1$.1f U로 제한됩니다.</string>
<string name="limitingextendedbolus">%2$s로 인해 확장Bolus가 %1$.1f U로 제한됩니다.</string>
<string name="limitingmaxiob">%2$s로 인해 최대 IOB가 %1$.1f U로 제한됩니다.</string>
<string name="limitingcarbs">%2$s로 인해 탄수화물이 %1$d g로 제한됩니다.</string>
<string name="limitingiob">%2$s로 인해 IOB가 %1$.1f U으로 제한됩니다.</string>
@ -930,7 +929,7 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="nav_setupwizard">설정 마법사</string>
<string name="setupwizard_finish">완료</string>
<string name="setupwizard_language_prompt">언어를 선택하세요</string>
<string name="boluserrorcode">요청: %1$.2fU 전송: %2$.2fU 에러코드: %3$d</string>
<string name="boluserrorcode">요청: %1$.2fU 전송: %2$.2fU 에러코드: %3$s</string>
<string name="firstinsulinincrement">1차 인슐린 증분</string>
<string name="secondinsulinincrement">2차 인슐린 증분</string>
<string name="thirdinsulinincrement">3차 인슐린 증분</string>
@ -948,12 +947,12 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="openapsama_autosens_min">최저 autosens 비율</string>
<string name="openapsama_bolussnooze_dia_divisor">Bolus snooze DIA 나눗수</string>
<string name="openapsama_max_daily_safety_multiplier">최대 일 안전 승수</string>
<string name="openapsama_current_basal_safety_multiplier">현재 기초주입 안전 승수</string>
<string name="openapsama_current_basal_safety_multiplier">현재 Basal 안전 승수</string>
<string name="value_unavailable_short">사용불가</string>
<string name="virtualpump_type">가성펌프 종류</string>
<string name="virtualpump_definition">펌프 정의</string>
<string name="virtualpump_pump_def">식사주입: 스텝=%1$s\n확장식사주입: [Step=%2$s, 기간=%3$s분-%4$s시]\n기초주입: 스텝=%5$s\n임시기초주입: %6$s (by %7$s), 기간=%8$s분-%9$s시\n%10$s</string>
<string name="virtualpump_pump_def_extended_note">* 가상펌프에서 Ranged 기초주입/식사주입이 지원되지 않습니다.</string>
<string name="virtualpump_pump_def">Bolus: 스텝=%1$s\n확장Bolus: [Step=%2$s, 기간=%3$s분-%4$s시]\nBasal: 스텝=%5$s\n임시Basal: %6$s (by %7$s), 기간=%8$s분-%9$s시\n%10$s</string>
<string name="virtualpump_pump_def_extended_note">* 가상펌프에서 다른 범위의 Basal/Bolus가 지원되지 않습니다.</string>
<string name="ns_autobackfill_title">혈당 자동채움</string>
<string name="wear_wizard_settings">마법사 설정</string>
<string name="wear_wizard_settings_summary">마법사 결과에 사용 된 계산:</string>
@ -965,7 +964,7 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="readstatus">상태 불러오기</string>
<string name="adjustprofileinns">오직 NS에서 변경해야합니다.</string>
<string name="exitwizard">설정 마법사 건너뛰기</string>
<string name="setupwizard_loop_description">AndroidAPS가 기초주입 변화를 제안 혹은 실행하게 하려면 아래 버튼을 누르세요.</string>
<string name="setupwizard_loop_description">AndroidAPS가 Basal 변화를 제안 혹은 실행하게 하려면 아래 버튼을 누르세요.</string>
<string name="setupwizard_objectives_description">목표를 활성화하기 위해 아래 버튼을 누르세요. 이 마법사를 종료된 다음 AndroidAPS의 모든 기능을 이용하기 위해 목표 탭을 확인하세요.\n</string>
<string name="enableobjectives">목표 활성화하기</string>
<string name="apssetup">APS 플러그인 설정하기</string>
@ -1020,7 +1019,7 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="largetimediff">큰 시간 차이:\n펌프의 시간과 1.5시간 이상 차이가 납니다.\n펌프의 이력에서 잘못된 시간을 읽어들임으로써 예상치 못한 행동이 발생하지 않도록 펌프의 시간을 수동으로 변경하세요.\n가능하면 시간을 변경하기 전에 펌프의 이력을 삭제하거나, 설정된 DIA 시간동안 Closed Loop를 비활성화 하세요.</string>
<string name="careportal_removestartedevents">\"AndroidAPS 시작\" 기록 삭제하기</string>
<string name="storedsettingsfound">저장된 설정이 있습니다.</string>
<string name="allow_hardware_pump_text">주의: 활성화하고 펌프에 연결하게되면, AndroidAPS는 프로파일의 기초설정을 복사해서 기존에 펌프에 저장되어 있던 기초주입설정을 덮어쓰게 될것입니다. AndroidAPS의 기초주입설정이 올바른지 반드시 확인하세요. 만약 확실치 않거나 기초주입설정을 덮어씌우길 원치않는다면, 취소버튼을 누르고 나중에 다시 연결하세요.</string>
<string name="allow_hardware_pump_text">주의: 활성화하고 펌프에 연결하게되면, AndroidAPS는 프로파일의 Basal설정을 복사해서 기존에 펌프에 저장되어 있던 Basal설정을 덮어쓰게 될것입니다. AndroidAPS의 Basal설정이 올바른지 반드시 확인하세요. 만약 확실치 않거나 Basal설정을 덮어씌우길 원치않는다면, 취소버튼을 누르고 나중에 다시 연결하세요.</string>
<string name="error_adding_treatment_title">관리 데이터가 불완전합니다</string>
<string name="maintenance_settings">정비 설정</string>
<string name="maintenance_email">Email</string>
@ -1045,6 +1044,12 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM
<string name="calculation_short">Calc</string>
<string name="handshaking">통신 확인</string>
<string name="sendlogfiles">예상치 못한 상황 보고를 위해 오늘의 로그 파일을 개발자에게 전송합니다.</string>
<string name="maxbolusviolation">최대 Bolus 위반</string>
<string name="commanderror">명령 오류</string>
<string name="speederror">속도 오류</string>
<string name="insulinlimitviolation">인슐린 제한 위반</string>
<string name="loop_openmode_min_change">최소 요청 변화 [%]</string>
<string name="loop_openmode_min_change_summary">이 값보다 변화가 클때만 Loop가 새 변화 요청창을 띄울것 입니다. 기본 값은 30%입니다.</string>
<plurals name="objective_days">
<item quantity="other">%1$d 일</item>
</plurals>

View file

@ -459,7 +459,6 @@ Stel in en gebruik tijdelijk en standaard tijdelijke streefdoelen (bv. bij sport
<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>
<string name="openapsama_bolussnooze_dia_divisor_summary">Standaard waarde: 2\nBolus snooze is actief nadat je een maaltijd bolus toegediend hebt, zodat de loop geen tegenvoorstel met een verlaagd tijdelijk basaal doet nadat je gegeten hebt. Het voorbeeld hier van van standaard 2; dus een 3 u DIA betekent dat de bolus snooze gemiddeld 1.5u actief is (3DIA/2).</string>
<string name="openapsama_min_5m_carbimpact_summary">Standaard waarde: 3.0 Dit is de instelling voor standaard KH absorbeer impact per 5 minuten. Deze standaard waarde slaat op 3mg/dl/5min. Dit heeft effect op hoe snel COB uitgewerkt zijn en hoeveel KH absorptie zal worden gebruikt in het berekenen van de volgende BG en dit wanneer de BG sneller daalt of stijgt dan verwacht.</string>
<string name="openapsama_link_to_preferncejson_doc_txt">Opgelet!\n Onderstaande waardes moeten normaal gezien niet worden aangepast. KLIK HIER en LEES de tekst zodat je alles volledig BEGRIJPT voordat je een waarde wijzigt.</string>
<string name="error_only_numeric_digits_allowed">Alleen numerieke waarden toegelaten.</string>
<string name="error_only_numeric_digits_range_allowed">Alleen numerieke waarden binnen het bereik %1$s - %2$s toegelaten.</string>
@ -929,7 +928,6 @@ Stel in en gebruik tijdelijk en standaard tijdelijke streefdoelen (bv. bij sport
<string name="nav_setupwizard">Setup Wizard</string>
<string name="setupwizard_finish">FINISH</string>
<string name="setupwizard_language_prompt">Selecteer uw taal</string>
<string name="boluserrorcode">Gevraagd: %1$.2fU Afgegeven: %2$.2fU Storings code: %3$d</string>
<string name="firstinsulinincrement">Eerste insuline increment</string>
<string name="secondinsulinincrement">Tweede insuline increment</string>
<string name="thirdinsulinincrement">Derde insuline increment</string>

View file

@ -21,6 +21,7 @@
<string name="description_insulin_rapid">Predefinição de Insulina Humalog e NovoRapid / NovoLog</string>
<string name="description_insulin_ultra_rapid">Predefinição de Insulina Fiasp</string>
<string name="description_insulin_free_peak">Permite definir o pico de atividade da insulina e deve ser usado somente por usuários avançados</string>
<string name="description_loop">Ativar ou desativar a aplicação que desencadeia o loop.</string>
<string name="description_ns_client">Sincroniza os seus dados com o Nightscout</string>
<string name="description_ma">Estado do algoritmo em 2016</string>
<string name="description_ama">Estado do algoritmo em 2017</string>
@ -30,6 +31,18 @@
<string name="description_profile_local">Definir um perfil que está disponível offline.</string>
<string name="description_profile_nightscout">Fornece o perfil definido no Nightscout</string>
<string name="description_profile_simple">Definir um perfil com apenas um bloco de tempo.</string>
<string name="description_pump_combo">Integração para bombas Accu-Chek Combo, requer ter o ruffy instalado</string>
<string name="description_pump_dana_r">Integração para bombas DANA Diabecare R</string>
<string name="description_pump_dana_r_korean">Integração para bombas DANA Diabecare R Coreanas</string>
<string name="description_pump_dana_r_v2">Integração para as bombas DANA Diabecare R com firmware atualizado</string>
<string name="description_pump_dana_rs">Integração para bombas DANA Diabecare RS</string>
<string name="description_pump_insight">Integração para bombas Accu-Chek Insight, requer ter o SightRemote instalado</string>
<string name="description_pump_mdi">Integração para as pessoas que fazem múltiplas injeções diárias para a sua terapia de diabetes</string>
<string name="description_pump_virtual">Integração para as bombas que não têm qualquer driver ainda (Open Loop)</string>
<string name="description_sensitivity_aaps">A sensibilidade é calculada da mesma forma que Oref0, mas você pode especificar o período de tempo para o passado. A absorção mínima de hidratos de carbono é calculada a partir do tempo máximo de absorção de hidratos de carbono das preferências.</string>
<string name="description_sensitivity_oref0">A sensibilidade é calculada a partir de dados de 24h no passado e os carboidratos (se não absorvidos) são cortados após o tempo especificado nas preferências.</string>
<string name="description_sensitivity_oref1">A sensibilidade é calculada a partir de dados de 8h no passado e os hidratos de carbono (se não absorvidos) são cortados após o tempo especificado nas preferências. O plug-in também calcula o UAM.</string>
<string name="description_sensitivity_weighted_average">A sensibilidade é calculada como uma média ponderada de desvios. Desvios mais recentes têm maior peso. A absorção mínima de hidratos de carbono é calculada a partir do tempo máximo de absorção de hidratos de carbono das preferências. Este algoritmo é o mais rápido em seguir as mudanças de sensibilidade.</string>
<string name="description_source_dexcom_g5">Receber valores de Glucose da aplicação Dexcom G5 modificada.</string>
<string name="description_source_glimp">Receber valores Glucose do Glimp.</string>
<string name="description_source_mm640g">Receber valores de Glucose do 600SeriesAndroidUploader.</string>
@ -43,6 +56,7 @@
<string name="objectives_button_verify">Verificar</string>
<string name="nsprofileview_units_label">Unidades</string>
<string name="nsprofileview_dia_label">DIA</string>
<string name="nsprofileview_ic_label">IC</string>
<string name="nsprofileview_isf_label">ISF</string>
<string name="nsprofileview_basal_label">Basal</string>
<string name="nsprofileview_target_label">Alvo</string>
@ -50,6 +64,55 @@
<string name="treatments_insulin_label_string">Insulina:</string>
<string name="treatments_carbs_label_string">Hidratos de Carbono:</string>
<string name="treatments_iob_label_string">IOB:</string>
<string name="sms_iob">IOB:</string>
<string name="treatments_activity_string">Actividade:</string>
<string name="treatments_iobtotal_label_string">IOB Total:</string>
<string name="treatments_iobactivitytotal_label_string">Actividade Total IOB:</string>
<string name="tempbasals_realduration_label_string">Dur:</string>
<string name="tempbasals_netratio_label_string">Rácio:</string>
<string name="tempbasals_netinsulin_label_string">Ins:</string>
<string name="tempbasals_iob_label_string">IOB:</string>
<string name="tempbasals_iobtotal_label_string">IOB Total:</string>
<string name="treatments_newtreatment_insulinamount_label">Insulina</string>
<string name="treatments_newtreatment_carbsamount_label">Hidratos</string>
<string name="treatments_wizard_bg_label">GLIC</string>
<string name="treatments_wizard_tt_label">TT</string>
<string name="treatments_wizard_carbs_label">Hidratos</string>
<string name="treatments_wizard_correction_label">Corr</string>
<string name="insulin_unit_shortname">U</string>
<string name="treatments_wizard_bolusiob_label">Bólus IOB</string>
<string name="openapsma_run">Executar agora</string>
<string name="vitualpump_label">BOMBA VIRTUAL</string>
<string name="pump_basebasalrate_label">Taxa Basal de base</string>
<string name="pump_tempbasal_label">Basal temp</string>
<string name="virtualpump_extendedbolus_label">Bólus estendido</string>
<string name="pump_battery_label">Bateria</string>
<string name="pump_reservoir_label">Reservatório</string>
<string name="virtualpump_resultok">OK</string>
<string name="openapsma_lastrun_label">Última execução</string>
<string name="openapsma_inputparameters_label">Parâmetros de entrada</string>
<string name="openapsma_glucosestatus_label">Status de Glicose</string>
<string name="openapsma_currenttemp_label">Temp actual</string>
<string name="openapsma_iobdata_label">Dados de IOB</string>
<string name="openapsma_profile_label">Perfil</string>
<string name="openapsma_mealdata_label">Dados de refeição</string>
<string name="result">Resultado</string>
<string name="openapsma_noglucosedata">Sem dados de glucose disponíveis</string>
<string name="nochangerequested">Nenhuma alteração solicitada</string>
<string name="openapsma_request_label">Pedido</string>
<string name="rate">Rácio</string>
<string name="duration">Duração</string>
<string name="reason">Motivo</string>
<string name="glucose">Glucose</string>
<string name="delta">Delta</string>
<string name="sms_delta">Delta:</string>
<string name="configbuilder">Configurador</string>
<string name="objectives">Objetivos</string>
<string name="openapsma">OpenAPS MA</string>
<string name="overview">Visão geral</string>
<string name="nsprofile">Perfil NS</string>
<string name="simpleprofile">Perfil simples</string>
<string name="tempbasal">Basal Temporária</string>
<string name="treatments">Tratamentos</string>
<string name="virtualpump">Bomba virtual</string>
<string name="careportal">Careportal</string>
@ -72,6 +135,7 @@
<string name="loop_aps_label">APS</string>
<string name="loop_constraintsprocessed_label">Depois das restrições processadas</string>
<string name="loop_tbrsetbypump_label">Basal temporária definida pela bomba</string>
<string name="openapsma_lastenact_label">Ultima execução</string>
<string name="ok">OK</string>
<string name="cancel">Cancelar</string>
<string name="noapsselected">NÃO EXISTE NENHUM APS SELECIONADO OU RESULTADO FORNECIDO</string>
@ -100,5 +164,883 @@
<string name="xdrip">xDrip</string>
<string name="apsmode_title">Modo APS</string>
<string name="closedloop">Closed Loop</string>
<string name="openloop">Open Loop</string>
<string name="disabledloop">Loop Desactivado</string>
<string name="disableloop">Desactivar Loop</string>
<string name="enableloop">Activar Loop</string>
<string name="openloop_newsuggestion">Disponível nova sugestão</string>
<string name="unsupportedclientver">Versão não suportada do NSCliente</string>
<string name="unsupportednsversion">Versão sem suporte do Nightscout</string>
<string name="nsclientnotinstalled">NSCliente em falta. Perdido registo!</string>
<string name="objectives_bgavailableinns">Glic disponível no NS</string>
<string name="objectives_pumpstatusavailableinns">Status da Bomba está disponível no NS</string>
<string name="objectives_manualenacts">Execução manual</string>
<string name="loopdisabled">LOOP DESATIVADO POR RESTRIÇÕES</string>
<string name="treatments_wizard_basaliob_label">Basal IOB</string>
<string name="bolusconstraintapplied">Restrição de bólus aplicada</string>
<string name="carbsconstraintapplied">Restrição de hidratos de carbono aplicada</string>
<string name="careportal_bgcheck">Verificar Glic</string>
<string name="careportal_announcement">Anúncio</string>
<string name="careportal_note">Nota</string>
<string name="careportal_question">Pergunta</string>
<string name="careportal_exercise">Exercício</string>
<string name="careportal_pumpsitechange">Alteração do local do cateter</string>
<string name="careportal_cgmsensorinsert">Colocação do Sensor CGM</string>
<string name="careportal_cgmsensorstart">Início do Sensor CGM</string>
<string name="careportal_insulincartridgechange">Mudança de Cartucho de Insulina</string>
<string name="careportal_profileswitch">Troca de Perfil</string>
<string name="careportal_snackbolus">Bólus Lanche</string>
<string name="careportal_mealbolus">Bólus Refeição</string>
<string name="careportal_correctionbolus">Bólus Correcção</string>
<string name="careportal_combobolus">Bólus Combo</string>
<string name="careportal_tempbasalstart">Início Temp Basal</string>
<string name="careportal_tempbasalend">Fim Temp Basal</string>
<string name="careportal_carbscorrection">Correcção Hidratos</string>
<string name="careportal_openapsoffline">OpenAPS Offline</string>
<string name="careportal_newnstreatment_eventtype">Tipo de evento</string>
<string name="careportal_newnstreatment_other">Outro</string>
<string name="careportal_newnstreatment_meter">Medidor</string>
<string name="careportal_newnstreatment_sensor">Sensor</string>
<string name="careportal_newnstreatment_carbs_label">Hidratos de Carbono</string>
<string name="careportal_newnstreatment_insulin_label">Insulina</string>
<string name="careportal_newnstreatment_carbtime_label">Tempo Hidratos</string>
<string name="careportal_newnstreatment_split_label">Dividir</string>
<string name="careportal_newnstreatment_duration_label">Duração</string>
<string name="careportal_newnstreatment_percent_label">Percentagem</string>
<string name="careportal_newnstreatment_absolute_label">Absoluto</string>
<string name="careportal_newnstreatment_notes_label">Notas</string>
<string name="careportal_newnstreatment_eventtime_label">Tempo do evento</string>
<string name="careportal_newnstreatment_profile_label">Perfil</string>
<string name="careportal_newnstreatment_enteredby_title">Introduzido por</string>
<string name="careportal_newnstreatment_glucosetype">Tipo de glicose</string>
<string name="noprofile">Sem perfil carregado do NS</string>
<string name="overview_tempbasal_button">BasalTemp</string>
<string name="overview_extendedbolus_button">Bólus estendido</string>
<string name="configbuilder_nightscoutversion_label">Versão Nightscout:</string>
<string name="missing">Em falta</string>
<string name="exported">Preferências exportadas</string>
<string name="export_to">Exportar configurações para</string>
<string name="import_from">Importar configurações de</string>
<string name="setting_imported">Configurações importadas</string>
<string name="filenotfound">Ficheiro não encontrado</string>
<string name="nav_export">Exportar configurações</string>
<string name="nav_import">Importar configurações</string>
<string name="openapsma_maxbasal_title">Max U/hr em que uma Temp Basal pode ser definida</string>
<string name="openapsma_maxbasal_summary">Este valor é chamado max basal no contexto do OpenAPS</string>
<string name="openapsma_maxiob_title">Basal Máxima IOB que OpenAPS pode dar [U]</string>
<string name="openapsma_maxiob_summary">Este valor é denominado Max IOB em contexto OpenAPS \nEste é o valor máximo de insulina em [U] que APS pode dar de uma vez.</string>
<string name="dismiss">Dispensar</string>
<string name="danarpump">DanaR</string>
<string name="connecting">A ligar</string>
<string name="connected">Ligado</string>
<string name="disconnected">Desligado</string>
<string name="danar_pump_settings">Definições bomba DanaR</string>
<string name="end_user_license_agreement">Condições de Utilização</string>
<string name="end_user_license_agreement_text">NÃO DEVE SER USADO PARA FAZER DECISÕES MÉDICAS. NÃO HÁ NENHUMA GARANTIA PARA O PROGRAMA, NA EXTENSÃO PERMITIDA PELA LEGISLAÇÃO APLICÁVEL. EXCETO QUANDO DE OUTRA FORMA, POR ESCRITO, OS TITULARES DOS DIREITOS DE AUTOR E / OU OUTRAS PARTES FORNECEM O PROGRAMA “TAL COMO ESTÁ”, SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO, ÀS GARANTIAS IMPLÍCITAS DE COMERCIALIZAÇÃO E ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. TODO O RISCO QUANTO À QUALIDADE E DESEMPENHO DO PROGRAMA É COM VOCÊ. CASO O PROGRAMA SEJA DEFEITUOSO, VOCÊ ASSUME O CUSTO DE TODOS OS SERVIÇOS, REPAROS OU CORREÇÕES NECESSÁRIOS.</string>
<string name="end_user_license_agreement_i_understand">EU ENTENDO E CONCORDO</string>
<string name="save">Guardar</string>
<string name="nobtadapter">Nenhum dispositivo bluetooth encontrado</string>
<string name="devicenotfound">Dispositivo seleccionado não foi encontrado</string>
<string name="connectionerror">Erro de conexão da bomba</string>
<string name="danar_iob_label">IOB Bomba</string>
<string name="danar_dailyunits">Unidades diárias</string>
<string name="pump_lastbolus_label">Último bólus</string>
<string name="hoursago">%.1fh atrás</string>
<string name="danar_invalidinput">Entrada Inválida</string>
<string name="danar_valuenotsetproperly">Valor não definido corretamente</string>
<string name="reloadprofile">Recarregar perfil</string>
<string name="danar_viewprofile">Ver perfil</string>
<string name="enacted">Executado</string>
<string name="comment">Commentário</string>
<string name="success">Sucesso</string>
<string name="percent">Percentagem</string>
<string name="absolute">Absoluto</string>
<string name="canceltemp">Cancelar basal temp</string>
<string name="smscommunicator">Comunicador SMS</string>
<string name="waitingforpumpresult">À espera de resultado</string>
<string name="smscommunicator_allowednumbers">Número de telefones permitidos</string>
<string name="smscommunicator_allowednumbers_summary">+XXXXXXXXXX;+YYYYYYYYYY</string>
<string name="smscommunicator_bolusreplywithcode">Para dar bolus %1$.2fU responder com código %2$s</string>
<string name="smscommunicator_calibrationreplywithcode">Para enviar calibração %1$.2f responder com código %2$s</string>
<string name="smscommunicator_bolusfailed">Bólus falhado</string>
<string name="bolusdelivered" formatted="false">Bólus %.2fU enviado com êxito</string>
<string name="bolusrequested" formatted="false">Vai ser enviado %.2fU</string>
<string name="smscommunicator_bolusdelivered" formatted="false">Bólus %.2fU enviado com êxito</string>
<string name="bolusdelivering" formatted="false">A enviar %.2fU</string>
<string name="smscommunicator_remotecommandsallowed">Permitir comandos remotos via SMS</string>
<string name="smscommunicator_remotebolusnotallowed">Bólus remoto não permitido</string>
<string name="glucosetype_finger">Dedo</string>
<string name="glucosetype_sensor">Sensor</string>
<string name="manual">Manual</string>
<string name="careportal_temporarytarget">Alvo temporário</string>
<string name="careportal_temporarytargetcancel">Cancelar alvo temporário</string>
<string name="danarprofile">Definições perfil DanaR</string>
<string name="danarprofile_dia">DIA [h]</string>
<string name="danarprofile_dia_summary">Duração da Insulina Activa</string>
<string name="failedupdatebasalprofile">Falha a actualizar perfil da basal</string>
<string name="danar_historyreload">Recarregar</string>
<string name="uploading">A enviar</string>
<string name="danar_ebolus">E bólus</string>
<string name="danar_dsbolus">DS Bólus</string>
<string name="danar_debolus">DE Bólus</string>
<string name="danar_error">erro</string>
<string name="danar_refill">recarregar</string>
<string name="danar_basalhour">hora basal</string>
<string name="danar_glucose">glicose</string>
<string name="danar_carbohydrate">hidratos de carbono</string>
<string name="danar_alarm">alarme</string>
<string name="danar_totaluploaded">Total de %1$d registos carregados</string>
<string name="danar_sbolus">S bolus</string>
<string name="danar_history_alarm">Alarmes</string>
<string name="danar_history_basalhours">Horas de Basal</string>
<string name="danar_history_bolus">Bolus</string>
<string name="danar_history_carbohydrates">Hidratos de Carbono</string>
<string name="danar_history_dailyinsulin">Insulina diária</string>
<string name="danar_history_errors">Erros</string>
<string name="danar_history_glucose">Glicose</string>
<string name="danar_history_refill">Reabastecimento</string>
<string name="danar_history_syspend">Suspender</string>
<string name="danar_history_connectingfor">A ligar durante %1$d s</string>
<string name="danar_password_title">Senha da bomba</string>
<string name="wrongpumppassword">Senha da bomba incorrecta!</string>
<string name="pumpbusy">A bomba está ocupada</string>
<string name="overview_bolusprogress_delivered">Entregue</string>
<string name="overview_bolusprogress_stoped">Parado</string>
<string name="bolusstopped">O bolus parou</string>
<string name="bolusstopping">A parar o bolus</string>
<string name="occlusion">Oclusão</string>
<string name="overview_bolusprogress_stop">Parar</string>
<string name="overview_bolusprogress_stoppressed">STOP PRESSIONADO</string>
<string name="waitingforpump">À espera da bomba</string>
<string name="overview_bolusprogress_goingtodeliver" formatted="false">Vai ser enviado %.2fU</string>
<string name="objectives_0_objective">Configuração da visualização e monitoramento, e análise de rácios e basals</string>
<string name="objectives_0_gate">Verificar se a BG está disponível no Nightscout, e se os dados de insulina da bomba estão a ser carregados</string>
<string name="objectives_1_objective">A iniciar um open loop</string>
<string name="objectives_1_gate">Utilizar em modo de open loop por alguns dias e dar manualmente muitas basais temporárias. Configurar e usar alvos temporários e alvos padrão temporários (por exemplo, para atividade ou tratamentos de hipo com Hcs)</string>
<string name="objectives_2_objective">Compreender o seu open loop, incluindo as suas recomendações de basais temporárias</string>
<string name="objectives_2_gate">Com base nessa experiência, decidir qual deve ser a basal máxima e configurá-la na bomba e nas preferências</string>
<string name="objectives_3_objective">Começaro close loop com Suspensão por Baixa Glicose</string>
<string name="objectives_3_gate">Utilizar em close loop com IOB máx = 0 por alguns dias sem muitas situações de Suspensão por Baixa Glicose</string>
<string name="objectives_4_objective">Ajustar o close loop, levantar a IOB máxima acima de 0 e reduzir gradualmente os alvos de valor glicémico</string>
<string name="objectives_4_gate">Utilizar por alguns dias e pelo menos uma noite sem alarmes de valores glicémicos baixos, antes de baixar os valores</string>
<string name="objectives_5_objective">Ajustar as basals e os rácios se necessário e em seguida habilitar o auto-sens</string>
<string name="objectives_5_gate">1 semana de looping durante o dia com sucesso com entrada de hidratos de carbono regular</string>
<string name="objectives_6_objective">Ativando recursos adicionais para uso durante o dia, como assistente avançado de refeição</string>
<string name="objectives_7_objective">Ativando recursos adicionais para uso durante o dia, como SMB</string>
<string name="objectives_7_gate">Deverá ler a wiki e aumentar a IOB máx para que os SMBs funcionem devidamente! Inicialmente poderá considerar maxIOB= média dos bolus + 3 x a basal máxima</string>
<string name="youareonallowedlimit">Atingiu o limite autorizado</string>
<string name="noprofileselected">Nenhum perfil seleccionado</string>
<string name="smscommunicator_loophasbeendisabled">Loop foi desactivado</string>
<string name="smscommunicator_loophasbeenenabled">Loop foi activado</string>
<string name="smscommunicator_loopisdisabled">Loop desactivado</string>
<string name="smscommunicator_loopisenabled">Loop activado</string>
<string name="valuelimitedto">%1$.2f limitado a %2$.2f</string>
<string name="valueoutofrange" formatted="false">O valor %s está fora dos limites permitidos</string>
<string name="smscommunicator_remotebasalnotallowed">A configuração remota de basal não é permitida</string>
<string name="smscommunicator_remotecommandnotallowed">O comando remoto não é permitido</string>
<string name="smscommunicator_basalreplywithcode">Para começar basal %1$.2fU/h responda com código %2$s</string>
<string name="smscommunicator_suspendreplywithcode">Para suspender o loop por %1$d minutos resposta com código %2$s</string>
<string name="smscommunicator_tempbasalset">Basal temporária %1$.2fU/h para %2$d min iniciada com êxito</string>
<string name="smscommunicator_tempbasalfailed">Início basal temp falhou </string>
<string name="smscommunicator_basalstopreplywithcode" formatted="false">Para parar a basal temporaria responda com o código %s</string>
<string name="smscommunicator_tempbasalcanceled">Basal temp cancelada</string>
<string name="smscommunicator_tempbasalcancelfailed">Não foi possivel cancelar a basal temp</string>
<string name="smscommunicator_unknowncommand">Comando desconhecido ou resposta errada</string>
<string name="quickwizard">Assistente Rápido</string>
<string name="quickwizardsettings">Definições do Assistente Rápido</string>
<string name="overview_editquickwizard_buttontext">Texto do botão:</string>
<string name="overview_editquickwizard_carbs">Hidratos:</string>
<string name="overview_editquickwizard_valid">Válido:</string>
<string name="overview_editquickwizardlistactivity_add">Adicionar</string>
<string name="overview_quickwizard_item_edit_button">Editar</string>
<string name="overview_quickwizard_item_remove_button">Remover</string>
<string name="mealbolus">Refeição</string>
<string name="correctionbous">Corr</string>
<string name="actions">Acções</string>
<string name="androidaps_start">AndroidAPS iniciado</string>
<string name="ns_upload_only">Envio NS apenas (sincronização desactivada)</string>
<string name="ns_upload_only_summary">Apenas upload para NS. Não é eficaz em SGV a menos que uma fonte local como xDrip esteja selecionada. Não é eficaz em perfis enquanto NS-Profiles é usado.</string>
<string name="pumpNotInitialized">Bomba não inicializada!</string>
<string name="pumpNotInitializedProfileNotSet">Bomba não inicializada, perfil não definido!</string>
<string name="primefill">Purgar/Preencher</string>
<string name="fillwarning">Por favor certifique-se que o valor corresponde ao especificado para o seu conjunto de infusão!</string>
<string name="othersettings_title">Outro</string>
<string name="fillbolus_title">Purgar/Preencher os valores standard.</string>
<string name="button1">Botão 1</string>
<string name="button2">Botão 2</string>
<string name="button3">Botão 3</string>
<string name="units">Unidades:</string>
<string name="mgdl">mg/dL</string>
<string name="mmol">mmol/L</string>
<string name="dia">DIA:</string>
<string name="target_range">Intervalo Alvo:</string>
<string name="prefs_range_title">Intervalo para visualização</string>
<string name="prefs_range_summary">Marca Alto e Baixo para os gráficos em Sumário e Smartwatch</string>
<string name="low_mark">Marca Baixo</string>
<string name="high_mark">Marca ALTO</string>
<string name="wear">Wear</string>
<string name="resend_all_data">Reenviar Todos os Dados</string>
<string name="open_settings_on_wear">Abrir Definições em Wear</string>
<string name="pumperror">Erro Bomba</string>
<string name="lowbattery">Bateria fraca</string>
<string name="pumpshutdown">Encerrar Bomba</string>
<string name="batterydischarged">Bateria da Bomba Descarregada</string>
<string name="danarkoreanpump">DanaR Coreana</string>
<string name="basal_rate">Valor da Basal:</string>
<string name="profile_set_failed">Não foi possivel configurar o perfil de basal</string>
<string name="profile_set_ok">Perfil Basal actualizado na bomba</string>
<string name="danar_disableeasymode">Desactivar modo EasyUI na bomba</string>
<string name="danar_enableextendedbolus">Habilitar bolus estendido na bomba</string>
<string name="danar_switchtouhmode">Mudar de modo U/d para U/h na bomba</string>
<string name="basalvaluebelowminimum">Valor da basal abaixo do mínimo. Perfil não definido!</string>
<string name="sms_actualbg">GLIC:</string>
<string name="sms_lastbg">Ultima Gli:</string>
<string name="mdi">MDI</string>
<string name="MM640g">MM640g</string>
<string name="ongoingnotificaction">Notificação em curso</string>
<string name="old_data">DADOS ANTIGOS</string>
<string name="minago">%1$d min atrás</string>
<string name="sms_minago">%1$dmin atrás</string>
<string name="localprofile">Perfil local</string>
<string name="openapsama">OpenAPS AMA</string>
<string name="short_avgdelta">Delta médio curto</string>
<string name="long_avgdelta">Delta médio longo</string>
<string name="array_of_elements">Array de %1$d elementos.\nValor actual:</string>
<string name="openapsma_autosensdata_label">Dados Autosens</string>
<string name="openapsma_scriptdebugdata_label">Script debug</string>
<string name="openapsama_useautosens">Utilizar função AMA autosens</string>
<string name="refresheventsfromnightscout">Actualizar tratamentos do NS</string>
<string name="deletefuturetreatments">Apagar tratamentos do futuro</string>
<string name="eatingsoon">Comer brevemente</string>
<string name="hypo">Hipo</string>
<string name="activity">Actividade</string>
<string name="removerecord">Remover registo:</string>
<string name="danar_stats">Estatísticas DanaR</string>
<string name="danar_stats_cumulative_tdd">Dose diária acumulativa</string>
<string name="danar_stats_expweight">Dose diária exponencialmente ponderada</string>
<string name="danar_stats_basalrate">Basal</string>
<string name="danar_stats_bolus">Bólus</string>
<string name="danar_stats_tdd">TDD</string>
<string name="danar_stats_date">Data</string>
<string name="danar_stats_ratio">Rácio</string>
<string name="danar_stats_amount_days"># Dias</string>
<string name="danar_stats_weight">Peso</string>
<string name="danar_stats_warning_Message">Possivelmente impreciso se foram usados bolus para purgar/preencher!</string>
<string name="danar_stats_olddata_Message">Dados antigos, pressione \"Recarregar\"</string>
<string name="danar_stats_tbb">Basal Diária Total</string>
<string name="danar_stats_tbb2">Basal diária * 2</string>
<string name="initializing">A inicializar ...</string>
<string name="actions_shortname">ACÇ</string>
<string name="configbuilder_shortname">CONF</string>
<string name="loop_shortname">LOOP</string>
<string name="simpleprofile_shortname">PS</string>
<string name="oaps_shortname">OAPS</string>
<string name="localprofile_shortname">PL</string>
<string name="danarpump_shortname">DANA</string>
<string name="overview_shortname">Início</string>
<string name="virtualpump_shortname">BOMBAV</string>
<string name="profileviewer_shortname">NSPerfil</string>
<string name="treatments_shortname">TRATA</string>
<string name="careportal_shortname">CP</string>
<string name="objectives_shortname">OBJ</string>
<string name="wear_shortname">WEAR</string>
<string name="smscommunicator_shortname">SMS</string>
<string name="short_tabtitles">Abreviar títulos dos separadores</string>
<string name="always_use_shortavg">Usar sempre delta médio curto em vez de delta simples</string>
<string name="always_use_shortavg_summary">Útil quando há ruído nos dados de fontes sem filtro como o xDrip.</string>
<string name="advancedsettings_title">Configurações Avançadas</string>
<string name="danar_model">Modelo: %1$02X Protocolo: %2$02X Código: %3$02X</string>
<string name="profile">Perfil</string>
<string name="openapsama_max_daily_safety_multiplier_summary">Valor padrão: 3 Por segurança é o valor limite estabelecido por OpenAPS. O que faz é limitar a basal a x3 a basal mázima. Se necessário modificar este valor, por favor ter em conta que os dados apontam para que os limites de segurança sejam - 3 x max diario ou 4x valor actual (qual seja menor) como valores máximos.</string>
<string name="openapsama_current_basal_safety_multiplier_summary">Valor padrão: 4 Esta é a outra parte dos valores limites de segurança - 3 x max diário ou 4x valor actual - do OpenAPS. Isto define que não importa o valor da basal máxima definido na bomba, o valor máximo da basal temporária não pode ser maior que 4 x o valor da basal definida na bomba. O objectivo é evitar que sejam determinadas basais temporárias demasiado elevadas antes que se perceba como o algoritmo funciona. 4x é um valor que a maior parte das pessoas nunca necessitará de alterar pois o mais provável é necessitar de alterar outras definições para não necessitar de \"ultrapassar\" este limite de segurança.</string>
<string name="openapsama_autosens_max_summary">Valor predefinido: 1.2\n Este é um multiplicador para autosens (e em breve autotune) que coloca um limite máximo de 20% aos rácios superiores e inferiores de autosens, o que por sua vez calcula o quão alto autosens pode ajustar a basal, quão pode baixar o Factor de Sensibilidade (ISF) e baixar o valor alvo de glucose no sangue (BG).</string>
<string name="openapsama_autosens_min_summary">Valor padrão: 0.7\nO outro lado dos limites de segurança do autosens. Coloca um tecto no quão baixo autosens pode ajustar as basais, e quão alto pode ajustar os valores de ISF e valor alvo de glucose no sangue (BG).</string>
<string name="openapsama_autosens_adjusttargets">Autosens também ajusta os alvos</string>
<string name="openapsama_autosens_adjusttargets_summary">Valor padrão: true\nÉ usado para permitir que autosens possa ajustar os valores alvo de glucose no sangue (BG), além de ISF e basais.</string>
<string name="openapsama_bolussnooze_dia_divisor_summary">Valor padrão: 2\nBolus Snooze (pausa após bolus) é executado depois de realizar um bolus por refeição Desta maneira o algoritmo não irá contrariar com temporárias baixas logo depois da refeição. O valor padrão é 2; Então uma duração de acção da insulina (DIA) de 5h significa que o Bolus Snooze irá ser gradualmente reduzido ao longo de 2,5 horas = 5/2 = DIA/Valor padrão.</string>
<string name="openapsama_min_5m_carbimpact_summary">Valor padrão: 3.0 para detecção avançada de refeições (AMA) ou 8.0 para super micro bolus (SMB). Esta é a configuração padrão para o calculo de quanto varia a cada 5 min a glucose no sangue (BG) devido à absorção de hidratos de carbono. O padrão é 3mg/ dl / 5min. Isso afeta a rapidez com que decaem as calorias no corpo (COB), e quantos hidratos de carbono terão de ser considerados no cálculo da previsão de BG, quando é que a BG está baixando mais do que espectável ou não subindo como espectável.</string>
<string name="openapsama_link_to_preferncejson_doc_txt">Atenção!\n Normalmente não é necessário modificar os valores abaixo. Por favor PRESSIONE AQUI e LEIA o texto para garantir que ENTENDE as consequenciais antes de alterar algum destes valores.</string>
<string name="error_only_numeric_digits_allowed">Apenas dígitos numéricos são permitidos.</string>
<string name="error_only_numeric_digits_range_allowed">Apenas são permitidos valores entre %1$s e %2$s.</string>
<string name="error_field_must_not_be_empty">Este campo não deve estar vazio</string>
<string name="error_phone_not_valid">Número de telefone não é válido</string>
<string name="smscommunicator_invalidphonennumber">SMS número de telefone inválido</string>
<string name="overview_calibration">Calibração</string>
<string name="send_calibration" formatted="false">Enviar calibração %.1f para o xDrip?</string>
<string name="xdripnotinstalled">xDrip+ não está instalado</string>
<string name="calibrationsent">Calibração enviada para o xDrip</string>
<string name="smscommunicator_remotecalibrationnotallowed">Calibração remota não permitida</string>
<string name="smscommunicator_calibrationsent">Calibração enviada. Recepção têm de estar activada no xDrip.</string>
<string name="smscommunicator_calibrationfailed">O xDrip não esta a receber as calibrações</string>
<string name="pumpsuspended">Bomba suspensa</string>
<string name="gettingpumpstatus">A obter estado bomba</string>
<string name="settingtempbasal">Definindo basal temp</string>
<string name="stoppingtempbasal">A parar basal temp</string>
<string name="settingextendedbolus">Configurando bolus prolongado</string>
<string name="stoppingextendedbolus">Parando bolus prolongado</string>
<string name="updatingbasalrates">Atualizar valores das basais</string>
<string name="disconnecting">A desligar</string>
<string name="executing">A Executar</string>
<string name="virtualpump_settings">Definições da bomba virtual</string>
<string name="virtualpump_uploadstatus_title">Enviar estado para NS</string>
<string name="wrongpassword">Senha incorrecta</string>
<string name="settings_password">Senha para definições</string>
<string name="unlock_settings">Desbloquear configurações</string>
<string name="approachingdailylimit">Aproximação do limite diario de insulina</string>
<string name="nsclientinternal">NSCliente</string>
<string name="nsclientinternal_shortname">NSCI</string>
<string name="nsclientinternal_url">URL:</string>
<string name="nsclientinternal_autoscroll">Rolar automático</string>
<string name="restart">Reiniciar</string>
<string name="nsclientinternal_title">NSCliente</string>
<string name="nsclientinternal_url_title">Nightscout URL</string>
<string name="nsclientinternal_url_dialogmessage">Introduza o Nightscout URL</string>
<string name="nsclientinternal_secret_title">NS API secret</string>
<string name="nsclientinternal_secret_dialogtitle">NS API secret</string>
<string name="nsclientinternal_secret_dialogmessage">Insira NS API secret (min 12 caract.)</string>
<string name="deliver_now">Entregar agora</string>
<string name="clear_queue">Limpar fila de espera</string>
<string name="show_queue">Mostrar file de espera</string>
<string name="queue">Fila de espera:</string>
<string name="status">Estado:</string>
<string name="paused">Em pausa</string>
<string name="clearlog">Limpar Registo</string>
<string name="nowritepermission">Cliente NS sem permissões para alterar dados. Tem a senha API correta?</string>
<string name="wear_settings">Definições Wear</string>
<string name="wear_detailedIOB_title">Mostrar IOB detalhada</string>
<string name="wear_detailedIOB_summary">Dividir IOB entre IOB de bolus e de basal na face do relógio</string>
<string name="nosuccess">sem efeito - por favor verifique no telemóvel</string>
<string name="notavailable">Indisponível</string>
<string name="patientage">Idade do Paciente</string>
<string name="child">Criança</string>
<string name="teenage">Adolescente</string>
<string name="adult">Adulto</string>
<string name="resistantadult">Adulto resistente insulina</string>
<string name="patientage_summary">Por favor seleccione a idade do diabético para definir os limites de segurança</string>
<string name="Glimp">Glimp</string>
<string name="needwhitelisting">%s necessita de autorizar a não optimização da bateria para assegurar a performance necessária</string>
<string name="loopsuspended">Loop suspenso</string>
<string name="loopsuspendedfor">Suspendido (%1$d m)</string>
<string name="loopsuperbolusfor">Superbólus (%1$d m)</string>
<string name="suspendloopfor1h">Suspender loop por 1h</string>
<string name="suspendloopfor2h">Suspender loop por 2h</string>
<string name="suspendloopfor3h">Suspender loop por 3h</string>
<string name="suspendloopfor10h">Suspender loop por 10h</string>
<string name="disconnectpumpfor15m">Desligar bomba por 15 min</string>
<string name="disconnectpumpfor30m">Desligar bomba por 30 min</string>
<string name="disconnectpumpfor1h">Desligar bomba por 1 h</string>
<string name="disconnectpumpfor2h">Desligar bomba por 2 h</string>
<string name="disconnectpumpfor3h">Desligar bomba por 3 h</string>
<string name="resume">Retomar</string>
<string name="smscommunicator_wrongduration">Duração errada</string>
<string name="smscommunicator_loopsuspended">Loop suspenso</string>
<string name="smscommunicator_loopresumed">Loop retomado</string>
<string name="treatments_wizard_bgtrend_label">Tendência 15 min</string>
<string name="treatments_wizard_cob_label">COB</string>
<string name="superbolus">Superbólus</string>
<string name="ns_logappstartedevent">Registar inicio da app no NS</string>
<string name="restartingapp">A sair da aplicação para aplicar as configurações.</string>
<string name="danarv2pump">DanaRv2</string>
<string name="configbuilder_insulin">Insulina</string>
<string name="configbuilder_insulin_description">Qual o tipo de insulina que está a utilizar?</string>
<string name="fastactinginsulin">Insulina de ação rapida</string>
<string name="fastactinginsulincomment">Novorapid, Novolog, Humalog</string>
<string name="ultrafastactinginsulincomment">Fiasp</string>
<string name="insulin_shortname">INS</string>
<string name="enablesuperbolus">Activar superbólus no assistente</string>
<string name="enablesuperbolus_summary">Habilite a funcionalidade de superbolus no assistente. Não habilite até que aprenda o funcionamento. PODE CAUSAR OVERDOSE DE INSULINA SE USAR INDISCRIMINADAMENTE!</string>
<string name="iob">IOB</string>
<string name="cob">COB</string>
<string name="virtualpump_firmware_label">Firmware</string>
<string name="pump_lastconnection_label">Última ligação</string>
<string name="danar_bluetooth_status">Estado Bluetooth</string>
<string name="nav_about">Acerca</string>
<string name="smscommunicator_missingsmspermission">Falta de permissão SMS</string>
<string name="xdripstatus_settings">Estado xDrip (relógio)</string>
<string name="xdripstatus">Linha estado xDrip (relógio)</string>
<string name="xdripstatus_shortname">xds</string>
<string name="wear_showbgi_title">Mostrar BGI</string>
<string name="wear_showbgi_summary">Adicionar BGI à linha de status</string>
<string name="ns_noupload">Sem envio para NS</string>
<string name="ns_noupload_summary">Todos os dados enviados para NS são descartados. AAPS está conectado ao NS, mas não é feita nenhuma alteração no NS</string>
<string name="basal_step">Valor da Basal</string>
<string name="bolus_step">Incremento de bolus</string>
<string name="extendedbolus">BólusEstendido</string>
<string name="temptarget">AlvoTemp</string>
<string name="overview_extendedbolus_cancel_button">Cancelar Bólus Estendido</string>
<string name="careportal_sensorage_label">Idade Sensor</string>
<string name="careportal_canulaage_label">Idade Canula</string>
<string name="careportal_insulinage_label">Idade Insulina</string>
<string name="hours">horas</string>
<string name="overview_newtempbasal_basaltype_label">Tipo de Basal</string>
<string name="invalidprofile">Perfil inválido !!!</string>
<string name="profileswitch">TrocaPerfil</string>
<string name="careportal_pbage_label">Idade bateria bomba</string>
<string name="careportal_pumpbatterychange">Troca bateria bomba</string>
<string name="ns_alarmoptions">Opções Alarme</string>
<string name="nsalarm_urgenthigh">Urgência hiperglicemia</string>
<string name="nsalarm_high">Alto</string>
<string name="nsalarm_low">Baixo</string>
<string name="nsalarm_urgentlow">Urgência hipoglicemia</string>
<string name="nsalarm_staledata">Dados Obsoletos</string>
<string name="nsalarm_urgentstaledata">Dados obsoletos urgentes</string>
<string name="nsalarm_staledatavalue_label">Tempo limite para dados obsoletos [min]</string>
<string name="nsalarm_urgent_staledatavalue_label">Tempo limite para Urgência por dados obsoletos [min]</string>
<string name="openapsama_autosens_period">Intervalo para autosens [h]</string>
<string name="openapsama_autosens_period_summary">Quantidade de horas observadas para a deteção de sensibilidade (o tempo de absorção dos hidratos de carbono é excluído)</string>
<string name="pump">Bomba</string>
<string name="openaps">OpenAPS</string>
<string name="uploader">Uploader</string>
<string name="configbuilder_sensitivity">Detecção sensibilidade</string>
<string name="configbuilder_sensitivity_description">Que algoritmo de sensibilidade deve ser usado?</string>
<string name="sensitivity_shortname">SENS</string>
<string name="sensitivityoref0">Sensibilidade Oref0</string>
<string name="sensitivityoref1">Sensibilidade Oref1</string>
<string name="sensitivityaaps">Sensibilidade AAPS</string>
<string name="absorptionsettings_title">Configurações de absorção</string>
<string name="absorption_maxtime_title">Tempo máx. absorção refeição [h]</string>
<string name="absorption_maxtime_summary">Tempo em horas, espectável para que todos os hidratos de carbono da refeição sejam absorvidos</string>
<string name="danar_visualizeextendedaspercentage_title">Visualizar bólus estendido com %</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>
<string name="careportal_pbage_label_short">PBAGE</string>
<string name="openaps_short">OAPS</string>
<string name="uploader_short">UPLD</string>
<string name="basal_short">BAS</string>
<string name="virtualpump_extendedbolus_label_short">EST</string>
<string name="keep_screen_on_title">Manter ecrã ligado</string>
<string name="keep_screen_on_summary">Impedir Android de desligar o ecrã. Isto irá consumir muita bateria quando não ligado ao carregador.</string>
<string name="sensitivity_warning">Ao activar a função Autosense lembre-se de introduzir todos os hidratos de carbono (carbs) que comeu. Caso contra contrário os desvios de carbs serão erroneamente identificados como uma variação da sensibilidade!!</string>
<string name="sensitivityweightedaverage">Média ponderada da Sensibilidade</string>
<string name="mdtp_ok">OK</string>
<string name="mdtp_cancel">Cancelar</string>
<string name="notloadedplugins">Nem todos perfis foram carregados!</string>
<string name="valuesnotstored">Valores não guardados!</string>
<string name="ns_localbroadcasts">Activar partilha para outras aplicações (como xDrip).</string>
<string name="ns_localbroadcasts_title">Activar partilha local.</string>
<string name="careportal_activity_label">FEEDBACK ACTIVIDADE &amp;</string>
<string name="careportal_carbsandbolus_label">HIDRATOS &amp; BÓLUS</string>
<string name="careportal_cgm_label">CGM &amp; OPENAPS</string>
<string name="careportal_pump_label">BOMBA</string>
<string name="overview_newtempbasal_basalabsolute">Valor da Basal [U/h]</string>
<string name="careportal_newnstreatment_duration_min_label">Duração [min]</string>
<string name="openapssmb">OpenAPS SMB</string>
<string name="smb_shortname">SMB</string>
<string name="enableuam">Activar UAM</string>
<string name="enablesmb">Activar SMB</string>
<string name="enablesmb_summary">Use Super Micro Boluses em vez de basal temp para uma acção mais rápida</string>
<string name="enableuam_summary">Detecção de refeições não Introduzidas</string>
<string name="insulin_oref_peak">Tempo Pico da curva de IOB</string>
<string name="insulin_peak_time">Tempo Pico [min]</string>
<string name="free_peak_oref">Oref Pico-Livre</string>
<string name="rapid_acting_oref">Oref Acção Rápida</string>
<string name="ultrarapid_oref">Ultra-Rapid Oref</string>
<string name="dia_too_short">Duração de Acção da Insulina (DIA) de %1$f demasiado curto - corrigido para %2$f!</string>
<string name="activate_profile">Activar perfil</string>
<string name="date">Data</string>
<string name="invalid">INVÁLIDO</string>
<string name="waitingforpairing">Aguardando emparelhamento na bomba</string>
<string name="pairingok">Emparelhamento OK</string>
<string name="pairingtimedout">Tempo limite emparelhamento</string>
<string name="pairing">A EMPARELHAR</string>
<string name="danars_nodeviceavailable">Nenhum dispositivo encontrado até agora</string>
<string name="emptyreservoir">Reservatório vazio</string>
<string name="bloodsugarmeasurementalert">Alerta medição da glicemia</string>
<string name="remaininsulinalert">Nível de insulina restante</string>
<string name="danarspump">DanaRS</string>
<string name="danarspump_shortname">Dana</string>
<string name="selectedpump">Bomba seleccionada</string>
<string name="pairpump">Emparelhar nova bomba</string>
<string name="bolusspeed">Velocidade Bólus</string>
<string name="danar_setbasalstep001">Coloque o incremento da basal em 0.01 U/h</string>
<string name="serialnumber">Número de série</string>
<string name="careportal_newnstreatment_percentage_label">Percentagem</string>
<string name="careportal_newnstreatment_timeshift_label">Alteração Turno</string>
<string name="default_temptargets">Alvo-Temp padrão</string>
<string name="eatingsoon_duration">duração comerbreve</string>
<string name="eatingsoon_target">alvo comerbreve</string>
<string name="activity_duration">duração actividade</string>
<string name="activity_target">alvo actividade</string>
<string name="hypo_duration">duração hipo</string>
<string name="hypo_target">alvo hipo</string>
<string name="danar_history_prime">Purge/Encha</string>
<string name="gettingextendedbolusstatus">Procurando o status do bolus estendido</string>
<string name="gettingbolusstatus">A obter estado bólus</string>
<string name="gettingtempbasalstatus">A obter o status da basal temporária</string>
<string name="gettingpumpsettings">A obter as definições da bomba</string>
<string name="gettingpumptime">A obter hora bomba</string>
<string name="reuse">reutilizar</string>
<string name="wearcontrol_title">Controles do Relógio</string>
<string name="wearcontrol_summary">Definir Alvo-Temp and inserir Tratamentos do relógio.</string>
<string name="connectiontimedout">Ligação expirou</string>
<string name="food">Alimentos</string>
<string name="shortgramm">g</string>
<string name="shortminute">m</string>
<string name="shorthour">h</string>
<string name="none"><![CDATA[<nenhum>]]></string>
<string name="shortkilojoul">kJ</string>
<string name="shortenergy">En</string>
<string name="shortprotein">Pr</string>
<string name="shortfat">Gor</string>
<string name="active"><![CDATA[<Activo>]]></string>
<string name="waitingforestimatedbolusend">A aguardar o final do bolus. Restam %1$d sec.</string>
<string name="processinghistory">A processar acção</string>
<string name="startingbolus">A iniciar administração de bolus</string>
<string name="executingrightnow">Comando será executado agora</string>
<string name="pumpdrivercorrected">Controlador bomba corrigido</string>
<string name="pump_unreachable">Bomba inacessível</string>
<string name="missed_bg_readings">Leituras Glic. perdidas</string>
<string name="raise_notifications_as_android_notifications">Usar as notificações do sistema para alertas e notificações</string>
<string name="localalertsettings_title">Alertas local</string>
<string name="enable_missed_bg_readings_alert">Alerta caso nenhuma glicemia seja recebida</string>
<string name="enable_pump_unreachable_alert">Alerta caso não seja possivel alcançar a bomba</string>
<string name="pump_unreachable_threshold">Limite para bomba inacessível [min]</string>
<string name="urgent_alarm">Alarme Urgente</string>
<string name="info">INFO</string>
<string name="bluetooth">Bluetooth</string>
<string name="btwatchdog_title">Watchdog BT</string>
<string name="btwatchdog_summary">Desliga o bluetooth do telefone durante um segundo se nenhuma conexão com bomba for possível. Este parâmetro pode ser util em alguns telefones, onde a pilha bluetooth congela.</string>
<string name="DexcomG5">Aplicação DexcomG5 (com patch)</string>
<string name="dexcomg5_nsupload_title">Enviar dados Glic. para NS</string>
<string name="dexcomg5_upload">Definições envio G5</string>
<string name="poctech_upload">Definições de upload para Poctech</string>
<string name="wear_detailed_delta_title">Mostrar Delta detalho</string>
<string name="wear_detailed_delta_summary">Mostrar delta com mais um ponto decimal</string>
<string name="smbmaxminutes_summary">Limite de minutos de basal para SMB</string>
<string name="unsupportedfirmware">Firmware bomba não suportado</string>
<string name="dexcomg5_xdripupload_title">Enviar dados Glic. para xDrip+</string>
<string name="dexcomg5_xdripupload_summary">Seleccionar 640g/Eversense como fonte no xDrip+</string>
<string name="nsclientbg">Glic NSCliente</string>
<string name="minimalbasalvaluereplaced">Valor da basal alterado para o valor mínimo suportado: %s</string>
<string name="maximumbasalvaluereplaced">Valor da basal alterado para o valor máximo suportado: %s</string>
<string name="overview_editquickwizard_usebg">Cálculos Glic</string>
<string name="overview_editquickwizard_usebolusiob">Cálculo de Bólus IOB</string>
<string name="overview_editquickwizard_usebasaliob">Cálculo de Basal IOB</string>
<string name="overview_editquickwizard_usetrend">Cálculo tendência</string>
<string name="overview_editquickwizard_usesuperbolus">Cálculo de superbolus</string>
<string name="yes">Sim</string>
<string name="no">Não</string>
<string name="positiveonly">Positivo apenas</string>
<string name="negativeonly">Negativo apenas</string>
<string name="overview_editquickwizard_usecob">Cálculo COB</string>
<string name="overview_editquickwizard_usetemptarget">Cálculo alvo temporário</string>
<string name="loopenabled">Loop activado</string>
<string name="apsselected">APS seleccionado</string>
<string name="nsclienthaswritepermission">NSCLiente tem permissão de escrita</string>
<string name="closedmodeenabled">Modo fechado ativado</string>
<string name="maxiobset">IOB máxima definida correctamente</string>
<string name="hasbgdata">Glicemia disponivel desde a fonte selecionada</string>
<string name="basalprofilenotaligned" formatted="false">Valores das basais não definidos por horas: %s</string>
<string name="zerovalueinprofile" formatted="false">Perfil inválido: %s</string>
<string name="combo_programming_bolus">A programar a bomba para injectar o bolus</string>
<string name="combo_refresh">Actualizar</string>
<string name="combo_pump_state_label">Estado</string>
<string name="combo_pump_activity_label">Actividade</string>
<string name="combo_no_pump_connection">Sem conexão há %1$d min</string>
<string name="combo_tbr_remaining">%1$d%% (%2$d min restantes)</string>
<string name="combo_pump_state_initializing">A iniciar</string>
<string name="combo_pump_state_suspended_due_to_error">Suspenso devido ao erro</string>
<string name="combo_pump_state_suspended_by_user">Suspenso pelo utilizador</string>
<string name="combo_pump_state_running">A correr</string>
<string name="combo_pump_action_cancelling_tbr">Cancelar TBR</string>
<string name="combo_pump_action_setting_tbr">A definir TBR (%1$d%% / %2$d min)</string>
<string name="combo_pump_action_bolusing">Injectando (%.1f U)</string>
<string name="combo_pump_action_refreshing">A actualizar</string>
<string name="combo_pump_unsupported_operation">Operação solicitada não suportada pela bomba</string>
<string name="combo_low_suspend_forced_notification">Ultilização nao segura: bolus estendudos ou multionda estão activos. Modo do loop foi alterado para apenas suspender em limite inferior por 6h. Apenas são suportados bolus normais em modo loop</string>
<string name="combo_force_disabled_notification">Utilização insegura: A bomba utiliza uma perfil de basal diferente do primeiro. O loop foi desactivado. Seleccionar o primeiro perfil da bomba e reinicie.</string>
<string name="bolus_frequency_exceeded">Um bolus com o mesmo valor foi introduzido nos 2 últimos minutos. Para evitar introduções acidentais e segurança contra bugs existentes o bolus foi cancelado.</string>
<string name="combo_pump_connected_now">Agora</string>
<string name="combo_activity_reading_pump_history">A ler histórico bomba</string>
<string name="danar_history">histórico bomba</string>
<string name="combo_activity_setting_basal_profile">A definir perfil basal</string>
<string name="combo_pump_cartridge_low_warrning">Nível cartucho da bomba está baixo</string>
<string name="combo_pump_battery_low_warrning">Bateria da bomba está fraca</string>
<string name="combo_is_in_error_state">A bomba está a dar o erro E%1$d: %2$s</string>
<string name="combo_reservoir_low">Baixo</string>
<string name="combo_reservoir_empty">Vazio</string>
<string name="combo_reservoir_normal">Normal</string>
<string name="combo_notification_check_time_date">Necesário actualizar relógio da bomba</string>
<string name="combo_warning">Aviso</string>
<string name="combo_pump_tbr_cancelled_warrning">Basal Temporária CANCELADA. O aviso foi confirmado</string>
<string name="combo_error_no_connection_no_bolus_delivered">Não foi possivel establecer comunicação com a bomba. Nenhum bolus foi administrado.</string>
<string name="combo_error_no_bolus_delivered">Administração de bolus falhou. Nenhum bolus parece ter sido administrado. Para confirmar, por favor verifique a bomba de forma a evitar uma dupla administração de bolus e programe novamente o bolus. De forma a evitar qualquer problema, os bolus não são reprogramados de forma automatica.</string>
<string name="combo_error_partial_bolus_delivered">Apenas %1$.2f U do bolus de %2$.2f U foi injectado de devido a um erro. Por favor verifique a bomba e tome as medidas necessárias.</string>
<string name="combo_error_bolus_verification_failed">A injeção do bolus e a verificação do histórico da bomba falharam, por favor verifique a bomba. Se o bolus foi injetado será adicionado ao histórico de tratamentos durante a próxima conexão com a bomba.</string>
<string name="combo_reservoir_level_insufficient_for_bolus">Não há insulina suficiente no reservatório para bolus</string>
<string name="extendedbolusdeliveryerror">Erro na entrega Bólus Estendido</string>
<string name="insightpump_shortname">Insight</string>
<string name="insightpump">Bomba Insight</string>
<string name="status_no_colon">Estado</string>
<string name="changed">Alterado</string>
<string name="pump_stopped_uppercase">BOMBA PARADA</string>
<string name="status_updated">Estado Actualizado</string>
<string name="ago">atrás</string>
<string name="with">com</string>
<string name="insight_active_tbr">TBR activa</string>
<string name="insight_min_left">min restante</string>
<string name="log_book">Diário</string>
<string name="insight_last_completed_action">Última Acção Terminada</string>
<string name="insight_min">min</string>
<string name="insight_remaining_over">a restar mais de</string>
<string name="insight_total_with">total com</string>
<string name="insight_upfront_with">atenção com</string>
<string name="insight_stay_always_connected">Ficar sempre ligada</string>
<string name="insight_history_idle">PARADO</string>
<string name="insight_history_syncing">A SINCRONIZAR</string>
<string name="insight_history_busy">OCUPADO</string>
<string name="insight_history_synced">SINCRONIZADO</string>
<string name="insight_startup_uppercase">INICIANDO</string>
<string name="insight_needs">necessita</string>
<string name="insight_not_connected_to_companion_app">Nãp conectado com a aplicação acompanhante!</string>
<string name="insight_companion_app_not_installed">Aplicação acompanhante aparentemente não instalada!</string>
<string name="insight_incompatible_compantion_app_we_need_version">Aplicação acompanhante incompatível. Versão necessitada</string>
<string name="insight_unknown">Desconhecido</string>
<string name="insight_waiting_for_code">A aguardar por código de confirmação</string>
<string name="insight_code_rejected">Codigo rejeitado</string>
<string name="insight_app_binding">Associação de aplicação</string>
<string name="insight_not_authorized">Não autorizado</string>
<string name="insight_incompatible">Incompativel</string>
<string name="second">segundo</string>
<string name="minute">minuto</string>
<string name="hour">hora</string>
<string name="day">dia</string>
<string name="week">semana</string>
<string name="time_plural">s</string>
<string name="insight_keepalive_format_string">%1$ds expira %2$s</string>
<string name="insight_keep_alive_status">Estado manter ligado</string>
<string name="statistics">Estatísticas</string>
<string name="connect_preemptively">Ligar preventivamente</string>
<string name="automatically_connect_when">Conectar automaticamente quando se inicia o AndroidAPS, antes que seja efectuado qualquer comando, de maneira a reduzir o atraso na conexão</string>
<string name="not_recommended_due_to_battery_drain">Não é recomendado devido ao gasto de bateria</string>
<string name="enablesmbalways">SMB sempre activado</string>
<string name="enablesmbalways_summary">SMB sempre activo independentemente dos bolus. Possível apenas quando o medidor tive um bom filtro de dados como o G5</string>
<string name="enablesmbaftercarbs">Activar SMB após hidratos</string>
<string name="enablesmbaftercarbs_summary">SMB activo por 6h após carbs, mesmo com 0 COB. Possível apenas quando o medidor tive um bom filtro de dados como o G5</string>
<string name="enablesmbwithcob">Activar SMB com COB</string>
<string name="enablesmbwithcob_summary">Activar SMB quando tem COB activo.</string>
<string name="enablesmbwithtemptarget">SMB activo com valores alvo temporários</string>
<string name="enablesmbwithtemptarget_summary">SMB activo quando há valor alvo temporário activo (exercício, etc)</string>
<string name="enablesmbwithhightemptarget">SMB activo com alvos temporários elevados</string>
<string name="enablesmbwithhightemptarget_summary">SMB activo com alvos temporários elevados em curso (exercicio)</string>
<string name="let_temp_basal_run">Permitir basal temp correr</string>
<string name="mute">Silêncio</string>
<string name="overview_insulin_label">Insulina</string>
<string name="overview_carbs_label">Hidratos</string>
<string name="overview_buttons_selection">Botões</string>
<string name="show_calibration_button_summary">Enviar calibrações para o xDrip+ ou abrir sistema de calibração do G5</string>
<string name="show_cgm_button_summary">Abre xDrip+, botão retorcer volta ao AAPS</string>
<string name="carb_increment_button_message">Número de carboidratos a adicionar quando o botão é premido</string>
<string name="insulin_increment_button_message">Unidades de insulina a adicionar quando o botão é premido</string>
<string name="error_starting_cgm">Não foi possível lançar aplicação de monitorização contínua. Por favor verifique que está instalada.</string>
<string name="overview_cgm">CGM</string>
<string name="nav_historybrowser">Navegador do histórico</string>
<string name="wear_notifysmb_title">Notificar no SMB</string>
<string name="wear_notifysmb_summary">Mostrar SMB no relogio como bolus normal.</string>
<string name="ns_create_announcements_from_errors_title">Criar anúncios dos erros</string>
<string name="ns_create_announcements_from_errors_summary">Criar um anúncio no Nightscout para caixas de diálogo de erro e alertas locais (também podem ser visualizados em Careportal sob tratamentos)</string>
<string name="wear_predictions_summary">Mostrar a predições na face do relogio.</string>
<string name="wear_predictions_title">Previsão</string>
<string name="data_choices">Escolha de Dados</string>
<string name="fabric_upload">Envio Fabric</string>
<string name="allow_automated_crash_reporting">Permitir que seja enviado automaticamente à equipa de desenvolvimento o report de crashes e das funções utilizadas, utilizando o serviço fabric.io.</string>
<string name="g5appnotdetected">Por favor actualize a sua versão da app G5 para a versão suportada</string>
<string name="start_activity_tt">Iniciar atividade TT</string>
<string name="start_eating_soon_tt">Iniciar Comer em breve TT</string>
<string name="temptargetshort">TT</string>
<string name="do_not_bolus_record_only">Sem bólus, registar apenas</string>
<string name="category">Categoria</string>
<string name="subcategory">Subcategoria</string>
<string name="bolusrecordedonly">O bolus apenas será gravado</string>
<string name="ns_autobackfill_summary">Preencher glicemias em falta com NS</string>
<string name="loop_smbsetbypump_label">SMB definido pela bomba</string>
<string name="overview_show_sensitivity">Sensibilidade</string>
<string name="overview_show_deviations">Desvios</string>
<string name="overview_show_cob">Carboidratos a bordo</string>
<string name="overview_show_iob">Insulina a bordo</string>
<string name="overview_show_basals">Basais</string>
<string name="no_action_selected">Nenhuma acção seleccionada, nada irá acontecer</string>
<string name="start_hypo_tt">Começar TT Hipo</string>
<string name="closed_loop_disabled_on_dev_branch">A correr a versão dev. O Loop fechado está desabilitado.</string>
<string name="engineering_mode_enabled">Modo engenheiro activado</string>
<string name="not_eng_mode_or_release">Modo de engenharia não habilitado e não no na versão mestra</string>
<string name="pump_basebasalrate">%.2f U/h</string>
<string name="combo_actvity_reading_basal_profile">A ler perfil basal</string>
<string name="combo_bolus_rejected_due_to_pump_history_change">O histórico da bomba foi alterado após o cálculo do bolo ter sido realizado. O bolus não foi injectado. Por favor, verifique se bolus ainda é necessário.</string>
<string name="combo_error_updating_treatment_record">O bolus foi injectado, mas não foi possível adicionar ao histórico. Isto é possível se dois bolus do mesmo valor baixo foram administrados nos últimos dois minutos. Por favor verifique o histórico da bomba e use o Careportal para adicionar os dados em falta caso necessário. Cuidado para não adicionar dados com o mesmo valor no mesmo minuto.</string>
<string name="combo_high_temp_rejected_due_to_pump_history_changes">A rejeitar a temporal alta uma vez que o cálculo não considerou as mudanças do histórico da bomba</string>
<string name="combo_activity_checking_pump_state">A actualizar estado bomba</string>
<string name="combo_warning_pump_basal_rate_changed">O rácio da basal foi alterado na bomba e vai ser actualizado em breve</string>
<string name="combo_error_failure_reading_changed_basal_rate">Rácio da basal foi alterado na bomba, mas a leitura falhou</string>
<string name="combo_activity_checking_for_history_changes">A verificar se há alterações de histórico</string>
<string name="about_link_urls">\n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de)</string>
<string name="combo_check_date">O último bólus tem mais de 24 horas ou está no futuro. Por favor verifique se a data está definida correctamente na bomba.</string>
<string name="combo_suspious_bolus_time">Hora/data da entrega do bólus na bomba parece errado, IOB aparentemente está incorrecto. Verifique hora/data na bomba.</string>
<string name="profileswitch_ismissing">TrocaPerfil em falta. Por favor faça uma troca de perfil ou pressione \"Activar Perfil\" em PerfilLocal.</string>
<string name="combo_bolus_count">Contagem Bólus</string>
<string name="combo_tbr_count">Contagem TBR</string>
<string name="objectivenotstarted">Objetivo %1$d não iniciado</string>
<string name="objectivenotfinished">Objetivo %1$d não concluido</string>
<string name="pumpisnottempbasalcapable">A bomba não é capaz de basais temporárias</string>
<string name="novalidbasalrate">Nenhum valor de basal temporaria valido foi lido da bomba</string>
<string name="closedmodedisabledinpreferences">Loop fecchado disabilitado nas preferências</string>
<string name="autosensdisabledinpreferences">Autosens desabilitado nas preferências</string>
<string name="smbdisabledinpreferences">SMB desactivado nas configurações</string>
<string name="limitingbasalratio">A basal max está limitada a %1$.2f U/h por %2$s</string>
<string name="pumplimit">limite bomba</string>
<string name="itmustbepositivevalue">deve ser valor positivo</string>
<string name="maxbasalmultiplier">multiplicador de basal máx</string>
<string name="maxdailybasalmultiplier">multiplicador de basal máx diária</string>
<string name="smb_frequency_exceeded">Um bolus foi injectado nos últimos 3 minutos, saltando SMB</string>
<string name="basal_set_correctly">Basal correctamente definida</string>
<string name="limitingpercentrate">A limitar rácio percentagem máx para %1$d%% porque %2$s</string>
<string name="limitingbolus">A limitar bólus para %1$.1f U porque %2$s</string>
<string name="limitingextendedbolus">A limitar bólus estendido para %1$.1f U porque %2$s</string>
<string name="limitingmaxiob">A limitar IOB máx. para %1$.1f U porque %2$s</string>
<string name="limitingcarbs">A limitar hidratos para %1$d g porque %2$s</string>
<string name="limitingiob">A limitar IOB para %1$.1f U porque %2$s</string>
<string name="maxvalueinpreferences">valor máx nas preferências</string>
<string name="hardlimit">limite rígido</string>
<string name="unsafeusage">uso não seguro</string>
<string name="readstatusfailed">Erro na leitura de estado</string>
<string name="record_pump_site_change">Registar mudança de sítio</string>
<string name="record_insulin_cartridge_change">Registar mudança cartucho</string>
<string name="smbalwaysdisabled">SMB sempre e depois dos hidratos desactivado por fonte da Glicemia activa não suportar filtro avançado</string>
<string name="smbnotallowedinopenloopmode">SMB não permitido no modo open loop</string>
<string name="food_short">Alimentos</string>
<string name="reset">repor</string>
<string name="waitingfortimesynchronization">À espera da sincronização da hora (%1$d sec)</string>
<string name="loopdisconnectedfor">Desligado (%1$d m)</string>
<string name="automatic_careportal_events">Eventos careportal automáticos</string>
<string name="automatically_upload_insulin_cannula_and_battery_changes_to_nightscout">Automaticamente envia mudança de insulina, canula, pilha e alarmes da bomba para o NightScout</string>
<string name="openapssmb_maxiob_title">Máximo total IOS OpenAPS não pode superar [U]</string>
<string name="pump_stopped">Bomba parada</string>
<string name="pump_started">Bomba iniciada</string>
<string name="pump_paused">Bomba suspensa</string>
<string name="absorption_cutoff_title">Tempo máx. absorção refeição [h]</string>
<string name="time">Hora</string>
<string name="overview_show_notes_field_in_dialogs_title">Mostrar campo de notas na janela de tratamentos</string>
<string name="next_button">Seguinte</string>
<string name="previous_button">Anterior</string>
<string name="nav_setupwizard">Assistente de Configuração</string>
<string name="setupwizard_finish">TERMINAR</string>
<string name="setupwizard_language_prompt">Selecione o seu Idioma</string>
<string name="boluserrorcode">Pedido: %1$.2fU Entregue: %2$.2fU Código Erro: %3$s</string>
<string name="firstinsulinincrement">Primeiro incremento insulina</string>
<string name="secondinsulinincrement">Segundo incremento insulina</string>
<string name="thirdinsulinincrement">Terceiro incremento insulina</string>
<string name="firstcarbsincrement">Primeiro incremento hidratos</string>
<string name="secondcarbsincrement">Segundo incremento hidratos</string>
<string name="thirdcarbsincrement">Terceiro incremento hidratos</string>
<string name="cgm">CGM</string>
<string name="ns_wifionly">Utilize apenas uma conexão WiFi</string>
<string name="ns_wifi_ssids">WiFi SSID</string>
<string name="ns_chargingonly">Apenas quando estiver a carregar</string>
<string name="connectionsettings_title">Definições de ligação</string>
<string name="ns_wifi_allowedssids">SSIDs permitidos (separada por ponto e vírgula)</string>
<string name="ns_allowroaming">Permitir ligação em roaming</string>
<string name="openapsama_autosens_max">Rácio máx. autosens</string>
<string name="openapsama_autosens_min">Rácio min. autosens</string>
<string name="openapsama_bolussnooze_dia_divisor">Pausa bólus divisor DIA</string>
<string name="openapsama_max_daily_safety_multiplier">Multiplicador máx. diário de segurança</string>
<string name="openapsama_current_basal_safety_multiplier">Multiplicador actual de segurança basal</string>
<string name="value_unavailable_short">n/a</string>
<string name="virtualpump_type">Tipo da Bomba Virtual</string>
<string name="virtualpump_definition">Definição da Bomba</string>
<string name="ns_autobackfill_title">Preenchimentoauto Glicemia</string>
<string name="wear_wizard_settings">Definições do Assistente Rápido</string>
<string name="wear_wizard_settings_summary">Resultado cálculos incluídos no Assistente:</string>
<string name="wear_display_settings">Mostrar Configurações</string>
<string name="wear_general_settings">Configurações gerais</string>
<string name="enable_nsclient">Activar NSCliente</string>
<string name="pumpsetup">Configurações da bomba</string>
<string name="readstatus">Ler estado</string>
<string name="adjustprofileinns">Alterações devem ser feitas no NS</string>
<string name="exitwizard">Saltar assistente de configuração</string>
<string name="enableobjectives">Activar Objectivos</string>
<string name="apssetup">Configurar plugin APS</string>
<string name="sensitivitysetup">Configurar plugin Sensibilidade</string>
<string name="setupwizard_sensitivity_url">https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COB</string>
<string name="nsclientinfotext">NSCliente gere a ligação ao Nightscout. Pode saltar esta parte mas não será possível passar os objectivos até que o configure.</string>
<string name="bgsourcesetup">Configure a fonte das glicemias</string>
<string name="startobjective">Iniciar primeiro objectivo</string>
<string name="permission">Permissão</string>
<string name="askforpermission">Pedir permissão</string>
<string name="needlocationpermission">Aplicação requer permissão de localização para pesquisa BT</string>
<string name="request">Pedido</string>
<string name="insulinsourcesetup">Configurar plugin Insulina</string>
<string name="exit">Sair</string>
<string name="danar_useroptions">Opções do utilizador</string>
<string name="danar_timedisplay">Formato hora</string>
<string name="danar_buttonscroll">Botão rolamento</string>
<string name="danar_beep">Sinal ao pressionar botão</string>
<string name="danar_pumpalarm">Alarme</string>
<string name="danar_pumpalarm_sound">Som</string>
<string name="danar_pumpalarm_vibrate">Vibrar</string>
<string name="danar_pumpalarm_both">Ambos</string>
<string name="danar_screentimeout">Desligar LCD [s]</string>
<string name="danar_backlight">Desligar luz de fundo [s]</string>
<string name="danar_glucoseunits">Unidades de Glucose</string>
<string name="danar_shutdown">Desligar(horas)</string>
<string name="danar_lowreservoir">Reservatório baixo (Unidades)</string>
<string name="danar_saveuseroptions">Gravar opções para a bomba</string>
<string name="option_on">Ligado</string>
<string name="option_off">Desligado</string>
<string name="open_navigation">Abrir a navegação</string>
<string name="close_navigation">Fechar a navegação</string>
<string name="nav_plugin_preferences">Preferências plugin</string>
<string name="completed_well_done">Terminado, parabéns!</string>
<string name="not_completed_yet">Incompleto</string>
<string name="time_elapsed">Tempo decorrido</string>
<string name="nth_objective">%1$d. Objectivo</string>
<string name="poctech">Poctech</string>
<string name="description_source_poctech">Receber valores Glucose da app Poctech</string>
<string name="high_temptarget_raises_sensitivity_title">Alto alvotempo aumenta sensibilidade</string>
<string name="high_temptarget_raises_sensitivity_summary"><![CDATA[Aumentar sensibilidade para alvostemp >= 100]]></string>
<string name="low_temptarget_lowers_sensitivity_title">Baixo alvotemp baixa sensibilidade</string>
<string name="low_temptarget_lowers_sensitivity_summary"><![CDATA[Baixar sensibilidade para alvostemp < 100]]></string>
<string name="custom">Personalizado</string>
<string name="largetimedifftitle">Grande diferença Horária</string>
<string name="careportal_removestartedevents">Limpar AndroidAPS iniciado</string>
<string name="storedsettingsfound">Configurações encontradas</string>
<string name="error_adding_treatment_title">Dados tratamento incompletos</string>
<string name="maintenance_settings">Configurações de manutenção</string>
<string name="maintenance_email">Email</string>
<string name="invalid_email_message">E-mail Inválido</string>
<string name="maintenance_amount">Nr. de registos a enviar</string>
<string name="maintenance">Manutenção</string>
<string name="maintenance_shortname">MANU</string>
<string name="send_all_logs">Enviar Logs por e-mail</string>
<string name="delete_logs">Eliminar registos</string>
<string name="generated_ecarbs_note">eCarbs: %1$d g (%2$d h), atraso: %3$d m</string>
<string name="openaps_noasdata">Sem dados Autosens disponíveis</string>
<string name="nav_logsettings">Definições de registo</string>
<string name="resettodefaults">Repor definições por defeito</string>
<string name="nsmalfunction">Erro de funcionamento do NSCliente. Pondere reiniciar o NS e NSCliente.</string>
<string name="as">AS</string>
<string name="versionavailable">Disponível %1$s disponível</string>
<string name="time_offset">Fuso horário</string>
<string name="setupwizard_preferred_aps_mode">Modo APS preferido</string>
<string name="treatments_wizard_total_label">Total</string>
<string name="calculation_short">Calc</string>
<string name="handshaking">Cumprimento</string>
<string name="sendlogfiles">Enviar os ficheiros de registo do dia de hoje para os programadores. Situação inesperada.</string>
<string name="maxbolusviolation">Transgressão Bólus máx</string>
<string name="commanderror">Erro no comando</string>
<string name="speederror">Erro velocidade</string>
<string name="insulinlimitviolation">Transgressão limite insulina</string>
<string name="loop_openmode_min_change">Pedido de mudança mínima [%]</string>
<plurals name="objective_days">
<item quantity="one">%1$d dia</item>
<item quantity="other">%1$d dias</item>
</plurals>
<plurals name="objective_hours">
<item quantity="one">%1$d hora</item>
<item quantity="other">%1$d hora</item>
</plurals>
<plurals name="objective_minutes">
<item quantity="one">%1$d minuto</item>
<item quantity="other">%1$d minutos</item>
</plurals>
</resources>

View file

@ -458,7 +458,6 @@
<string name="openapsama_autosens_adjusttargets">Autosens ajustează țintele la</string>
<string name="openapsama_autosens_adjusttargets_summary">Valoare implicită: adevărat\nAceasta se folosește pentru a permite autosens să ajusteze țintele de glicemie, pe lângă modificările asupra ISF și bazalelor.</string>
<string name="openapsama_bolussnooze_dia_divisor_summary">Valoare implicită: 2\nAmânarea bolusului este aplicată după ce ați făcut un bolus de masă, astfel încât bucla să nu reacționeze cu ținte bazale temporare scăzute atunci când tocmai ați mâncat. Exemplul de față și valoarea implicită sunt 2; astfel o durată de acțiune a insulinei (DIA) de 3 ore duce la o eliminare treptată a întârzierii setării bazalelor temporare după 1.5 ore (3DIA/2).</string>
<string name="openapsama_min_5m_carbimpact_summary">Valoare implicită: 3.0\nAceasta este o setare ce privește impactul carbohidraților pe o durată de 5 minute. Valoarea implicită este de așteptat a fi 3mg/dl/5min. Aceasta afectează cât de mult se scade valoarea COB și cât de mare este presupusă a fi absorbția de carbohidrați în calcularea valorii prezise a glicemiei, atunci când glicemia scade cu mai mult decât s-a estimat sau când nu crește așa cum s-a așteptat.</string>
<string name="openapsama_link_to_preferncejson_doc_txt">Atenție!\nÎn mod normal nu este nevoie să modificați valorile de mai jos. Vă rog să APĂSAȚI AICI și să CITIȚI textul și să vă asigurați că l-ați ÎNȚELES înainte de a schimba valorile.</string>
<string name="error_only_numeric_digits_allowed">Se acceptă numai valori numerice.</string>
<string name="error_only_numeric_digits_range_allowed">Se acceptă numai valori numerice între %1$s - %2$s.</string>
@ -928,7 +927,6 @@
<string name="nav_setupwizard">Asistent de configurare</string>
<string name="setupwizard_finish">TERMINARE</string>
<string name="setupwizard_language_prompt">Alegeți limba</string>
<string name="boluserrorcode">Solicitat: %1$.2fU Livrat: %2$.2fU Cod eroare: %3$d</string>
<string name="firstinsulinincrement">Primul increment de insulină</string>
<string name="secondinsulinincrement">Al doilea increment de insulină</string>
<string name="thirdinsulinincrement">Al treilea increment de insulină</string>

View file

@ -458,7 +458,7 @@
<string name="openapsama_autosens_adjusttargets">Autosens тоже подстроит цели</string>
<string name="openapsama_autosens_adjusttargets_summary">значение по умолчанию : верно. используется чтобы разрешить юстировку целевых СК, а также ISF и базала</string>
<string name="openapsama_bolussnooze_dia_divisor_summary">значение по умолчанию :2 bolus snoose активируется после введения болюса на еду чтобы цикл не взаимодействовал с временными низкими СК сразу после еды. так, трехчасовой DIA при величине 2 означает постыпенное затихание bolus snooze после 1.5 часов (3DIA/2)</string>
<string name="openapsama_min_5m_carbimpact_summary">значение по умолчанию :3 усвоение углеводов за 5 мин. то есть 3 мг/дл/ 5 мин. Влияет на расчет прогнозируемой гликемии, когда СК падает быстрее или не растет так как ожидается.</string>
<string name="openapsama_min_5m_carbimpact_summary">Значение по умолчанию: 3.0 (AMA) или 8.0 (SMB). Эта настройка на усвоение углеводов за 5 мин. По умолчанию ожидается 3мг/дл/5мин. Влияет на скорость учета поглощения углеводов COB и усвоения в расчетах прогнозируемой гликемии, когда СК падает быстрее или не растет так как ожидается.</string>
<string name="openapsama_link_to_preferncejson_doc_txt">Внимание! Обычно нет необходимости изменять приведенные ниже величины. Нажмите ЗДЕСЬ, ПРОЧТИТЕ и убедитесь что вы ПОНИМАЕТЕ изложенное прежде чем менять какую-либо из этих величин</string>
<string name="error_only_numeric_digits_allowed">разрешены только цифровые значения</string>
<string name="error_only_numeric_digits_range_allowed">разрешены только цифровые значения в диапазоне %1$s - %2$s</string>
@ -895,8 +895,9 @@
<string name="maxdailybasalmultiplier">множитель макс суточного базала</string>
<string name="smb_frequency_exceeded">Болюс был подан в течение последних трех минут, минуя супер микро болюс SMB</string>
<string name="basal_set_correctly">Базал задан корректно</string>
<string name="limitingpercentrate">Макс процент базала ограничен до %1$d% ед/ч вследствие %2$s</string>
<string name="limitingpercentrate">Макс процент базала ограничен до %1$d%% ед/ч вследствие %2$s</string>
<string name="limitingbolus">Макс уровень болюса ограничен до %1$.1f ед вследствие %2$s</string>
<string name="limitingextendedbolus">Ограничение расширенного болюса до %1$.1f U из-за %2$s</string>
<string name="limitingmaxiob">Ограничение максимума активного инсулина IOB до %1$.1f U из-за %2$s</string>
<string name="limitingcarbs">Ограничение максимума углеводов до %1$d грамм из-за %2$s</string>
<string name="limitingiob">Ограничение активного инсулина IOB до %1$.1f ед. из-за %2$s</string>
@ -928,7 +929,7 @@
<string name="nav_setupwizard">Мастер настройки</string>
<string name="setupwizard_finish">ГОТОВО</string>
<string name="setupwizard_language_prompt">Выберите Ваш язык</string>
<string name="boluserrorcode">Запрошено: %1$.2f ед. Подано: %2$.2f ед. Код ошибки: %3$d</string>
<string name="boluserrorcode">Запрошено: %1$.2f ед. Подано: %2$.2f ед. Код ошибки: %3$s</string>
<string name="firstinsulinincrement">Первый шаг увеличения инсулина</string>
<string name="secondinsulinincrement">Второй шаг увеличения инсулина</string>
<string name="thirdinsulinincrement">Третий шаг увеличения инсулина</string>
@ -1045,4 +1046,10 @@ Context | Edit Context</string>
<string name="calculation_short">Кальк</string>
<string name="handshaking">Подтверждение связи</string>
<string name="sendlogfiles">Отправьте файлы сегодняшнего лога разработчикам наряду с этим. Непредвиденная ситуация.</string>
<string name="maxbolusviolation">Макс нарушение болюса</string>
<string name="commanderror">Ошибка в команде</string>
<string name="speederror">Ошибка в скорости</string>
<string name="insulinlimitviolation">Нарушение ограничения инсулина</string>
<string name="loop_openmode_min_change">Минимальный запрос на изменения [%]</string>
<string name="loop_openmode_min_change_summary">Алгоритм ИПЖ выдаст всплывающее окно с запросом на новые изменения, только если изменение больше, чем это значение. Значение по умолчанию — 30%</string>
</resources>

View file

@ -459,7 +459,7 @@
<string name="openapsama_autosens_adjusttargets">Úprava cieľovej glykémie pomocou automatickej detekcie citlivosti</string>
<string name="openapsama_autosens_adjusttargets_summary">Štandardná hodnota: zapnuté\nToto nastavenie hovorí, že automatická detekcia citlivosti môže meniť tiež cieľové hodnoty glykémií.</string>
<string name="openapsama_bolussnooze_dia_divisor_summary">Štandardná hodnota: 2\nToto nastavenie hovorí, po akú časť z hodnoty DIA uzavretý okruh po boluse čaká a nereaguje na zmeny glykémií (tu 3DIA/2 = 1,5h).</string>
<string name="openapsama_min_5m_carbimpact_summary">Štandardná hodnota: 3.0 Tato hodnota definuje minimálnu časť strávených sacharidov za každých 5 min. Štandardná hodnota je 3mg/dl/5min. Tato hodnota ovplyvňuje výpočet COB.</string>
<string name="openapsama_min_5m_carbimpact_summary">Štandardná hodnota: 3.0 (AMA), alebo 8.0 (SMB) mg/dl/5min. Táto hodnota definuje minimálnu časť vstrebaných sacharidov za každých 5min. Táto hodnota ovplyvňuje výpočet COB.</string>
<string name="openapsama_link_to_preferncejson_doc_txt">Pozor!\nZa normálnych okolností tieto hodnoty nemusíte meniť. Kliknete TU, PREČÍTAJTE si informácie a UISTITE sa, že im rozumiete skôr, ako ich začnete meniť.</string>
<string name="error_only_numeric_digits_allowed">Povolené iba číslice.</string>
<string name="error_only_numeric_digits_range_allowed">Povolené iba čísla v rozsahu %1$s - %2$s.</string>
@ -898,6 +898,7 @@
<string name="basal_set_correctly">Bazál nastavený správne</string>
<string name="limitingpercentrate">Bazál obmedzený na %1$d%%: %2$s</string>
<string name="limitingbolus">Bolus obmedzený na %1$.1f U: %2$s</string>
<string name="limitingextendedbolus">Predĺžený bolus obmedzený na %1$.1f U: %2$s</string>
<string name="limitingmaxiob">Max IOB obmedzený na %1$.1f U: %2$s</string>
<string name="limitingcarbs">Sacharidy obmedzené na %1$d g: %2$s</string>
<string name="limitingiob">IOB obmedzený na %1$.1f U: %2$s</string>
@ -929,7 +930,7 @@
<string name="nav_setupwizard">Sprievodca nastavením</string>
<string name="setupwizard_finish">Dokončiť</string>
<string name="setupwizard_language_prompt">Vyberte jazyk</string>
<string name="boluserrorcode">Požadované: %1$.2fU Podané: %2$.2fU Chyba: %3$d</string>
<string name="boluserrorcode">Požadované: %1$.2fU Podané: %2$.2fU Chyba: %3$s</string>
<string name="firstinsulinincrement">Prvý prídavok inzulínu</string>
<string name="secondinsulinincrement">Druhý prídavok inzulínu</string>
<string name="thirdinsulinincrement">Tretí prídavok inzulínu</string>
@ -949,6 +950,10 @@
<string name="openapsama_max_daily_safety_multiplier">Max násobiteľ denného najvyššieho bazálu</string>
<string name="openapsama_current_basal_safety_multiplier">Max násobiteľ súčasného bazálu</string>
<string name="value_unavailable_short">---</string>
<string name="virtualpump_type">Typ virtuálnej pumpy</string>
<string name="virtualpump_definition">Definícia pumpy</string>
<string name="virtualpump_pump_def">Bolus: Krok =%1$s\nPredl. bolus: [Krok=%2$s, Dĺžka=%3$smin-%4$sh]\nBazál: Krok=%5$s\nDoč. bazál: %6$s (%7$s), Dĺžka=%8$smin-%9$sh\n%10$s</string>
<string name="virtualpump_pump_def_extended_note">* Rozdielne hodnoty podľa rozsahu nie sú podporované.</string>
<string name="ns_autobackfill_title">Automatické doplňovanie glykémií z NS</string>
<string name="wear_wizard_settings">Nastavenie wizardu</string>
<string name="wear_wizard_settings_summary">Kalkulácia použitá vo výsledku wizardu:</string>
@ -1039,6 +1044,11 @@
<string name="treatments_wizard_total_label">Spolu</string>
<string name="calculation_short">Kalk</string>
<string name="handshaking">Overovanie</string>
<string name="sendlogfiles">Odošlite dnešné súbory protokolov vývojárom spolu s týmto časom. Neočakávaná situácia.</string>
<string name="maxbolusviolation">Prekročený maximálny bolus</string>
<string name="commanderror">Chyba príkazu</string>
<string name="speederror">Chyba rýchlosti</string>
<string name="insulinlimitviolation">Prekročený limit inzulínu</string>
<plurals name="objective_days">
<item quantity="one">%1$d deň</item>
<item quantity="few">%1$d dní</item>

View file

@ -458,7 +458,7 @@
<string name="openapsama_autosens_adjusttargets">Autosens justerar även mål-BG</string>
<string name="openapsama_autosens_adjusttargets_summary">Standardvärde: sant. Detta för att tillåta autosens justera mål-BG utöver ISF och basaler.</string>
<string name="openapsama_bolussnooze_dia_divisor_summary">Standardvärde: 2 Bolus snooze är aktivt efter att du givit en måltidsbolus, detta för att inte loop ska lågtempa när du just ätit. I detta exempel och grundvärde är 2; innebär att DIA på 3 tim kommer bolus snooze kommer att fasas ut under 1,5 tim (3DIA/2).</string>
<string name="openapsama_min_5m_carbimpact_summary">Standardvärde: 3.0 mg/dl/5 min Detta är grundinställning för KH-absorption per 5 min. Detta styr hur snabbt COB minskar, dvs hur snabbt programmet kalkylerar att KH tagits upp, och påverkar BG framöver när BG faller mer än väntat, eller inte stiger som väntat.</string>
<string name="openapsama_min_5m_carbimpact_summary">Standardvärde: 3.0 (AMA) eller 8.0 (SMB). Detta är grundinställning för KH-absorption per 5 min. Detta styr hur snabbt COB minskar, dvs hur snabbt programmet kalkylerar att KH tagits upp, och påverkar BG framöver när BG faller mer än väntat, eller inte stiger som väntat.</string>
<string name="openapsama_link_to_preferncejson_doc_txt">Viktigt!\nNormalt behöver du inte ändra dessa värden. Vg KLICKA HÄR och LÄS texten och försäkra dig om att du FÖRSTÅTT innan du ändrar dessa värden.</string>
<string name="error_only_numeric_digits_allowed">Endast siffror tillåtna.</string>
<string name="error_only_numeric_digits_range_allowed">Endast siffror mellan %1$s - %2$s är tillåtna.</string>
@ -897,6 +897,7 @@
<string name="basal_set_correctly">Basal justerad korrekt</string>
<string name="limitingpercentrate">Begränsar max procent hastighet till %1$d%% pga %2$s</string>
<string name="limitingbolus">Begränsar bolus till %1$.1f enheter pga %2$s</string>
<string name="limitingextendedbolus">Begränsar bolus till %1$.1f enheter pga %2$s</string>
<string name="limitingmaxiob">Begränsar max IOB till %1$.1f pga %2$s</string>
<string name="limitingcarbs">Begränsar kolhydrater till %1$d g pga %2$s</string>
<string name="limitingiob">Begränsar IOB till %1$.1f pga %2$s</string>
@ -928,7 +929,7 @@
<string name="nav_setupwizard">Installationsguide</string>
<string name="setupwizard_finish">Avsluta</string>
<string name="setupwizard_language_prompt">Välj språk</string>
<string name="boluserrorcode">Angivet: %1$.2f enheter. Levererat: %2$.2f enheter. Felkod: %3$d</string>
<string name="boluserrorcode">Angivet: %1$.2f enheter. Levererat: %2$.2f enheter. Felkod: %3$s</string>
<string name="firstinsulinincrement">Första snabbknabben för insulin</string>
<string name="secondinsulinincrement">Andra snabbknabben för insulin</string>
<string name="thirdinsulinincrement">Tredje snabbknabben för insulin</string>
@ -948,6 +949,10 @@
<string name="openapsama_max_daily_safety_multiplier">Multiplikator för max daglig basal (max_daily)</string>
<string name="openapsama_current_basal_safety_multiplier">Multiplikator för nuvarande basal (max_current)</string>
<string name="value_unavailable_short">-</string>
<string name="virtualpump_type">Typ av virtuell pump</string>
<string name="virtualpump_definition">Pumpdefinition</string>
<string name="virtualpump_pump_def">Bolus: Steg =%1$s\nFörlängd bolus: [Steg=%2$s, duration =%3$smin -%4$sh] \nBasal: Steg=%5$s\nTempbasal: %6$s (av %7$s), duration =%8$smin -%9$sh\n%10$s</string>
<string name="virtualpump_pump_def_extended_note">* Den virtuella pumpen kräver fasta värden för basal/bolus.</string>
<string name="ns_autobackfill_title">Auto Backfill BG</string>
<string name="wear_wizard_settings">Kalkylatorinställningar</string>
<string name="wear_wizard_settings_summary">Kalkyler inkluderade i resultatet</string>
@ -1034,6 +1039,15 @@
<string name="as">AS</string>
<string name="versionavailable">Version %1$s tillgänglig</string>
<string name="time_offset">Tidsförskjutning</string>
<string name="setupwizard_preferred_aps_mode">Föredraget APS-läge</string>
<string name="treatments_wizard_total_label">Total</string>
<string name="calculation_short">Kalkyl</string>
<string name="handshaking">Handskakning</string>
<string name="sendlogfiles">Skicka dagens loggfiler till utvecklarna tillsammans med denna datumstämpel. Oväntad situation.</string>
<string name="maxbolusviolation">Max bolus nådd</string>
<string name="commanderror">Kommandofel</string>
<string name="speederror">Felaktig hastighet</string>
<string name="insulinlimitviolation">Insulingräns nådd</string>
<plurals name="objective_days">
<item quantity="one">%1$d dag</item>
<item quantity="other">%1$d dagar</item>

View file

@ -458,7 +458,6 @@
<string name="openapsama_autosens_adjusttargets">Autosens 也调整目标血糖</string>
<string name="openapsama_autosens_adjusttargets_summary">缺省值:是\n 这是用来允许 autosens调整血糖目标还有 ISF胰岛素敏感系数和基础率这些参数。</string>
<string name="openapsama_bolussnooze_dia_divisor_summary">默认值: 2 \n大剂量snooze是在输注餐时大剂量后开始生效的, 所以在你刚吃完饭的时候, 闭环不会因为你输注了大剂量而减少或停基础。这里的例子和缺省是 2; 因此, 3 小时的DIA(胰岛素持续作用时间) 意味着大剂量snooze将逐步在. 5小时 (3 DIA/2) 后失效。</string>
<string name="openapsama_min_5m_carbimpact_summary">默认值: 3.0 这是默认的每5分钟碳水化合物吸收效果。默认值为3毫克/dl/5 分钟。这就影响了碳水化合物的衰减速度, 以及在计算预测未来血糖时假设的碳水化合物吸收量, 当血糖的下降超过预期时, 或者不像预期的上升的那么多时。</string>
<string name="openapsama_link_to_preferncejson_doc_txt">注意! \n 正常地您不必在下面更改这些值。请点击这里, 阅读说明, 并确保您了解它之前不要更改任何这些值。</string>
<string name="error_only_numeric_digits_allowed">只允许数字。</string>
<string name="error_only_numeric_digits_range_allowed">仅允许在范围 %1$s - %2$s 内的数字。</string>
@ -928,7 +927,6 @@
<string name="nav_setupwizard">设置向导</string>
<string name="setupwizard_finish">完成</string>
<string name="setupwizard_language_prompt">选择你的语言</string>
<string name="boluserrorcode">已请求: %1$.2fU 已输注: %2$.2fU 错误代码: %3$d</string>
<string name="firstinsulinincrement">第一胰岛素增量</string>
<string name="secondinsulinincrement">第二胰岛素增量</string>
<string name="thirdinsulinincrement">第三胰岛素增量</string>

View file

@ -1019,6 +1019,7 @@
<string name="limitingpercentrate">Limiting max percent rate to %1$d%% because of %2$s</string>
<string name="key_treatmentssafety_maxbolus" translatable="false">treatmentssafety_maxbolus</string>
<string name="limitingbolus">Limiting bolus to %1$.1f U because of %2$s</string>
<string name="limitingextendedbolus">Limiting extended bolus to %1$.1f U because of %2$s</string>
<string name="limitingmaxiob">Limiting max IOB to %1$.1f U because of %2$s</string>
<string name="limitingcarbs">Limiting carbs to %1$d g because of %2$s</string>
<string name="limitingiob">Limiting IOB to %1$.1f U because of %2$s</string>
@ -1199,6 +1200,9 @@
<string name="commanderror">Command error</string>
<string name="speederror">Speed error</string>
<string name="insulinlimitviolation">Insulin limit violation</string>
<string name="key_loop_openmode_min_change" translatable="false">loop_openmode_min_change</string>
<string name="loop_openmode_min_change">Minimal request change [%]</string>
<string name="loop_openmode_min_change_summary">Loop will popup new change request only if change is bigger than this value. Default value is 30%</string>
<plurals name="objective_days">
<item quantity="one">%1$d day</item>

View file

@ -1,14 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:key="aps_general"
android:title="@string/loop">
<ListPreference
android:title="@string/apsmode_title"
android:key="@string/key_aps_mode"
android:defaultValue="open"
android:entries="@array/aps_modeArray"
android:entryValues="@array/aps_modeValues"/>
</PreferenceCategory>
</PreferenceScreen>

View file

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:validate="http://schemas.android.com/apk/res-auto">
<PreferenceCategory
android:key="aps_general"
android:title="@string/loop">
<ListPreference
android:title="@string/apsmode_title"
android:key="@string/key_aps_mode"
android:defaultValue="open"
android:entries="@array/aps_modeArray"
android:entryValues="@array/aps_modeValues"/>
<com.andreabaccega.widget.ValidatingEditTextPreference
android:defaultValue="30"
android:dialogMessage="@string/loop_openmode_min_change_summary"
android:digits="0123456789"
android:inputType="number"
android:key="@string/key_loop_openmode_min_change"
android:maxLines="1"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="@string/loop_openmode_min_change"
validate:maxNumber="80"
validate:minNumber="10"
validate:testType="numericRange" />
</PreferenceCategory>
</PreferenceScreen>

View file

@ -2,7 +2,6 @@ package info;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import com.squareup.otto.Bus;
@ -10,7 +9,6 @@ import org.json.JSONException;
import org.json.JSONObject;
import org.junit.Assert;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.modules.junit4.PowerMockRunner;
import java.util.Locale;
@ -21,11 +19,10 @@ import info.nightscout.androidaps.data.ConstraintChecker;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.data.ProfileStore;
import info.nightscout.androidaps.db.DatabaseHelper;
import info.nightscout.androidaps.interfaces.Constraint;
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.NSClientInternal.NSUpload;
import info.nightscout.androidaps.plugins.NSClientInternal.data.DbLogger;
import info.nightscout.androidaps.plugins.Treatments.TreatmentService;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.androidaps.queue.CommandQueue;
@ -33,10 +30,8 @@ import info.nightscout.utils.SP;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyDouble;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@ -117,9 +112,10 @@ public class AAPSMocker {
when(MainApp.getConfigBuilder()).thenReturn(configBuilderPlugin);
}
public static void mockConstraintsChecker() {
public static ConstraintChecker mockConstraintsChecker() {
ConstraintChecker constraintChecker = mock(ConstraintChecker.class);
when(MainApp.getConstraintChecker()).thenReturn(constraintChecker);
return constraintChecker;
}
public static void mockBus() {
@ -139,7 +135,7 @@ public class AAPSMocker {
when(L.isEnabled(any())).thenReturn(true);
}
public static void mockNSUpload(){
public static void mockNSUpload() {
PowerMockito.mockStatic(NSUpload.class);
}
@ -159,11 +155,16 @@ public class AAPSMocker {
when(ConfigBuilderPlugin.getCommandQueue()).thenReturn(queue);
}
public static TreatmentsPlugin mockTreatmentPlugin() {
PowerMockito.mockStatic(TreatmentsPlugin.class);
TreatmentsPlugin treatmentsPlugin = PowerMockito.mock(TreatmentsPlugin.class);
when(TreatmentsPlugin.getPlugin()).thenReturn(treatmentsPlugin);
return treatmentsPlugin;
}
public static void mockTreatmentService() throws Exception {
TreatmentService treatmentService = PowerMockito.mock(TreatmentService.class);
TreatmentsPlugin treatmentsPlugin = PowerMockito.mock(TreatmentsPlugin.class);
PowerMockito.whenNew(TreatmentService.class).withNoArguments().thenReturn(treatmentService);
when(TreatmentsPlugin.getPlugin()).thenReturn(treatmentsPlugin);
}
public static Profile getValidProfile() {
@ -193,6 +194,14 @@ public class AAPSMocker {
return profileStore;
}
public static void mockProfileFunctions() {
PowerMockito.mockStatic(ProfileFunctions.class);
ProfileFunctions profileFunctions = PowerMockito.mock(ProfileFunctions.class);
PowerMockito.when(ProfileFunctions.getInstance()).thenReturn(profileFunctions);
profile = getValidProfile();
PowerMockito.when(ProfileFunctions.getInstance().getProfile()).thenReturn(profile);
}
private static MockedBus bus = new MockedBus();
public static void prepareMockedBus() {

View file

@ -156,7 +156,7 @@ public class ConstraintsCheckerTest {
// Apply all limits
Constraint<Double> d = constraintChecker.getMaxBasalAllowed(AAPSMocker.getValidProfile());
Assert.assertEquals(0.8d, d.value());
Assert.assertEquals(true, d.getReasonList().size() == 6);
Assert.assertEquals(6, d.getReasonList().size());
Assert.assertEquals("DanaR: Limiting basal rate to 0.80 U/h because of pump limit", d.getMostLimitedReasons());
}
@ -183,7 +183,7 @@ public class ConstraintsCheckerTest {
// Apply all limits
Constraint<Integer> i = constraintChecker.getMaxBasalPercentAllowed(AAPSMocker.getValidProfile());
Assert.assertEquals((Integer) 100, i.value());
Assert.assertEquals(true, i.getReasonList().size() == 9); // 6x Safety & RS & R & Insight
Assert.assertEquals(9, i.getReasonList().size()); // 6x Safety & RS & R & Insight
Assert.assertEquals("Safety: Limiting percent rate to 100% because of pump limit", i.getMostLimitedReasons());
}

View file

@ -1,4 +1,4 @@
package info.nightscout.androidaps.plugins.PumpCommon.utils;
package info.nightscout.androidaps.interfaces;
import org.junit.Assert;
import org.junit.Test;
@ -13,14 +13,14 @@ import static org.junit.Assert.*;
/**
* Created by andy on 5/13/18.
*/
public class PumpUtilUTest {
public class PumpDescritpionTest {
@Test
public void setPumpDescription() throws Exception {
public void setPumpDescription() {
PumpDescription pumpDescription = new PumpDescription();
PumpUtil.setPumpDescription(pumpDescription, PumpType.AccuChekCombo);
pumpDescription.setPumpDescription(PumpType.AccuChekCombo);
Assert.assertEquals(pumpDescription.bolusStep, PumpType.AccuChekCombo.getBolusSize(), 0.1d);
Assert.assertEquals(pumpDescription.basalMinimumRate, PumpType.AccuChekCombo.getBaseBasalStep(), 0.1d);

View file

@ -18,6 +18,7 @@ import info.nightscout.androidaps.db.BgReading;
import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
import info.nightscout.utils.DateUtil;
import info.nightscout.utils.SP;
import info.nightscout.utils.T;
@ -108,7 +109,7 @@ public class IobCobCalculatorPluginTest {
}
@Test
public void createBucketedData5minTest() {
public void createBucketedData5minTest() throws Exception {
List<BgReading> bgReadingList = new ArrayList<>();
// Super data should not be touched
@ -212,6 +213,131 @@ public class IobCobCalculatorPluginTest {
iobCobCalculatorPlugin.createBucketedData();
Assert.assertEquals(null, iobCobCalculatorPlugin.getBucketedData());
// real data gap test
bgReadingList.clear();
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T13:34:55Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T13:14:55Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T13:09:55Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T13:04:55Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T12:59:55Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T12:54:55Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T12:49:55Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T12:44:55Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T12:39:55Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T12:34:55Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T12:29:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T12:24:55Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T12:19:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T12:14:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T12:09:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T12:04:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T11:59:55Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T11:54:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T11:49:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T11:44:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T11:39:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T11:34:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T11:29:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T11:24:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T11:19:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T11:14:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T11:09:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T11:04:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T10:59:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T10:54:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T10:49:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T10:44:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T10:39:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T10:34:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T10:29:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T10:24:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T10:19:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T10:14:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T10:09:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T10:04:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T09:59:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T09:54:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T09:49:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T09:44:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T09:39:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T09:35:05Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T09:30:17Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T09:24:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T09:19:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T09:14:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T09:09:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T09:04:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T08:59:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T08:54:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T08:49:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T08:44:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T08:40:02Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T08:34:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T08:29:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T08:24:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T08:19:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T08:14:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T08:09:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T08:04:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T07:59:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T07:54:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T07:49:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T07:44:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T07:39:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T07:34:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T07:30:03Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T07:25:17Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T07:19:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T07:14:58Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T07:09:58Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T07:04:58Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T06:59:58Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T06:54:58Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T06:49:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T06:44:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T06:39:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T06:34:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T06:29:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T06:24:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T06:19:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T06:14:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T06:10:03Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T06:04:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T05:59:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T05:54:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T05:49:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T05:44:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T05:39:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T05:34:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T05:29:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T05:24:57Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T05:19:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T05:14:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T05:09:57Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T05:04:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T04:59:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T04:54:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T04:50:03Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T04:44:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T04:39:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T04:34:57Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T04:29:57Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T04:24:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T04:19:57Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T04:14:57Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T04:10:03Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T04:04:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T03:59:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T03:54:56Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T03:50:03Z")).value(100));
bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T03:44:57Z")).value(100));
iobCobCalculatorPlugin.setBgReadings(bgReadingList);
iobCobCalculatorPlugin.createBucketedData();
Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData());
Assert.assertEquals(DateUtil.fromISODateString("2018-09-05T13:34:57Z").getTime(), iobCobCalculatorPlugin.getBucketedData().get(0).date);
Assert.assertEquals(DateUtil.fromISODateString("2018-09-05T03:44:57Z").getTime(), iobCobCalculatorPlugin.getBucketedData().get(iobCobCalculatorPlugin.getBucketedData().size() - 1).date);
}
@Test
@ -283,9 +409,9 @@ public class IobCobCalculatorPluginTest {
iobCobCalculatorPlugin.createBucketedData();
Assert.assertEquals(null, iobCobCalculatorPlugin.findPreviousTimeFromBucketedData(T.mins(4).msecs()));
Assert.assertEquals((Long)T.mins(5).msecs(), iobCobCalculatorPlugin.findPreviousTimeFromBucketedData(T.mins(6).msecs()));
Assert.assertEquals((Long)T.mins(20).msecs(), iobCobCalculatorPlugin.findPreviousTimeFromBucketedData(T.mins(20).msecs()));
Assert.assertEquals((Long)T.mins(20).msecs(), iobCobCalculatorPlugin.findPreviousTimeFromBucketedData(T.mins(25).msecs()));
Assert.assertEquals((Long) T.mins(5).msecs(), iobCobCalculatorPlugin.findPreviousTimeFromBucketedData(T.mins(6).msecs()));
Assert.assertEquals((Long) T.mins(20).msecs(), iobCobCalculatorPlugin.findPreviousTimeFromBucketedData(T.mins(20).msecs()));
Assert.assertEquals((Long) T.mins(20).msecs(), iobCobCalculatorPlugin.findPreviousTimeFromBucketedData(T.mins(25).msecs()));
}
@Before

View file

@ -0,0 +1,197 @@
package info.nightscout.androidaps.plugins.Loop;
import android.content.Context;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
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.db.TemporaryBasal;
import info.nightscout.androidaps.interfaces.Constraint;
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.PumpCommon.defs.PumpType;
import info.nightscout.androidaps.plugins.PumpVirtual.VirtualPumpPlugin;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.utils.JsonHelper;
import info.nightscout.utils.SP;
import static org.mockito.ArgumentMatchers.anyDouble;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.powermock.api.mockito.PowerMockito.when;
@RunWith(PowerMockRunner.class)
@PrepareForTest({MainApp.class, ConfigBuilderPlugin.class, SP.class, Context.class, ProfileFunctions.class, TreatmentsPlugin.class, L.class})
public class APSResultTest {
VirtualPumpPlugin virtualPumpPlugin;
TreatmentsPlugin treatmentsPlugin;
Constraint<Boolean> closedLoopEnabled = new Constraint<>(false);
@Test
public void isChangeRequestedTest() {
APSResult apsResult = new APSResult();
// BASAL RATE IN TEST PROFILE IS 1U/h
// **** PERCENT pump ****
virtualPumpPlugin.getPumpDescription().setPumpDescription(PumpType.Cellnovo1); // % based
apsResult.usePercent(true);
// closed loop mode return original request
closedLoopEnabled.set(true);
when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(null);
apsResult.tempBasalRequested(false);
Assert.assertEquals(false, apsResult.isChangeRequested());
apsResult.tempBasalRequested(true).percent(200).duration(30);
Assert.assertEquals(true, apsResult.isChangeRequested());
// open loop
closedLoopEnabled.set(false);
// no change requested
when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(null);
apsResult.tempBasalRequested(false);
Assert.assertEquals(false, apsResult.isChangeRequested());
// request 100% when no temp is running
when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(null);
apsResult.tempBasalRequested(true).percent(100).duration(30);
Assert.assertEquals(false , apsResult.isChangeRequested());
// request equal temp
when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().percent(70).duration(30));
apsResult.tempBasalRequested(true).percent(70).duration(30);
Assert.assertEquals(false , apsResult.isChangeRequested());
// request zero temp
when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().percent(10).duration(30));
apsResult.tempBasalRequested(true).percent(0).duration(30);
Assert.assertEquals(true , apsResult.isChangeRequested());
// request high temp
when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().percent(190).duration(30));
apsResult.tempBasalRequested(true).percent(200).duration(30);
Assert.assertEquals(true , apsResult.isChangeRequested());
// request slightly different temp
when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().percent(70).duration(30));
apsResult.tempBasalRequested(true).percent(80).duration(30);
Assert.assertEquals(false , apsResult.isChangeRequested());
// request different temp
when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().percent(70).duration(30));
apsResult.tempBasalRequested(true).percent(120).duration(30);
Assert.assertEquals(true , apsResult.isChangeRequested());
// it should work with absolute temps too
// request different temp
when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().absolute(1).duration(30));
apsResult.tempBasalRequested(true).percent(100).duration(30);
Assert.assertEquals(false , apsResult.isChangeRequested());
when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().absolute(2).duration(30));
apsResult.tempBasalRequested(true).percent(50).duration(30);
Assert.assertEquals(true , apsResult.isChangeRequested());
// **** ABSOLUTE pump ****
virtualPumpPlugin.getPumpDescription().setPumpDescription(PumpType.Medtronic_515_715); // U/h based
apsResult.usePercent(false);
// open loop
closedLoopEnabled.set(false);
// request 100% when no temp is running
when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(null);
apsResult.tempBasalRequested(true).rate(1).duration(30);
Assert.assertEquals(false , apsResult.isChangeRequested());
// request equal temp
when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().absolute(2).duration(30));
apsResult.tempBasalRequested(true).rate(2).duration(30);
Assert.assertEquals(false , apsResult.isChangeRequested());
when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().percent(200).duration(30));
apsResult.tempBasalRequested(true).rate(2).duration(30);
Assert.assertEquals(false , apsResult.isChangeRequested());
// request zero temp
when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().absolute(0.1d).duration(30));
apsResult.tempBasalRequested(true).rate(0).duration(30);
Assert.assertEquals(true , apsResult.isChangeRequested());
// request high temp
when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().absolute(34.9).duration(30));
apsResult.tempBasalRequested(true).rate(35).duration(30);
Assert.assertEquals(true , apsResult.isChangeRequested());
// request slightly different temp
when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().absolute(1.1d).duration(30));
apsResult.tempBasalRequested(true).rate(1.2d).duration(30);
Assert.assertEquals(false , apsResult.isChangeRequested());
// request different temp
when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().absolute(1.1d).duration(30));
apsResult.tempBasalRequested(true).rate(1.5d).duration(30);
Assert.assertEquals(true , apsResult.isChangeRequested());
// it should work with percent temps too
// request different temp
when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().percent(110).duration(30));
apsResult.tempBasalRequested(true).rate(1.1d).duration(30);
Assert.assertEquals(false , apsResult.isChangeRequested());
when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().percent(200).duration(30));
apsResult.tempBasalRequested(true).rate(0.5d).duration(30);
Assert.assertEquals(true , apsResult.isChangeRequested());
}
@Test
public void cloneTest() {
APSResult apsResult = new APSResult();
apsResult.rate(10);
APSResult apsResult2 = apsResult.clone();
Assert.assertEquals(apsResult.rate, apsResult2.rate, 0);
}
@Test
public void jsonTest() {
closedLoopEnabled.set(true);
APSResult apsResult = new APSResult();
apsResult.rate(20).tempBasalRequested(true);
Assert.assertEquals(20d, JsonHelper.safeGetDouble(apsResult.json(), "rate"), 0d);
apsResult.rate(20).tempBasalRequested(false);
Assert.assertEquals(false, apsResult.json().has("rate"));
}
@Before
public void prepareMock() throws Exception {
AAPSMocker.mockMainApp();
AAPSMocker.mockConfigBuilder();
AAPSMocker.mockSP();
AAPSMocker.mockStrings();
AAPSMocker.mockBus();
AAPSMocker.mockProfileFunctions();
AAPSMocker.mockTreatmentService();
AAPSMocker.mockL();
treatmentsPlugin = AAPSMocker.mockTreatmentPlugin();
ConstraintChecker constraintChecker = AAPSMocker.mockConstraintsChecker();
virtualPumpPlugin = VirtualPumpPlugin.getPlugin();
when(ConfigBuilderPlugin.getActivePump()).thenReturn(virtualPumpPlugin);
when(constraintChecker.isClosedLoopAllowed()).thenReturn(closedLoopEnabled);
Mockito.when(SP.getDouble(anyInt(), anyDouble())).thenReturn(30d);
}
}

View file

@ -41,7 +41,7 @@ public class LoopPluginTest {
Assert.assertEquals("LOOP", loopPlugin.getNameShort());
Assert.assertEquals(true, loopPlugin.hasFragment());
Assert.assertEquals(true, loopPlugin.showInList(PluginType.LOOP));
Assert.assertEquals(R.xml.pref_closedmode, loopPlugin.getPreferencesId());
Assert.assertEquals(R.xml.pref_loop, loopPlugin.getPreferencesId());
// Plugin is disabled by default
Assert.assertEquals(false, loopPlugin.isEnabled(PluginType.LOOP));

View file

@ -130,6 +130,7 @@ public class CommandQueueTest extends CommandQueue {
when(MainApp.instance()).thenReturn(mainApp);
Constraint<Double> bolusConstraint = new Constraint<>(0d);
when(MainApp.getConstraintChecker().applyBolusConstraints(any())).thenReturn(bolusConstraint);
when(MainApp.getConstraintChecker().applyExtendedBolusConstraints(any())).thenReturn(bolusConstraint);
Constraint<Integer> carbsConstraint = new Constraint<>(0);
when(MainApp.getConstraintChecker().applyCarbsConstraints(any())).thenReturn(carbsConstraint);
Constraint<Double> rateConstraint = new Constraint<>(0d);

View file

@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip