diff --git a/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java b/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java index e7fd6c99e9..e6098cee54 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java +++ b/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java @@ -97,14 +97,17 @@ public class CareportalEvent implements DataPointWithLabelInterface, Interval { public String age() { Map diff = computeDiff(date, System.currentTimeMillis()); if (OverviewFragment.shorttextmode) - return diff.get(TimeUnit.DAYS) +"d" + diff.get(TimeUnit.HOURS) + "h"; + return diff.get(TimeUnit.DAYS) + "d" + diff.get(TimeUnit.HOURS) + "h"; else return diff.get(TimeUnit.DAYS) + " " + MainApp.gs(R.string.days) + " " + diff.get(TimeUnit.HOURS) + " " + MainApp.gs(R.string.hours); } - public boolean isOlderThan(double hours) { return getHoursFromStart() > hours; } + public boolean isOlderThan(double hours) { + return getHoursFromStart() > hours; + } - public String log() { + @Override + public String toString() { return "CareportalEvent{" + "date= " + date + ", date= " + DateUtil.dateAndTimeString(date) + @@ -136,11 +139,12 @@ public class CareportalEvent implements DataPointWithLabelInterface, Interval { for (int i = 0; i < list.size(); i++) { CareportalEvent event = list.get(i); if (event.date <= time && event.date > (time - T.mins(5).msecs())) { - //log.debug("Found event for time: " + DateUtil.dateAndTimeString(time) + " " + event.toString()); + if (L.isEnabled(L.DATABASE)) + log.debug("Found event for time: " + DateUtil.dateAndTimeFullString(time) + " " + event.toString()); return true; } } - //log.debug("WWWWWW No found event for time: " + DateUtil.dateAndTimeString(time)); + //log.debug("No found event for time: " + DateUtil.dateAndTimeString(time)); return false; } diff --git a/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java b/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java index 8e1373ad48..43d7af3ce5 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java +++ b/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java @@ -1365,7 +1365,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { if (list.size() == 1) { CareportalEvent record = list.get(0); if (L.isEnabled(L.DATABASE)) - log.debug("Removing CareportalEvent record from database: " + record.log()); + log.debug("Removing CareportalEvent record from database: " + record.toString()); delete(record); } else { if (L.isEnabled(L.DATABASE)) diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/PumpDescription.java b/app/src/main/java/info/nightscout/androidaps/interfaces/PumpDescription.java index 2edf9033bf..f3c25e42dd 100644 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/PumpDescription.java +++ b/app/src/main/java/info/nightscout/androidaps/interfaces/PumpDescription.java @@ -45,4 +45,39 @@ public class PumpDescription { public boolean supportsTDDs = false; public boolean needsManualTDDLoad = true; + + + public void resetSettings() + { + isBolusCapable = true; + bolusStep = 0.1d; + + isExtendedBolusCapable = true; + extendedBolusStep = 0.1d; + extendedBolusDurationStep = 30; + extendedBolusMaxDuration = 12 * 60; + + isTempBasalCapable = true; + tempBasalStyle = PERCENT; + maxTempPercent = 200; + tempPercentStep = 10; + maxTempAbsolute = 10; + tempAbsoluteStep = 0.05d; + tempDurationStep = 60; + tempMaxDuration = 12 * 60; + tempDurationStep15mAllowed = false; + tempDurationStep30mAllowed = false; + + isSetBasalProfileCapable = true; + basalStep = 0.01d; + basalMinimumRate = 0.04d; + is30minBasalRatesCapable = false; + + isRefillingCapable = false; + storesCarbInfo = true; + + supportsTDDs = false; + needsManualTDDLoad = true; + + } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/ErrorDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/ErrorDialog.java index 7c05b4398e..dc4fa21aca 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/ErrorDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/ErrorDialog.java @@ -74,7 +74,7 @@ public class ErrorDialog extends DialogFragment implements View.OnClickListener @Override public void dismiss() { - super.dismiss(); + super.dismissAllowingStateLoss(); if (helperActivity != null) { helperActivity.finish(); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java index 1887356876..2ea594c4df 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java @@ -61,6 +61,8 @@ import info.nightscout.androidaps.plugins.PumpCombo.ruffyscripter.history.Bolus; import info.nightscout.androidaps.plugins.PumpCombo.ruffyscripter.history.PumpHistory; 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; @@ -85,42 +87,6 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint private final static PumpDescription pumpDescription = new PumpDescription(); - static { - // these properties can't be changed on the pump, some via desktop configuration software - pumpDescription.isBolusCapable = true; - pumpDescription.bolusStep = 0.1d; - - pumpDescription.isExtendedBolusCapable = false; - pumpDescription.extendedBolusStep = 0.1d; - pumpDescription.extendedBolusDurationStep = 15; - pumpDescription.extendedBolusMaxDuration = 12 * 60; - - pumpDescription.isTempBasalCapable = true; - pumpDescription.tempBasalStyle = PumpDescription.PERCENT; - - pumpDescription.maxTempPercent = 500; - pumpDescription.tempPercentStep = 10; - - pumpDescription.tempDurationStep = 15; - pumpDescription.tempDurationStep15mAllowed = true; - pumpDescription.tempDurationStep30mAllowed = true; - pumpDescription.tempMaxDuration = 24 * 60; - - - pumpDescription.isSetBasalProfileCapable = true; - pumpDescription.basalStep = 0.01d; - pumpDescription.basalMinimumRate = 0.05d; - - pumpDescription.isRefillingCapable = true; - - pumpDescription.storesCarbInfo = false; - - pumpDescription.is30minBasalRatesCapable = false; - - pumpDescription.supportsTDDs = true; - pumpDescription.needsManualTDDLoad = true; - } - @NonNull private final RuffyCommands ruffyScripter; @@ -173,6 +139,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")); } public ComboPump getPump() { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/data/DoseSettings.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/data/DoseSettings.java new file mode 100644 index 0000000000..36ee4e5845 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/data/DoseSettings.java @@ -0,0 +1,49 @@ +package info.nightscout.androidaps.plugins.PumpCommon.data; + +/** + * Created by andy on 02/05/2018. + */ + +public class DoseSettings { + + private float step; + private int durationStep; + private int maxDuration; + private float minDose; + private Float maxDose; + + public DoseSettings(float step, int durationStep, int maxDuration, float minDose, Float maxDose) + { + this.step = step; + this.durationStep = durationStep; + this.maxDuration = maxDuration; + this.minDose = minDose; + this.maxDose = maxDose; + } + + public DoseSettings(float step, int durationStep, int maxDuration, float minDose) + { + this(step, durationStep, maxDuration, minDose, null); + } + + + public float getStep() { + return step; + } + + public int getDurationStep() { + return durationStep; + } + + public int getMaxDuration() { + return maxDuration; + } + + public float getMinDose() { + return minDose; + } + + public Float getMaxDose() { + return maxDose; + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/defs/DoseStepSize.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/defs/DoseStepSize.java new file mode 100644 index 0000000000..69691886e2 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/defs/DoseStepSize.java @@ -0,0 +1,90 @@ +package info.nightscout.androidaps.plugins.PumpCommon.defs; + +/** + * Created by andy on 02/05/2018. + */ + +public enum DoseStepSize +{ + + ComboBasal( // + new DoseStepSizeEntry(0f, 1f, 0.01f), // + new DoseStepSizeEntry(1f, 10f, 0.05f), // + new DoseStepSizeEntry(10f, Float.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)), + + MedtronicVeoBasal( // + new DoseStepSizeEntry(0f, 1f, 0.025f), // + new DoseStepSizeEntry(1f, 10f, 0.05f), // + new DoseStepSizeEntry(10f, Float.MAX_VALUE, 0.1f)), // + + ; + + + DoseStepSizeEntry[] entries; + + + DoseStepSize(DoseStepSizeEntry...entries) + { + this.entries = entries; + } + + + public float getStepSizeForAmount(float amount) + { + for (DoseStepSizeEntry entry : entries) { + if (entry.from <= amount && entry.to > amount) + return entry.value; + } + + // should never come to this + return entries[entries.length-1].value; + } + + + public String getDescription() { + StringBuilder sb = new StringBuilder(); + + for (DoseStepSizeEntry entry : entries) { + + sb.append(entry.value); + sb.append(" {"); + sb.append(entry.from); + sb.append("-"); + + if (entry.to == Float.MAX_VALUE) + { + sb.append("~}"); + } + else + { + sb.append(entry.to); + sb.append("}, "); + } + } + + return sb.toString(); + } + + + static class DoseStepSizeEntry + { + float from; + float to; + float 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) + { + this.from = from; + this.to = to; + this.value = value; + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/defs/PumpCapability.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/defs/PumpCapability.java new file mode 100644 index 0000000000..d3e29ded0a --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/defs/PumpCapability.java @@ -0,0 +1,72 @@ +package info.nightscout.androidaps.plugins.PumpCommon.defs; + +/** + * Created by andy on 03/05/2018. + */ + +public enum PumpCapability { + + Bolus, // isBolusCapable + ExtendedBolus, // isExtendedBolusCapable + TempBasal, // isTempBasalCapable + BasalProfileSet, // isSetBasalProfileCapable + Refill, // isRefillingCapable + StoreCarbInfo, // storesCarbInfo + TDD, // supportsTDDs + ManualTDDLoad, // needsManualTDDLoad + BasalRate30min, // is30minBasalRatesCapable + + // grouped by pump + VirtualPumpCapabilities(Bolus, ExtendedBolus, TempBasal, BasalProfileSet, Refill), // + ComboCapabilities(Bolus, TempBasal, BasalProfileSet, Refill, TDD, ManualTDDLoad), // + DanaCapabilities(Bolus, ExtendedBolus, TempBasal, BasalProfileSet, Refill, TDD, ManualTDDLoad), // + DanaWithHistoryCapabilities(Bolus, ExtendedBolus, TempBasal, BasalProfileSet, Refill, StoreCarbInfo, TDD, ManualTDDLoad), // + InsightCapabilities(Bolus, ExtendedBolus, TempBasal, BasalProfileSet, Refill,TDD,BasalRate30min), // + + + // BasalRates (separately grouped) + BasalRate_Duration15minAllowed, // + BasalRate_Duration30minAllowed, // + BasalRate_Duration15and30minAllowed(BasalRate_Duration15minAllowed, BasalRate_Duration30minAllowed), // + BasalRate_Duration15and30minNotAllowed, // + ; + + PumpCapability[] children; + + + PumpCapability() + { + } + + + PumpCapability(PumpCapability...children) + { + this.children = children; + } + + + public boolean hasCapability(PumpCapability capability) + { + // we can only check presense of simple capabilities + if (capability.children != null) + return false; + + if (this == capability) + return true; + + if (this.children!=null) + { + for (PumpCapability child : children) { + if (child == capability) + return true; + } + + return false; + } + else + return false; + } + + + +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/defs/PumpTempBasalType.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/defs/PumpTempBasalType.java new file mode 100644 index 0000000000..167e886ea7 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/defs/PumpTempBasalType.java @@ -0,0 +1,10 @@ +package info.nightscout.androidaps.plugins.PumpCommon.defs; + +/** + * Created by andy on 02/05/2018. + */ + +public enum PumpTempBasalType { + Percent, // + Absolute, +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/defs/PumpType.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/defs/PumpType.java new file mode 100644 index 0000000000..f73bcb06f4 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/defs/PumpType.java @@ -0,0 +1,329 @@ +package info.nightscout.androidaps.plugins.PumpCommon.defs; + + +import java.util.HashMap; +import java.util.Map; + +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.R; +import info.nightscout.androidaps.plugins.PumpCommon.data.DoseSettings; + + + +/** + * Created by andy on 02/05/2018. + * + * Most of this defintions is intended for VirtualPump only, but they can be used by other plugins. + */ + +public enum PumpType { + + GenericAAPS("Generic AAPS", 0.1f, null, // + new DoseSettings(0.05f, 30, 8*60, 0.05f), // + PumpTempBasalType.Percent, // + new DoseSettings(10,30, 24*60, 0f, 500f), PumpCapability.BasalRate_Duration15and30minAllowed, // + 0.01f, 0.01f, null, PumpCapability.VirtualPumpCapabilities), // + + // Cellnovo + + Cellnovo1("Cellnovo", 0.05f, null, // + new DoseSettings(0.05f, 30, 24*60, 1f, null), + PumpTempBasalType.Percent, + new DoseSettings(5,30, 24*60, 0f, 200f), PumpCapability.BasalRate_Duration30minAllowed, // + 0.05f, 0.05f, null, PumpCapability.VirtualPumpCapabilities), // + + // Accu-Chek + + AccuChekCombo("Accu-Chek Combo", 0.1f, null, // + new DoseSettings(0.1f, 15, 12*60, 0.1f), // + PumpTempBasalType.Percent, + new DoseSettings(10, 15, 12*60,0f, 500f), PumpCapability.BasalRate_Duration15and30minAllowed, // + 0.01f, 0.1f, DoseStepSize.ComboBasal, PumpCapability.ComboCapabilities), // + + AccuChekSpirit("Accu-Chek Spirit", 0.1f, null, // + new DoseSettings(0.1f, 15, 12*60, 0.1f), // + PumpTempBasalType.Percent, + new DoseSettings(10, 15, 12*60,0f, 500f), PumpCapability.BasalRate_Duration15and30minAllowed, // + 0.01f, 0.1f, null, PumpCapability.VirtualPumpCapabilities), // + + AccuChekInsight("Accu-Chek Insight", 0.05f, DoseStepSize.InsightBolus, // + new DoseSettings(0.05f, 15, 24*60, 0.05f), // + PumpTempBasalType.Percent, + new DoseSettings(10, 15, 12*60,0f, 250f), PumpCapability.BasalRate_Duration15and30minAllowed, // + 0.02f, 0.1f, null, PumpCapability.InsightCapabilities), // + + // Animas + AnimasVibe("Animas Vibe", 0.05f, null, // AnimasBolus? + new DoseSettings(0.05f, 30, 12*60, 0.05f), // + PumpTempBasalType.Percent, // + new DoseSettings(10, 30, 24*60, 0f, 200f), PumpCapability.BasalRate_Duration30minAllowed, // + 0.025f, 5f, 0f, null, PumpCapability.VirtualPumpCapabilities), // + + AnimasPing("Animas Ping", AnimasVibe), + + // Dana + DanaR("DanaR", 0.05f, null, // + new DoseSettings(0.05f, 30, 8*60, 0.05f), // + PumpTempBasalType.Percent, // + new DoseSettings(10f, 60, 24*60, 0f, 200f), PumpCapability.BasalRate_Duration15and30minNotAllowed, // + 0.04f, 0.01f, null, PumpCapability.DanaCapabilities), + + DanaRKorean("DanaR Korean", 0.05f, null, // + new DoseSettings(0.05f, 30, 8*60, 0.05f), // + PumpTempBasalType.Percent, // + new DoseSettings(10f, 60, 24*60, 0f, 200f), PumpCapability.BasalRate_Duration15and30minNotAllowed, // + 0.1f, 0.01f, null, PumpCapability.DanaCapabilities), + + DanaRS("DanaRS", 0.05f, null, // + new DoseSettings(0.05f, 30, 8*60, 0.05f), // + PumpTempBasalType.Percent, // + new DoseSettings(10f, 60, 24*60, 0f, 200f), PumpCapability.BasalRate_Duration15and30minAllowed, // + 0.04f, 0.01f, null, PumpCapability.DanaWithHistoryCapabilities), + + DanaRv2("DanaRv2", DanaRS), + + + // Insulet + Insulet_Omnipod("Insulet Omnipod", 0.05f, null, // + new DoseSettings(0.05f, 30, 8*60, 0.05f), // + 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), + + // Medtronic + Medtronic_512_712("Medtronic 512/712", 0.05f, null, // + new DoseSettings(0.05f, 30, 8*60, 0.05f), // + PumpTempBasalType.Absolute, // + new DoseSettings(0.05f, 30, 24*60, 0f, 35f), PumpCapability.BasalRate_Duration30minAllowed, // + 0.05f, 0.05f, 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), // + PumpTempBasalType.Absolute, // + new DoseSettings(0.05f, 30, 24*60, 0f, 35f), PumpCapability.BasalRate_Duration30minAllowed, // + 0.025f, 0.025f, 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), // + PumpTempBasalType.Absolute, // + new DoseSettings(0.05f, 30, 24*60, 0f, 35f), PumpCapability.BasalRate_Duration30minAllowed, // + 0.025f, 0.025f, DoseStepSize.MedtronicVeoBasal, PumpCapability.VirtualPumpCapabilities), // + + // Tandem + TandemTSlim("Tandem t:slim", 0.01f, null, // + new DoseSettings(0.01f,15, 8*60, 0.4f), + PumpTempBasalType.Percent, + new DoseSettings(1,15, 8*60, 0f, 250f), PumpCapability.BasalRate_Duration15and30minAllowed, // + 0.1f, 0.001f, null, PumpCapability.VirtualPumpCapabilities), + + TandemTFlex("Tandem t:flex", TandemTSlim), // + TandemTSlimG4("Tandem t:slim G4", TandemTSlim), // + TandemTSlimX2("Tandem t:slim X2", TandemTSlim), // + ; + + private String description; + private float 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 DoseStepSize baseBasalSpecialSteps; // + private PumpCapability pumpCapability; + + private PumpType parent; + private static Map mapByDescription; + + static + { + mapByDescription = new HashMap<>(); + + for (PumpType pumpType : values()) { + mapByDescription.put(pumpType.getDescription(), pumpType); + } + } + + + PumpType(String description, PumpType parent) + { + this.description = description; + this.parent = parent; + } + + PumpType(String description, PumpType parent, PumpCapability pumpCapability) + { + this.description = description; + this.parent = parent; + this.pumpCapability = pumpCapability; + } + + PumpType(String description, float bolusSize, DoseStepSize specialBolusSize, // + DoseSettings extendedBolusSettings, // + PumpTempBasalType pumpTempBasalType, DoseSettings tbrSettings, PumpCapability specialBasalDurations, // + float baseBasalMinValue, float 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, // + DoseSettings extendedBolusSettings, // + PumpTempBasalType pumpTempBasalType, DoseSettings tbrSettings, PumpCapability specialBasalDurations, // + float baseBasalMinValue, Float baseBasalMaxValue, float baseBasalStep, DoseStepSize baseBasalSpecialSteps, PumpCapability pumpCapability) + { + this.description = description; + this.bolusSize = bolusSize; + this.specialBolusSize = specialBolusSize; + this.extendedBolusSettings = extendedBolusSettings; + this.pumpTempBasalType = pumpTempBasalType; + this.tbrSettings = tbrSettings; + this.specialBasalDurations = specialBasalDurations; + this.baseBasalMinValue = baseBasalMinValue; + this.baseBasalMaxValue = baseBasalMaxValue; + this.baseBasalStep = baseBasalStep; + this.baseBasalSpecialSteps = baseBasalSpecialSteps; + this.pumpCapability = pumpCapability; + } + + + public String getDescription() { + return description; + } + + public PumpCapability getPumpCapability() { + + if (isParentSet()) + return this.pumpCapability == null ? parent.pumpCapability : pumpCapability; + else + return this.pumpCapability; + } + + public float getBolusSize() { + return isParentSet() ? parent.bolusSize : bolusSize; + } + + + public DoseStepSize getSpecialBolusSize() { + return isParentSet() ? parent.specialBolusSize : specialBolusSize; + } + + + public DoseSettings getExtendedBolusSettings() { + return isParentSet() ? parent.extendedBolusSettings : extendedBolusSettings; + } + + + public PumpTempBasalType getPumpTempBasalType() { + return isParentSet() ? parent.pumpTempBasalType : pumpTempBasalType; + } + + + public DoseSettings getTbrSettings() { + return isParentSet() ? parent.tbrSettings : tbrSettings; + } + + + public float getBaseBasalMinValue() { + return isParentSet() ? parent.baseBasalMinValue : baseBasalMinValue; + } + + + public Float getBaseBasalMaxValue() { + return isParentSet() ? parent.baseBasalMaxValue : baseBasalMaxValue; + } + + + public float getBaseBasalStep() { + return isParentSet() ? parent.baseBasalStep : baseBasalStep; + } + + + public DoseStepSize getBaseBasalSpecialSteps() { + return isParentSet() ? parent.baseBasalSpecialSteps : baseBasalSpecialSteps; + } + + + public PumpType getParent() { + return parent; + } + + + private boolean isParentSet() + { + return this.parent!=null; + } + + + public static PumpType getByDescription(String desc) + { + if (mapByDescription.containsKey(desc)) + { + return mapByDescription.get(desc); + } + else + { + return PumpType.GenericAAPS; + } + } + + + public String getFullDescription(String i18nTemplate, boolean hasExtendedBasals) { + + String unit = getPumpTempBasalType()==PumpTempBasalType.Percent ? "%" : ""; + + DoseSettings eb = getExtendedBolusSettings(); + DoseSettings tbr = getTbrSettings(); + + String extendedNote = hasExtendedBasals ? MainApp.gs(R.string.virtualpump_pump_def_extended_note) : ""; + + return String.format(i18nTemplate, // + getStep("" + getBolusSize(), getSpecialBolusSize()), // + eb.getStep(), eb.getDurationStep(), eb.getMaxDuration()/60, // + getStep(getBaseBasalRange(), getBaseBasalSpecialSteps()), // + tbr.getMinDose() + unit + "-" + tbr.getMaxDose() + unit, tbr.getStep() + unit, + tbr.getDurationStep(), tbr.getMaxDuration()/60, extendedNote); + } + + + private String getBaseBasalRange() + { + Float maxValue = getBaseBasalMaxValue(); + + return maxValue==null ? "" + getBaseBasalMinValue() : getBaseBasalMinValue() + "-" + maxValue; + } + + + private String getStep(String step, DoseStepSize stepSize) + { + if (stepSize!=null) + return step + " [" + stepSize.getDescription() + "] *"; + else + return "" + step; + } + + + public boolean hasExtendedBasals() { + return ((getBaseBasalSpecialSteps() !=null) || (getSpecialBolusSize() != null)); + } + + + public PumpCapability getSpecialBasalDurations() { + + if (isParentSet()) + { + return parent.getSpecialBasalDurations(); + } + else + { + return specialBasalDurations == null ? // + PumpCapability.BasalRate_Duration15and30minNotAllowed : specialBasalDurations; + } + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/utils/PumpUtil.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/utils/PumpUtil.java new file mode 100644 index 0000000000..a14453dba1 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/utils/PumpUtil.java @@ -0,0 +1,66 @@ +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); + + } + + +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRFragment.java index fd1c42771a..bd077bea4c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRFragment.java @@ -273,9 +273,9 @@ public class DanaRFragment extends SubscriberFragment { queueView.setText(status); } } - //hide user options button if not an RS pump + //hide user options button if not an RS pump or old firmware boolean isKorean = DanaRKoreanPlugin.getPlugin().isEnabled(PluginType.PUMP); - if (isKorean) { + if (isKorean || firmwareView.getText() == "OLD") { danar_user_options.setVisibility(View.GONE); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java index 27e3cbc611..1b2d7c2dfe 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java @@ -21,9 +21,10 @@ import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.events.EventPreferenceChange; import info.nightscout.androidaps.interfaces.Constraint; import info.nightscout.androidaps.interfaces.PluginType; -import info.nightscout.androidaps.interfaces.PumpDescription; 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; @@ -47,35 +48,7 @@ public class DanaRPlugin extends AbstractDanaRPlugin { public DanaRPlugin() { super(); useExtendedBoluses = SP.getBoolean(R.string.key_danar_useextended, false); - - pumpDescription.isBolusCapable = true; - pumpDescription.bolusStep = 0.05d; - - pumpDescription.isExtendedBolusCapable = true; - pumpDescription.extendedBolusStep = 0.05d; - pumpDescription.extendedBolusDurationStep = 30; - pumpDescription.extendedBolusMaxDuration = 8 * 60; - - pumpDescription.isTempBasalCapable = true; - pumpDescription.tempBasalStyle = PumpDescription.PERCENT; - - pumpDescription.maxTempPercent = 200; - pumpDescription.tempPercentStep = 10; - - pumpDescription.tempDurationStep = 60; - pumpDescription.tempMaxDuration = 24 * 60; - - - pumpDescription.isSetBasalProfileCapable = true; - pumpDescription.basalStep = 0.01d; - pumpDescription.basalMinimumRate = 0.04d; - - pumpDescription.isRefillingCapable = true; - - pumpDescription.storesCarbInfo = false; - - pumpDescription.supportsTDDs = true; - pumpDescription.needsManualTDDLoad = true; + PumpUtil.setPumpDescription(pumpDescription, PumpType.getByDescription("DanaR")); } @Override diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java index 8e56097fde..35578d577b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java @@ -21,9 +21,10 @@ import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.events.EventPreferenceChange; import info.nightscout.androidaps.interfaces.Constraint; import info.nightscout.androidaps.interfaces.PluginType; -import info.nightscout.androidaps.interfaces.PumpDescription; 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; @@ -50,35 +51,7 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin { pluginDescription.description(R.string.description_pump_dana_r_korean); useExtendedBoluses = SP.getBoolean(R.string.key_danar_useextended, false); - - pumpDescription.isBolusCapable = true; - pumpDescription.bolusStep = 0.1d; - - pumpDescription.isExtendedBolusCapable = true; - pumpDescription.extendedBolusStep = 0.05d; - pumpDescription.extendedBolusDurationStep = 30; - pumpDescription.extendedBolusMaxDuration = 8 * 60; - - pumpDescription.isTempBasalCapable = true; - pumpDescription.tempBasalStyle = PumpDescription.PERCENT; - - pumpDescription.maxTempPercent = 200; - pumpDescription.tempPercentStep = 10; - - pumpDescription.tempDurationStep = 60; - pumpDescription.tempMaxDuration = 24 * 60; - - - pumpDescription.isSetBasalProfileCapable = true; - pumpDescription.basalStep = 0.01d; - pumpDescription.basalMinimumRate = 0.1d; - - pumpDescription.isRefillingCapable = true; - - pumpDescription.storesCarbInfo = false; - - pumpDescription.supportsTDDs = true; - pumpDescription.needsManualTDDLoad = true; + PumpUtil.setPumpDescription(pumpDescription, PumpType.getByDescription("DanaR Korean")); } @Override diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java index 42c64e1f88..d671a3f784 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java @@ -43,6 +43,8 @@ import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotificati 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; @@ -88,36 +90,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte .description(R.string.description_pump_dana_rs) ); - pumpDescription.isBolusCapable = true; - pumpDescription.bolusStep = 0.05d; - - pumpDescription.isExtendedBolusCapable = true; - pumpDescription.extendedBolusStep = 0.05d; - pumpDescription.extendedBolusDurationStep = 30; - pumpDescription.extendedBolusMaxDuration = 8 * 60; - - pumpDescription.isTempBasalCapable = true; - pumpDescription.tempBasalStyle = PumpDescription.PERCENT; - - pumpDescription.maxTempPercent = 200; - pumpDescription.tempPercentStep = 10; - - pumpDescription.tempDurationStep = 60; - pumpDescription.tempDurationStep15mAllowed = true; - pumpDescription.tempDurationStep30mAllowed = true; - pumpDescription.tempMaxDuration = 24 * 60; - - - pumpDescription.isSetBasalProfileCapable = true; - pumpDescription.basalStep = 0.01d; - pumpDescription.basalMinimumRate = 0.04d; - - pumpDescription.isRefillingCapable = true; - - pumpDescription.storesCarbInfo = true; - - pumpDescription.supportsTDDs = true; - pumpDescription.needsManualTDDLoad = true; + PumpUtil.setPumpDescription(pumpDescription, PumpType.getByDescription("DanaRS")); } @Override diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java index f251c59638..3c9077e76d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java @@ -18,10 +18,11 @@ import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.TemporaryBasal; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.interfaces.Constraint; -import info.nightscout.androidaps.interfaces.PumpDescription; 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; @@ -50,37 +51,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin { pluginDescription.description(R.string.description_pump_dana_r_v2); useExtendedBoluses = false; - - pumpDescription.isBolusCapable = true; - pumpDescription.bolusStep = 0.05d; - - pumpDescription.isExtendedBolusCapable = true; - pumpDescription.extendedBolusStep = 0.05d; - pumpDescription.extendedBolusDurationStep = 30; - pumpDescription.extendedBolusMaxDuration = 8 * 60; - - pumpDescription.isTempBasalCapable = true; - pumpDescription.tempBasalStyle = PumpDescription.PERCENT; - - pumpDescription.maxTempPercent = 200; - pumpDescription.tempPercentStep = 10; - - pumpDescription.tempDurationStep = 60; - pumpDescription.tempDurationStep15mAllowed = true; - pumpDescription.tempDurationStep30mAllowed = true; - pumpDescription.tempMaxDuration = 24 * 60; - - - pumpDescription.isSetBasalProfileCapable = true; - pumpDescription.basalStep = 0.01d; - pumpDescription.basalMinimumRate = 0.04d; - - pumpDescription.isRefillingCapable = true; - - pumpDescription.storesCarbInfo = true; - - pumpDescription.supportsTDDs = true; - pumpDescription.needsManualTDDLoad = true; + PumpUtil.setPumpDescription(pumpDescription, PumpType.getByDescription("DanaRv2")); } @Override diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPlugin.java index 81b9dd6409..2baf835b26 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPlugin.java @@ -11,7 +11,6 @@ import org.slf4j.LoggerFactory; import java.text.DecimalFormat; import java.util.ArrayList; -import java.util.Date; import java.util.List; import info.nightscout.androidaps.BuildConfig; @@ -34,10 +33,13 @@ import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.logging.L; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment; import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions; +import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload; import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification; 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; @@ -53,7 +55,6 @@ import info.nightscout.androidaps.plugins.PumpInsight.utils.StatusItem; import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; import info.nightscout.utils.DateUtil; -import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload; import info.nightscout.utils.SP; import sugar.free.sightparser.applayer.descriptors.ActiveBolus; import sugar.free.sightparser.applayer.descriptors.ActiveBolusType; @@ -121,38 +122,7 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai .description(R.string.description_pump_insight) ); log("InsightPlugin instantiated"); - pumpDescription.isBolusCapable = true; - pumpDescription.bolusStep = 0.01d; // specification says 0.05U up to 2U then 0.1U @ 2-5U 0.2U @ 10-20U 0.5U 10-20U (are these just UI restrictions? Yes, they are!) - - pumpDescription.isExtendedBolusCapable = true; - pumpDescription.extendedBolusStep = 0.01d; // specification probably same as above - pumpDescription.extendedBolusDurationStep = 15; // 15 minutes up to 24 hours - pumpDescription.extendedBolusMaxDuration = 24 * 60; - - pumpDescription.isTempBasalCapable = true; - //pumpDescription.tempBasalStyle = PumpDescription.PERCENT | PumpDescription.ABSOLUTE; - pumpDescription.tempBasalStyle = PumpDescription.PERCENT; - - pumpDescription.maxTempPercent = 250; // 0-250% - pumpDescription.tempPercentStep = 10; - - pumpDescription.tempDurationStep = 15; // 15 minutes up to 24 hours - pumpDescription.tempDurationStep15mAllowed = true; - pumpDescription.tempDurationStep30mAllowed = true; - pumpDescription.tempMaxDuration = 24 * 60; - - pumpDescription.isSetBasalProfileCapable = true; - pumpDescription.is30minBasalRatesCapable = true; - pumpDescription.basalStep = 0.01d; - pumpDescription.basalMinimumRate = 0.02d; - pumpDescription.basalMaximumRate = 25d; - - pumpDescription.isRefillingCapable = true; - - pumpDescription.storesCarbInfo = false; - - pumpDescription.supportsTDDs = true; - pumpDescription.needsManualTDDLoad = false; + PumpUtil.setPumpDescription(pumpDescription, PumpType.getByDescription("Accu-Chek Insight")); } @@ -212,7 +182,7 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai @Override public void switchAllowed(ConfigBuilderFragment.PluginViewHolder.PluginSwitcher pluginSwitcher, FragmentActivity context) { boolean allowHardwarePump = SP.getBoolean("allow_hardware_pump", false); - if (allowHardwarePump || context == null){ + if (allowHardwarePump || context == null) { pluginSwitcher.invoke(); } else { AlertDialog.Builder builder = new AlertDialog.Builder(context); @@ -529,16 +499,16 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai log("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"); + log("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"); + log("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"); + log("Calculated rate is below or equal to 250%, using normal TBRs"); cancelExtendedBolus(); return setTempBasalPercent((int) percent, durationInMinutes, profile, true); } @@ -567,7 +537,8 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai .source(Source.USER); TreatmentsPlugin.getPlugin().addToHistoryTempBasal(tempBasal); updateGui(); - if (L.isEnabled(L.PUMPCOMM)) log.debug("Set temp basal " + percent + "% for " + durationInMinutes + "m"); + if (L.isEnabled(L.PUMPCOMM)) + log.debug("Set temp basal " + percent + "% for " + durationInMinutes + "m"); connector.requestHistorySync(5000); connector.tryToGetPumpStatusAgain(); return new PumpEnactResult().success(true).enacted(true).percent(percent); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpFragment.java index f5007ca121..ef4c85e0a7 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpFragment.java @@ -15,10 +15,12 @@ import com.squareup.otto.Subscribe; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.db.ExtendedBolus; import info.nightscout.androidaps.db.TemporaryBasal; import info.nightscout.androidaps.plugins.Common.SubscriberFragment; +import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpType; import info.nightscout.androidaps.plugins.PumpVirtual.events.EventVirtualPumpUpdateGui; import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; import info.nightscout.utils.FabricPrivacy; @@ -31,6 +33,9 @@ public class VirtualPumpFragment extends SubscriberFragment { TextView extendedBolusView; TextView batteryView; TextView reservoirView; + TextView pumpTypeView; + TextView pumpSettingsView; + private static Handler sLoopHandler = new Handler(); private static Runnable sRefreshLoop = null; @@ -60,6 +65,8 @@ public class VirtualPumpFragment extends SubscriberFragment { extendedBolusView = (TextView) view.findViewById(R.id.virtualpump_extendedbolus); batteryView = (TextView) view.findViewById(R.id.virtualpump_battery); reservoirView = (TextView) view.findViewById(R.id.virtualpump_reservoir); + pumpTypeView = (TextView) view.findViewById(R.id.virtualpump_type); + pumpSettingsView = (TextView) view.findViewById(R.id.virtualpump_type_def); return view; } catch (Exception e) { @@ -97,6 +104,18 @@ public class VirtualPumpFragment extends SubscriberFragment { } batteryView.setText(virtualPump.batteryPercent + "%"); reservoirView.setText(virtualPump.reservoirInUnits + "U"); + + virtualPump.refreshConfiguration(); + + PumpType pumpType = virtualPump.getPumpType(); + + pumpTypeView.setText(pumpType.getDescription()); + + String template = MainApp.gs(R.string.virtualpump_pump_def); + + + pumpSettingsView.setText(pumpType.getFullDescription(template, pumpType.hasExtendedBasals())); + } }); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java index f5d1faab77..f59d83b00e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java @@ -2,6 +2,8 @@ package info.nightscout.androidaps.plugins.PumpVirtual; import android.os.SystemClock; +import com.squareup.otto.Subscribe; + import org.json.JSONException; import org.json.JSONObject; import org.slf4j.Logger; @@ -17,6 +19,7 @@ import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.ExtendedBolus; import info.nightscout.androidaps.db.Source; import info.nightscout.androidaps.db.TemporaryBasal; +import info.nightscout.androidaps.events.EventPreferenceChange; import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PluginDescription; import info.nightscout.androidaps.interfaces.PluginType; @@ -28,6 +31,8 @@ import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload; 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; @@ -57,6 +62,9 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { private PumpDescription pumpDescription = new PumpDescription(); + PumpType pumpType = null; + + private static void loadFakingStatus() { fromNSAreCommingFakedExtendedBoluses = SP.getBoolean(R.string.key_fromNSAreCommingFakedExtendedBoluses, false); } @@ -110,6 +118,24 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { pumpDescription.is30minBasalRatesCapable = true; } + @Override + protected void onStart() { + super.onStart(); + MainApp.bus().register(this); + refreshConfiguration(); + } + + @Override + protected void onStop() { + MainApp.bus().unregister(this); + } + + @Subscribe + public void onStatusEvent(final EventPreferenceChange s) { + if (s.isChanged(R.string.key_virtualpump_type)) + refreshConfiguration(); + } + @Override public boolean isFakingTempsByExtendedBoluses() { return (Config.NSCLIENT) && fromNSAreCommingFakedExtendedBoluses; @@ -414,4 +440,29 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { return "Virtual Pump"; } + public PumpType getPumpType() { + return pumpType; + } + + + public void refreshConfiguration() { + String pumptype = SP.getString(R.string.key_virtualpump_type, "Generic AAPS"); + + PumpType pumpTypeNew = PumpType.getByDescription(pumptype); + + if (L.isEnabled(L.PUMP)) + log.debug("Pump in configuration: {}, PumpType object: {}", pumptype, pumpTypeNew); + + if (pumpType == pumpTypeNew) + return; + + if (L.isEnabled(L.PUMP)) + log.debug("New pump configuration found ({}), changing from previous ({})", pumpTypeNew, pumpType); + + PumpUtil.setPumpDescription(pumpDescription, pumpTypeNew); + + this.pumpType = pumpTypeNew; + + } + } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentService.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentService.java index 7a316161b3..8c01db13fd 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentService.java @@ -244,17 +244,8 @@ public class TreatmentService extends OrmLiteBaseService { Treatment treatment = Treatment.createFromJson(json); if (treatment != null) createOrUpdate(treatment); - } catch (JSONException e) { - log.error("Unhandled exception", e); - } - } - - public void createFoodFromJsonIfNotExists(JSONArray array) { - try { - for (int n = 0; n < array.length(); n++) { - JSONObject json = array.getJSONObject(n); - createTreatmentFromJsonIfNotExists(json); - } + else + log.error("Date is null: " + treatment.toString()); } catch (JSONException e) { log.error("Unhandled exception", e); } @@ -340,6 +331,8 @@ public class TreatmentService extends OrmLiteBaseService { scheduleTreatmentChange(treatment); return new UpdateReturn(true, true); } + if (L.isEnabled(L.DATATREATMENTS)) + log.debug("Equal record by date from: " + Source.getString(treatment.source) + " " + old.toString()); return new UpdateReturn(true, false); } // find by NS _id @@ -361,6 +354,9 @@ public class TreatmentService extends OrmLiteBaseService { scheduleTreatmentChange(treatment); return new UpdateReturn(true, true); } + if (L.isEnabled(L.DATATREATMENTS)) + log.debug("Equal record by _id from: " + Source.getString(treatment.source) + " " + old.toString()); + return new UpdateReturn(true, false); } } getDao().create(treatment); diff --git a/app/src/main/java/info/nightscout/androidaps/services/DataService.java b/app/src/main/java/info/nightscout/androidaps/services/DataService.java index c0cfe07370..6edd49c0ed 100644 --- a/app/src/main/java/info/nightscout/androidaps/services/DataService.java +++ b/app/src/main/java/info/nightscout/androidaps/services/DataService.java @@ -202,7 +202,7 @@ public class DataService extends IntentService { MainApp.getDbHelper().deleteProfileSwitchById(_id); } - private void handleTreatmentFromNS(JSONObject json, Intent intent) throws JSONException { + private void handleTreatmentFromNS(JSONObject json, Intent intent) { // new DB model int mode = Intents.ACTION_NEW_TREATMENT.equals(intent.getAction()) ? EventNsTreatment.ADD : EventNsTreatment.UPDATE; double insulin = JsonHelper.safeGetDouble(json, "insulin"); @@ -254,7 +254,7 @@ public class DataService extends IntentService { CareportalEvent careportalEvent = new CareportalEvent(nsMbg); MainApp.getDbHelper().createOrUpdate(careportalEvent); if (L.isEnabled(L.DATASERVICE)) - log.debug("Adding/Updating new MBG: " + careportalEvent.log()); + log.debug("Adding/Updating new MBG: " + careportalEvent.toString()); } } diff --git a/app/src/main/java/info/nightscout/utils/DecimalFormatter.java b/app/src/main/java/info/nightscout/utils/DecimalFormatter.java index 0f7164b690..84a40de84b 100644 --- a/app/src/main/java/info/nightscout/utils/DecimalFormatter.java +++ b/app/src/main/java/info/nightscout/utils/DecimalFormatter.java @@ -46,13 +46,13 @@ public class DecimalFormatter { } public static String toPumpSupportedBolus(double value) { - return ConfigBuilderPlugin.getActivePump().getPumpDescription().bolusStep <= 0.05 + return ConfigBuilderPlugin.getActivePump().getPumpDescription().bolusStep <= 0.051 ? to2Decimal(value) : to1Decimal(value); } public static DecimalFormat pumpSupportedBolusFormat() { - return ConfigBuilderPlugin.getActivePump().getPumpDescription().bolusStep <= 0.05 + return ConfigBuilderPlugin.getActivePump().getPumpDescription().bolusStep <= 0.051 ? new DecimalFormat("0.00") : new DecimalFormat("0.0"); } diff --git a/app/src/main/res/layout/virtualpump_fragment.xml b/app/src/main/res/layout/virtualpump_fragment.xml index 3643c95bf5..0cc6e739ff 100644 --- a/app/src/main/res/layout/virtualpump_fragment.xml +++ b/app/src/main/res/layout/virtualpump_fragment.xml @@ -189,6 +189,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 2056dd70fb..524867b168 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -712,6 +712,8 @@ Изпращай данни за КЗ към xDrip+ В xDrip+ изберете 640g/Eversense за източник на данни КЗ от NS + Базалната стойност е заместена от минимално поддържаната стойност %s + Базалната стойност е заместена от максимално поддържаната стойност %s Калкулиране на КЗ Калкулиране на Болус IOB Калкулиране на базален IOB @@ -765,6 +767,7 @@ Помпата е недостъпна. Не беше доставен болус. Болусът беше неуспешен. За да сте сигурни, моля, проверете помпата, за да избегнете повторение на вече доставен болус. За да се избегнат бъгове болусите не се повтарят автоматично. Само %1$.2f U от искания болус от %2$.2f U е доставен поради грешка. Моля, проверете помпата, за да потвърдите това и да предприемете съответните действия. + Свързването с помпата и стартирането на болус се провали. Моля, проверете ръчно в историята на помпата доставен ли е болусът. Ако болусът е доставен, ще бъде добавен автоматично при следващото свързване с помпата. Няма достатъчно инсулин в резервоара Грешка при доставяне на удължен болус Insight @@ -1023,6 +1026,7 @@ Изпратщане на логове чрез ел. поща Изтрий логове Събитие (инсулин: %1$.2f, въглехидрати: %2$d, в: %3$s) не може да бъде добавено към събития. Моля уверете се, че е правилно и го добавете ръчно. + eCarbs: %1$d г (за %2$d ч), след: %3$d м Няма налични данни за авточувствителност Настройки на логовете Възстанови настройките по подразбиране @@ -1031,6 +1035,7 @@ Има налично обновяване до версия %1$s времево отместване + Предпочитаният режим на APS %1$d дeн %1$d дни diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 70bd08bbef..82afe135d7 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -948,6 +948,10 @@ Max násobitel denního nejvyššího bazálu Max násobitel současného bazálu --- + Typ virtuální pumpy + Definice pumpy + Bolus: Krok =%1$s\nProdl. bolus: [Krok=%2$s, Délka=%3$smin-%4$sh]\nBazál: Krok=%5$s\nDoč. bazál: %6$s (%7$s), Délka=%8$smin-%9$sh\n%10$s + * Rozdílné hodnoty podle rozsahu nejsou podporovány. Doplňování glykémií z NS Nastavení wizardu Kalkulace použité ve výsledku wizardu: @@ -1034,6 +1038,10 @@ SENS Verze %1$s je k dispozici Časový posun + Preferovaný režim APS + Výsledek + Kalk + Navazování spojení %1$d den %1$d dnů diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index c24bacb1e6..31d7a9f82b 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -66,13 +66,13 @@ IOB: IOB: Aktivität: - Gesamt-IOB: - Gesamt-Insulin-Aktivität: + Gesamt IOB: + Ges. IOB Aktivität: Dauer: Verhältnis: Ins: IOB: - Gesamt-IOB: + Gesamt IOB: Insulin-Menge Kohlenhydrat-Menge BZ @@ -606,7 +606,7 @@ maxIOB = durchschnittlicher Essensbolus + 3 x maximale Basalrate IAGE CAGE BAT - OAPS + OASP UPLD BAS EXT diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 00e99c0f56..70489fbc5e 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -1,675 +1,3 @@ - - 관리 안전설정 - 최대 허용 식사주입인슐린 [U] - 최대 허용 탄수화물 [g] - 설정 - NS에서 관리 새로고침 - 데이터베이스 초기화 - 데이터 베이스를 정말 초기화하시겠습니까? - 종료 - >200% 주입위한 확장식사주입 - 다나R 블루투스 - 기초주입량 절대값 사용하기 - 폰을 재부팅하고나 AndroidAPS를 재시작하세요 \n그렇지 않으면 로그가 기록이되지 않습니다.(알고리즘이 제대로 작동하는지 확인하기 위해 로그가 필요합니다.)! - 시작 - 확인 - 단위 - 인슐린활동시간(DIA): - 인슐린 대 탄수화물 비율(IC): - 인슐린 민감도(ISF): - 기초주입: - 목표: - NO PROFILE SET - 인슐린: - 탄수화물: - IOB: - IOB: - 활동: - IOB 총량: - 활동 IOB 총량: - 기간: - 비율: - 인슐린: - IOB: - IOB 총량: - 인슐린 양 - 탄수화물 양 - 혈당 - 탄수화물 - 교정 - U - 식사주입 IOB - 지금 실행 - 가상 펌프 - 기본 기초주입량 - 임시기초주입 - 확장식사주입 - 배터리 - 인슐린 잔량 - OK - 최근 실행 - 입력 변수 - 혈당 상태 - 현재 임시기초 - IOB 데이터 - 프로파일 - 식사 데이터 - 결과 - 혈당 데이터 없음 - 변경사항 없음 - 요청 - 주입량 - 기간 - 근거 - 혈당 - Delta - Delta: - 구성 관리자 - 목표 - OpenAPS MA - 개요 - NS 프로파일 - Simple 프로파일 - 임시기초 - 관리 - 가상펌프 - 케어포털 - 펌프 - 관리 - 프로파일 - APS - 일반 - - 제한 - Loop - Loop - APS - 제약 적용 후 - 최근 주입 - OK - 취소 - NO APS SELECTED OR PROVIDED RESULT - Safety - 플러그인이 사용불가능 합니다 - 제한 위반 - 식사주입 전송 에러 - 임시기초주입 전송 에러 - 기초주입 값 [%] - % (100% = 현재) - 새 임시기초주입 적용: - 식사주입 - 계산기 - 제한! - 확인 - 새 Treatment 입력: - 식사주입 - Bolus: - 기초주입 - Basal: - 탄수화물 - 입력값 변경! - 새 확장식사주입 설정: - 혈당 소스 - xDrip - APS 모드 - Closed Loop - Open Loop - Loop 중지됨 - Loop 중지하기 - Loop 실행하기 - 새로운 제안이 있습니다 - 지원하지 않는 NSClient 버전입니다 - 지원하지 않는 Nightscout 버전입니다 - NSClient 가 설치되지 않았습니다. 기록이 삭제됩니다! - NS에서 혈당데이터가 확인 가능합니다. - NS에서 펌프상태가 확인 가능합니다. - 수동 주입 - 제한으로 인해 LOOP가 사용불가합니다. - Czech - English - 기초주입 IOB - 식사주입 제한이 적용되었습니다 - 탄수화물 제한이 적용되었습니다 - 혈당 체크 - 알림 - 노트 - 의문 - 운동 - 펌프 위치 변경 - CGM 센서 삽입 - CGM 센서 시작 - 인슐린 카트리지 교체 - 프로파일 변경 - 간식 주입 - 식사 주입 - 교정 주입 - 콤보 주입 - 임시 기초 시작 - 임시 기초 종료 - 탄수화물 교정 - OpenAPS 오프라인 - 이벤트 종류 - 기타 - 측정기 - 센서 - 탄수화물 - 인슐린 - 탄수화물 시간 - 분할 - 기간 - 퍼센트 - 절대값 - 노트 - 이벤트 시간 - 프로파일 - Entered By - 혈당 종류 - 아직 NS에서 프로파일을 로드하지 못했습니다. - 임시기초주입 - 확장식사주입 - Nightscout 버전: - Missing - 설정이 저장되었습니다 - 다음 위치에 설정을 저장하시겠습니까 - 다음 위치에서 설정을 불러오시겠습니까 - 설정을 불러왔습니다 - 파일을 찾을 수 없습니다 - 설정 저장하기 - 설정 불러오기 - Dutch - German - Spanish - Greek - Italian - Russian - Swedish - 임시기초주입 최대량 [U/hr] - 이 값은 OpenAPS에서 Max Basal(임시기초주입 최대량)로 설정되는 값입니다 - OpenAPS가 주입할수 있는 최대 기초주입 IOB [U] - 이 값은 OpenAPS에서 Max IOB라고 부르는 값입니다\n기본값은 0으로 설정되어 있습니다. 몇일 혹은 몇주 정도 사용 후 적절한 값으로 변경할 수 있습니다. - Bulgarian - 닫기 - 언어 - 다나R - 연결중 - 연결됨 - 연결 끊김 - 다나R 펌프 설정 - 최종 사용자 라이선스 동의서 - 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. - 모두 이해하였고 동의합니다. - 저장 - 블루투스 어댑터를 찾지 못했습니다 - 선택된 기기를 찾지 못했습니다 - 펌프 연결 에러 - 펌프 IOB - 일 인슐린 총량 - 최근 식사주입: - 사용할수 없는 입력 데이터 - 값이 제대로 설정되지 않았습니다 - Reload profile - 프로파일 보기 - Enacted - Comment - Success - 퍼센트 - Absolute - 임시기초주입 취소하기 - SMS 전송 - 결과 기다리는 중 - 허가된 전화번호 - +XXXXXXXXXX;+YYYYYYYYYY - 식사주입 %1$.2fU 을 실행하려면 %2$s 를 입력하고 답장하세요 - 보정값 %1$.2f을 전송하려면 %2$s 를 입력하고 답장하세요 - Bolus failed - Bolus %.2fU delivered successfully - %.2fU 주입 예정입니다. - Bolus %.2fU delivered successfully - %.2fU 주입중 - SMS 원격 명령 사용하기 - 원격 식사주입 허용되지 않음 - Finger - Sensor - Manual - 임시목표 - 임시목표 취소 - DanaR 프로파일 설정 - 인슐린활동시간(DIA) [h] - Duration of Insulin Activity - 기초주입 프로파일 갱신 실패 - 새로고침 - 업로드중 - E bolus - DS bolus - DE bolus - 에러 - 교체 - basal hour - 혈당 - 탄수화물 - 알람 - 총 %1$d 기록들이 업로드되었습니다. - S bolus - 알람 - 기초주입 시간 - 식사주입 - 탄수화물 - 일일 인슐린 - 에러 - 혈당 - 교체 - 중지 - %1$d 초 동안 연결중 - 펌프 비밀번호 - 펌프 비밀번호가 잘못되었습니다! - 펌프가 바쁩니다 - 주입됨 - 정지됨 - 막힘 - 정지 - 정지 누름 - 펌프를 기다리는 중 - %.2fU을 주입합니다 - 표시설정과 모니터링설정을 완료하고, 기초주입과 비율을 분석한다. - 나이트스카우트에서 혈당 데이터가 잘 들어오는지, 펌프데이터가 업로드 되는지 확인한다. - Open Loop를 시작한다. - Open Loop 모드에서 몇일간 사용하여보고, 임시기초주입을 여러번 수동으로 실행하여본다. Set up and use temporary and default temporary targets (e.g. for activity or hypo treatment carbs) - 임시기초주입 추천기능을 포함해서, Open Loop에 대해 이해한다. - 이 경험을 토대로, 최대 기초주입량을 결정하고 이를 펌프와 설정에 입력한다. - Closed Loop를 시작하고 저혈당인슐린 중지 기능을 사용해본다. - 최대 IOB = 0 인 상태로 Closed Loop를 몇일동안 실행시켜 본다. 저혈당 인슐린일시중지가 많이 발생하지 않도록 한다. - Closed Loop를 조정하여 최대 IOB를 0 이상으로 올려서 서서히 혈당 목표치를 낮춘다. - 혈당을 낮추기 전에 몇일간 사용해보되 최소한 하루는 저혈당 혈당 알람이 발생하지 않도록 해본다. - 필요하면 기초주입과 비율을 조절하고, auto-sens를 활성화한다. - 평소의 탄수화물을 입력하면서 1주일동안 낮시간대에 loop를 성공적으로 사용해본다. - AMA(Advanced Meal Assist)같은 낮시간대를 위한 추가적인 기능들을 실행하여 본다. - 낮시간대에 SMB(Super Micro Bolus)같은 추가기능을 활성화해 사용해본다. - 허용된 제한값에 도달하였습니다 - 프로파일이 선택되지 않았습니다 - Loop가 중지되었습니다. - Loop가 실행되었습니다. - Loop가 중지중입니다. - Loop가 실행중입니다. - %1$.2f, %2$.2f으로 제한됨 - %s값이 하드리밋(Hard Limit)를 벗어났습니다 - 원격 기초주입설정이 허가되지 않았습니다 - 원격 명령이 허가되지 않았습니다 - 기초주입 %1$.2fU/h 을 실행하려면 %2$s 를 입력하고 답장하세요 - %1$d분동안 Loop 일시중지하려면 %2$s 를 입력하고 답장하세요 - Temp basal %1$.2fU/h for %2$d min started successfully - Temp basal start failed - 임시기초주입을 중지하려면 %s 를 입력하고 답장하세요 - Temp basal canceled - Canceling temp basal failed - 알려지지 않은 명령이거나 잘못된 답장입니다. - 빠른마법사 - 빠른마법사 설정 - 버튼명: - 탄수화물: - 유효기간: - 추가 - 수정 - 삭제 - Meal - Corr - 한국어 - 실행 - AndroidAPS 시작 - NS에 업로드만 하기(동기화 불능) - NS에 업로드만 하기. 로컬소스(xDrip)가 선택되지 않으면 SGV에는 효력이 없습니다. NS프로파일이 사용중이라면 프로파일에는 효력이 없습니다. - 펌프가 초기화 되지 않았습니다! - 펌프가 초기화와 프로파일 설정이 되지 않았습니다! - 교체/채움 - 양이 인퓨전세트의 사양과 일치하는지 확인하세요! - 기타 - 교체/채움 기본 인슐린양 - 버튼1 - 버튼2 - 버튼3 - Units: - mg/dl - mmol/l - DIA: - 목표 범위: - 차트 표시 범위 - 개요/스마트워치 차트 표시용 고/저혈당 선 - 저혈당 선 - 고혈당 선 - 웨어 - 모든 데이터 다시 보내기 - 웨어에서 설정 열기 - 펌프 에러 - 배터리 부족 - 펌프 중지 - 펌프배터리 방전 - 다나R 한글 - 기초주입량: - 기초주입 프로파일 설정이 실패하였습니다 - 기초주입 프로파일이 펌프에 업데이트 되었습니다 - 펌프에서 EasyUI모드를 해제하세요 - 펌프에서 확장식사기능을 활성화 하세요 - 펌프에서 U/d에서 U/h로 모드를 변경하세요 - 기초주입값이 최소값 이하입니다. 프로파일이 설정되지 않습니다! - BG: - Last BG: - MDI - MM640g - 연속 알림 - OLD DATA - %d분전 - %dmin ago - Local Profile - OpenAPS AMA - Short avg. delta - Long avg. delta - Array of %1$d elements.\nActual value: - Autosens 정보 - Script debug - AMA autosens 기능 사용하기 - NS에서 이벤트 새로고침 - Eating Soon - Activity - 기록 삭제: - DanaR 통계 - 누적 일총량 - 지수가중 일총량 - 기초주입 - 식사주입 - 일총량 - 날짜 - 비율 - #일 - 가중 - 교체/채움을 위해 식사주입을 사용한 경우 부정확할 수 있습니다!! - 오래된 데이터입니다. "새로고침"을 누르세요. - 총기초량 - 총기초량 * 2 - 초기화중 ... - ACT - CONF - LOOP - SP - OAPS - LP - DANA - HOME - VPUMP - NSPROFILE - TREAT - CP - OBJ - WEAR - SMS - 탭 이름 단축 - 단순델타값 대신 단기평균델타값을 항상 사용합니다. - xDrip의 혈당데이터에 노이즈가 심할경우 유용합니다. - 고급 설정 - 모델: %1$02X 프로토콜: %2$02X 코드: %3$02X - 프로파일 - 기본값: 3\n이 값은 중요한 OpenAPS 안전장치입니다. 이 값의 역할은 펌프에 설정되어 있는 최대기초주입량보다 3배를 초과할 수 없게 제한하는 것입니다. 이 값을 변경할 필요는 없을 것이지만, 안전을 위해 "3x max daily; 4x current"이 의미하는 바를 알고 있어야 합니다. - 기본값: 4\n이 값은 "3x max daily; 4x current"의 나머지 절반에 해당하는 또 다른 중요한 OpenAPS 안전장치입니다. 이 값은 펌프에 설정된 최대기초주입량과 관계없이, 설정된 현재시간의 기초주입량에 이 값을 곱한 양을 초과할 수 없게됩니다. 이는 알고리즘의 작동 방식을 이해하기 전에 과도하게 높은 최대 기본을 설정하여 위험한 상황에 빠지지 않도록 보호하기 위한 것입니다. 다시한번, 기본 값은 4배인 것을 알아두세요; 일반적으로 이것을 조정할 필요는 전혀 없으며, 대신 이 안전장치를 변경해야할것처럼 생각이 된다면, 다른 설정을 변경해야 할 가능성이 더 큽니다. - 기본값: 1.2\n이 값은 autosens가 autosens 비율을 얼마나 높게 할 수 있는지에 대한 최대 한계를 20%로 설정하는 승수장치입니다. 이는 autosens가 얼마나 높게 기초주입량을 조절할수 있는지, ISF를 얼마나 낮게 조절할수 있는지, 혈당 목표범위를 얼마나 낮게 설정할수 있는지를 결정합니다. - 기본값: 0.7\nautosens 안전 제한의 나머지 부분입니다. 이는 기초주입량을 얼마나 낮게 조절할 수 있는지, ISF와 혈당 목표범위를 얼마나 높게 설정할 수 있는지를 결정합니다. - 기본값: 활성\n이것은 autosens가 ISF와 기초주입뿐만 아니라, 혈당 목표범위를 조절할 수 있게 합니다. - 기본값: 2\n식사주입 후 Bolus snooze가 수행되게 되고, 따라서 식사주입 직후엔 loop가 low temp에 대응하지 않게 됩니다. 기본값이 2일때 예제는 다음과 같습니다; DIA가 3시간일 경우 bolus snooz는 점차적으로 1.5시간에 걸쳐 단계적으로 사라지게 됩니다.(3DIA/2). - 기본값: 3\n이것은 5분당 기본 탄수화물 흡수량에 대한 설정입니다. 예상되는 기본값은 3mg/dl/5min입니다. 이는 혈당이 예상보다 빨리 떨어지거나 오를때, 얼마나 빨리 COB가 감쇠하는지와 혈당예측을 위한 계산시 탄수화물 흡수량이 얼마나 될것으로 예상되는지에 영향을 미치게 됩니다. - 주의!\n보통의 경우 아래의 값을 변경하면 안됩니다. 이 값들을 변경하기 전에 반드시 이곳을 클릭하고 글을 정독해서 확실하게 이해를 하여야 합니다. - 숫자만 입력가능합니다. - 이 범위(%1$s - %2$s)안에 해당하는 숫자만 입력가능합니다. - 필수 입력 항목입니다. - 폰번호가 유효하지 않습니다 - SMS폰번호가 유효하지 않습니다 - 클립보드에 복사 - 클립보드에 복사되었습니다 - 로그 보기 - 보정 - 보정값 %.1f을 xDrip에 전송하시겠습니까? - xDrip+가 설치되지 않았습니다 - 보정이 xDrip으로 전송되었습니다 - 원격보정이 허용되지 않았습니다 - 보정 전송됨. xDrip에서 수신이 되도록 설정되어 있어야 합니다. - xDrip에서 보정을 받지 못합니다. - 펌프 일시중지됨 - 펌프 상태 가져오는중 - 임시기초주입 설정중 - 임시기초주입 취소중 - 확장식사주입 설정중 - 확장식사주입 취소중 - 기초주입량 업데이트중 - 연결끊기중 - 실행중 - 가상펌프 설정 - NS에 상태 업로드하기 - 잘못된 비밀번호 - 설정 비밀번호 - 설정 잠금해제 - 인슐린 일 허용량에 근접중 - 내장 NSClient - NSCI - URL: - 자동스크롤 - Restart - 내장 NSClient - Nightscout URL - Nightscout URL 입력 - NS API secret - NS API secret - NS API secret 입력(최소 12글자) - Deliver now - Clear queue - Show queue - Queue: - Status: - 일시중지 - Clear log - NSCLIENT이 쓰기 권한이 없습니다. 잘못된 API secret인지 확인해보세요 - 웨어 설정 - IOB 자세하게 보여주기 - 워치페이스에 IOB를 식사주입IOB와 기초주입IOB로 나누어서 보여줍니다. - 성공하지 못했습니다. 폰을 확인하세요 - 알수없음 - 나이 - 어린이 - 청소년 - 성인 - 안전제한을 설정하기 위해 당뇨인의 나이를 선택하세요 - Glimp - Loop 일시중지 - 일시중지중 (%d분) - 수퍼 식사주입 (%d분) - 1시간동안 Loop 일시중지 - 2시간동안 Loop 일시중지 - 3시간동안 Loop 일시중지 - 10시간동안 Loop 일시중지 - 15분동안 펌프 일시중지 - 30분동안 펌프 일시중지 - 1시간동안 펌프 일시중지 - 2시간동안 펌프 일시중지 - 3시간동안 펌프 일시중지 - 재실행 - 기간이 잘못되었습니다. - Loop가 일시중지 되었습니다. - Loop가 재실행 되었습니다. - 15분 추이 - COB - 수퍼 식사주입 - 앱시작을 NS에 기록하기 - 설정을 적용하기위해 앱을 종료합니다. - 다나Rv2 - 인슐린 - Fast Acting Insulin - 노보래피드, 휴마로그, 에피드라 - 피아스프(Fiasp) - INS - 마법사에서 수퍼 식사주입 활성화하기 - 마법사에서 수퍼 식사주입 기능을 활성화합니다. 어떤 기능인지 확실히 알기전까지 활성화 하지 마세요. 제대로 알지 못하고 사용하면 일슐린이 과다 주입될 수 있습니다! - IOB - COB - 펌웨어 - 최근 연결 - 블루투스 상태 - 버전정보 - SMS 권한 누락 - xDrip 상태(워치) - xDrip 상태표시라인(워치) - xds - BGI 보기 - BGI를 상태라인에 추가하기 - NS에 업로드하지 않기 - NS로 보낼 모든 데이터가 버려집니다. AAPS는 NS에 연결되어 있지만 NS에는 변화가 없을것입니다. - 기초주입 최소단위 - 식사주입 최소단위 - 확장식사 - 임시목표 - 확장 식사주입 취소 - 센서 사용기간 - 캐뉼라 사용기간 - 인슐린 사용기간 - 시간 - 기초주입 종류 - 프로파일이 잘못되었습니다 !!! - 프로파일변경 - 펌프배터리사용기간 - 펌프 배터리 교체 - 알람 옵션 - 위험 고혈당 - 고혈당 - 저혈당 - 위험 저혈당 - 누락 데이터 - 위험 누락 데이터 - 누락 데이터 기준값[분] - 위험 누락 데이터 기준값[분] - autosens 시간 [h] - 민감도를 감지하기 위해 계산될 총 시간 (탄수화물 흡수 시간은 제외됩니다.) - Pump - OpenAPS - Uploader - 민감도 감지 - SENS - 민감도 Oref0 - 민감도 AAPS - 흡수 설정 - 식사 최대 흡수 시간 [h] - 식사로 섭취한 탄수화물이 모두 흡수될기까지 예상되는 시간 - 확장식사주입을 %로 표시하기 - SAGE - IAGE - CAGE - PBAGE - OAPS - UPLD - BAS - EXT - Autosense 기능을 켜면 모든 섭취된 탄수화물양을 입력하십시오. 그렇지 않으면 탄수화물 편차(deviations)가 민감도 변화로 잘못 인식될것입니다!! - 민감도 가중평균 - OK - Cancel - Not all profiles loaded! - Values not stored! - (xDrip 같은) 다른 앱으로의 브로드캐스트를 활성화합니다. - Local Broadcasts 활성화하기 - 활동 & 조절 - 탄수화물 & 식사주입 - CGM & OPENAPS - 펌프 - Basal value [U/h] - Duration [min] - IOB 커브 피크 시간 - 피크 시간[분] - Free-Peak Oref - Rapid-Acting Oref - Ultra-Rapid Oref - "DIA %1$f는 너무 짧습니다. 대신 %2$f을 사용하세요!" - 프로파일 활성화하기 - Date - INVALID - 펌프연동 대기중 - 연동완료 - 연동시간초과 - 연동중 - 현재까지 발견된 기기가 없습니다. - 빈 주사기 - 혈당측정알람 - 남은 인슐린 양 - 다나RS - Dana - 선택된 펌프 - 새 펌프와 연동 - 식사주입 속도 - 기초주입 단위를 0.01 U/h로 설정하세요 - 시리얼번호 - 퍼센트 - 시간 이동 - 임시목표 기본값 - eatingsoon 기간 - eatingsoon 목표 - activity 기간 - activity 목표 - 교체 - 확장식사주입 상태 가져오는중 - 식사주입상태 가져오는중 - 임시기초주입상태 가져오는중 - 펌프설정 가져오는중 - 펌프시간 가져오는중 - 재사용 - 워치로 작동하기 - 임시목표와 관리입력을 워치로 설정합니다. - 연결시간초과 - 음식 - g - ]]> - kJ - En - Pr - Fat - ]]> - 식사주입 종료를 기다리고 있습니다. %d초 남았습니다. - 이벤트 처리중 - 식사주입을 시작합니다. - 명령을 지금 실행합니다. - 펌프 드라이버가 수정되었습니다. - 펌프에 연결할 수 없습니다. - 혈당 읽기가 누락되었습니다. - 경고와 알림시 시스템 알림 사용하기 - 자체 경고 기능 - 혈당 데이터 누락시 경고하기 - 펌프와 연결불가시 경고하기 - 펌프 연결불가 기준시간[분] - 긴급 알람 - 정보 - 블루투스 - 블루투스 감시기능 - 펌프에 연결이 되지 않을때 폰의 블루투스를 1초간 껐다 켭니다. 블루투스 스택이 정지되는 일부폰에 이 기능이 도움이 됩니다. - (패치된) DexcomG5 앱 - NS에 혈당데이터 업로드하기 - G5업로드 세팅 - 델타(혈당증분값) 자세히 보여주기 - 소수점 한자리 더 추가된 델타 보여주기 - 지원되지 않는 펌프 펌웨어 - 혈당 데이터를 xDrip+에 전송하기 - xDrip+ 데이터 소스에서 640g/Eversense을 선택하세요 - 지원되는 최소값으로 기초주입량이 대체되었습니다. - 혈당 계산 - 식사주입 IOB 계산 - 기초주입 IOB 계산 - 추세계산 - 수퍼 식사주입 계산 - - 아니오 - 양수만 - 음수만 - COB 계산 - 임시목표 계산 - Loop 활성화됨 - APS 선택됨 - NSClient가 쓰기권한이 있습니다 - Closed 모드가 활성화됨 - 최대 IOB가 바르게 설정됨 - 선택한 소스에서 혈당이 들어옵니다. - 기초주입값이 시간단위로 설정되지 않았습니다: %s - 유효하지 않은 프로파일: %s - 펌프 이력 - 확장식사주입 에러 - + + diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index f399a07b1f..85fbff0879 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1036,4 +1036,8 @@ Context | Edit Context Авточувств Доступна версия %1$s Смещение по времени + Предпочитаемый режим APS + Итого + Кальк + Подтверждение связи diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 58e7909e1b..fcf718590d 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -230,7 +230,7 @@ Maximálny bazálny IOB, ktorý OpenAPS môže podať [U] Táto hodnota je nazývaná v kontexte OpenAPS ako max IOB, je to maximálne množstvo inzulínu v [U], ktoré APS môže naraz podať. - ZAMIETNUŤ + POTVRDIŤ DanaR Pripájanie Pripojené @@ -713,6 +713,8 @@ Odosielať glykémie do xDrip+ V xDrip+ vyberte zdroj dát 640g/Eversense Glykémie z NS + Hodnota bazálu nahradená minimálnou možnou + Hodnota bazálu nahradená maximálnou možnou: %s Výpočet glykémie Výpočet bolusového IOB Výpočet bazálneho IOB @@ -766,6 +768,7 @@ Pumpa nedostupná. Bolus nebol podaný Podávanie inzulínu zlyhalo. Zdá sa, že nebol podaný žiadny bolus. Aby ste si boli istí, skontrolujte pumpu a prípadne pošlite bolus znovu. Aby sa zabránilo nechcenému dvojitému bolusu, podanie bolusu nie je automaticky opakované. Iba %1$.2f U z bolusu %2$.2f bolo podaného z dôvodu chyby. Skontrolujte podaný bolus na pumpe a urobte potrebné opatrenia. + Podanie bolusu a kontrola histórie pumpy zlyhala. Skontrolujte pumpu. Pokiaľ bolus prebehol, načíta se pri najbližšom pripojení automaticky. Nedostatok inzulínu v zásobníku pre takýto bolus Chyba pri podávaní predĺženého bolusu Insight @@ -1024,6 +1027,7 @@ Zasielať logy E-mailom Vymazať logy Ošetrenie (inzulín: %1$.2f, sacharidy: %2$d, čas: %3$s) nie je možné pridať. Skontrolujte a podľa potreby manuálne pridajte záznam. + eCarbs: %1$d g (%2$d h), Oneskorenie: %3$d m Nedostupné dáta o glykémiách Nastavenie logovania Obnoviť predvolené @@ -1031,4 +1035,26 @@ AS Verzia %1$s je k dispozícii Časový posun + Preferovaný režim APS + Spolu + Kalk + Overovanie + + %1$d deň + %1$d dní + %1$d dní + %1$d dní + + + %1$d hodina + %1$d hodín + %1$d hodín + %1$d hodín + + + %1$d minúta + %1$d minút + %1$d minút + %1$d minút + diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 8da5747c68..3b6643f480 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -111,4 +111,30 @@ @string/no @string/yes + + + Generic AAPS + Accu-Chek Spirit + Accu-Chek Combo + Accu-Chek Insight + Animas Ping + Animas Vibe + Cellnovo + DanaR + DanaR Korean + DanaRS + DanaRv2 + Insulet Omnipod + Medtronic 512/712 + Medtronic 515/715 + Medtronic 522/722 + Medtronic 523/723 (Revel) + Medtronic 554/754 (Veo) + Medtronic 640G + Tandem t:slim + Tandem t:flex + Tandem t:slim G4 + Tandem t:slim X2 + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ae4e572392..ea378a6f0c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1083,6 +1083,11 @@ Max daily safety multiplier Current basal safety multiplier n/a + virtualpump_type + Virtual Pump Type + Pump Definition + Bolus: Step=%1$s\nExtended Bolus: [Step=%2$s, Duration=%3$smin-%4$sh]\nBasal: Step=%5$s\nTBR: %6$s (by %7$s), Duration=%8$smin-%9$sh\n%10$s + * Ranged basal/bolus values are not supported by Virtual Pump. Autobackfill BG Irish Wizard Settings diff --git a/app/src/main/res/xml/pref_virtualpump.xml b/app/src/main/res/xml/pref_virtualpump.xml index 23d39114b4..367fa59531 100644 --- a/app/src/main/res/xml/pref_virtualpump.xml +++ b/app/src/main/res/xml/pref_virtualpump.xml @@ -8,6 +8,14 @@ android:defaultValue="false" android:key="virtualpump_uploadstatus" android:title="@string/virtualpump_uploadstatus_title" /> + + + \ No newline at end of file diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/PumpCommon/utils/PumpUtilUTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/PumpCommon/utils/PumpUtilUTest.java new file mode 100644 index 0000000000..86b030b801 --- /dev/null +++ b/app/src/test/java/info/nightscout/androidaps/plugins/PumpCommon/utils/PumpUtilUTest.java @@ -0,0 +1,45 @@ +package info.nightscout.androidaps.plugins.PumpCommon.utils; + +import org.junit.Assert; +import org.junit.Test; + +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; + +import static org.junit.Assert.*; + +/** + * Created by andy on 5/13/18. + */ +public class PumpUtilUTest { + + @Test + public void setPumpDescription() throws Exception { + + PumpDescription pumpDescription = new PumpDescription(); + + PumpUtil.setPumpDescription(pumpDescription, PumpType.AccuChekCombo); + + Assert.assertEquals(pumpDescription.bolusStep, PumpType.AccuChekCombo.getBolusSize(), 0.1d); + Assert.assertEquals(pumpDescription.basalMinimumRate, PumpType.AccuChekCombo.getBaseBasalStep(), 0.1d); + Assert.assertEquals(pumpDescription.basalStep, PumpType.AccuChekCombo.getBaseBasalStep(), 0.1d); + Assert.assertEquals(pumpDescription.extendedBolusDurationStep, PumpType.AccuChekCombo.getExtendedBolusSettings().getDurationStep(), 0.1d); + Assert.assertEquals(pumpDescription.extendedBolusMaxDuration, PumpType.AccuChekCombo.getExtendedBolusSettings().getMaxDuration(), 0.1d); + Assert.assertEquals(pumpDescription.extendedBolusStep, PumpType.AccuChekCombo.getExtendedBolusSettings().getStep(), 0.1d); + Assert.assertEquals(pumpDescription.isExtendedBolusCapable, PumpType.AccuChekCombo.getPumpCapability().hasCapability(PumpCapability.ExtendedBolus)); + Assert.assertEquals(pumpDescription.isBolusCapable, PumpType.AccuChekCombo.getPumpCapability().hasCapability(PumpCapability.Bolus)); + Assert.assertEquals(pumpDescription.isRefillingCapable, PumpType.AccuChekCombo.getPumpCapability().hasCapability(PumpCapability.Refill)); + Assert.assertEquals(pumpDescription.isSetBasalProfileCapable, PumpType.AccuChekCombo.getPumpCapability().hasCapability(PumpCapability.BasalProfileSet)); + Assert.assertEquals(pumpDescription.isTempBasalCapable, PumpType.AccuChekCombo.getPumpCapability().hasCapability(PumpCapability.TempBasal)); + Assert.assertEquals(pumpDescription.maxTempPercent, PumpType.AccuChekCombo.getTbrSettings().getMaxDose(), 0.1d); + Assert.assertEquals(pumpDescription.tempPercentStep, PumpType.AccuChekCombo.getTbrSettings().getStep(), 0.1d); + Assert.assertEquals(pumpDescription.tempBasalStyle, PumpType.AccuChekCombo.getPumpTempBasalType()== PumpTempBasalType.Percent ? PumpDescription.PERCENT : PumpDescription.ABSOLUTE); + Assert.assertEquals(pumpDescription.tempDurationStep, PumpType.AccuChekCombo.getTbrSettings().getDurationStep()); + Assert.assertEquals(pumpDescription.tempDurationStep15mAllowed, PumpType.AccuChekCombo.getSpecialBasalDurations().hasCapability(PumpCapability.BasalRate_Duration15minAllowed)); + Assert.assertEquals(pumpDescription.tempDurationStep30mAllowed, PumpType.AccuChekCombo.getSpecialBasalDurations().hasCapability(PumpCapability.BasalRate_Duration30minAllowed)); + + } + +} \ No newline at end of file diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPluginUTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPluginUTest.java new file mode 100644 index 0000000000..76cc54de94 --- /dev/null +++ b/app/src/test/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPluginUTest.java @@ -0,0 +1,76 @@ +package info.nightscout.androidaps.plugins.PumpVirtual; + +import android.content.Context; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +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.R; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpType; +import info.nightscout.utils.SP; +import info.nightscout.utils.ToastUtils; + +import static org.powermock.api.mockito.PowerMockito.when; + +/** + * Created by andy on 5/13/18. + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({MainApp.class, ConfigBuilderPlugin.class, ToastUtils.class, Context.class, SP.class}) +public class VirtualPumpPluginUTest { + + + VirtualPumpPlugin virtualPumpPlugin; + + + + @Before + public void prepareMocks() throws Exception { + AAPSMocker.mockMainApp(); + AAPSMocker.mockConfigBuilder(); + AAPSMocker.mockBus(); + AAPSMocker.mockStrings(); + AAPSMocker.mockCommandQueue(); + AAPSMocker.mockSP(); + + virtualPumpPlugin = VirtualPumpPlugin.getPlugin(); + } + + + @Test + public void getPumpType() { + } + + @Test + public void refreshConfiguration() { + + when(SP.getString(R.string.key_virtualpump_type, "Generic AAPS")).thenReturn("Accu-Chek Combo"); + + virtualPumpPlugin.refreshConfiguration(); + + Assert.assertEquals(PumpType.AccuChekCombo, virtualPumpPlugin.getPumpType()); + } + + + @Test + public void refreshConfigurationTwice() { + + when(SP.getString(R.string.key_virtualpump_type, "Generic AAPS")).thenReturn("Accu-Chek Combo"); + + virtualPumpPlugin.refreshConfiguration(); + + when(SP.getString(R.string.key_virtualpump_type, "Generic AAPS")).thenReturn("Accu-Chek Combo"); + + virtualPumpPlugin.refreshConfiguration(); + + Assert.assertEquals(PumpType.AccuChekCombo, virtualPumpPlugin.getPumpType()); + } + +} \ No newline at end of file