From 07495ccfdd55858cca7ead768f79877c01085971 Mon Sep 17 00:00:00 2001 From: Andy Rozman Date: Tue, 28 Aug 2018 16:57:14 +0100 Subject: [PATCH 01/41] - added bolus and basal amount rounding (rounding to pump specification) --- .../plugins/PumpCommon/utils/PumpUtil.java | 56 +++++++++++++++++++ .../PumpVirtual/VirtualPumpPlugin.java | 37 ++++++++++++ 2 files changed, 93 insertions(+) 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 index a14453dba1..48a24a0222 100644 --- 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 @@ -1,6 +1,7 @@ package info.nightscout.androidaps.plugins.PumpCommon.utils; import info.nightscout.androidaps.interfaces.PumpDescription; +import info.nightscout.androidaps.plugins.PumpCommon.defs.DoseStepSize; import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpCapability; import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpTempBasalType; import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpType; @@ -12,6 +13,61 @@ import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpType; public class PumpUtil { + public static double determineCorrectBolusSize(double bolusAmount, PumpType pumpType) + { + if (bolusAmount == 0.0d || pumpType==null) + { + return bolusAmount; + } + + double bolusStepSize; + + if (pumpType.getSpecialBolusSize()==null) + { + bolusStepSize = pumpType.getBolusSize(); + } + else + { + DoseStepSize specialBolusSize = pumpType.getSpecialBolusSize(); + + bolusStepSize = specialBolusSize.getStepSizeForAmount((float)bolusAmount); + } + + return Math.round(bolusAmount/bolusStepSize) * bolusStepSize; + + } + + + public static double determineCorrectBasalSize(Double basalAmount, PumpType pumpType) + { + if ( basalAmount == null || basalAmount == 0.0d || pumpType==null) + { + return basalAmount; + } + + double basalStepSize; + + if (pumpType.getBaseBasalSpecialSteps()==null) + { + basalStepSize = pumpType.getBaseBasalStep(); + } + else + { + DoseStepSize specialBolusSize = pumpType.getBaseBasalSpecialSteps(); + + basalStepSize = specialBolusSize.getStepSizeForAmount(basalAmount.floatValue()); + } + + if (basalAmount> pumpType.getBaseBasalMaxValue()) + basalAmount = pumpType.getBaseBasalMaxValue().doubleValue(); + + + return Math.round(basalAmount/basalStepSize) * basalStepSize; + + } + + + public static void setPumpDescription(PumpDescription pumpDescription, PumpType pumpType) { // reset 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 f59d83b00e..7b5c896a72 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 @@ -47,6 +47,7 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { private static VirtualPumpPlugin plugin = null; public static VirtualPumpPlugin getPlugin() { + loadFakingStatus(); if (plugin == null) plugin = new VirtualPumpPlugin(); @@ -66,19 +67,23 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { 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) .fragmentClass(VirtualPumpFragment.class.getName()) @@ -120,6 +125,7 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { @Override protected void onStart() { + super.onStart(); MainApp.bus().register(this); refreshConfiguration(); @@ -127,17 +133,20 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { @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; } @@ -150,40 +159,48 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { @Override public boolean isInitialized() { + return true; } @Override public boolean isSuspended() { + return false; } @Override public boolean isBusy() { + return false; } @Override public boolean isConnected() { + return true; } @Override public boolean isConnecting() { + return false; } @Override public boolean isHandshakeInProgress() { + return false; } @Override public void finishHandshaking() { + } @Override public void connect(String reason) { + if (!Config.NSCLIENT) NSUpload.uploadDeviceStatus(); lastDataTime = System.currentTimeMillis(); @@ -191,19 +208,23 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { @Override public void disconnect(String reason) { + } @Override public void stopConnecting() { + } @Override public void getPumpStatus() { + lastDataTime = System.currentTimeMillis(); } @Override public PumpEnactResult setNewBasalProfile(Profile profile) { + lastDataTime = System.currentTimeMillis(); // Do nothing here. we are using MainApp.getConfigBuilder().getActiveProfile().getProfile(); PumpEnactResult result = new PumpEnactResult(); @@ -215,16 +236,19 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { @Override public boolean isThisProfileSet(Profile profile) { + return true; } @Override public long lastDataTime() { + return lastDataTime; } @Override public double getBaseBasalRate() { + Profile profile = ProfileFunctions.getInstance().getProfile(); if (profile != null) return profile.getBasal(); @@ -232,8 +256,18 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { return 0d; } + + + + @Override public PumpEnactResult deliverTreatment(DetailedBolusInfo detailedBolusInfo) { + + if (this.pumpType!=null) + { + detailedBolusInfo.insulin = PumpUtil.determineCorrectBolusSize(detailedBolusInfo.insulin, this.pumpType); + } + PumpEnactResult result = new PumpEnactResult(); result.success = true; result.bolusDelivered = detailedBolusInfo.insulin; @@ -272,6 +306,9 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { @Override public PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes, Profile profile, boolean enforceNew) { + + absoluteRate = PumpUtil.determineCorrectBasalSize(absoluteRate, this.pumpType); + TemporaryBasal tempBasal = new TemporaryBasal() .date(System.currentTimeMillis()) .absolute(absoluteRate) From 124f3d8ac1e40504697a20a9b1cafcaaac2b4d3e Mon Sep 17 00:00:00 2001 From: Andy Rozman Date: Tue, 28 Aug 2018 22:41:31 +0100 Subject: [PATCH 02/41] - small bug in determineCorrectBasalSize --- .../androidaps/plugins/PumpCommon/utils/PumpUtil.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 index 48a24a0222..4e8076751b 100644 --- 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 @@ -58,8 +58,8 @@ public class PumpUtil { basalStepSize = specialBolusSize.getStepSizeForAmount(basalAmount.floatValue()); } - if (basalAmount> pumpType.getBaseBasalMaxValue()) - basalAmount = pumpType.getBaseBasalMaxValue().doubleValue(); + if (basalAmount> pumpType.getTbrSettings().getMaxDose()) + basalAmount = pumpType.getTbrSettings().getMaxDose().doubleValue(); return Math.round(basalAmount/basalStepSize) * basalStepSize; From c1677289353d260e1d9240c8f396f768202d2842 Mon Sep 17 00:00:00 2001 From: Andy Rozman Date: Tue, 28 Aug 2018 22:56:12 +0100 Subject: [PATCH 03/41] - changed build name --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 5dbea71e3a..a290e2f6e6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -63,7 +63,7 @@ android { targetSdkVersion 25 multiDexEnabled true versionCode 1500 - version "2.0f-dev" + version "2.0f-dev-andy" buildConfigField "String", "VERSION", '"' + version + '"' buildConfigField "String", "BUILDVERSION", '"' + generateGitBuild() + '-' + generateDate() + '"' buildConfigField "String", "HEAD", '"' + generateGitBuild() + '"' From c3e1dff3455249457adce756dea02989c5582178 Mon Sep 17 00:00:00 2001 From: Roumen Georgiev Date: Thu, 30 Aug 2018 12:08:45 +0300 Subject: [PATCH 04/41] also don't show UserOptions for pumps with code 3 until debugged --- .../nightscout/androidaps/plugins/PumpDanaR/DanaRFragment.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 bd077bea4c..83e27806d1 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 @@ -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); } } From 7869ee987e0faf8fa52889f826d29059f69bef75 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 30 Aug 2018 12:49:15 +0200 Subject: [PATCH 05/41] New Crowdin translations (#1376) --- app/src/main/res/values-bg/strings.xml | 40 +- app/src/main/res/values-cs/strings.xml | 8 +- app/src/main/res/values-de/strings.xml | 7 +- app/src/main/res/values-es/strings.xml | 2 - app/src/main/res/values-ko/strings.xml | 2 - app/src/main/res/values-nl/strings.xml | 2 - app/src/main/res/values-pt/strings.xml | 790 +++++++++++++++++++++++++ app/src/main/res/values-ro/strings.xml | 2 - app/src/main/res/values-ru/strings.xml | 2 - app/src/main/res/values-sk/strings.xml | 2 - app/src/main/res/values-sv/strings.xml | 2 - app/src/main/res/values-zh/strings.xml | 2 - 12 files changed, 839 insertions(+), 22 deletions(-) diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 3aab3e100b..4027711b66 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -21,10 +21,13 @@ Действие на инсулините Humalog и NovoRapid / NovoLog Действие на инсулин Fiasp Позволява да зададете сами пика на инсулиновата активност (не използвайте, ако сте нови потребители) + Включва или изключва затворения кръг (loop). Синхронизира локалните данни с Nightscout Алгоритъма, какъвто е бил през 2016 Алгоритъма, какъвто е бил през 2017 Най-новият алгоритъм (само за напреднали потребители) + Показва текущото състояние на вашия APS и бутони за най-често използваните действия + Показва известие с резюме на това, което прави вашия APS Работа с профил, който е наличен само на този телефон (локален). Работа с профила, които сте дефинирали в Nightscout Работа с профил със само една стойност за всички часове. @@ -47,6 +50,7 @@ Получава данни за КЗ от xDrip. Записва всички процедури, които са били направени Наблюдавайте и контролирайте AndroidAPS, от вашия WearOS часовник. + Покажи информация за вашия APS на xDrip + циферблат на часовник. Дистанционно управление AndroidAPS чрез използване на SMS команди. Стартирай Провери @@ -125,6 +129,8 @@ Кои ограничения да се прилагат? дни Ограничения + Кръг - Loop + Режим на APS - Loop Използвайте това, за да активирате loop интеграцията в \'AndroidAPS. Алгоритъм за APS След ограничения @@ -157,6 +163,8 @@ От къде трябва да AndroidAPS да си взима данни? xDrip APS режим + Затворен кръг + Отворен кръг Loop изключен Изключи Loop Включи Loop @@ -307,7 +315,13 @@ Ще достави %.2fЕ Настройка на визуализацията и наблюдението, а също и анализиране на базалните нужди и коефициенти Потвърждаване, че КЗ е достъпна в Найтскаут и данните за помпата се качват там + Стартиране в режим Отворен кръг (Open loop) + Работа в режим \"Отворен кръг\" за няколко дни и ръчно въвеждане на много временни базали. Настройте и използвайте временни и стандартни временни цели (напр. за активни или хипо-третирани въглехидрати) + Опитайте се да разбирате по-добре вашият APS в режим \"Отворен кръг\", включително препоръчваните временни базали Определяне на макс. лимит на базалния инсулин и настройване в помпата и програмата + Стартиране на \"Затворен кръг\" с изключване на базал при ниска КЗ + Стартиране на \"Затворен кръг\" с макс. IOB=0 без твърде много събития тип ниска КЗ + Настройване на \"Затворен кръг\" чрез повишаване на максималният IOB над 0 и понижаване на целевите нива на КЗ Прекарайте няколко дни по този начин, като поне една нощ нямате аларма за ниска КЗ. Настройване на базалния инсулин и коефициенти ако е необходимо и активиране на auto-sens Една седмица успешно дневно използване с редовно въвеждане на въглехидрати @@ -316,11 +330,16 @@ Вие трябва да прочетете wiki и увеличите maxIOB за да може SMB да работи добре! Добро начало е maxIOB = средния болус за хранене + 3 x най-големия базал от профила Достигнахте лимита Няма избран профил + APS е деактивиран + APS е активиран + APS е изключен + APS е включен %1$.2f ограничен до %2$.2f Стойността %s е извън границите Отдалечено прилагане на базал е забранено Отдалеченото управление е забранено За да стартирате базал от %1$.2fЕ отговорете с код %2$s + За да спрете APS за %1$d минути отговорете с код %2$s Временен базал от %1$.2fЕ/ч за %2$d мин стартиран успешно Неуспешно стартиране на временен базал За да спрете времен базал отговорете с код %s @@ -439,7 +458,7 @@ Да променя ли autosens и целевата КЗ По подразбиране: разрешено\nТова позволява на autosens да променя и целевите КЗ(освен чувствителност и базал). По подразбиране: 2\nBolus snooze се активира след като поставите болус за основно хранене, така Loop няма да пуснка/намаля базалите веднага след като сте се хранили. Примерът тук е с 2; така при 3 часа DIA това ще означава че bolus snooze ще бъде внимателно изместен 1.5 часа (3DIA/2). - По подразбиране: 3.0\nТова е настройка на количеството на покачване на КЗ при усвояване на въглехидратите за всеки 5 минути. По подразбиране 3мг/дл/5мин. Това се отразява на това колко бързо се усвояват COB според алгоритъма, и как това се отразява в предвиждането на КЗ, когато тя не се покачва или пада с различен темп от очакваното. + Стойност по подразбиране: 3.0 (АМА) или 8.0 (SMB). Това е настройка на количеството на покачване на КЗ при усвояване на въглехидратите за всеки 5 минути. По подразбиране 3мг/дл за 5мин. Това се отразява на това колко бързо се усвояват COB според алгоритъма, и как това се отразява в предвиждането на КЗ, когато тя не се покачва или пада с различен темп от очакваното. Внимание! Обикновено Вие не трябва да променяте тези стойности. Моля НАТИСНЕТЕ ТУК, прочетете текста и бъдете сигурни, че го РАЗБИРАТЕ преди да направите каквито и да е промени! Позволени са само числа Позволени са числа между %1$s - %2$s @@ -503,6 +522,10 @@ Loop изключен Изключен (%1$d мин) Суперболус (%1$d мин) + Изключи APS за 1ч + Изключи APS за 2ч + Изключи APS за 3ч + Изключи APS за 10 ч Изключи помпата за 15 мин. Изключи помпата за 30 мин. Изключи помпата за 1 ч @@ -510,6 +533,8 @@ Изключи помпата за 3 ч Възстанови Грешна продължителност + APS забранен + APS възобновен Δ за 15мин СОВ Суперболус @@ -700,8 +725,10 @@ Само отрицателни Калкулиране на COB Калкулиране на временни цели + APS разрешен Избран APS NSClient има права за запис + APS - Затворен кръг е позволен Максимален IOB е зададен правилно Има данни за КЗ от избрания източник Няма базални стойности за някои часове: %s @@ -835,6 +862,7 @@ Базали Няма избрано действие, нищо няма да се изпълни Старт на вр. цел при хипо + Използвате dev версия. Затворения кръг е недостъпен за Вас. Режим за раработчици (Engineering mode) включен Режим за раработчици (Engineering mode) не е активиран и не е release версия %.2f Е/ч @@ -857,6 +885,7 @@ ЦЕЛ %1$d не е завършена Помпата не поддържа временен базал Няма валиден базал в помпата + Затворения кръг е забранен в настройките Аутосенс е забранен в настройките SMB е забранен в настройките Ограничаване на макс. базална стойност до %1$.2f Е/ч поради %2$s @@ -878,6 +907,7 @@ Запис смяна на сет Запис смяна на резервоар SMB \"винаги включен\" и \"след въглехидрати\" е забранен, защото е активен източник на КЗ, който не поддържа необходимата филтрация + SMB не е позволен в режим Отворен кръг Храна нулиране Изчаква синхронизация на времето (%1$d сек) @@ -898,7 +928,7 @@ Съветник за настройване КРАЙ Избиране на език - Поискано: %1$.2fU Доставено: %2$.2fU Error code: %3$d + Стартирано: %1$.2fЕ Доставено: %2$.2fЕ Код на грешка: %3$s Стойност на първия бърз бутон [e] Стойност на втория бърз бутон [e] Стойност на третия бърз бутон [e] @@ -985,6 +1015,7 @@ Невалидни настройки на помпата, проверете wiki и се уверете че меню Quick Info се казва QUICK INFO, с помощта на 360 софтуера. По избор Голяма времева разлика + Голяма времева разлика: Помпата е изключена за повече от 1,5 часа. Моля, регулирайте ръчно времето на помпата и се уверете, че четенето на историята от помпата не води до неочаквано поведение. Ако е възможно, премахнете историята от помпата, преди да промените времето или да изключите затворения кръг за едно DIA след последното погрешно влизане в историята, но поне едно DIA отсега. AndroidAPS стартира Открити са предишни настройки Внимание: Ако активирате и свържете с хардуерна помпа, AndroidAPS ще копира основните настройки от профила в помпата, като презапише съществуващата базова скорост, съхранявана на помпата. Уверете се, че имате правилните основни настройки в AndroidAPS. Ако не сте сигурни или не искате да презапишете основните настройки на помпата, натиснете Cancel и повторете превключването към помпата по-късно. @@ -1012,6 +1043,11 @@ Общо Калк Сдвояване + Изпрати последните лог файлове на разработчиците. Непредвидена ситуация. + Превишавате макс болус + Грешка при команда + Скорост грешка + Нарушение на макс дневен инсулин %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 5ed032bc28..c829c9f150 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -458,7 +458,7 @@ Úprava cílové glykémie pomocí Autosens Výchozí hodnota: zapnuto\nToto nastavení říká, že autosens může měnit také cílové hodnoty glykémií. 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). - 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. + 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. 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. Povoleny pouze číslice. Povoleny pouze čísla v rozsahu %1$s - %2$s. @@ -928,7 +928,7 @@ Průvodce nastavením Dokončit Vyberte jazyk - Požadováno: %1$.2fU Doručeno: %2$.2fU Chyba: %3$d + Požadováno: %1$.2fU Doručeno: %2$.2fU Chyba: %3$s První přídavek inzulínu Druhý přídavek inzulínu Třetí přídavek inzulínu @@ -1043,6 +1043,10 @@ Kalk Navazování spojení Odešlete dnešní soubory protokolů vývojářům spolu s tímto časem. Neočekávaná situace. + Překročen maximální bolus + Chyba příkazu + Chyba rychlosti + Překročen limit inzulínu %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 31d7a9f82b..bebb7b7e34 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -459,7 +459,7 @@ maxIOB = durchschnittlicher Essensbolus + 3 x maximale Basalrate Autosense passt Zielwerte an Vorgabe: erlaubt.\nErlaubt Autosense den Ziel-BZ-Bereich in Verbindung mit ISF und Basal anzupassen. 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). - 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. + 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. 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. Bitte verwende nur Ziffern. Bitte verwende nur Ziffern von %1$s - %2$s. @@ -929,7 +929,7 @@ maxIOB = durchschnittlicher Essensbolus + 3 x maximale Basalrate Einrichtungsassistent FERTIG Wähle Deine Sprache. - Angefragt: %1$.2f IE. Abgegeben: %2$.2f IE. Fehlercode: %3$d + Angefragt: %1$.2f IE. Abgegeben: %2$.2f IE. Fehlercode: %3$s Erste Insulin-Erhöhung Zweite Insulin-Erhöhung Dritte Insulin-Erhöhung @@ -1027,6 +1027,7 @@ maxIOB = durchschnittlicher Essensbolus + 3 x maximale Basalrate Logs als E-Mail versenden Logs löschen 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. + eCarbs: %1$d g (%2$d h), Verzögerung: %3$d m Keine Autosens-Daten verfügbar Log-Einstellungen Auf Standardwerte zurücksetzen @@ -1034,6 +1035,8 @@ maxIOB = durchschnittlicher Essensbolus + 3 x maximale Basalrate AS Version %1$s ist verfügbar. Zeit Verschiebung + Bevorzugter APS-Modus + Gesamt %1$d Tag %1$d Tage diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 601e6e448f..90053a8c4b 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -458,7 +458,6 @@ Autosens también ajusta los objetivos Ajuste por defecto: true\nEsto se usa para permitir a autosens el ajuste de objetivos BG además de ISF y bases. 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). - 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. 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. Sólo se permiten caracteres numéricos. Sólo se permiten dígitos en el rango %1$s - %2$s @@ -928,7 +927,6 @@ Asistente de configuración FINALIZAR Selecciona tu idioma - Solicitado: %1$.2fU Entregado: %2$.2fU Código de error: %3$d Primer incremento insulina Segundo incremento insulina Tercer incremento insulina diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index fcfc48bb2b..03aa8f74e4 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -460,7 +460,6 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM Autosens가 목표도 조절합니다. 기본값: 활성\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)안에 해당하는 숫자만 입력가능합니다. @@ -930,7 +929,6 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM 설정 마법사 완료 언어를 선택하세요 - 요청: %1$.2fU 전송: %2$.2fU 에러코드: %3$d 1차 인슐린 증분 2차 인슐린 증분 3차 인슐린 증분 diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 230b5d5d63..4f4657d6a7 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -459,7 +459,6 @@ Stel in en gebruik tijdelijk en standaard tijdelijke streefdoelen (bv. bij sport Autosens past de streefwaardes ook aan Standaardwaarde: waar Dit wordt gebruikt om autosens de bevoegdheid te geven BG doelen aan te passen alsook ISF en basalen 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). - 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. 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. Alleen numerieke waarden toegelaten. Alleen numerieke waarden binnen het bereik %1$s - %2$s toegelaten. @@ -929,7 +928,6 @@ Stel in en gebruik tijdelijk en standaard tijdelijke streefdoelen (bv. bij sport Setup Wizard FINISH Selecteer uw taal - Gevraagd: %1$.2fU Afgegeven: %2$.2fU Storings code: %3$d Eerste insuline increment Tweede insuline increment Derde insuline increment diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index e65e8ec454..b22db94e3e 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -21,6 +21,7 @@ Predefinição de Insulina Humalog e NovoRapid / NovoLog Predefinição de Insulina Fiasp Permite definir o pico de atividade da insulina e deve ser usado somente por usuários avançados + Ativar ou desativar a aplicação que desencadeia o loop. Sincroniza os seus dados com o Nightscout Estado do algoritmo em 2016 Estado do algoritmo em 2017 @@ -30,6 +31,18 @@ Definir um perfil que está disponível offline. Fornece o perfil definido no Nightscout Definir um perfil com apenas um bloco de tempo. + Integração para bombas Accu-Chek Combo, requer ter o ruffy instalado + Integração para bombas DANA Diabecare R + Integração para bombas DANA Diabecare R Coreanas + Integração para as bombas DANA Diabecare R com firmware atualizado + Integração para bombas DANA Diabecare RS + Integração para bombas Accu-Chek Insight, requer ter o SightRemote instalado + Integração para as pessoas que fazem múltiplas injeções diárias para a sua terapia de diabetes + Integração para as bombas que não têm qualquer driver ainda (Open Loop) + 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. + 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. + 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. + 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. Receber valores de Glucose da aplicação Dexcom G5 modificada. Receber valores Glucose do Glimp. Receber valores de Glucose do 600SeriesAndroidUploader. @@ -43,6 +56,7 @@ Verificar Unidades DIA + IC ISF Basal Alvo @@ -50,6 +64,55 @@ Insulina: Hidratos de Carbono: IOB: + IOB: + Actividade: + IOB Total: + Actividade Total IOB: + Dur: + Rácio: + Ins: + IOB: + IOB Total: + Insulina + Hidratos + GLIC + TT + Hidratos + Corr + U + Bólus IOB + Executar agora + BOMBA VIRTUAL + Taxa Basal de base + Basal temp + Bólus estendido + Bateria + Reservatório + OK + Última execução + Parâmetros de entrada + Status de Glicose + Temp actual + Dados de IOB + Perfil + Dados de refeição + Resultado + Sem dados de glucose disponíveis + Nenhuma alteração solicitada + Pedido + Rácio + Duração + Motivo + Glucose + Delta + Delta: + Configurador + Objetivos + OpenAPS MA + Visão geral + Perfil NS + Perfil simples + Basal Temporária Tratamentos Bomba virtual Careportal @@ -72,6 +135,7 @@ APS Depois das restrições processadas Basal temporária definida pela bomba + Ultima execução OK Cancelar NÃO EXISTE NENHUM APS SELECIONADO OU RESULTADO FORNECIDO @@ -100,5 +164,731 @@ xDrip Modo APS Closed Loop + Open Loop + Loop Desactivado + Desactivar Loop + Activar Loop + Disponível nova sugestão + Versão não suportada do NSClient + Versão sem suporte do Nightscout + NSCliente em falta. Perdido registo! + Glic disponível no NS + Status da Bomba está disponível no NS + Execução manual + LOOP DESATIVADO POR RESTRIÇÕES + Basal IOB + Restrição de bólus aplicada + Restrição de hidratos de carbono aplicada + Verificar Glic + Anúncio + Nota + Pergunta + Exercício + Alteração do local do cateter + Colocação do Sensor CGM + Início do Sensor CGM + Mudança de Cartucho de Insulina + Troca de Perfil + Bólus Lanche + Bólus Refeição + Bólus Correcção + Bólus Combo + Início Temp Basal + Fim Temp Basal + Correcção Hidratos + OpenAPS Offline + Tipo de evento + Outro + Medidor + Sensor + Hidratos de Carbono + Insulina + Tempo Hidratos + Dividir + Duração + Percentagem + Absoluto + Notas + Tempo do evento + Perfil + Introduzido por + Tipo de glicose + Sem perfil carregado do NS + BasalTemp + Bólus estendido + Versão Nightscout: + Em falta Preferências exportadas + Exportar configurações para + Importar configurações de + Configurações importadas + Ficheiro não encontrado + Exportar configurações + Importar configurações + Max U/hr em que uma Temp Basal pode ser definida + Este valor é chamado max basal no contexto do OpenAPS + Basal Máxima IOB que OpenAPS pode dar [U] + Este valor é denominado Max IOB em contexto OpenAPS \nEste é o valor máximo de insulina em [U] que APS pode dar de uma vez. + Dispensar + DanaR + A ligar + Ligado + Desligado + Definições bomba DanaR + Condições de Utilização + 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. + EU ENTENDO E CONCORDO + Guardar + Nenhum dispositivo bluetooth encontrado + Dispositivo seleccionado não foi encontrado + Erro de conexão da bomba + IOB Bomba + Unidades diárias + Último bólus + %.1fh atrás + Entrada Inválida + Valor não definido corretamente + Recarregar perfil + Ver perfil + Executado + Commentário + Sucesso + Percentagem + Absoluto + Cancelar basal temp + Comunicador SMS + À espera de resultado + Número de telefones permitidos + +XXXXXXXXXX;+YYYYYYYYYY + Para dar bolus %1$.2fU responder com código %2$s + Para enviar calibração %1$.2f responder com código %2$s + Bólus falhado + Bólus %.2fU enviado com êxito + Vai ser enviado %.2fU + Bólus %.2fU enviado com êxito + A enviar %.2fU + Permitir comandos remotos via SMS + Bólus remoto não permitido + Dedo + Sensor + Manual + Alvo temporário + Cancelar alvo temporário + Definições perfil DanaR + DIA [h] + Duração da Insulina Activa + Falha a actualizar perfil da basal + Recarregar + A enviar + E bólus + DS Bólus + DE Bólus + erro + recarregar + hora basal + glicose + hidratos de carbono + alarme + Total de %1$d registos carregados + S bolus + Alarmes + Horas de Basal + Bolus + Hidratos de Carbono + Insulina diária + Erros + Glicose + Reabastecimento + Suspender + A ligar durante %1$d s + Senha da bomba + Senha da bomba incorrecta! + A bomba está ocupada + Entregue + Parado + O bolus parou + A parar o bolus + Oclusão + Parar + STOP PRESSIONADO + À espera da bomba + Vai ser enviado %.2fU + Configuração da visualização e monitoramento, e análise de rácios e basals + Verificar se a BG está disponível no Nightscout, e se os dados de insulina da bomba estão a ser carregados + A iniciar um open loop + 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) + Compreender o seu open loop, incluindo as suas recomendações de basais temporárias + Com base nessa experiência, decidir qual deve ser a basal máxima e configurá-la na bomba e nas preferências + Começaro close loop com Suspensão por Baixa Glicose + Utilizar em close loop com IOB máx = 0 por alguns dias sem muitas situações de Suspensão por Baixa Glicose + Ajustar o close loop, levantar a IOB máxima acima de 0 e reduzir gradualmente os alvos de valor glicémico + Utilizar por alguns dias e pelo menos uma noite sem alarmes de valores glicémicos baixos, antes de baixar os valores + Ajustar as basals e os rácios se necessário e em seguida habilitar o auto-sens + 1 semana de looping durante o dia com sucesso com entrada de hidratos de carbono regular + Ativando recursos adicionais para uso durante o dia, como assistente avançado de refeição + Ativando recursos adicionais para uso durante o dia, como SMB + 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 + Atingiu o limite autorizado + Nenhum perfil seleccionado + Loop foi desactivado + Loop foi activado + Loop desactivado + Loop activado + %1$.2f limitado a %2$.2f + O valor %s está fora dos limites permitidos + A configuração remota de basal não é permitida + O comando remoto não é permitido + Para começar basal %1$.2fU/h responda com código %2$s + Para suspender o loop por %1$d minutos resposta com código %2$s + Basal temporária %1$.2fU/h para %2$d min iniciada com êxito + Início basal temp falhou + Para parar a basal temporaria responda com o código %s + Basal temp cancelada + Não foi possivel cancelar a basal temp + Comando desconhecido ou resposta errada + Assistente Rápido + Definições do Assistente Rápido + Texto do botão: + Hidratos: + Válido: + Adicionar + Editar + Remover + Refeição + Corr + Acções + AndroidAPS iniciado + Envio NS apenas (sincronização desactivada) + 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. + Bomba não inicializada! + Bomba não inicializada, perfil não definido! + Purgar/Preencher + Por favor certifique-se que o valor corresponde ao especificado para o seu conjunto de infusão! + Outro + Purgar/Preencher os valores standard. + Botão 1 + Botão 2 + Botão 3 + Unidades: + mg/dL + mmol/L + DIA: + Intervalo Alvo: + Intervalo para visualização + Marca Alto e Baixo para os gráficos em Sumário e Smartwatch + Marca Baixo + Marca ALTO + Wear + Reenviar Todos os Dados + Abrir Definições em Wear + Erro Bomba + Bateria fraca + Encerrar Bomba + Bateria da Bomba Descarregada + DanaR Coreana + Valor da Basal: + Não foi possivel configurar o perfil de basal + Perfil Basal actualizado na bomba + Desactivar modo EasyUI na bomba + Habilitar bolus estendido na bomba + Mudar de modo U/d para U/h na bomba + Valor da basal abaixo do mínimo. Perfil não definido! + GLIC: + Ultima Gli: + MDI + MM640g + Notificação em curso + DADOS ANTIGOS + %1$d min atrás + %1$dmin atrás + Perfil local + OpenAPS AMA + Delta médio curto + Delta médio longo + Array de %1$d elementos.\nValor actual: + Dados Autosens + Script debug + Utilizar função AMA autosens + Actualizar tratamentos do NS + Apagar tratamentos do futuro + Comer brevemente + Hipo + Actividade + Remover registo: + Estatísticas DanaR + Dose diária acumulativa + Dose diária exponencialmente ponderada + Basal + Bólus + TDD + Data + Rácio + # Dias + Peso + Possivelmente impreciso se foram usados bolus para purgar/preencher! + Dados antigos, pressione \"Recarregar\" + Basal Diária Total + Basal diária * 2 + A inicializar ... + ACÇ + CONF + LOOP + PS + OAPS + PL + DANA + Início + BOMBAV + NSPerfil + TRATA + CP + OBJ + WEAR + SMS + Abreviar títulos dos separadores + Usar sempre delta médio curto em vez de delta simples + Útil quando há ruído nos dados de fontes sem filtro como o xDrip. + Configurações Avançadas + Modelo: %1$02X Protocolo: %2$02X Código: %3$02X + Perfil + 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. + 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. + 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). + 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). + Autosens também ajusta os alvos + 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. + 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. + 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. + 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. + Apenas dígitos numéricos são permitidos. + Apenas são permitidos valores entre %1$s e %2$s. + Este campo não deve estar vazio + Número de telefone não é válido + SMS número de telefone inválido + Calibração + Enviar calibração %.1f para o xDrip? + xDrip+ não está instalado + Calibração enviada para o xDrip + Calibração remota não permitida + Calibração enviada. Recepção têm de estar activada no xDrip. + O xDrip não esta a receber as calibrações + Bomba suspensa + A obter estado bomba + Definindo basal temp + A parar basal temp + Configurando bolus prolongado + Parando bolus prolongado + Atualizar valores das basais + A desligar + A Executar + Definições da bomba virtual + Enviar estado para NS + Senha incorrecta + Senha para definições + Desbloquear configurações + Aproximação do limite diario de insulina + NSCliente + NSCI + URL: + Rolar automático + Reiniciar + NSCliente + Nightscout URL + Introduza o Nightscout URL + NS API secret + NS API secret + Insira NS API secret (min 12 caract.) + Entregar agora + Limpar fila de espera + Mostrar file de espera + Fila de espera: + Estado: + Em pausa + Limpar Registo + Cliente NS sem permissões para alterar dados. Tem a senha API correta? + Definições Wear + Mostrar IOB detalhada + Dividir IOB entre IOB de bolus e de basal na face do relógio + sem efeito - por favor verifique no telemóvel + Indisponível + Idade do Paciente + Criança + Adolescente + Adulto + Adulto resistente insulina + Por favor seleccione a idade do diabético para definir os limites de segurança + Glimp + %s necessita de autorizar a não optimização da bateria para assegurar a performance necessária + Loop suspenso + Suspendido (%1$d m) + Superbólus (%1$d m) + Suspender loop por 1h + Suspender loop por 2h + Suspender loop por 3h + Suspender loop por 10h + Desligar bomba por 15 min + Desligar bomba por 30 min + Desligar bomba por 1 h + Desligar bomba por 2 h + Desligar bomba por 3 h + Retomar + Duração errada + Loop suspenso + Loop retomado + Tendência 15 min + COB + Superbólus + Registar inicio da app no NS + A sair da aplicação para aplicar as configurações. + DanaRv2 + Insulina + Qual o tipo de insulina que está a utilizar? + Insulina de ação rapida + Novorapid, Novolog, Humalog + Fiasp + INS + Activar superbólus no assistente + Habilite a funcionalidade de superbolus no assistente. Não habilite até que aprenda o funcionamento. PODE CAUSAR OVERDOSE DE INSULINA SE USAR INDISCRIMINADAMENTE! + IOB + COB + Firmware + Última ligação + Estado Bluetooth + Acerca + Falta de permissão SMS + Estado xDrip (relógio) + Linha estado xDrip (relógio) + xds + Mostrar BGI + Adicionar BGI à linha de status + Sem envio para NS + Todos os dados enviados para NS são descartados. AAPS está conectado ao NS, mas não é feita nenhuma alteração no NS + Valor da Basal + Incremento de bolus + BólusEstendido + AlvoTemp + Cancelar Bólus Estendido + Idade Sensor + Idade Canula + Idade Insulina + horas + Tipo de Basal + Perfil inválido !!! + TrocaPerfil + Idade bateria bomba + Troca bateria bomba + Opções Alarme + Urgência hiperglicemia + Alto + Baixo + Urgência hipoglicemia + Dados Obsoletos + Dados obsoletos urgentes + Tempo limite para dados obsoletos [min] + Tempo limite para Urgência por dados obsoletos [min] + Intervalo para autosens [h] + Quantidade de horas observadas para a deteção de sensibilidade (o tempo de absorção dos hidratos de carbono é excluído) + Bomba + OpenAPS + Uploader + Detecção sensibilidade + Que algoritmo de sensibilidade deve ser usado? + SENS + Sensibilidade Oref0 + Sensibilidade Oref1 + Sensibilidade AAPS + Configurações de absorção + Tempo máx. absorção refeição [h] + Tempo em horas, espectável para que todos os hidratos de carbono da refeição sejam absorvidos + Visualizar bólus estendido com % + SAGE + IAGE + CAGE + PBAGE + OAPS + UPLD + BAS + EST + Manter ecrã ligado + Impedir Android de desligar o ecrã. Isto irá consumir muita bateria quando não ligado ao carregador. + OK + Cancelar + Nem todos perfis foram carregados! + Valores não guardados! + HIDRATOS & BÓLUS + CGM & OPENAPS + BOMBA + Valor da Basal [U/h] + Duração [min] + OpenAPS SMB + SMB + Activar UAM + Activar SMB + Tempo Pico [min] + Ultra-Rapid Oref + Activar perfil + Data + INVÁLIDO + Emparelhamento OK + Tempo limite emparelhamento + A EMPARELHAR + Nenhum dispositivo encontrado até agora + Reservatório vazio + Alerta medição da glicemia + Nível de insulina restante + DanaRS + Dana + Bomba seleccionada + Emparelhar nova bomba + Velocidade Bólus + Número de série + Percentagem + Alteração Turno + Alvo-Temp padrão + duração comerbreve + alvo comerbreve + duração actividade + alvo actividade + duração hipo + alvo hipo + A obter estado bólus + A obter hora bomba + reutilizar + Controles do Relógio + Definir Alvo-Temp and inserir Tratamentos do relógio. + Ligação expirou + Alimentos + g + m + h + ]]> + kJ + En + Pr + Gor + ]]> + A iniciar administração de bolus + Comando será executado agora + Bomba inacessível + Leituras Glic. perdidas + Alertas local + Alerta caso nenhuma glicemia seja recebida + Alerta caso não seja possivel alcançar a bomba + Alarme Urgente + INFO + Bluetooth + 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. + Enviar dados Glic. para NS + Definições envio G5 + Mostrar Delta detalho + Firmware bomba não suportado + Enviar dados Glic. para xDrip+ + Seleccionar 640g/Eversense como fonte no xDrip+ + Glic NSCliente + Cálculos Glic + Cálculo de Bólus IOB + Cálculo de Basal IOB + Cálculo tendência + Cálculo de superbolus + Sim + Não + Positivo apenas + Negativo apenas + Cálculo COB + Cálculo alvo temporário + Loop activado + APS seleccionado + NSCLiente tem permissão de escrita + Modo fechado ativado + IOB máxima definida correctamente + Glicemia disponivel desde a fonte selecionada + Valores das basais não definidos por horas: %s + Perfil inválido: %s + A programar a bomba para injectar o bolus + Actualizar + Estado + Actividade + Sem conexão há %1$d min + %1$d%% (%2$d min restantes) + A iniciar + Suspenso devido ao erro + Suspenso pelo utilizador + A correr + Cancelar TBR + A definir TBR (%1$d%% / %2$d min) + Injectando (%.1f U) + A actualizar + Operação solicitada não suportada pela bomba + Agora + A ler histórico bomba + histórico bomba + A definir perfil basal + Nível cartucho da bomba está baixo + Bateria da bomba está fraca + Baixo + Vazio + Normal + Necesário actualizar relógio da bomba + Aviso + Não foi possivel establecer comunicação com a bomba. Nenhum bolus foi administrado. + 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. + Erro na entrega Bólus Estendido + Insight + Bomba Insight + Estado + Alterado + BOMBA PARADA + Estado Actualizado + atrás + com + TBR activa + min restante + Diário + Última Acção Terminada + min + total com + Ficar sempre ligada + PARADO + A SINCRONIZAR + OCUPADO + SINCRONIZADO + necessita + Desconhecido + A aguardar por código de confirmação + Codigo rejeitado + Não autorizado + Incompativel + segundo + minuto + hora + dia + semana + s + %1$ds expira %2$s + Estado manter ligado + Estatísticas + Não é recomendado devido ao gasto de bateria + SMB sempre activado + Activar SMB após hidratos + Activar SMB com COB + Activar SMB quando tem COB activo. + Silêncio + Insulina + Hidratos + Botões + Abre xDrip+, botão retorcer volta ao AAPS + CGM + Navegador do histórico + Notificar no SMB + Previsão + Escolha de Dados + Envio Fabric + Iniciar atividade TT + Iniciar Comer em breve TT + TT + Sem bólus, registar apenas + Categoria + Subcategoria + SMB definido pela bomba + Sensibilidade + Basais + Começar TT Hipo + Modo engenheiro activado + %.2f U/h + A ler perfil basal + A actualizar estado bomba + Contagem Bólus + Contagem TBR + SMB desactivado nas configurações + limite bomba + deve ser valor positivo + multiplicador de basal máx + multiplicador de basal máx diária + Basal correctamente definida + valor máx nas preferências + uso não seguro + Erro na leitura de estado + Registar mudança de sítio + Registar mudança cartucho + Alimentos + repor + Bomba parada + Bomba iniciada + Bomba suspensa + Hora + Seguinte + Anterior + Assistente de Configuração + TERMINAR + Selecione o seu Idioma + Primeiro incremento insulina + Segundo incremento insulina + Terceiro incremento insulina + Primeiro incremento hidratos + Segundo incremento hidratos + Terceiro incremento hidratos + CGM + Utilize apenas uma conexão WiFi + WiFi SSID + Apenas quando estiver a carregar + Definições de ligação + SSIDs permitidos (separada por ponto e vírgula) + Permitir ligação em roaming + Rácio máx. autosens + Rácio min. autosens + n/a + Definição da Bomba + Definições do Assistente Rápido + Mostrar Configurações + Configurações gerais + Configurações da bomba + Ler estado + Activar Objectivos + Configure a fonte das glicemias + Iniciar primeiro objectivo + Permissão + Pedir permissão + Pedido + Sair + Opções do utilizador + Formato hora + Alarme + Som + Vibrar + Ambos + Unidades de Glucose + Reservatório baixo (Unidades) + Ligado + Desligado + Terminado, parabéns! + Incompleto + Tempo decorrido + %1$d. Objectivo + Personalizado + Grande diferença Horária + Configurações encontradas + Configurações de manutenção + Email + E-mail Inválido + Nr. de registos a enviar + Manutenção + MANU + Enviar Logs por e-mail + Eliminar registos + Definições de registo + Repor definições por defeito + Disponível %1$s disponível + Fuso horário + Total + Calc + Erro no comando + Erro velocidade + + %1$d dia + %1$d dias + + + %1$d hora + %1$d hora + diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index b2c6c79900..77179f8c6f 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -458,7 +458,6 @@ Autosens ajustează țintele la 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. 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). - 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. 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. Se acceptă numai valori numerice. Se acceptă numai valori numerice între %1$s - %2$s. @@ -928,7 +927,6 @@ Asistent de configurare TERMINARE Alegeți limba - Solicitat: %1$.2fU Livrat: %2$.2fU Cod eroare: %3$d Primul increment de insulină Al doilea increment de insulină Al treilea increment de insulină diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 46d20b4a4b..f913664ecc 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -458,7 +458,6 @@ Autosens тоже подстроит цели значение по умолчанию : верно. используется чтобы разрешить юстировку целевых СК, а также ISF и базала значение по умолчанию :2 bolus snoose активируется после введения болюса на еду чтобы цикл не взаимодействовал с временными низкими СК сразу после еды. так, трехчасовой DIA при величине 2 означает постыпенное затихание bolus snooze после 1.5 часов (3DIA/2) - значение по умолчанию :3 усвоение углеводов за 5 мин. то есть 3 мг/дл/ 5 мин. Влияет на расчет прогнозируемой гликемии, когда СК падает быстрее или не растет так как ожидается. Внимание! Обычно нет необходимости изменять приведенные ниже величины. Нажмите ЗДЕСЬ, ПРОЧТИТЕ и убедитесь что вы ПОНИМАЕТЕ изложенное прежде чем менять какую-либо из этих величин разрешены только цифровые значения разрешены только цифровые значения в диапазоне %1$s - %2$s @@ -928,7 +927,6 @@ Мастер настройки ГОТОВО Выберите Ваш язык - Запрошено: %1$.2f ед. Подано: %2$.2f ед. Код ошибки: %3$d Первый шаг увеличения инсулина Второй шаг увеличения инсулина Третий шаг увеличения инсулина diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index fcf718590d..d22e9e1f49 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -459,7 +459,6 @@ Úprava cieľovej glykémie pomocou automatickej detekcie citlivosti Štandardná hodnota: zapnuté\nToto nastavenie hovorí, že automatická detekcia citlivosti môže meniť tiež cieľové hodnoty glykémií. Š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). - Š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. 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ť. Povolené iba číslice. Povolené iba čísla v rozsahu %1$s - %2$s. @@ -929,7 +928,6 @@ Sprievodca nastavením Dokončiť Vyberte jazyk - Požadované: %1$.2fU Podané: %2$.2fU Chyba: %3$d Prvý prídavok inzulínu Druhý prídavok inzulínu Tretí prídavok inzulínu diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index ffd6b79fba..7b000a1cf9 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -458,7 +458,6 @@ Autosens justerar även mål-BG Standardvärde: sant. Detta för att tillåta autosens justera mål-BG utöver ISF och basaler. 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). - 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. 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. Endast siffror tillåtna. Endast siffror mellan %1$s - %2$s är tillåtna. @@ -928,7 +927,6 @@ Installationsguide Avsluta Välj språk - Angivet: %1$.2f enheter. Levererat: %2$.2f enheter. Felkod: %3$d Första snabbknabben för insulin Andra snabbknabben för insulin Tredje snabbknabben för insulin diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 35c03f56f7..93b944c31e 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -458,7 +458,6 @@ Autosens 也调整目标血糖 缺省值:是\n 这是用来允许 autosens调整血糖目标,还有 ISF胰岛素敏感系数和基础率这些参数。 默认值: 2 \n大剂量snooze是在输注餐时大剂量后开始生效的, 所以在你刚吃完饭的时候, 闭环不会因为你输注了大剂量而减少或停基础。这里的例子和缺省是 2; 因此, 3 小时的DIA(胰岛素持续作用时间) 意味着大剂量snooze将逐步在1. 5小时 (3 DIA/2) 后失效。 - 默认值: 3.0 这是默认的每5分钟碳水化合物吸收效果。默认值为3毫克/dl/5 分钟。这就影响了碳水化合物的衰减速度, 以及在计算预测未来血糖时假设的碳水化合物吸收量, 当血糖的下降超过预期时, 或者不像预期的上升的那么多时。 注意! \n 正常地您不必在下面更改这些值。请点击这里, 阅读说明, 并确保您了解它之前不要更改任何这些值。 只允许数字。 仅允许在范围 %1$s - %2$s 内的数字。 @@ -928,7 +927,6 @@ 设置向导 完成 选择你的语言 - 已请求: %1$.2fU 已输注: %2$.2fU 错误代码: %3$d 第一胰岛素增量 第二胰岛素增量 第三胰岛素增量 From 679b4b26682ffac024f7280e554c1ac0d221e65b Mon Sep 17 00:00:00 2001 From: Andy Rozman Date: Thu, 30 Aug 2018 16:22:25 +0100 Subject: [PATCH 06/41] - added methods to return correct Extended bolus size - using exetended bolus size --- .../plugins/PumpCommon/data/DoseSettings.java | 2 +- .../plugins/PumpCommon/utils/PumpUtil.java | 76 ++++++++++--------- .../PumpVirtual/VirtualPumpPlugin.java | 8 +- 3 files changed, 47 insertions(+), 39 deletions(-) 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 index 36ee4e5845..eb8169c361 100644 --- 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 @@ -23,7 +23,7 @@ public class DoseSettings { public DoseSettings(float step, int durationStep, int maxDuration, float minDose) { - this(step, durationStep, maxDuration, minDose, null); + this(step, durationStep, maxDuration, minDose, Float.MAX_VALUE); } 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 index 4e8076751b..ffabf345fb 100644 --- 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 @@ -1,6 +1,7 @@ package info.nightscout.androidaps.plugins.PumpCommon.utils; import info.nightscout.androidaps.interfaces.PumpDescription; +import info.nightscout.androidaps.plugins.PumpCommon.data.DoseSettings; import info.nightscout.androidaps.plugins.PumpCommon.defs.DoseStepSize; import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpCapability; import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpTempBasalType; @@ -12,64 +13,73 @@ import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpType; public class PumpUtil { - - public static double determineCorrectBolusSize(double bolusAmount, PumpType pumpType) - { - if (bolusAmount == 0.0d || pumpType==null) - { + public static double determineCorrectBolusSize(double bolusAmount, PumpType pumpType) { + if (bolusAmount == 0.0d || pumpType == null) { return bolusAmount; } double bolusStepSize; - if (pumpType.getSpecialBolusSize()==null) - { + if (pumpType.getSpecialBolusSize() == null) { bolusStepSize = pumpType.getBolusSize(); - } - else - { + } else { DoseStepSize specialBolusSize = pumpType.getSpecialBolusSize(); bolusStepSize = specialBolusSize.getStepSizeForAmount((float)bolusAmount); } - return Math.round(bolusAmount/bolusStepSize) * bolusStepSize; + return Math.round(bolusAmount / bolusStepSize) * bolusStepSize; } - public static double determineCorrectBasalSize(Double basalAmount, PumpType pumpType) - { - if ( basalAmount == null || basalAmount == 0.0d || pumpType==null) - { + public static double determineCorrectExtendedBolusSize(double bolusAmount, PumpType pumpType) { + if (bolusAmount == 0.0d || pumpType == null) { + return bolusAmount; + } + + double bolusStepSize; + + if (pumpType.getExtendedBolusSettings() == null) { // this should be never null + return 0.0d; + } + + DoseSettings extendedBolusSettings = pumpType.getExtendedBolusSettings(); + + bolusStepSize = extendedBolusSettings.getStep(); + + if (bolusAmount > extendedBolusSettings.getMaxDose()) { + bolusAmount = extendedBolusSettings.getMaxDose(); + } + + return Math.round(bolusAmount / bolusStepSize) * bolusStepSize; + } + + + public static double determineCorrectBasalSize(Double basalAmount, PumpType pumpType) { + if (basalAmount == null || basalAmount == 0.0d || pumpType == null) { return basalAmount; } double basalStepSize; - if (pumpType.getBaseBasalSpecialSteps()==null) - { + if (pumpType.getBaseBasalSpecialSteps() == null) { basalStepSize = pumpType.getBaseBasalStep(); - } - else - { + } else { DoseStepSize specialBolusSize = pumpType.getBaseBasalSpecialSteps(); basalStepSize = specialBolusSize.getStepSizeForAmount(basalAmount.floatValue()); } - if (basalAmount> pumpType.getTbrSettings().getMaxDose()) + if (basalAmount > pumpType.getTbrSettings().getMaxDose()) basalAmount = pumpType.getTbrSettings().getMaxDose().doubleValue(); - - return Math.round(basalAmount/basalStepSize) * basalStepSize; + return Math.round(basalAmount / basalStepSize) * basalStepSize; } - - public static void setPumpDescription(PumpDescription pumpDescription, PumpType pumpType) - { + public static void setPumpDescription(PumpDescription pumpDescription, PumpType pumpType) { // reset pumpDescription.resetSettings(); @@ -85,14 +95,11 @@ public class PumpUtil { pumpDescription.isTempBasalCapable = pumpCapability.hasCapability(PumpCapability.TempBasal); - if (pumpType.getPumpTempBasalType()==PumpTempBasalType.Percent) - { + if (pumpType.getPumpTempBasalType() == PumpTempBasalType.Percent) { pumpDescription.tempBasalStyle = PumpDescription.PERCENT; pumpDescription.maxTempPercent = pumpType.getTbrSettings().getMaxDose().intValue(); pumpDescription.tempPercentStep = (int)pumpType.getTbrSettings().getStep(); - } - else - { + } else { pumpDescription.tempBasalStyle = PumpDescription.ABSOLUTE; pumpDescription.maxTempAbsolute = pumpType.getTbrSettings().getMaxDose(); pumpDescription.tempAbsoluteStep = pumpType.getTbrSettings().getStep(); @@ -101,8 +108,10 @@ public class PumpUtil { 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.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(); @@ -118,5 +127,4 @@ public class PumpUtil { } - } 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 7b5c896a72..a73c0f1ff3 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 @@ -263,10 +263,7 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { @Override public PumpEnactResult deliverTreatment(DetailedBolusInfo detailedBolusInfo) { - if (this.pumpType!=null) - { - detailedBolusInfo.insulin = PumpUtil.determineCorrectBolusSize(detailedBolusInfo.insulin, this.pumpType); - } + detailedBolusInfo.insulin = PumpUtil.determineCorrectBolusSize(detailedBolusInfo.insulin, this.pumpType); PumpEnactResult result = new PumpEnactResult(); result.success = true; @@ -362,6 +359,9 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { PumpEnactResult result = cancelExtendedBolus(); if (!result.success) return result; + + insulin = PumpUtil.determineCorrectExtendedBolusSize(insulin, this.pumpType); + ExtendedBolus extendedBolus = new ExtendedBolus(); extendedBolus.date = System.currentTimeMillis(); extendedBolus.insulin = insulin; From bbffa703dfcb22852044b60e63569728fac0e068 Mon Sep 17 00:00:00 2001 From: Andy Rozman Date: Thu, 30 Aug 2018 20:54:15 +0100 Subject: [PATCH 07/41] reverting some formater changes --- .../PumpVirtual/VirtualPumpPlugin.java | 83 ++++++------------- 1 file changed, 24 insertions(+), 59 deletions(-) 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 a73c0f1ff3..2197e4f898 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 @@ -42,48 +42,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 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 long lastDataTime = 0; - + private static Logger log = LoggerFactory.getLogger(VirtualPumpPlugin.class); + private static VirtualPumpPlugin plugin = null; private static boolean fromNSAreCommingFakedExtendedBoluses = false; - + PumpType pumpType = null; + private long lastDataTime = 0; 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) .fragmentClass(VirtualPumpFragment.class.getName()) @@ -123,9 +91,28 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { pumpDescription.is30minBasalRatesCapable = true; } + public static VirtualPumpPlugin getPlugin() { + loadFakingStatus(); + if (plugin == null) + plugin = new VirtualPumpPlugin(); + return plugin; + } + + private static void loadFakingStatus() { + fromNSAreCommingFakedExtendedBoluses = SP.getBoolean(R.string.key_fromNSAreCommingFakedExtendedBoluses, false); + } + + public static boolean getFakingStatus() { + return fromNSAreCommingFakedExtendedBoluses; + } + + public static void setFakingStatus(boolean newStatus) { + fromNSAreCommingFakedExtendedBoluses = newStatus; + SP.putBoolean(R.string.key_fromNSAreCommingFakedExtendedBoluses, fromNSAreCommingFakedExtendedBoluses); + } + @Override protected void onStart() { - super.onStart(); MainApp.bus().register(this); refreshConfiguration(); @@ -133,20 +120,17 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { @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; } @@ -159,48 +143,40 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { @Override public boolean isInitialized() { - return true; } @Override public boolean isSuspended() { - return false; } @Override public boolean isBusy() { - return false; } @Override public boolean isConnected() { - return true; } @Override public boolean isConnecting() { - return false; } @Override public boolean isHandshakeInProgress() { - return false; } @Override public void finishHandshaking() { - } @Override public void connect(String reason) { - if (!Config.NSCLIENT) NSUpload.uploadDeviceStatus(); lastDataTime = System.currentTimeMillis(); @@ -208,23 +184,19 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { @Override public void disconnect(String reason) { - } @Override public void stopConnecting() { - } @Override public void getPumpStatus() { - lastDataTime = System.currentTimeMillis(); } @Override public PumpEnactResult setNewBasalProfile(Profile profile) { - lastDataTime = System.currentTimeMillis(); // Do nothing here. we are using MainApp.getConfigBuilder().getActiveProfile().getProfile(); PumpEnactResult result = new PumpEnactResult(); @@ -236,19 +208,16 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { @Override public boolean isThisProfileSet(Profile profile) { - return true; } @Override public long lastDataTime() { - return lastDataTime; } @Override public double getBaseBasalRate() { - Profile profile = ProfileFunctions.getInstance().getProfile(); if (profile != null) return profile.getBasal(); @@ -257,9 +226,6 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { } - - - @Override public PumpEnactResult deliverTreatment(DetailedBolusInfo detailedBolusInfo) { @@ -298,7 +264,6 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { @Override public void stopBolusDelivering() { - } @Override From d205492a7b786bc0bcb0b3c96a2a4914decace1a Mon Sep 17 00:00:00 2001 From: Andy Rozman Date: Thu, 30 Aug 2018 21:26:29 +0100 Subject: [PATCH 08/41] reverting changed name --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index a290e2f6e6..5dbea71e3a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -63,7 +63,7 @@ android { targetSdkVersion 25 multiDexEnabled true versionCode 1500 - version "2.0f-dev-andy" + version "2.0f-dev" buildConfigField "String", "VERSION", '"' + version + '"' buildConfigField "String", "BUILDVERSION", '"' + generateGitBuild() + '-' + generateDate() + '"' buildConfigField "String", "HEAD", '"' + generateGitBuild() + '"' From e2182528fdb91402a21442861c844937987b68b9 Mon Sep 17 00:00:00 2001 From: Andy Rozman Date: Thu, 30 Aug 2018 22:03:09 +0100 Subject: [PATCH 09/41] - changed calls of PumpUtil.setPumpDescription to use enums directly --- .../nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java | 2 +- .../androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java | 2 +- .../nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java | 2 +- .../androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java | 2 +- .../androidaps/plugins/PumpInsight/InsightPlugin.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) 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 d8a90c2e9b..4a2b5b0552 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 @@ -136,7 +136,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")); + PumpUtil.setPumpDescription(pumpDescription, PumpType.AccuChekCombo); } public ComboPump getPump() { 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 1ff5fb472c..b719c9a43a 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 @@ -51,7 +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); - PumpUtil.setPumpDescription(pumpDescription, PumpType.getByDescription("DanaR Korean")); + PumpUtil.setPumpDescription(pumpDescription, PumpType.DanaRKorean); } @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 d671a3f784..d4bcb9bf5d 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 @@ -90,7 +90,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte .description(R.string.description_pump_dana_rs) ); - PumpUtil.setPumpDescription(pumpDescription, PumpType.getByDescription("DanaRS")); + PumpUtil.setPumpDescription(pumpDescription, PumpType.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 179e85293f..f6d633a338 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 @@ -51,7 +51,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin { pluginDescription.description(R.string.description_pump_dana_r_v2); useExtendedBoluses = false; - PumpUtil.setPumpDescription(pumpDescription, PumpType.getByDescription("DanaRv2")); + PumpUtil.setPumpDescription(pumpDescription, PumpType.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 2baf835b26..2f554d2cf3 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 @@ -122,7 +122,7 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai .description(R.string.description_pump_insight) ); log("InsightPlugin instantiated"); - PumpUtil.setPumpDescription(pumpDescription, PumpType.getByDescription("Accu-Chek Insight")); + PumpUtil.setPumpDescription(pumpDescription, PumpType.AccuChekInsight); } From b9fda827bdd9fa1d7645850cced9e8733d04fe81 Mon Sep 17 00:00:00 2001 From: triplem <160079+triplem@users.noreply.github.com> Date: Fri, 31 Aug 2018 11:25:57 +0200 Subject: [PATCH 10/41] Add version information to emails --- .../Maintenance/MaintenancePlugin.java | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Maintenance/MaintenancePlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Maintenance/MaintenancePlugin.java index 56cd67f328..3fd3745f42 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Maintenance/MaintenancePlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Maintenance/MaintenancePlugin.java @@ -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); From 316f001cbc61f8dab61bee1125854a3c7267443d Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 1 Sep 2018 11:45:29 +0200 Subject: [PATCH 11/41] PumpUtil cleanup --- .../androidaps/db/DatabaseHelper.java | 12 +- .../interfaces/PumpDescription.java | 124 ++++++++++++----- .../plugins/PumpCombo/ComboPlugin.java | 3 +- .../plugins/PumpCommon/defs/PumpType.java | 64 +++++++++ .../plugins/PumpCommon/utils/PumpUtil.java | 130 ------------------ .../plugins/PumpDanaR/DanaRPlugin.java | 3 +- .../PumpDanaRKorean/DanaRKoreanPlugin.java | 3 +- .../plugins/PumpDanaRS/DanaRSPlugin.java | 3 +- .../plugins/PumpDanaRv2/DanaRv2Plugin.java | 3 +- .../plugins/PumpInsight/InsightPlugin.java | 3 +- .../PumpVirtual/VirtualPumpPlugin.java | 24 ++-- 11 files changed, 177 insertions(+), 195 deletions(-) delete mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/utils/PumpUtil.java 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 75de0cb372..742f767cec 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java +++ b/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java @@ -200,7 +200,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 +236,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { } catch (SQLException e) { log.error("Unhandled exception", e); } - VirtualPumpPlugin.setFakingStatus(false); + VirtualPumpPlugin.getPlugin().setFakingStatus(false); scheduleTemporaryBasalChange(); } @@ -967,8 +967,8 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { extendedBolus.durationInMinutes = trJson.getInt("duration"); extendedBolus.insulin = trJson.getDouble("originalExtendedAmount"); extendedBolus._id = trJson.getString("_id"); - if (!VirtualPumpPlugin.getFakingStatus()) { - VirtualPumpPlugin.setFakingStatus(true); + if (!VirtualPumpPlugin.getPlugin().getFakingStatus()) { + VirtualPumpPlugin.getPlugin().setFakingStatus(true); updateEarliestDataChange(0); scheduleTemporaryBasalChange(); } @@ -981,8 +981,8 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { extendedBolus.durationInMinutes = 0; extendedBolus.insulin = 0; extendedBolus._id = trJson.getString("_id"); - if (!VirtualPumpPlugin.getFakingStatus()) { - VirtualPumpPlugin.setFakingStatus(true); + if (!VirtualPumpPlugin.getPlugin().getFakingStatus()) { + VirtualPumpPlugin.getPlugin().setFakingStatus(true); updateEarliestDataChange(0); scheduleTemporaryBasalChange(); } 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 f3c25e42dd..1c6902e3b7 100644 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/PumpDescription.java +++ b/app/src/main/java/info/nightscout/androidaps/interfaces/PumpDescription.java @@ -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 { + 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); + } + } 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 4a2b5b0552..f6f1de2ad0 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 @@ -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.AccuChekCombo); + pumpDescription.setPumpDescription(PumpType.AccuChekCombo); } public ComboPump getPump() { 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 index f73bcb06f4..1bc05d4659 100644 --- 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 @@ -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((float)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((float) basalAmount); + } + + if (basalAmount > getTbrSettings().getMaxDose()) + basalAmount = getTbrSettings().getMaxDose().doubleValue(); + + return Math.round(basalAmount / basalStepSize) * basalStepSize; + + } } 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 deleted file mode 100644 index ffabf345fb..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/utils/PumpUtil.java +++ /dev/null @@ -1,130 +0,0 @@ -package info.nightscout.androidaps.plugins.PumpCommon.utils; - -import info.nightscout.androidaps.interfaces.PumpDescription; -import info.nightscout.androidaps.plugins.PumpCommon.data.DoseSettings; -import info.nightscout.androidaps.plugins.PumpCommon.defs.DoseStepSize; -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 double determineCorrectBolusSize(double bolusAmount, PumpType pumpType) { - if (bolusAmount == 0.0d || pumpType == null) { - return bolusAmount; - } - - double bolusStepSize; - - if (pumpType.getSpecialBolusSize() == null) { - bolusStepSize = pumpType.getBolusSize(); - } else { - DoseStepSize specialBolusSize = pumpType.getSpecialBolusSize(); - - bolusStepSize = specialBolusSize.getStepSizeForAmount((float)bolusAmount); - } - - return Math.round(bolusAmount / bolusStepSize) * bolusStepSize; - - } - - - public static double determineCorrectExtendedBolusSize(double bolusAmount, PumpType pumpType) { - if (bolusAmount == 0.0d || pumpType == null) { - return bolusAmount; - } - - double bolusStepSize; - - if (pumpType.getExtendedBolusSettings() == null) { // this should be never null - return 0.0d; - } - - DoseSettings extendedBolusSettings = pumpType.getExtendedBolusSettings(); - - bolusStepSize = extendedBolusSettings.getStep(); - - if (bolusAmount > extendedBolusSettings.getMaxDose()) { - bolusAmount = extendedBolusSettings.getMaxDose(); - } - - return Math.round(bolusAmount / bolusStepSize) * bolusStepSize; - } - - - public static double determineCorrectBasalSize(Double basalAmount, PumpType pumpType) { - if (basalAmount == null || basalAmount == 0.0d || pumpType == null) { - return basalAmount; - } - - double basalStepSize; - - if (pumpType.getBaseBasalSpecialSteps() == null) { - basalStepSize = pumpType.getBaseBasalStep(); - } else { - DoseStepSize specialBolusSize = pumpType.getBaseBasalSpecialSteps(); - - basalStepSize = specialBolusSize.getStepSizeForAmount(basalAmount.floatValue()); - } - - if (basalAmount > pumpType.getTbrSettings().getMaxDose()) - basalAmount = pumpType.getTbrSettings().getMaxDose().doubleValue(); - - return Math.round(basalAmount / basalStepSize) * basalStepSize; - - } - - - 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/DanaRPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java index 14c21cf576..dfdca746cb 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 @@ -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 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 b719c9a43a..54f0beb89b 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 @@ -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.DanaRKorean); + pumpDescription.setPumpDescription(PumpType.DanaRKorean); } @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 d4bcb9bf5d..c08c35636a 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 @@ -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.DanaRS); + pumpDescription.setPumpDescription(PumpType.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 f6d633a338..86c07b89ff 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 @@ -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.DanaRv2); + pumpDescription.setPumpDescription(PumpType.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 2f554d2cf3..678b91dfec 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 @@ -39,7 +39,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; @@ -122,7 +121,7 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai .description(R.string.description_pump_insight) ); log("InsightPlugin instantiated"); - PumpUtil.setPumpDescription(pumpDescription, PumpType.AccuChekInsight); + pumpDescription.setPumpDescription(PumpType.AccuChekInsight); } 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 2197e4f898..bd530371fb 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 @@ -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; @@ -47,7 +46,7 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { private static Logger log = LoggerFactory.getLogger(VirtualPumpPlugin.class); private static VirtualPumpPlugin plugin = null; private static boolean fromNSAreCommingFakedExtendedBoluses = false; - PumpType pumpType = null; + private PumpType pumpType = null; private long lastDataTime = 0; private PumpDescription pumpDescription = new PumpDescription(); @@ -92,21 +91,21 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { } public static VirtualPumpPlugin getPlugin() { - loadFakingStatus(); if (plugin == null) plugin = new VirtualPumpPlugin(); + plugin.loadFakingStatus(); return plugin; } - private static void loadFakingStatus() { + private void loadFakingStatus() { fromNSAreCommingFakedExtendedBoluses = SP.getBoolean(R.string.key_fromNSAreCommingFakedExtendedBoluses, false); } - public static boolean getFakingStatus() { + public boolean getFakingStatus() { return fromNSAreCommingFakedExtendedBoluses; } - public static void setFakingStatus(boolean newStatus) { + public void setFakingStatus(boolean newStatus) { fromNSAreCommingFakedExtendedBoluses = newStatus; SP.putBoolean(R.string.key_fromNSAreCommingFakedExtendedBoluses, fromNSAreCommingFakedExtendedBoluses); } @@ -137,8 +136,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 @@ -229,7 +227,7 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { @Override public PumpEnactResult deliverTreatment(DetailedBolusInfo detailedBolusInfo) { - detailedBolusInfo.insulin = PumpUtil.determineCorrectBolusSize(detailedBolusInfo.insulin, this.pumpType); + detailedBolusInfo.insulin = pumpType.determineCorrectBolusSize(detailedBolusInfo.insulin); PumpEnactResult result = new PumpEnactResult(); result.success = true; @@ -269,7 +267,7 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { @Override public PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes, Profile profile, boolean enforceNew) { - absoluteRate = PumpUtil.determineCorrectBasalSize(absoluteRate, this.pumpType); + absoluteRate = pumpType.determineCorrectBasalSize(absoluteRate); TemporaryBasal tempBasal = new TemporaryBasal() .date(System.currentTimeMillis()) @@ -325,7 +323,7 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { if (!result.success) return result; - insulin = PumpUtil.determineCorrectExtendedBolusSize(insulin, this.pumpType); + insulin = pumpType.determineCorrectExtendedBolusSize(insulin); ExtendedBolus extendedBolus = new ExtendedBolus(); extendedBolus.date = System.currentTimeMillis(); @@ -400,7 +398,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) { @@ -461,7 +459,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; From 62b111eb640bf6d7dbb429a5d72234b6b6c0823d Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 1 Sep 2018 12:40:07 +0200 Subject: [PATCH 12/41] fix test --- .../PumpDescritpionTest.java} | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename app/src/test/java/info/nightscout/androidaps/{plugins/PumpCommon/utils/PumpUtilUTest.java => interfaces/PumpDescritpionTest.java} (92%) diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/PumpCommon/utils/PumpUtilUTest.java b/app/src/test/java/info/nightscout/androidaps/interfaces/PumpDescritpionTest.java similarity index 92% rename from app/src/test/java/info/nightscout/androidaps/plugins/PumpCommon/utils/PumpUtilUTest.java rename to app/src/test/java/info/nightscout/androidaps/interfaces/PumpDescritpionTest.java index 86b030b801..054c44bb49 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/PumpCommon/utils/PumpUtilUTest.java +++ b/app/src/test/java/info/nightscout/androidaps/interfaces/PumpDescritpionTest.java @@ -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); From 315c83069d84dec32c7096f8085282ffb8e4aab5 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 1 Sep 2018 22:45:15 +0200 Subject: [PATCH 13/41] apply bolus description settings in constraints --- .../androidaps/data/ConstraintChecker.java | 15 ++ .../androidaps/interfaces/Constraint.java | 9 ++ .../interfaces/ConstraintsInterface.java | 4 + .../androidaps/interfaces/PluginBase.java | 5 +- .../interfaces/PumpDescription.java | 2 +- .../dialogs/NewExtendedBolusDialog.java | 4 +- .../ConstraintsSafety/SafetyPlugin.java | 47 +++++- .../plugins/PumpCommon/data/DoseSettings.java | 18 +-- .../plugins/PumpCommon/defs/DoseStepSize.java | 18 +-- .../plugins/PumpCommon/defs/PumpType.java | 142 +++++++++--------- .../PumpDanaR/AbstractDanaRPlugin.java | 7 +- .../comm/MsgSetExtendedBolusStart.java | 2 +- .../plugins/PumpDanaRS/DanaRSPlugin.java | 7 +- .../PumpVirtual/VirtualPumpPlugin.java | 6 - .../androidaps/queue/CommandQueue.java | 2 +- .../androidaps/queue/QueueThread.java | 10 +- app/src/main/res/values/strings.xml | 1 + .../interfaces/ConstraintsCheckerTest.java | 4 +- .../ConstraintsSafety/SafetyPluginTest.java | 4 +- .../androidaps/queue/CommandQueueTest.java | 1 + 20 files changed, 196 insertions(+), 112 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/data/ConstraintChecker.java b/app/src/main/java/info/nightscout/androidaps/data/ConstraintChecker.java index bfbbfedbd1..fc37f5f2a5 100644 --- a/app/src/main/java/info/nightscout/androidaps/data/ConstraintChecker.java +++ b/app/src/main/java/info/nightscout/androidaps/data/ConstraintChecker.java @@ -58,6 +58,10 @@ public class ConstraintChecker implements ConstraintsInterface { return applyBolusConstraints(new Constraint<>(Constants.REALLYHIGHBOLUS)); } + public Constraint getMaxExtendedBolusAllowed() { + return applyExtendedBolusConstraints(new Constraint<>(Constants.REALLYHIGHBOLUS)); + } + public Constraint getMaxCarbsAllowed() { return applyCarbsConstraints(new Constraint<>(Constants.REALLYHIGHCARBS)); } @@ -170,6 +174,17 @@ public class ConstraintChecker implements ConstraintsInterface { return insulin; } + @Override + public Constraint applyExtendedBolusConstraints(Constraint insulin) { + ArrayList 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 applyCarbsConstraints(Constraint carbs) { ArrayList constraintsPlugins = mainApp.getSpecificPluginsListByInterface(ConstraintsInterface.class); diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/Constraint.java b/app/src/main/java/info/nightscout/androidaps/interfaces/Constraint.java index 26c58ed89e..6a47a892db 100644 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/Constraint.java +++ b/app/src/main/java/info/nightscout/androidaps/interfaces/Constraint.java @@ -47,6 +47,15 @@ public class Constraint { return this; } + public Constraint 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 setIfSmaller(T value, String reason, Object from) { if (value.compareTo(this.value) < 0) { this.value = value; diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/ConstraintsInterface.java b/app/src/main/java/info/nightscout/androidaps/interfaces/ConstraintsInterface.java index 820170dc0f..310c94ac20 100644 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/ConstraintsInterface.java +++ b/app/src/main/java/info/nightscout/androidaps/interfaces/ConstraintsInterface.java @@ -43,6 +43,10 @@ public interface ConstraintsInterface { return insulin; } + default Constraint applyExtendedBolusConstraints(Constraint insulin) { + return insulin; + } + default Constraint applyCarbsConstraints(Constraint carbs) { return carbs; } diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/PluginBase.java b/app/src/main/java/info/nightscout/androidaps/interfaces/PluginBase.java index 494cd9e1ae..3d7895a62a 100644 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/PluginBase.java +++ b/app/src/main/java/info/nightscout/androidaps/interfaces/PluginBase.java @@ -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(); } } 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 1c6902e3b7..34221b203f 100644 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/PumpDescription.java +++ b/app/src/main/java/info/nightscout/androidaps/interfaces/PumpDescription.java @@ -9,7 +9,7 @@ import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpType; */ public class PumpDescription { - PumpType pumpType = PumpType.GenericAAPS; + public PumpType pumpType = PumpType.GenericAAPS; public PumpDescription () { resetSettings(); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java index 45b6460392..882b677e2f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java @@ -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,7 +71,7 @@ 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) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPlugin.java index f76673197e..9dd6665b4d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPlugin.java @@ -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) { + 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,10 +150,14 @@ 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); @@ -154,6 +172,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 applyExtendedBolusConstraints(Constraint 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; } 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 index eb8169c361..21a893e943 100644 --- 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 @@ -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, Float.MAX_VALUE); + 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; } } 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 index 69691886e2..421c441c32 100644 --- 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 @@ -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; 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 index 1bc05d4659..be759548e0 100644 --- 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 @@ -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, 5.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; } @@ -339,7 +339,7 @@ public enum PumpType { } else { DoseStepSize specialBolusSize = getSpecialBolusSize(); - bolusStepSize = specialBolusSize.getStepSizeForAmount((float)bolusAmount); + bolusStepSize = specialBolusSize.getStepSizeForAmount((double)bolusAmount); } return Math.round(bolusAmount / bolusStepSize) * bolusStepSize; @@ -381,7 +381,7 @@ public enum PumpType { } else { DoseStepSize specialBolusSize = getBaseBasalSpecialSteps(); - basalStepSize = specialBolusSize.getStepSizeForAmount((float) basalAmount); + basalStepSize = specialBolusSize.getStepSizeForAmount((double) basalAmount); } if (basalAmount > getTbrSettings().getMaxDose()) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/AbstractDanaRPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/AbstractDanaRPlugin.java index 04b7773799..c50e635eb8 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/AbstractDanaRPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/AbstractDanaRPlugin.java @@ -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 applyExtendedBolusConstraints(Constraint insulin) { + return applyBolusConstraints(insulin); + } + @Nullable @Override public ProfileStore getProfile() { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetExtendedBolusStart.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetExtendedBolusStart.java index a7f2a0e1b8..faefd79368 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetExtendedBolusStart.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetExtendedBolusStart.java @@ -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); 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 c08c35636a..fd2eee78d6 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 @@ -263,6 +263,11 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte return insulin; } + @Override + public Constraint applyExtendedBolusConstraints(Constraint insulin) { + return applyBolusConstraints(insulin); + } + // Profile interface @Nullable @@ -600,7 +605,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); 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 bd530371fb..f1d620b92b 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 @@ -227,8 +227,6 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { @Override public PumpEnactResult deliverTreatment(DetailedBolusInfo detailedBolusInfo) { - detailedBolusInfo.insulin = pumpType.determineCorrectBolusSize(detailedBolusInfo.insulin); - PumpEnactResult result = new PumpEnactResult(); result.success = true; result.bolusDelivered = detailedBolusInfo.insulin; @@ -267,8 +265,6 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { @Override public PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes, Profile profile, boolean enforceNew) { - absoluteRate = pumpType.determineCorrectBasalSize(absoluteRate); - TemporaryBasal tempBasal = new TemporaryBasal() .date(System.currentTimeMillis()) .absolute(absoluteRate) @@ -323,8 +319,6 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { if (!result.success) return result; - insulin = pumpType.determineCorrectExtendedBolusSize(insulin); - ExtendedBolus extendedBolus = new ExtendedBolus(); extendedBolus.date = System.currentTimeMillis(); extendedBolus.insulin = insulin; diff --git a/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java b/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java index a5f3db72bd..0e74ec8185 100644 --- a/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java +++ b/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java @@ -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); diff --git a/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.java b/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.java index 1de60240d7..d59a83a4f4 100644 --- a/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.java +++ b/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.java @@ -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 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d6d3c830f4..4c681b9048 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1019,6 +1019,7 @@ Limiting max percent rate to %1$d%% because of %2$s treatmentssafety_maxbolus Limiting bolus to %1$.1f U because of %2$s + Limiting extended bolus to %1$.1f U because of %2$s Limiting max IOB to %1$.1f U because of %2$s Limiting carbs to %1$d g because of %2$s Limiting IOB to %1$.1f U because of %2$s diff --git a/app/src/test/java/info/nightscout/androidaps/interfaces/ConstraintsCheckerTest.java b/app/src/test/java/info/nightscout/androidaps/interfaces/ConstraintsCheckerTest.java index f79e99e06a..8fc02d07d2 100644 --- a/app/src/test/java/info/nightscout/androidaps/interfaces/ConstraintsCheckerTest.java +++ b/app/src/test/java/info/nightscout/androidaps/interfaces/ConstraintsCheckerTest.java @@ -156,7 +156,7 @@ public class ConstraintsCheckerTest { // Apply all limits Constraint d = constraintChecker.getMaxBasalAllowed(AAPSMocker.getValidProfile()); Assert.assertEquals(0.8d, d.value()); - Assert.assertEquals(true, d.getReasonList().size() == 6); + Assert.assertEquals(7, 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 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(10, i.getReasonList().size()); // 7x Safety & RS & R & Insight Assert.assertEquals("Safety: Limiting percent rate to 100% because of pump limit", i.getMostLimitedReasons()); } diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPluginTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPluginTest.java index ae350c4fe6..086b3082c1 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPluginTest.java +++ b/app/src/test/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPluginTest.java @@ -112,7 +112,8 @@ public class SafetyPluginTest { Assert.assertEquals("Safety: Limiting basal rate to 1.00 U/h because of max value in preferences\n" + "Safety: Limiting basal rate to 4.00 U/h because of max basal multiplier\n" + "Safety: Limiting basal rate to 3.00 U/h because of max daily basal multiplier\n" + - "Safety: Limiting basal rate to 2.00 U/h because of hard limit", c.getReasons()); + "Safety: Limiting basal rate to 2.00 U/h because of hard limit\n" + + "Safety: Limiting basal rate to 500.00 U/h because of pump limit", c.getReasons()); Assert.assertEquals("Safety: Limiting basal rate to 1.00 U/h because of max value in preferences", c.getMostLimitedReasons()); } @@ -144,6 +145,7 @@ public class SafetyPluginTest { "Safety: Limiting basal rate to 4.00 U/h because of max basal multiplier\n" + "Safety: Limiting basal rate to 3.00 U/h because of max daily basal multiplier\n" + "Safety: Limiting basal rate to 2.00 U/h because of hard limit\n" + + "Safety: Limiting basal rate to 500.00 U/h because of pump limit\n" + "Safety: Limiting percent rate to 100% because of pump limit", i.getReasons()); Assert.assertEquals("Safety: Limiting percent rate to 100% because of pump limit", i.getMostLimitedReasons()); } diff --git a/app/src/test/java/info/nightscout/androidaps/queue/CommandQueueTest.java b/app/src/test/java/info/nightscout/androidaps/queue/CommandQueueTest.java index 29c9128186..fcbd4b55f2 100644 --- a/app/src/test/java/info/nightscout/androidaps/queue/CommandQueueTest.java +++ b/app/src/test/java/info/nightscout/androidaps/queue/CommandQueueTest.java @@ -130,6 +130,7 @@ public class CommandQueueTest extends CommandQueue { when(MainApp.instance()).thenReturn(mainApp); Constraint bolusConstraint = new Constraint<>(0d); when(MainApp.getConstraintChecker().applyBolusConstraints(any())).thenReturn(bolusConstraint); + when(MainApp.getConstraintChecker().applyExtendedBolusConstraints(any())).thenReturn(bolusConstraint); Constraint carbsConstraint = new Constraint<>(0); when(MainApp.getConstraintChecker().applyCarbsConstraints(any())).thenReturn(carbsConstraint); Constraint rateConstraint = new Constraint<>(0d); From f5e7d28aa6f25374df70fc39a317a1810ba5610a Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 1 Sep 2018 23:34:35 +0200 Subject: [PATCH 14/41] fix WizardInfoDialog 2nd --- .../androidaps/plugins/Actions/dialogs/FillDialog.java | 2 +- .../plugins/Overview/Dialogs/WizardDialog.java | 2 +- .../plugins/Treatments/dialogs/WizardInfoDialog.java | 3 ++- app/src/main/res/layout/treatments_wizardinfo_dialog.xml | 9 +++++++++ 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/FillDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/FillDialog.java index cd649d30cd..20211e5f22 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/FillDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/FillDialog.java @@ -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); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java index 458608edbf..28ae009c6e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java @@ -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); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/dialogs/WizardInfoDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/dialogs/WizardInfoDialog.java index 2823957b63..25ffc946a2 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/dialogs/WizardInfoDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/dialogs/WizardInfoDialog.java @@ -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); diff --git a/app/src/main/res/layout/treatments_wizardinfo_dialog.xml b/app/src/main/res/layout/treatments_wizardinfo_dialog.xml index 12e0e4e73e..9f605ada12 100644 --- a/app/src/main/res/layout/treatments_wizardinfo_dialog.xml +++ b/app/src/main/res/layout/treatments_wizardinfo_dialog.xml @@ -21,6 +21,15 @@ android:layout_marginTop="-15dp" android:background="@color/listdelimiter" /> + + Date: Mon, 3 Sep 2018 15:16:25 +0200 Subject: [PATCH 15/41] New Crowdin translations (#1378) --- app/src/main/res/values-cs/strings.xml | 1 + app/src/main/res/values-ko/strings.xml | 13 ++-- app/src/main/res/values-pt/strings.xml | 85 ++++++++++++++++++++++++++ app/src/main/res/values-ru/strings.xml | 8 ++- 4 files changed, 102 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index c829c9f150..4e12670d6a 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -897,6 +897,7 @@ Bazál nastaven správně Bazál omezen na %1$d%%: %2$s Bolus omezen na %1$.1f U: %2$s + Prodloužený bolus omezen na %1$.1f U: %2$s Max IOB omezeno na %1$.1f U: %2$s Sacharidy omezeny na %1$d g: %2$s IOB omezeno na %1$.1f U: %2$s diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 03aa8f74e4..44872e8d35 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -12,7 +12,7 @@ >200% 주입위한 확장식사주입 다나R 블루투스 기초주입량 절대값 사용하기 - 폰을 재부팅하고나 AndroidAPS를 재시작하세요 \n그렇지 않으면 로그가 기록이되지 않습니다.(알고리즘이 제대로 작동하는지 확인하기 위해 로그가 필요합니다.)! + 폰을 재부팅하거나 AndroidAPS를 재시작하세요 \n그렇지 않으면 로그 기록이 되지 않습니다.(알고리즘이 정상적인 작동하는지 확인하기 위해 로그가 필요합니다.)! 일반 기능을 빠르게 실행시킬 버튼 고급 로그 항목을 입력합니다. 활성화된 플러그인을 구성하는 데 사용됩니다. @@ -236,9 +236,7 @@ 연결 끊김 다나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. + 이 프로그램을 의학적 결정을 내리는 데 사용해서는 안되며, 여기에 대한 어떠한 보증도 없습니다. 이 프로그램의 품질과 성능에 관한 모든 위험은 사용자에게 있습니다.\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. 모두 이해하였고 동의합니다. 저장 블루투스 어댑터를 찾지 못했습니다 @@ -460,6 +458,7 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM Autosens가 목표도 조절합니다. 기본값: 활성\n이것은 autosens가 ISF와 기초주입뿐만 아니라, 혈당 목표범위를 조절할 수 있게 합니다. 기본값: 2\n식사주입 후 Bolus snooze가 수행되게 되고, 따라서 식사주입 직후엔 loop가 low temp에 대응하지 않게 됩니다. 기본값이 2일때 예제는 다음과 같습니다; DIA가 3시간일 경우 bolus snooz는 점차적으로 1.5시간에 걸쳐 단계적으로 사라지게 됩니다.(3DIA/2). + 기본값: 3.0 (AMA) 또는 8.0 (SMB). 5분당 탄수화물이 얼만큼 흡수되었는지에 대한 기본값 설정입니다. 기본값은 3mg/dl / 5분 입니다. 이는 혈당이 예상보다 빨리 떨어지거나 혹은 예상보다 오르지 않을때, COB가 얼마나 빨리 사라지게 되는지에 영향을 주게 되고, 추정된 탄수화물 흡수량이 미래 혈당 예측 계산시에도 영향을 주게 됩니다. 주의!\n보통의 경우 아래의 값을 변경하면 안됩니다. 이 값들을 변경하기 전에 반드시 이곳을 클릭하고 글을 정독해서 확실하게 이해를 하여야 합니다. 숫자만 입력가능합니다. 이 범위(%1$s - %2$s)안에 해당하는 숫자만 입력가능합니다. @@ -898,6 +897,7 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM 기초주입이 정상적으로 설정되었습니다. %2$s로 인해 최대 비율이 %1$d%%로 제한됩니다. %2$s로 인해 식사주입이 %1$.1f U로 제한됩니다. + %2$s로 인해 확장식사주입이 %1$.1f U로 제한됩니다. %2$s로 인해 최대 IOB가 %1$.1f U로 제한됩니다. %2$s로 인해 탄수화물이 %1$d g로 제한됩니다. %2$s로 인해 IOB가 %1$.1f U으로 제한됩니다. @@ -929,6 +929,7 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM 설정 마법사 완료 언어를 선택하세요 + 요청: %1$.2fU 전송: %2$.2fU 에러코드: %3$s 1차 인슐린 증분 2차 인슐린 증분 3차 인슐린 증분 @@ -1043,6 +1044,10 @@ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM Calc 통신 확인 예상치 못한 상황 보고를 위해 오늘의 로그 파일을 개발자에게 전송합니다. + 최대 식사주입 위반 + 명령 오류 + 속도 오류 + 인슐린 제한 위반 %1$d 일 diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index b22db94e3e..31cfedbf43 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -611,10 +611,15 @@ EST Manter ecrã ligado Impedir Android de desligar o ecrã. Isto irá consumir muita bateria quando não ligado ao carregador. + 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!! + Média ponderada da Sensibilidade OK Cancelar Nem todos perfis foram carregados! Valores não guardados! + Activar partilha para outras aplicações (como xDrip). + Activar partilha local. + FEEDBACK ACTIVIDADE & HIDRATOS & BÓLUS CGM & OPENAPS BOMBA @@ -624,11 +629,18 @@ SMB Activar UAM Activar SMB + Use Super Micro Boluses em vez de basal temp para uma acção mais rápida + Detecção de refeições não Introduzidas + Tempo Pico da curva de IOB Tempo Pico [min] + Oref Pico-Livre + Oref Acção Rápida Ultra-Rapid Oref + Duração de Acção da Insulina (DIA) de %1$f demasiado curto - corrigido para %2$f! Activar perfil Data INVÁLIDO + Aguardando emparelhamento na bomba Emparelhamento OK Tempo limite emparelhamento A EMPARELHAR @@ -641,6 +653,7 @@ Bomba seleccionada Emparelhar nova bomba Velocidade Bólus + Coloque o incremento da basal em 0.01 U/h Número de série Percentagem Alteração Turno @@ -651,7 +664,11 @@ alvo actividade duração hipo alvo hipo + Purge/Encha + Procurando o status do bolus estendido A obter estado bólus + A obter o status da basal temporária + A obter as definições da bomba A obter hora bomba reutilizar Controles do Relógio @@ -667,24 +684,36 @@ Pr Gor ]]> + A aguardar o final do bolus. Restam %1$d sec. + A processar acção A iniciar administração de bolus Comando será executado agora + Controlador bomba corrigido Bomba inacessível Leituras Glic. perdidas + Usar as notificações do sistema para alertas e notificações Alertas local Alerta caso nenhuma glicemia seja recebida Alerta caso não seja possivel alcançar a bomba + Limite para bomba inacessível [min] Alarme Urgente INFO Bluetooth + Watchdog BT 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. + Aplicação DexcomG5 (com patch) Enviar dados Glic. para NS Definições envio G5 + Definições de upload para Poctech Mostrar Delta detalho + Mostrar delta com mais um ponto decimal + Limite de minutos de basal para SMB Firmware bomba não suportado Enviar dados Glic. para xDrip+ Seleccionar 640g/Eversense como fonte no xDrip+ Glic NSCliente + Valor da basal alterado para o valor mínimo suportado: %s + Valor da basal alterado para o valor máximo suportado: %s Cálculos Glic Cálculo de Bólus IOB Cálculo de Basal IOB @@ -719,19 +748,27 @@ Injectando (%.1f U) A actualizar Operação solicitada não suportada pela bomba + 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 + 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. + 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. Agora A ler histórico bomba histórico bomba A definir perfil basal Nível cartucho da bomba está baixo Bateria da bomba está fraca + A bomba está a dar o erro E%1$d: %2$s Baixo Vazio Normal Necesário actualizar relógio da bomba Aviso + Basal Temporária CANCELADA. O aviso foi confirmado Não foi possivel establecer comunicação com a bomba. Nenhum bolus foi administrado. 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. + 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. + 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. + Não há insulina suficiente no reservatório para bolus Erro na entrega Bólus Estendido Insight Bomba Insight @@ -746,16 +783,23 @@ Diário Última Acção Terminada min + a restar mais de total com + atenção com Ficar sempre ligada PARADO A SINCRONIZAR OCUPADO SINCRONIZADO + INICIANDO necessita + Nãp conectado com a aplicação acompanhante! + Aplicação acompanhante aparentemente não instalada! + Aplicação acompanhante incompatível. Versão necessitada Desconhecido A aguardar por código de confirmação Codigo rejeitado + Associação de aplicação Não autorizado Incompativel segundo @@ -767,51 +811,92 @@ %1$ds expira %2$s Estado manter ligado Estatísticas + Ligar preventivamente + Conectar automaticamente quando se inicia o AndroidAPS, antes que seja efectuado qualquer comando, de maneira a reduzir o atraso na conexão Não é recomendado devido ao gasto de bateria SMB sempre activado + SMB sempre activo independentemente dos bolus. Possível apenas quando o medidor tive um bom filtro de dados como o G5 Activar SMB após hidratos + 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 Activar SMB com COB Activar SMB quando tem COB activo. + SMB activo com valores alvo temporários + SMB activo quando há valor alvo temporário activo (exercício, etc) + SMB activo com alvos temporários elevados + SMB activo com alvos temporários elevados em curso (exercicio) + Permitir basal temp correr Silêncio Insulina Hidratos Botões + Enviar calibrações para o xDrip+ ou abrir sistema de calibração do G5 Abre xDrip+, botão retorcer volta ao AAPS + Número de carboidratos a adicionar quando o botão é premido + Unidades de insulina a adicionar quando o botão é premido + Não foi possível lançar aplicação de monitorização contínua. Por favor verifique que está instalada. CGM Navegador do histórico Notificar no SMB + Mostrar SMB no relogio como bolus normal. + Criar anúncios dos erros + 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) + Mostrar a predições na face do relogio. Previsão Escolha de Dados Envio Fabric + Permitir que seja enviado automaticamente à equipa de desenvolvimento o report de crashes e das funções utilizadas, utilizando o serviço fabric.io. + Por favor actualize a sua versão da app G5 para a versão suportada Iniciar atividade TT Iniciar Comer em breve TT TT Sem bólus, registar apenas Categoria Subcategoria + O bolus apenas será gravado + Preencher glicemias em falta com NS SMB definido pela bomba Sensibilidade + Desvios + Carboidratos a bordo + Insulina a bordo Basais + Nenhuma acção seleccionada, nada irá acontecer Começar TT Hipo + A correr a versão dev. O Loop fechado está desabilitado. Modo engenheiro activado + Modo de engenharia não habilitado e não no na versão mestra %.2f U/h A ler perfil basal + 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. + 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. + A rejeitar a temporal alta uma vez que o cálculo não considerou as mudanças do histórico da bomba A actualizar estado bomba + A verificar se há alterações de histórico Contagem Bólus Contagem TBR + Objetivo %1$d não iniciado + Objetivo %1$d não concluido + A bomba não é capaz de basais temporárias + Nenhum valor de basal temporaria valido foi lido da bomba + Loop fecchado disabilitado nas preferências + Autosens desabilitado nas preferências SMB desactivado nas configurações + A basal max está limitada a %1$.2f U/h por %2$s limite bomba deve ser valor positivo multiplicador de basal máx multiplicador de basal máx diária + Um bolus foi injectado nos últimos 3 minutos, saltando SMB Basal correctamente definida valor máx nas preferências uso não seguro Erro na leitura de estado Registar mudança de sítio Registar mudança cartucho + SMB não permitido no modo open loop Alimentos repor + Desligado (%1$d m) Bomba parada Bomba iniciada Bomba suspensa diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index f913664ecc..34628156f2 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -458,6 +458,7 @@ Autosens тоже подстроит цели значение по умолчанию : верно. используется чтобы разрешить юстировку целевых СК, а также ISF и базала значение по умолчанию :2 bolus snoose активируется после введения болюса на еду чтобы цикл не взаимодействовал с временными низкими СК сразу после еды. так, трехчасовой DIA при величине 2 означает постыпенное затихание bolus snooze после 1.5 часов (3DIA/2) + Значение по умолчанию: 3.0 (AMA) или 8.0 (SMB). Эта настройка на усвоение углеводов за 5 мин. По умолчанию ожидается 3мг/дл/5мин. Влияет на скорость учета поглощения углеводов COB и усвоения в расчетах прогнозируемой гликемии, когда СК падает быстрее или не растет так как ожидается. Внимание! Обычно нет необходимости изменять приведенные ниже величины. Нажмите ЗДЕСЬ, ПРОЧТИТЕ и убедитесь что вы ПОНИМАЕТЕ изложенное прежде чем менять какую-либо из этих величин разрешены только цифровые значения разрешены только цифровые значения в диапазоне %1$s - %2$s @@ -894,7 +895,7 @@ множитель макс суточного базала Болюс был подан в течение последних трех минут, минуя супер микро болюс SMB Базал задан корректно - Макс процент базала ограничен до %1$d% ед/ч вследствие %2$s + Макс процент базала ограничен до %1$d%% ед/ч вследствие %2$s Макс уровень болюса ограничен до %1$.1f ед вследствие %2$s Ограничение максимума активного инсулина IOB до %1$.1f U из-за %2$s Ограничение максимума углеводов до %1$d грамм из-за %2$s @@ -927,6 +928,7 @@ Мастер настройки ГОТОВО Выберите Ваш язык + Запрошено: %1$.2f ед. Подано: %2$.2f ед. Код ошибки: %3$s Первый шаг увеличения инсулина Второй шаг увеличения инсулина Третий шаг увеличения инсулина @@ -1043,4 +1045,8 @@ Context | Edit Context Кальк Подтверждение связи Отправьте файлы сегодняшнего лога разработчикам наряду с этим. Непредвиденная ситуация. + Макс нарушение болюса + Ошибка в команде + Ошибка в скорости + Нарушение ограничения инсулина From 42714afeb1ca9dcdc0a171f7392cc8da9e2ff9cf Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Tue, 4 Sep 2018 15:38:04 +0200 Subject: [PATCH 16/41] fix false constraint warning --- .../plugins/Actions/dialogs/NewExtendedBolusDialog.java | 2 +- .../plugins/Actions/dialogs/NewTempBasalDialog.java | 2 +- .../plugins/Overview/Dialogs/NewTreatmentDialog.java | 2 +- .../androidaps/plugins/Overview/Dialogs/WizardDialog.java | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java index 882b677e2f..80939e639c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java @@ -74,7 +74,7 @@ public class NewExtendedBolusDialog extends DialogFragment implements View.OnCli 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; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java index 32f1271d82..359e0e4877 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java @@ -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); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewTreatmentDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewTreatmentDialog.java index 5fb698d1c5..eac1a5c09e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewTreatmentDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewTreatmentDialog.java @@ -141,7 +141,7 @@ public class NewTreatmentDialog extends DialogFragment implements OnClickListene } if (carbsAfterConstraints > 0) confirmMessage += "
" + 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 += "
" + MainApp.gs(R.string.constraintapllied); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java index 458608edbf..c0f894afa4 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java @@ -339,7 +339,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com if (carbsAfterConstraints > 0) confirmMessage += "
" + MainApp.gs(R.string.carbs) + ": " + "" + carbsAfterConstraints + "g" + ""; - 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; From 4ca9d220628021d6036cd69368ee716e9273e0ba Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Tue, 4 Sep 2018 19:55:31 +0200 Subject: [PATCH 17/41] Virtual pump descriptions used for APS requests in open loop mode --- .../androidaps/db/TemporaryBasal.java | 60 ++++--- .../ConstraintsSafety/SafetyPlugin.java | 8 +- .../androidaps/plugins/Loop/APSResult.java | 170 +++++++++++++++++- .../androidaps/plugins/Loop/LoopPlugin.java | 106 +++++++---- .../OpenAPSAMA/DetermineBasalResultAMA.java | 13 +- .../plugins/OpenAPSAMA/OpenAPSAMAPlugin.java | 11 -- .../OpenAPSMA/DetermineBasalResultMA.java | 14 +- .../plugins/OpenAPSMA/OpenAPSMAPlugin.java | 10 -- .../OpenAPSSMB/DetermineBasalResultSMB.java | 18 +- .../plugins/OpenAPSSMB/OpenAPSSMBPlugin.java | 10 -- app/src/test/java/info/AAPSMocker.java | 24 ++- .../interfaces/ConstraintsCheckerTest.java | 4 +- .../Dialogs/NewNSTreatmentDialogTest.java | 2 +- .../ConstraintsSafety/SafetyPluginTest.java | 4 +- .../plugins/Loop/APSREsultTest.java | 168 +++++++++++++++++ 15 files changed, 473 insertions(+), 149 deletions(-) create mode 100644 app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSREsultTest.java diff --git a/app/src/main/java/info/nightscout/androidaps/db/TemporaryBasal.java b/app/src/main/java/info/nightscout/androidaps/db/TemporaryBasal.java index 7fdc7ac117..09331a52ce 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/TemporaryBasal.java +++ b/app/src/main/java/info/nightscout/androidaps/db/TemporaryBasal.java @@ -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 "; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPlugin.java index 9dd6665b4d..59f44c77c7 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPlugin.java @@ -126,7 +126,7 @@ public class SafetyPlugin extends PluginBase implements ConstraintsInterface { PumpInterface pump = MainApp.getConfigBuilder().getActivePump(); // check for pump max - if (pump != null) { + 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); } @@ -151,6 +151,7 @@ public class SafetyPlugin extends PluginBase implements ConstraintsInterface { percentRate.copyReasons(absoluteConstraint); PumpInterface pump = MainApp.getConfigBuilder().getActivePump(); + Integer percentRateAfterConst = Double.valueOf(absoluteConstraint.value() / currentBasal * 100).intValue(); if (pump != null) { if (percentRateAfterConst < 100) @@ -161,6 +162,11 @@ public class SafetyPlugin extends PluginBase implements ConstraintsInterface { 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; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java index 8ea19fe8a7..374bfbcd1d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java @@ -15,11 +15,16 @@ 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; /** @@ -31,6 +36,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 +50,37 @@ public class APSResult { public Constraint inputConstraints; public Constraint rateConstraint; + public Constraint percentConstraint; public Constraint 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; + } + + @Override public String toString() { final PumpInterface pump = ConfigBuilderPlugin.getActivePump(); @@ -55,6 +91,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 +120,10 @@ public class APSResult { ret = MainApp.gs(R.string.canceltemp) + "
"; else if (rate == -1) ret = MainApp.gs(R.string.let_temp_basal_run) + "
"; + else if (usePercent) + ret = "" + MainApp.gs(R.string.rate) + ": " + DecimalFormatter.to2Decimal(percent) + "% " + + "(" + DecimalFormatter.to2Decimal(percent * pump.getBaseBasalRate() / 100d) + " U/h)
" + + "" + MainApp.gs(R.string.duration) + ": " + DecimalFormatter.to2Decimal(duration) + " min
"; else ret = "" + MainApp.gs(R.string.rate) + ": " + DecimalFormatter.to2Decimal(rate) + " U/h " + "(" + DecimalFormatter.to2Decimal(rate / pump.getBaseBasalRate() * 100) + "%)
" + @@ -101,21 +145,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 = new String(reason); 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 +284,112 @@ public class APSResult { } public boolean isChangeRequested() { - return tempBasalRequested || bolusRequested; + Constraint 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 percentToBeSmallChange = 30; + percentToBeSmallChange /= 100; + double change = rate / activeTemp.tempBasalConvertedToAbsolute(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; + } } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java index c9fdb45f86..832e095e81 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java @@ -40,6 +40,7 @@ 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 +52,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 +60,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; /** @@ -148,8 +151,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. *

- * 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 +306,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 +358,7 @@ public class LoopPlugin extends PluginBase { Constraint 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 +401,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) @@ -466,8 +477,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 +493,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 +516,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); + } } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalResultAMA.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalResultAMA.java index 7d57f52efb..77c8d8a860 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalResultAMA.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalResultAMA.java @@ -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; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java index d9c577dd42..413b75cd1a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java @@ -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]; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/DetermineBasalResultMA.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/DetermineBasalResultMA.java index 3f0e9abea9..d3e1869f87 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/DetermineBasalResultMA.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/DetermineBasalResultMA.java @@ -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; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAPlugin.java index b310c3e2b5..954204e47a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAPlugin.java @@ -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; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalResultSMB.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalResultSMB.java index bd41120e30..364731bea5 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalResultSMB.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalResultSMB.java @@ -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; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBPlugin.java index 4445c46a04..9390b9b588 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBPlugin.java @@ -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]; diff --git a/app/src/test/java/info/AAPSMocker.java b/app/src/test/java/info/AAPSMocker.java index e52d61169b..d2e7c02e17 100644 --- a/app/src/test/java/info/AAPSMocker.java +++ b/app/src/test/java/info/AAPSMocker.java @@ -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,13 @@ public class AAPSMocker { when(ConfigBuilderPlugin.getCommandQueue()).thenReturn(queue); } - public static void mockTreatmentService() throws Exception { + public static TreatmentsPlugin mockTreatmentPlugin() throws Exception { TreatmentService treatmentService = PowerMockito.mock(TreatmentService.class); + PowerMockito.mockStatic(TreatmentsPlugin.class); TreatmentsPlugin treatmentsPlugin = PowerMockito.mock(TreatmentsPlugin.class); PowerMockito.whenNew(TreatmentService.class).withNoArguments().thenReturn(treatmentService); when(TreatmentsPlugin.getPlugin()).thenReturn(treatmentsPlugin); + return treatmentsPlugin; } public static Profile getValidProfile() { @@ -193,6 +191,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() { diff --git a/app/src/test/java/info/nightscout/androidaps/interfaces/ConstraintsCheckerTest.java b/app/src/test/java/info/nightscout/androidaps/interfaces/ConstraintsCheckerTest.java index 8fc02d07d2..205ceed465 100644 --- a/app/src/test/java/info/nightscout/androidaps/interfaces/ConstraintsCheckerTest.java +++ b/app/src/test/java/info/nightscout/androidaps/interfaces/ConstraintsCheckerTest.java @@ -156,7 +156,7 @@ public class ConstraintsCheckerTest { // Apply all limits Constraint d = constraintChecker.getMaxBasalAllowed(AAPSMocker.getValidProfile()); Assert.assertEquals(0.8d, d.value()); - Assert.assertEquals(7, d.getReasonList().size()); + 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 i = constraintChecker.getMaxBasalPercentAllowed(AAPSMocker.getValidProfile()); Assert.assertEquals((Integer) 100, i.value()); - Assert.assertEquals(10, i.getReasonList().size()); // 7x 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()); } diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialogTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialogTest.java index 23be73838a..8a11b51667 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialogTest.java +++ b/app/src/test/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialogTest.java @@ -67,7 +67,7 @@ public class NewNSTreatmentDialogTest { AAPSMocker.mockApplicationContext(); AAPSMocker.mockStrings(); PowerMockito.mockStatic(NSUpload.class); - AAPSMocker.mockTreatmentService(); + AAPSMocker.mockTreatmentPlugin(); AAPSMocker.mockBus(); AAPSMocker.mockDatabaseHelper(); diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPluginTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPluginTest.java index 086b3082c1..ae350c4fe6 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPluginTest.java +++ b/app/src/test/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPluginTest.java @@ -112,8 +112,7 @@ public class SafetyPluginTest { Assert.assertEquals("Safety: Limiting basal rate to 1.00 U/h because of max value in preferences\n" + "Safety: Limiting basal rate to 4.00 U/h because of max basal multiplier\n" + "Safety: Limiting basal rate to 3.00 U/h because of max daily basal multiplier\n" + - "Safety: Limiting basal rate to 2.00 U/h because of hard limit\n" + - "Safety: Limiting basal rate to 500.00 U/h because of pump limit", c.getReasons()); + "Safety: Limiting basal rate to 2.00 U/h because of hard limit", c.getReasons()); Assert.assertEquals("Safety: Limiting basal rate to 1.00 U/h because of max value in preferences", c.getMostLimitedReasons()); } @@ -145,7 +144,6 @@ public class SafetyPluginTest { "Safety: Limiting basal rate to 4.00 U/h because of max basal multiplier\n" + "Safety: Limiting basal rate to 3.00 U/h because of max daily basal multiplier\n" + "Safety: Limiting basal rate to 2.00 U/h because of hard limit\n" + - "Safety: Limiting basal rate to 500.00 U/h because of pump limit\n" + "Safety: Limiting percent rate to 100% because of pump limit", i.getReasons()); Assert.assertEquals("Safety: Limiting percent rate to 100% because of pump limit", i.getMostLimitedReasons()); } diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSREsultTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSREsultTest.java new file mode 100644 index 0000000000..d134b71e79 --- /dev/null +++ b/app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSREsultTest.java @@ -0,0 +1,168 @@ +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.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.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.SP; + +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}) +public class APSREsultTest { + VirtualPumpPlugin virtualPumpPlugin; + TreatmentsPlugin treatmentsPlugin; + Constraint 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()); + + } + + + @Before + public void prepareMock() throws Exception { + AAPSMocker.mockMainApp(); + AAPSMocker.mockConfigBuilder(); + AAPSMocker.mockSP(); + AAPSMocker.mockStrings(); + AAPSMocker.mockBus(); + AAPSMocker.mockProfileFunctions(); + treatmentsPlugin = AAPSMocker.mockTreatmentPlugin(); + ConstraintChecker constraintChecker = AAPSMocker.mockConstraintsChecker(); + + virtualPumpPlugin = VirtualPumpPlugin.getPlugin(); + when(ConfigBuilderPlugin.getActivePump()).thenReturn(virtualPumpPlugin); + + when(constraintChecker.isClosedLoopAllowed()).thenReturn(closedLoopEnabled); + } +} From 6f5332af0ac1d9b073dcf39f73fcfb2b8d1b2fb2 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Tue, 4 Sep 2018 20:42:33 +0200 Subject: [PATCH 18/41] Omnipod max tbr 30U --- .../nightscout/androidaps/plugins/PumpCommon/defs/PumpType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index be759548e0..1ab285fb27 100644 --- 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 @@ -87,7 +87,7 @@ public enum PumpType { Insulet_Omnipod("Insulet Omnipod", 0.05d, null, // new DoseSettings(0.05d, 30, 8*60, 0.05d), // PumpTempBasalType.Absolute, // - new DoseSettings(0.05d, 30, 12*60, 0d, 5.0d), PumpCapability.BasalRate_Duration30minAllowed, // cannot exceed max basal rate 30u/hr + new DoseSettings(0.05d, 30, 12*60, 0d, 30.0d), PumpCapability.BasalRate_Duration30minAllowed, // cannot exceed max basal rate 30u/hr 0.05d, 0.05d, null, PumpCapability.VirtualPumpCapabilities), // Medtronic From 1ede3df6270886887a1c17152cad36443c790e42 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Tue, 4 Sep 2018 20:50:42 +0200 Subject: [PATCH 19/41] fix tests --- app/src/test/java/info/AAPSMocker.java | 9 ++++++--- .../Careportal/Dialogs/NewNSTreatmentDialogTest.java | 2 +- .../androidaps/plugins/Loop/APSREsultTest.java | 1 + 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/src/test/java/info/AAPSMocker.java b/app/src/test/java/info/AAPSMocker.java index d2e7c02e17..15bab41e2b 100644 --- a/app/src/test/java/info/AAPSMocker.java +++ b/app/src/test/java/info/AAPSMocker.java @@ -155,15 +155,18 @@ public class AAPSMocker { when(ConfigBuilderPlugin.getCommandQueue()).thenReturn(queue); } - public static TreatmentsPlugin mockTreatmentPlugin() throws Exception { - TreatmentService treatmentService = PowerMockito.mock(TreatmentService.class); + public static TreatmentsPlugin mockTreatmentPlugin() { PowerMockito.mockStatic(TreatmentsPlugin.class); TreatmentsPlugin treatmentsPlugin = PowerMockito.mock(TreatmentsPlugin.class); - PowerMockito.whenNew(TreatmentService.class).withNoArguments().thenReturn(treatmentService); when(TreatmentsPlugin.getPlugin()).thenReturn(treatmentsPlugin); return treatmentsPlugin; } + public static void mockTreatmentService() throws Exception { + TreatmentService treatmentService = PowerMockito.mock(TreatmentService.class); + PowerMockito.whenNew(TreatmentService.class).withNoArguments().thenReturn(treatmentService); + } + public static Profile getValidProfile() { try { if (profile == null) diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialogTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialogTest.java index 8a11b51667..23be73838a 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialogTest.java +++ b/app/src/test/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialogTest.java @@ -67,7 +67,7 @@ public class NewNSTreatmentDialogTest { AAPSMocker.mockApplicationContext(); AAPSMocker.mockStrings(); PowerMockito.mockStatic(NSUpload.class); - AAPSMocker.mockTreatmentPlugin(); + AAPSMocker.mockTreatmentService(); AAPSMocker.mockBus(); AAPSMocker.mockDatabaseHelper(); diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSREsultTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSREsultTest.java index d134b71e79..83a8e6a69a 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSREsultTest.java +++ b/app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSREsultTest.java @@ -157,6 +157,7 @@ public class APSREsultTest { AAPSMocker.mockStrings(); AAPSMocker.mockBus(); AAPSMocker.mockProfileFunctions(); + AAPSMocker.mockTreatmentService(); treatmentsPlugin = AAPSMocker.mockTreatmentPlugin(); ConstraintChecker constraintChecker = AAPSMocker.mockConstraintsChecker(); From f3a4f883a41f87813b8a342bfa180b7bb114b901 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Tue, 4 Sep 2018 21:51:13 +0200 Subject: [PATCH 20/41] fix tests --- .../info/nightscout/androidaps/plugins/Loop/APSREsultTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSREsultTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSREsultTest.java index 83a8e6a69a..a47010d06d 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSREsultTest.java +++ b/app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSREsultTest.java @@ -158,6 +158,7 @@ public class APSREsultTest { AAPSMocker.mockBus(); AAPSMocker.mockProfileFunctions(); AAPSMocker.mockTreatmentService(); + AAPSMocker.mockL(); treatmentsPlugin = AAPSMocker.mockTreatmentPlugin(); ConstraintChecker constraintChecker = AAPSMocker.mockConstraintsChecker(); From e36499f9d45040d4447c1dafb6677411d984a217 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Tue, 4 Sep 2018 22:08:35 +0200 Subject: [PATCH 21/41] more tests --- .../androidaps/plugins/Loop/APSResult.java | 8 ++++--- .../plugins/Loop/APSREsultTest.java | 23 ++++++++++++++++++- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java index 374bfbcd1d..cd7c0b9a0e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java @@ -68,18 +68,20 @@ public class APSResult { 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() { @@ -151,7 +153,7 @@ public class APSResult { protected void doClone(APSResult newResult) { newResult.date = date; - newResult.reason = new String(reason); + newResult.reason = reason != null ? new String(reason) : null; newResult.rate = rate; newResult.duration = duration; newResult.tempBasalRequested = tempBasalRequested; diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSREsultTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSREsultTest.java index a47010d06d..5dcefc2f8f 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSREsultTest.java +++ b/app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSREsultTest.java @@ -14,18 +14,20 @@ 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.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}) +@PrepareForTest({MainApp.class, ConfigBuilderPlugin.class, SP.class, Context.class, ProfileFunctions.class, TreatmentsPlugin.class, L.class}) public class APSREsultTest { VirtualPumpPlugin virtualPumpPlugin; TreatmentsPlugin treatmentsPlugin; @@ -148,6 +150,25 @@ public class APSREsultTest { } + @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 { From 5499396661996aa105a383663711de176bdab9be Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Tue, 4 Sep 2018 22:26:59 +0200 Subject: [PATCH 22/41] fix NPE --- .../java/info/nightscout/androidaps/services/DataService.java | 4 ++++ 1 file changed, 4 insertions(+) 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 6edd49c0ed..cfc564770d 100644 --- a/app/src/main/java/info/nightscout/androidaps/services/DataService.java +++ b/app/src/main/java/info/nightscout/androidaps/services/DataService.java @@ -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); From a8bed0096da33ccf43da89c279c98170727728b9 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Tue, 4 Sep 2018 22:34:36 +0200 Subject: [PATCH 23/41] fix NPE --- .../fragments/TreatmentsProfileSwitchFragment.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsProfileSwitchFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsProfileSwitchFragment.java index 2449dff52e..0edc704eb6 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsProfileSwitchFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsProfileSwitchFragment.java @@ -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); From 65f7f9cbfb0c514ce45b1584776799801330e314 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 6 Sep 2018 07:41:29 +0200 Subject: [PATCH 24/41] New Crowdin translations (#1389) * New translations strings.xml (Slovak) * New translations strings.xml (Swedish) --- app/src/main/res/values-sk/strings.xml | 12 ++++++++++++ app/src/main/res/values-sv/strings.xml | 16 ++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index d22e9e1f49..4a49dd6683 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -459,6 +459,7 @@ Úprava cieľovej glykémie pomocou automatickej detekcie citlivosti Štandardná hodnota: zapnuté\nToto nastavenie hovorí, že automatická detekcia citlivosti môže meniť tiež cieľové hodnoty glykémií. Š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). + Š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. 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ť. Povolené iba číslice. Povolené iba čísla v rozsahu %1$s - %2$s. @@ -897,6 +898,7 @@ Bazál nastavený správne Bazál obmedzený na %1$d%%: %2$s Bolus obmedzený na %1$.1f U: %2$s + Predĺžený bolus obmedzený na %1$.1f U: %2$s Max IOB obmedzený na %1$.1f U: %2$s Sacharidy obmedzené na %1$d g: %2$s IOB obmedzený na %1$.1f U: %2$s @@ -928,6 +930,7 @@ Sprievodca nastavením Dokončiť Vyberte jazyk + Požadované: %1$.2fU Podané: %2$.2fU Chyba: %3$s Prvý prídavok inzulínu Druhý prídavok inzulínu Tretí prídavok inzulínu @@ -947,6 +950,10 @@ Max násobiteľ denného najvyššieho bazálu Max násobiteľ súčasného bazálu --- + Typ virtuálnej pumpy + Definícia pumpy + 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 + * Rozdielne hodnoty podľa rozsahu nie sú podporované. Automatické doplňovanie glykémií z NS Nastavenie wizardu Kalkulácia použitá vo výsledku wizardu: @@ -1037,6 +1044,11 @@ Spolu Kalk Overovanie + Odošlite dnešné súbory protokolov vývojárom spolu s týmto časom. Neočakávaná situácia. + Prekročený maximálny bolus + Chyba príkazu + Chyba rýchlosti + Prekročený limit inzulínu %1$d deň %1$d dní diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 7b000a1cf9..72545b8d32 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -458,6 +458,7 @@ Autosens justerar även mål-BG Standardvärde: sant. Detta för att tillåta autosens justera mål-BG utöver ISF och basaler. 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). + 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. 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. Endast siffror tillåtna. Endast siffror mellan %1$s - %2$s är tillåtna. @@ -896,6 +897,7 @@ Basal justerad korrekt Begränsar max procent hastighet till %1$d%% pga %2$s Begränsar bolus till %1$.1f enheter pga %2$s + Begränsar bolus till %1$.1f enheter pga %2$s Begränsar max IOB till %1$.1f pga %2$s Begränsar kolhydrater till %1$d g pga %2$s Begränsar IOB till %1$.1f pga %2$s @@ -927,6 +929,7 @@ Installationsguide Avsluta Välj språk + Angivet: %1$.2f enheter. Levererat: %2$.2f enheter. Felkod: %3$s Första snabbknabben för insulin Andra snabbknabben för insulin Tredje snabbknabben för insulin @@ -946,6 +949,10 @@ Multiplikator för max daglig basal (max_daily) Multiplikator för nuvarande basal (max_current) - + Typ av virtuell pump + Pumpdefinition + 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 + * Den virtuella pumpen kräver fasta värden för basal/bolus. Auto Backfill BG Kalkylatorinställningar Kalkyler inkluderade i resultatet @@ -1032,6 +1039,15 @@ AS Version %1$s tillgänglig Tidsförskjutning + Föredraget APS-läge + Total + Kalkyl + Handskakning + Skicka dagens loggfiler till utvecklarna tillsammans med denna datumstämpel. Oväntad situation. + Max bolus nådd + Kommandofel + Felaktig hastighet + Insulingräns nådd %1$d dag %1$d dagar From abea2f30bbfcbd9fe7cab210276f2b6a1bda614c Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 6 Sep 2018 07:45:52 +0200 Subject: [PATCH 25/41] typo --- .../plugins/Loop/{APSREsultTest.java => APSResultTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename app/src/test/java/info/nightscout/androidaps/plugins/Loop/{APSREsultTest.java => APSResultTest.java} (99%) diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSREsultTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSResultTest.java similarity index 99% rename from app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSREsultTest.java rename to app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSResultTest.java index 5dcefc2f8f..1505004535 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSREsultTest.java +++ b/app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSResultTest.java @@ -28,7 +28,7 @@ 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 { +public class APSResultTest { VirtualPumpPlugin virtualPumpPlugin; TreatmentsPlugin treatmentsPlugin; Constraint closedLoopEnabled = new Constraint<>(false); From e4f95c7a4e4e65a209b7b31911594612b7776297 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 6 Sep 2018 11:18:15 +0200 Subject: [PATCH 26/41] more logging for bucketed data --- .../nightscout/androidaps/db/BgReading.java | 5 + .../IobCobCalculatorPlugin.java | 16 ++- .../IobCobCalculatorPluginTest.java | 134 +++++++++++++++++- 3 files changed, 145 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/db/BgReading.java b/app/src/main/java/info/nightscout/androidaps/db/BgReading.java index 64837a60cc..a2e06d0bb1 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/BgReading.java +++ b/app/src/main/java/info/nightscout/androidaps/db/BgReading.java @@ -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; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java index f067b69670..22c269d8c9 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java @@ -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(); } diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/IobCobCalculatorPlugin/IobCobCalculatorPluginTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/IobCobCalculatorPlugin/IobCobCalculatorPluginTest.java index d89e637557..c68e7f3919 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/IobCobCalculatorPlugin/IobCobCalculatorPluginTest.java +++ b/app/src/test/java/info/nightscout/androidaps/plugins/IobCobCalculatorPlugin/IobCobCalculatorPluginTest.java @@ -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 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 From ecae6af151a4b9aed93645510ee73f2c0764e5de Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 6 Sep 2018 16:30:57 +0200 Subject: [PATCH 27/41] reset autosens on profileswitch with zero duration --- .../androidaps/db/CareportalEvent.java | 1 - .../androidaps/db/DatabaseHelper.java | 18 +++++++++++++++ .../androidaps/db/ProfileSwitch.java | 22 +++++++++++++++++++ .../Sensitivity/SensitivityAAPSPlugin.java | 8 +++++++ .../Sensitivity/SensitivityOref0Plugin.java | 8 +++++++ .../Sensitivity/SensitivityOref1Plugin.java | 8 +++++++ .../SensitivityWeightedAveragePlugin.java | 8 +++++++ 7 files changed, 72 insertions(+), 1 deletion(-) 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 e6098cee54..60c7553cc3 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java +++ b/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java @@ -144,7 +144,6 @@ public class CareportalEvent implements DataPointWithLabelInterface, Interval { return true; } } - //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 742f767cec..a7ca159794 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java +++ b/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java @@ -1434,6 +1434,24 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { return new ArrayList<>(); } + public List getProfileSwitchEventsFromTime(long mills, boolean ascending) { + try { + Dao daoProfileSwitch = getDaoProfileSwitch(); + List profileSwitches; + QueryBuilder queryBuilder = daoProfileSwitch.queryBuilder(); + queryBuilder.orderBy("date", ascending); + queryBuilder.limit(100L); + Where where = queryBuilder.where(); + where.ge("date", mills); + PreparedQuery 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; diff --git a/app/src/main/java/info/nightscout/androidaps/db/ProfileSwitch.java b/app/src/main/java/info/nightscout/androidaps/db/ProfileSwitch.java index f003976d8f..0527864fd2 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/ProfileSwitch.java +++ b/app/src/main/java/info/nightscout/androidaps/db/ProfileSwitch.java @@ -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 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 -------------------- diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityAAPSPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityAAPSPlugin.java index 993a51edf8..432420df85 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityAAPSPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityAAPSPlugin.java @@ -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 siteChanges = MainApp.getDbHelper().getCareportalEventsFromTime(fromTime, CareportalEvent.SITECHANGE, true); + List profileSwitches = MainApp.getDbHelper().getProfileSwitchEventsFromTime(fromTime, true); List 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 diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityOref0Plugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityOref0Plugin.java index de0e9c9c0c..53a8be8661 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityOref0Plugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityOref0Plugin.java @@ -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 siteChanges = MainApp.getDbHelper().getCareportalEventsFromTime(fromTime, CareportalEvent.SITECHANGE, true); + List profileSwitches = MainApp.getDbHelper().getProfileSwitchEventsFromTime(fromTime, true); List 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 diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityOref1Plugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityOref1Plugin.java index 06656617c5..7d91c7fc4a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityOref1Plugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityOref1Plugin.java @@ -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 siteChanges = MainApp.getDbHelper().getCareportalEventsFromTime(fromTime, CareportalEvent.SITECHANGE, true); + List profileSwitches = MainApp.getDbHelper().getProfileSwitchEventsFromTime(fromTime, true); List 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 diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityWeightedAveragePlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityWeightedAveragePlugin.java index 95b027a86c..2aeb26bd1a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityWeightedAveragePlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityWeightedAveragePlugin.java @@ -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 siteChanges = MainApp.getDbHelper().getCareportalEventsFromTime(fromTime, CareportalEvent.SITECHANGE, true); + List 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 From 4165a178d43472288cbd06378e5c1853d3459632 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 7 Sep 2018 08:26:12 +0200 Subject: [PATCH 28/41] New translations strings.xml (Bulgarian) --- app/src/main/res/values-bg/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 4027711b66..4144b0f163 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -897,6 +897,7 @@ Базалът е зададен коректно Ограничаване на максималната процентна стойност до %1$d%% поради %2$s Ограничаване на болус до %1$.1f Е поради %2$s + Ограничение на удължен болус до %1$.1f Е поради %2$s Ограничаване на макс. IOB до %1$.1f Е поради %2$s Ограничаване на въглехидрати до %1$d гр. поради %2$s Ограничаване на IOB до %1$.1f Е поради %2$s From 6f4eea000342a2b962a4c0aa590b5360007468ba Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 7 Sep 2018 13:10:12 +0200 Subject: [PATCH 29/41] gradle 4.6 --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b4740f44a7..c25a2b3e46 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -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 From 0edc79e5897d9c40bd9f4e3781c9909a30588203 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sun, 9 Sep 2018 09:51:01 +0200 Subject: [PATCH 30/41] New translations strings.xml (Russian) --- app/src/main/res/values-ru/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 34628156f2..812efd9635 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -897,6 +897,7 @@ Базал задан корректно Макс процент базала ограничен до %1$d%% ед/ч вследствие %2$s Макс уровень болюса ограничен до %1$.1f ед вследствие %2$s + Ограничение расширенного болюса до %1$.1f U из-за %2$s Ограничение максимума активного инсулина IOB до %1$.1f U из-за %2$s Ограничение максимума углеводов до %1$d грамм из-за %2$s Ограничение активного инсулина IOB до %1$.1f ед. из-за %2$s From e577e8555da8b19f40b564932aa4b9d86f0881ce Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sun, 9 Sep 2018 12:15:44 +0200 Subject: [PATCH 31/41] openloop mode min change threshold configurable --- .../androidaps/plugins/Loop/APSResult.java | 9 +++--- .../androidaps/plugins/Loop/LoopPlugin.java | 3 +- app/src/main/res/values/strings.xml | 3 ++ app/src/main/res/xml/pref_closedmode.xml | 14 --------- app/src/main/res/xml/pref_loop.xml | 31 +++++++++++++++++++ .../plugins/Loop/LoopPluginTest.java | 2 +- 6 files changed, 41 insertions(+), 21 deletions(-) delete mode 100644 app/src/main/res/xml/pref_closedmode.xml create mode 100644 app/src/main/res/xml/pref_loop.xml diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java index cd7c0b9a0e..f886524dfb 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java @@ -26,6 +26,7 @@ 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. @@ -377,11 +378,11 @@ public class APSResult { } // report change bigger than 30% if (activeTemp != null) { - double percentToBeSmallChange = 30; - percentToBeSmallChange /= 100; + double percentMinChangeChange = SP.getDouble(R.string.key_loop_openmode_min_change, 30d); + percentMinChangeChange /= 100; double change = rate / activeTemp.tempBasalConvertedToAbsolute(now, profile); - double lowThreshold = 1 - percentToBeSmallChange; - double highThreshold = 1 + percentToBeSmallChange; + double lowThreshold = 1 - percentMinChangeChange; + double highThreshold = 1 + percentMinChangeChange; if (change < lowThreshold || change > highThreshold) { if (L.isEnabled(L.APS)) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java index 832e095e81..6081845d32 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java @@ -33,7 +33,6 @@ 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; @@ -106,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); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1330771548..0354ca5e12 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1200,6 +1200,9 @@ Command error Speed error Insulin limit violation + loop_openmode_min_change + Minimal request change [%] + Loop will popup new change request only if change is bigger than this value. Default value is 30% %1$d day diff --git a/app/src/main/res/xml/pref_closedmode.xml b/app/src/main/res/xml/pref_closedmode.xml deleted file mode 100644 index 7d33941885..0000000000 --- a/app/src/main/res/xml/pref_closedmode.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/xml/pref_loop.xml b/app/src/main/res/xml/pref_loop.xml new file mode 100644 index 0000000000..5f22ce439a --- /dev/null +++ b/app/src/main/res/xml/pref_loop.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/Loop/LoopPluginTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/Loop/LoopPluginTest.java index 4a457651ce..0a37ba5df5 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/Loop/LoopPluginTest.java +++ b/app/src/test/java/info/nightscout/androidaps/plugins/Loop/LoopPluginTest.java @@ -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)); From 3c8b7f10bec68fb872248f39451ef161ac7e4c15 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sun, 9 Sep 2018 12:22:23 +0200 Subject: [PATCH 32/41] fix NPE --- .../plugins/NSClientInternal/services/NSClientService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java index 7e706af9b7..2066aaa423 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java @@ -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 From 0552a3f1eda704a02cc036b7f178db260d4cf649 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sun, 9 Sep 2018 12:24:03 +0200 Subject: [PATCH 33/41] 2.0g-dev --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 5dbea71e3a..1f86c015dd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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() + '"' From 7bf17a1f5c5221aa80feac6bac48c9ecee21a152 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sun, 9 Sep 2018 12:56:48 +0200 Subject: [PATCH 34/41] fix test --- .../nightscout/androidaps/plugins/Loop/APSResultTest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSResultTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSResultTest.java index 1505004535..d5fe95c49d 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSResultTest.java +++ b/app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSResultTest.java @@ -6,6 +6,7 @@ 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; @@ -23,6 +24,8 @@ 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; @@ -187,5 +190,8 @@ public class APSResultTest { when(ConfigBuilderPlugin.getActivePump()).thenReturn(virtualPumpPlugin); when(constraintChecker.isClosedLoopAllowed()).thenReturn(closedLoopEnabled); + + Mockito.when(SP.getDouble(anyInt(), anyDouble())).thenReturn(30d); + } } From 640a7d3b87cbb27b52a6d61c16287b6e77d9d63e Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sun, 9 Sep 2018 13:13:34 +0200 Subject: [PATCH 35/41] fix NPE --- .../androidaps/db/DatabaseHelper.java | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) 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 a7ca159794..b7714f0c05 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java +++ b/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java @@ -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; @@ -1571,23 +1572,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; } } From c380b3dcc73381c4912f495ef2411d365fd43d68 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sun, 9 Sep 2018 22:08:26 +0200 Subject: [PATCH 36/41] catch exception in LoggingBus --- .../java/com/squareup/otto/LoggingBus.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/squareup/otto/LoggingBus.java b/app/src/main/java/com/squareup/otto/LoggingBus.java index 9a4d771dbb..d9758a9a24 100644 --- a/app/src/main/java/com/squareup/otto/LoggingBus.java +++ b/app/src/main/java/com/squareup/otto/LoggingBus.java @@ -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: "); } - if (everyMinute < System.currentTimeMillis()) { - log.debug("***************** Event -> receiver pairings seen so far ****************"); - for (Map.Entry> 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> 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); From 6f53afbbe3ef79cddccb23f8a951360f83391e9a Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Mon, 10 Sep 2018 12:23:24 +0200 Subject: [PATCH 37/41] Objectives: remove static code, cleanup --- .../ConstraintsObjectives/ObjectivesFragment.java | 14 +++++++------- .../ConstraintsObjectives/ObjectivesPlugin.java | 12 ++++++------ .../objectives/Objective.java | 7 ++++--- .../objectives/Objective1.java | 4 ++-- .../objectives/Objective2.java | 13 ++++++++----- .../objectives/Objective4.java | 3 ++- .../objectives/Objective5.java | 3 ++- .../objectives/Objective6.java | 3 ++- .../objectives/Objective7.java | 3 ++- .../objectives/Objective8.java | 3 ++- .../androidaps/plugins/Loop/LoopPlugin.java | 4 ++-- .../NSClientInternal/data/NSDeviceStatus.java | 8 ++++---- .../plugins/Source/SourceNSClientPlugin.java | 4 ++-- 13 files changed, 45 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java index 3e33b9e926..3dcec0920f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java @@ -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 { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesPlugin.java index 1d3520ebf7..e675adee69 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesPlugin.java @@ -37,10 +37,10 @@ public class ObjectivesPlugin extends PluginBase implements ConstraintsInterface private static ObjectivesPlugin objectivesPlugin; - public static List objectives = new ArrayList<>(); - public static boolean bgIsAvailableInNS = false; - public static boolean pumpStatusIsAvailableInNS = false; - public static Integer manualEnacts = 0; + public List 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 getObjectives() { + public List getObjectives() { return objectives; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective.java index bba29c5201..5127f64b34 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective.java @@ -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); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective1.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective1.java index e374126b11..d1f4f3ebd7 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective1.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective1.java @@ -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) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective2.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective2.java index 305f00ec6f..ac5485f953 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective2.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective2.java @@ -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 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; } }); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective4.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective4.java index 36a98babc1..4cac10e514 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective4.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective4.java @@ -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 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() { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective5.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective5.java index 563a114e05..8472f26c6c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective5.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective5.java @@ -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 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() { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective6.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective6.java index 7106d7522b..7867b28e70 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective6.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective6.java @@ -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 tasks) { - tasks.add(new MinimumDurationTask(7L * 24L * 60L * 60L * 1000L)); + tasks.add(new MinimumDurationTask(T.days(7).msecs())); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective7.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective7.java index cfd041bf13..670cffe746 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective7.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective7.java @@ -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 tasks) { - tasks.add(new MinimumDurationTask(28L * 24L * 60L * 60L * 1000L)); + tasks.add(new MinimumDurationTask(T.days(28).msecs())); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective8.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective8.java index 376d5fb7a2..9ac4f9b6d7 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective8.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective8.java @@ -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 tasks) { - tasks.add(new MinimumDurationTask(28L * 24L * 60L * 60L * 1000L)); + tasks.add(new MinimumDurationTask(T.days(28).msecs())); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java index 6081845d32..9a2a72746e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java @@ -464,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()); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSDeviceStatus.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSDeviceStatus.java index db9727822e..b48319f979 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSDeviceStatus.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSDeviceStatus.java @@ -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(); } } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceNSClientPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceNSClientPlugin.java index 9f222d935e..7470710d8c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceNSClientPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceNSClientPlugin.java @@ -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) { From 0f2a620ebe2773712c88b5640c2f058c1ac4e064 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Mon, 10 Sep 2018 12:41:57 +0200 Subject: [PATCH 38/41] fix NewInsulinDialog message --- .../androidaps/plugins/Overview/Dialogs/NewInsulinDialog.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewInsulinDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewInsulinDialog.java index 1fad80af8f..6040680aaf 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewInsulinDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewInsulinDialog.java @@ -218,13 +218,13 @@ public class NewInsulinDialog extends DialogFragment implements OnClickListener List actions = new LinkedList<>(); if (insulin > 0) { - actions.add(MainApp.gs(R.string.bolus) + ": " + "" + insulinAfterConstraints + "U" + ""); + actions.add(MainApp.gs(R.string.bolus) + ": " + "" + DecimalFormatter.to2Decimal(insulinAfterConstraints) + "U" + ""); if (recordOnlyCheckbox.isChecked()) { actions.add("" + MainApp.gs(R.string.bolusrecordedonly) + ""); } } - if (!insulinAfterConstraints.equals(insulin)) + if (Math.abs(insulinAfterConstraints - insulin) > 0.01d) actions.add("" + MainApp.gs(R.string.bolusconstraintapplied) + ""); int eatingSoonTTDuration = SP.getInt(R.string.key_eatingsoon_duration, Constants.defaultEatingSoonTTDuration); From 90cae60f9be6caf8e03e2c387c50153571ed0aaa Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Mon, 10 Sep 2018 13:03:36 +0200 Subject: [PATCH 39/41] New Crowdin translations (#1403) --- app/src/main/res/values-bg/strings.xml | 2 + app/src/main/res/values-he/strings.xml | 12 + app/src/main/res/values-ko/strings.xml | 292 +++++++++++++------------ app/src/main/res/values-pt/strings.xml | 69 +++++- app/src/main/res/values-ru/strings.xml | 2 + 5 files changed, 231 insertions(+), 146 deletions(-) create mode 100644 app/src/main/res/values-he/strings.xml diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 4144b0f163..c630588858 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -1049,6 +1049,8 @@ Грешка при команда Скорост грешка Нарушение на макс дневен инсулин + Минимална стойност за промяна [%] + AndroidAPS ще покаже запитването за промяна на базала само ако е по-голямо от тази стойност.(Стандартно 30%) %1$d дeн %1$d дни diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml new file mode 100644 index 0000000000..24003c9946 --- /dev/null +++ b/app/src/main/res/values-he/strings.xml @@ -0,0 +1,12 @@ + + + + רענן טיפול מ-Nightscout + השתמש בבולוס מורחב של 200% + בבקשה אתחל את הסמרטפון שלך או תרענן את אפלקצית AndroidAPS בהגדרות המערכת +אחרת AndroidAPS לא יוכל לבצע רישום (חשוב לעקוב אחר ולוודא כי האלגוריתמים פועלים כראוי)! + מציג את ההגדרות הקבועות מראש עבור מזון המוגדר ב-Nightscout + להפעיל או לכבות את הלולאה. + מסנכרן את הנתונים שלך עם Nightscout + יבא פרופיל מ- Nightscout + diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 44872e8d35..f38b145b18 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -2,16 +2,16 @@ 관리 안전설정 - 최대 허용 식사주입인슐린 [U] + 최대 허용 Bolus [U] 최대 허용 탄수화물 [g] 설정 NS에서 관리 새로고침 데이터베이스 초기화 데이터 베이스를 정말 초기화하시겠습니까? 종료 - >200% 주입위한 확장식사주입 + >200% 주입위한 확장Bolus 사용 다나R 블루투스 - 기초주입량 절대값 사용하기 + Basal 절대값 사용하기 폰을 재부팅하거나 AndroidAPS를 재시작하세요 \n그렇지 않으면 로그 기록이 되지 않습니다.(알고리즘이 정상적인 작동하는지 확인하기 위해 로그가 필요합니다.)! 일반 기능을 빠르게 실행시킬 버튼 고급 로그 항목을 입력합니다. @@ -58,7 +58,7 @@ 인슐린활동시간(DIA): 인슐린 대 탄수화물 비율(IC): 인슐린 민감도(ISF): - 기초주입: + Basal 목표: 프로파일이 설정되지 않았습니다. 인슐린: @@ -80,12 +80,12 @@ 탄수화물 교정 U - 식사주입 IOB + Bolus IOB 지금 실행 가상 펌프 - 기본 기초주입량 - 임시기초주입 - 확장식사주입 + 기본 Basal양 + 임시Basal + 확장Bolus 배터리 인슐린 잔량 @@ -112,7 +112,7 @@ 개요 NS 프로파일 Simple 프로파일 - 임시기초 + 임시Basal 관리 가상펌프 케어포털 @@ -134,7 +134,7 @@ AndroidAPS의 Loop를 활성하기 위해서 이것을 사용하세요. APS 제약 적용 후 - 펌프에 의한 임시기초설정 + 펌프에 의한 임시Basal 설정 최근 실행 취소 @@ -142,23 +142,23 @@ 안전성 플러그인이 사용불가능 합니다 제한 위반 - 식사주입 전송 에러 - 임시기초주입 전송 에러 - 기초주입 양[%] + Bolus 주입 에러 + 임시Basal 주입 에러 + Basal값[%] % (100% = 현재) - 새 임시기초주입 적용: + 새 임시Basal 적용: 관리 계산기 제한 적용! 확인 새 Treatment 입력: - 식사주입 + Bolus Bolus: - 기초주입 + Basal Basal: 탄수화물 입력값을 변경하세요! - 새 확장식사주입 설정: + 새 확장Bolus 설정: 혈당 소스 AndroidAPS가 어디에서 데이터를 가져옵니까? xDrip @@ -176,8 +176,8 @@ NS에서 펌프상태가 확인 가능합니다. 수동 주입 제한으로 인해 LOOP가 사용불가합니다. - 기초주입 IOB - 식사주입 제한이 적용되었습니다 + Basal IOB + Bolus 제한이 적용되었습니다 탄수화물 제한이 적용되었습니다 혈당 체크 알림 @@ -189,12 +189,12 @@ CGM 센서 시작 인슐린 카트리지 교체 프로파일 변경 - 간식 주입 - 식사 주입 - 교정 주입 - 콤보 주입 - 임시 기초 시작 - 임시 기초 종료 + 간식Bolus + 식사Bolus + 교정Bolus + 콤보Bolus + 임시Basal 시작 + 임시Basal 종료 탄수화물 교정 OpenAPS 오프라인 이벤트 종류 @@ -214,8 +214,8 @@ 입력자 혈당 종류 아직 NS에서 프로파일을 로드하지 못했습니다. - 임시기초주입 - 확장식사주입 + 임시Basal + 확장 Bolus Nightscout 버전: 누락 설정이 저장되었습니다 @@ -225,9 +225,9 @@ 파일을 찾을 수 없습니다 설정 저장하기 설정 불러오기 - 임시기초주입 최대량 [U/hr] - 이 값은 OpenAPS에서 Max Basal(임시기초주입 최대량)로 설정되는 값입니다 - OpenAPS가 주입할수 있는 최대 기초주입 IOB [U] + 임시Basal 최대량 [U/hr] + 이 값은 OpenAPS에서 Max Basal(최대 Basal)로 설정되는 값입니다 + OpenAPS가 주입할수 있는 최대 Basal IOB [U] 이 값은 OpenAPS에서 Max IOB라고 부르는 값입니다\n기본값은 0으로 설정되어 있습니다. 몇일 혹은 몇주 정도 사용 후 적절한 값으로 변경할 수 있습니다. 무시 다나R @@ -244,7 +244,7 @@ 펌프 연결 에러 펌프 IOB 일 인슐린 총량 - 최근 식사주입: + 최근 Bolus: %.1f시간 전 사용할수 없는 입력 데이터 값이 제대로 설정되지 않았습니다 @@ -255,20 +255,20 @@ 성공 퍼센트 절대값 - 임시기초주입 취소하기 + 임시Basal 취소하기 SMS 통신기 결과 기다리는 중 허가된 전화번호 +XXXXXXXXXX;+YYYYYYYYYY - 식사주입 %1$.2fU 을 실행하려면 %2$s 를 입력하고 답장하세요 + Bolus %1$.2fU 을 주입하려면 %2$s 를 입력하고 답장하세요 보정값 %1$.2f을 전송하려면 %2$s 를 입력하고 답장하세요 Bolus failed - 식사주입 %.2fU이 주입되었습니다. + Bolus %.2fU이 주입되었습니다. %.2fU 주입 예정입니다. Bolus %.2fU delivered successfully %.2fU 주입중 SMS 원격 명령 사용하기 - 원격 식사주입 허용되지 않음 + 원격 Bolus 허용되지 않음 체혈 센서 수동 @@ -277,7 +277,7 @@ DanaR 프로파일 설정 인슐린활동시간(DIA) [h] 인슐린 활동 기간 - 기초주입 프로파일 갱신 실패 + Basal 프로파일 갱신 실패 새로고침 업로드중 E bolus @@ -285,15 +285,15 @@ DE bolus 에러 교체 - 기초주입 시간 + Basal 시간 혈당 탄수화물 알람 총 %1$d 기록들이 업로드되었습니다. S bolus 알람 - 기초주입 시간 - 식사주입 + Basal 시간 + Boluses 탄수화물 일일 인슐린 에러 @@ -306,28 +306,28 @@ 펌프가 바쁩니다 주입됨 정지됨 - 식사주입 중지됨 - 식사주입 중지중 + Bolus 중지됨 + Bolus 중지중 막힘 정지 정지 누름 펌프를 기다리는 중 %.2fU을 주입합니다 - 표시설정과 모니터링설정을 완료하고, 기초주입과 비율을 분석한다. + 표시설정과 모니터설정을 완료하고, Basal과 비율을 분석한다. 나이트스카우트에서 혈당 데이터가 잘 들어오는지, 펌프데이터가 업로드 되는지 확인한다. Open Loop를 시작한다. - Open Loop 모드에서 몇일간 사용하여보고, 임시기초주입을 여러번 수동으로 실행하여본다. Set up and use temporary and default temporary targets (e.g. for activity or hypo treatment carbs) - 임시기초주입 추천기능을 포함해서, Open Loop에 대해 이해한다. - 이 경험을 토대로, 최대 기초주입량을 결정하고 이를 펌프와 설정에 입력한다. + Open Loop 모드에서 몇일간 사용하여보고, 임시Basal을 여러번 수동으로 주입해 본다. 임시목표와 기본임시목표(\'식사직전\', \'활동\',\'저혈당\' 임시목표)를 설정하고 사용해 본다. + 임시Basal 추천기능을 포함해서, Open Loop에 대해 이해한다. + 이 경험을 토대로, 최대 Basal을 결정하고 이를 펌프와 설정에 입력한다. Closed Loop를 시작하고 저혈당인슐린 중지 기능을 사용해본다. 최대 IOB = 0 인 상태로 Closed Loop를 몇일동안 실행시켜 본다. 저혈당 인슐린일시중지가 많이 발생하지 않도록 한다. Closed Loop를 조정하여 최대 IOB를 0 이상으로 올려서 서서히 혈당 목표치를 낮춘다. 혈당을 낮추기 전에 몇일간 사용해보되 최소한 하루는 저혈당 혈당 알람이 발생하지 않도록 해본다. - 필요하면 기초주입과 비율을 조절하고, auto-sens를 활성화한다. + 필요하면 Basal과 비율을 조절하고, auto-sens를 활성화한다. 평소의 탄수화물을 입력하면서 1주일동안 낮시간대에 loop를 성공적으로 사용해본다. AMA(Advanced Meal Assist)같은 낮시간대를 위한 추가적인 기능들을 실행하여 본다. 낮시간대에 SMB(Super Micro Bolus)같은 추가기능을 활성화해 사용해본다. - SMB가 잘 작동하게 하기위해서 wiki를 반드시 읽은다음 maxIOB를 올려주세요. maxIOB=평균 식사주입 + 3 x 최대하루 기초주입량이면 괜찮은 시작값입니다. + SMB가 잘 작동하게 하기위해서 wiki를 반드시 읽은다음 maxIOB를 올려주세요. maxIOB=평균 식사 Bolus + 3 x 최대하루 Basal이면 괜찮은 시작값입니다. 허용된 제한값에 도달하였습니다 프로파일이 선택되지 않았습니다 Loop가 중지되었습니다. @@ -336,15 +336,15 @@ Loop가 실행중입니다. %1$.2f, %2$.2f으로 제한됨 %s값이 하드한계(Hard Limit)를 벗어났습니다 - 원격 기초주입설정이 허가되지 않았습니다 + 원격 Basal 설정이 허가되지 않았습니다 원격 명령이 허가되지 않았습니다 - 기초주입 %1$.2fU/h 을 실행하려면 %2$s 를 입력하고 답장하세요 + Basal %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 + Temp Basal %1$.2fU/h for %2$d min started successfully + Temp Basal start failed + 임시Basal을 중지하려면 %s 를 입력하고 답장하세요 + Temp Basal canceled + Canceling Temp Basal failed 알려지지 않은 명령이거나 잘못된 답장입니다. 빠른마법사 빠른마법사 설정 @@ -354,7 +354,7 @@ 추가 수정 삭제 - 식사주입 + 식사 교정주입 실행 AndroidAPS 시작 @@ -386,13 +386,13 @@ 펌프 종료 펌프배터리 방전 다나R 한글 - 기초주입량: - 기초주입 프로파일 설정이 실패하였습니다 - 기초주입 프로파일이 펌프에 업데이트 되었습니다 + Basal양: + Basal 프로파일 설정이 실패하였습니다 + Basal 프로파일이 펌프에 업데이트 되었습니다 펌프에서 이지모드(EasyUI)를 해제하세요 - 펌프에서 확장식사기능을 활성화 하세요 + 펌프에서 확장Bolus를 활성화 하세요 펌프에서 U/d에서 U/h로 모드를 변경하세요 - 기초주입값이 최소값 이하입니다. 프로파일이 설정되지 않습니다! + Basal값이 최소값 이하입니다. 프로파일이 설정되지 않습니다! BG: Last BG: MDI @@ -418,16 +418,16 @@ DanaR 통계 누적 일총량 지수가중 일총량 - 기초주입 - 식사주입 + Basal + Bolus 일총량 날짜 비율 #일 가중 - 교체/채움을 위해 식사주입을 사용한 경우 부정확할 수 있습니다!! + 교체/채움을 위해 Bolus를 사용한 경우 부정확할 수 있습니다!! 오래된 데이터입니다. \"새로고침\"을 누르세요. - 총기초량 + 총 기본 Basal 총기초량 * 2 초기화중 ... ACT @@ -451,12 +451,12 @@ 고급 설정 모델: %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와 혈당 목표범위를 얼마나 높게 설정할 수 있는지를 결정합니다. + 기본값: 3\n이 값은 중요한 OpenAPS 안전장치입니다. 이 값의 역할은 펌프에 설정되어 있는 최대Basal보다 3배를 초과할 수 없게 제한하는 것입니다. 이 값을 변경할 필요는 없을 것이지만, 안전을 위해 \"3x max daily; 4x current\"이 의미하는 바를 알고 있어야 합니다. + 기본값: 4\n이 값은 \"3x max daily; 4x current\"의 나머지 절반에 해당하는 또 다른 중요한 OpenAPS 안전장치입니다. 이것은, 펌프에 설정된 최대 Basal과는 관계없이, Basal이 설정된 현재시간의 Basal에 이 값을 곱한 양을 초과할 수 없다는 것을 의미합니다. 이는 알고리즘의 작동 방식을 이해하기 전에 과도하게 높은 최대 기본을 설정하여 위험한 상황에 빠지지 않도록 보호하기 위한 것입니다. 다시한번, 기본 값은 4배인 것을 알아두세요; 일반적으로 이것을 조정할 필요는 전혀 없으며, 대신 이 안전장치를 변경해야할것처럼 생각이 된다면, 다른 설정을 변경해야 할 가능성이 더 큽니다. + 기본값: 1.2\n이 값은 autosens가 autosens 비율을 얼마나 높게 할 수 있는지에 대한 최대 한계를 20%로 설정하는 승수장치입니다. 이는 autosens가 얼마나 높게 Basal을 조절할수 있는지, ISF를 얼마나 낮게 조절할수 있는지, 혈당 목표범위를 얼마나 낮게 설정할수 있는지를 결정합니다. + 기본값: 0.7\nautosens 안전 제한의 나머지 부분입니다. 이는 Basal을 얼마나 낮게 조절할 수 있는지, ISF와 혈당 목표범위를 얼마나 높게 설정할 수 있는지를 결정합니다. Autosens가 목표도 조절합니다. - 기본값: 활성\n이것은 autosens가 ISF와 기초주입뿐만 아니라, 혈당 목표범위를 조절할 수 있게 합니다. + 기본값: 활성\n이것은 autosens가 ISF와 Basal뿐만 아니라, 혈당 목표범위를 조절할 수 있게 합니다. 기본값: 2\n식사주입 후 Bolus snooze가 수행되게 되고, 따라서 식사주입 직후엔 loop가 low temp에 대응하지 않게 됩니다. 기본값이 2일때 예제는 다음과 같습니다; DIA가 3시간일 경우 bolus snooz는 점차적으로 1.5시간에 걸쳐 단계적으로 사라지게 됩니다.(3DIA/2). 기본값: 3.0 (AMA) 또는 8.0 (SMB). 5분당 탄수화물이 얼만큼 흡수되었는지에 대한 기본값 설정입니다. 기본값은 3mg/dl / 5분 입니다. 이는 혈당이 예상보다 빨리 떨어지거나 혹은 예상보다 오르지 않을때, COB가 얼마나 빨리 사라지게 되는지에 영향을 주게 되고, 추정된 탄수화물 흡수량이 미래 혈당 예측 계산시에도 영향을 주게 됩니다. 주의!\n보통의 경우 아래의 값을 변경하면 안됩니다. 이 값들을 변경하기 전에 반드시 이곳을 클릭하고 글을 정독해서 확실하게 이해를 하여야 합니다. @@ -474,11 +474,11 @@ xDrip에서 보정을 받지 못합니다. 펌프 일시중지됨 펌프 상태 가져오는중 - 임시기초주입 설정중 - 임시기초주입 취소중 - 확장식사주입 설정중 - 확장식사주입 취소중 - 기초주입량 업데이트중 + 임시Basal 설정중 + 임시Basal 취소중 + 확장Bolus 설정중 + 확장Bolus 취소중 + Basal양 업데이트중 연결끊기중 실행중 가상펌프 설정 @@ -508,7 +508,7 @@ NSCLIENT이 쓰기 권한이 없습니다. 잘못된 API secret인지 확인해보세요 워치 설정 IOB 자세하게 보여주기 - 워치페이스에 IOB를 식사주입IOB와 기초주입IOB로 나누어서 보여줍니다. + 워치페이스에 IOB를 Bolus IOB와 Basal IOB로 나누어서 보여줍니다. 성공하지 못했습니다. 폰을 확인하세요 알수없음 나이 @@ -521,7 +521,7 @@ 최적의 성능을 위해 %s에서 배터리 최적화를 해제해야합니다. Loop 일시중지 일시중지중 (%d분) - 수퍼 식사주입 (%d분) + Superbolus (%1$d 분) 1시간동안 Loop 일시중지 2시간동안 Loop 일시중지 3시간동안 Loop 일시중지 @@ -537,7 +537,7 @@ Loop가 재실행 되었습니다. 15분 추이 COB - 수퍼 식사주입 + Superbolus 앱시작을 NS에 기록하기 설정을 적용하기위해 앱을 종료합니다. 다나R v2 @@ -547,8 +547,8 @@ 노보래피드, 휴마로그, 에피드라 피아스프(Fiasp) INS - 마법사에서 수퍼 식사주입 활성화하기 - 마법사에서 수퍼 식사주입 기능을 활성화합니다. 어떤 기능인지 확실히 알기전까지 활성화 하지 마세요. 제대로 알지 못하고 사용하면 일슐린이 과다 주입될 수 있습니다! + 마법사에서 Superbolus 활성화하기 + 마법사에서 Superbolus 기능을 활성화합니다. 어떤 기능인지 확실히 알기전까지 활성화 하지 마세요. 제대로 알지 못하고 사용하면 일슐린이 과다 주입될 수 있습니다! IOB COB 펌웨어 @@ -563,16 +563,16 @@ BGI를 상태라인에 추가하기 NS에 업로드하지 않기 NS로 보낼 모든 데이터가 버려집니다. AAPS는 NS에 연결되어 있지만 NS에는 변화가 없을것입니다. - 기초주입 최소단위 - 식사주입 최소단위 - 확장식사 + Basal 단위 + Bolus 단위 + 확장Bolus 임시목표 - 확장 식사주입 취소 + 확장Bolus 취소 센서 사용기간 캐뉼라 사용기간 인슐린 사용기간 시간 - 기초주입 종류 + Basal 종류 프로파일이 유효하지 않습니다!!! 프로파일변경 펌프배터리사용기간 @@ -600,7 +600,7 @@ 흡수 설정 식사 최대 흡수 시간 [h] 식사로 섭취한 탄수화물이 모두 흡수될기까지 예상되는 시간 - 확장식사주입을 %로 표시하기 + 확장Bolus를 %로 표시하기 SAGE IAGE CAGE @@ -620,16 +620,16 @@ (xDrip 같은) 다른 앱으로의 브로드캐스트를 활성화합니다. Local Broadcasts 활성화하기 활동 & 피드백 - 탄수화물 & 식사주입 + 탄수화물 & Bolus CGM & OPENAPS 펌프 - 기초주입량 [U/h] + Basal값 [U/h] 기간 [min] OpenAPS SMB SMB UAM 활성화하기 SMB 활성화하기 - 더 빠른 작용을 위해 임시기초주입 대신 SMB 사용 + 더 빠른 작용을 위해 임시Basal 대신 Super Micro Bolus 사용 알리지 않은 식사 감지 IOB 커브 피크 시간 피크 시간 [min] @@ -652,8 +652,8 @@ Dana 선택된 펌프 새 펌프와 연동 - 식사주입 속도 - 기초주입 단위를 0.01 U/h로 설정하세요 + Bolus 속도 + Basal 단위를 0.01 U/h로 설정하세요 시리얼번호 퍼센트 시간 이동 @@ -661,13 +661,13 @@ 식사직전 기간 식사직전 목표 activity 기간 - activity 목표 + 활동 목표 저혈당 기간 저혈당 목표 교체 - 확장식사주입 상태 가져오는중 - 식사주입상태 가져오는중 - 임시기초주입상태 가져오는중 + 확장Bolus 상태 가져오는중 + Bolus 상태 가져오는중 + 임시Basal 상태 가져오는중 펌프설정 가져오는중 펌프시간 가져오는중 재사용 @@ -684,9 +684,9 @@ 단백질 지방 ]]> - 식사주입 종료를 기다리고 있습니다. %d초 남았습니다. + Bolus 종료를 기다리고 있습니다. %d초 남았습니다. 이벤트 처리중 - 식사주입을 시작합니다. + Bolus 주입을 시작합니다. 명령을 지금 실행합니다. 펌프 드라이버가 수정되었습니다. 펌프에 연결할 수 없습니다. @@ -707,18 +707,18 @@ Poctech 업로드 설정 델타(혈당증분값) 자세히 보여주기 소수점 자리 추가된 증분값 보여주기 - SMB가 기초주입량을 제한할 수 있는 최대 시간(분) + SMB가 Basal을 제한할 수 있는 최대 시간(분) 지원되지 않는 펌프 펌웨어 혈당 데이터를 xDrip+에 전송하기 xDrip+ 데이터 소스에서 640g/Eversense을 선택하세요 NSClient 혈당 - 지원되는 최소값으로 기초주입량이 대체되었습니다:%s - 지원되는 최대값으로 기초주입량이 대체되었습니다:%s + 지원되는 최소값으로 Basal값이 대체되었습니다:%s + 지원되는 최대값으로 Basal값이 대체되었습니다:%s 혈당 계산 - 식사주입 IOB 계산 - 기초주입 IOB 계산 + Bolus IOB 계산 + Basal IOB 계산 추세계산 - 수퍼 식사주입 계산 + Superbolus 계산 아니오 양수만 @@ -731,9 +731,9 @@ Closed 모드가 활성화됨 최대 IOB가 바르게 설정됨 선택한 소스에서 혈당이 들어옵니다. - 기초주입값이 시간단위로 설정되지 않았습니다: %s + Basal값이 시간단위로 설정되지 않았습니다: %s 유효하지 않은 프로파일: %s - 식사주입을 위한 펌프 프로그래밍 + Bolus 주입을 위한 펌프 프로그래밍 새로고침 상태 활동 @@ -745,16 +745,16 @@ 실행중 임시기초주입 취소중 임시기초주입 설정중 (%1$d%% / %2$d분) - 식사주입중(%.1f U) + Bolus 주입중(%.1f U) 새로고침중 요청하신 동작은 펌프에서 지원하지 않습니다. - 위험한 사용: 확장식사주입 혹은 멀티웨이브 식사주입이 활성화 됩니다. Loop 모드가 저혈당 방지로 오직 6시간만 설정됩니다. Loop 모드에선 정상적인 식사주입만 지원합니다. - 위험한 사용: 펌프의 기초주입 프로파일이 펌프의 첫번째 기초주입 프로파일과 다릅니다. Loop가 비활성화되었습니다. 첫 번째 프로파일을 설정하고 새로 고침하십시오. - 2개의 동일한 양의 식사주입이 요청되었습니다. 이중으로 식사주입이 되는 사고를 막고 버그로부터 보호하기 위하여 이는 금지됩니다. + 위험한 사용: 확장Bolus 혹은 멀티웨이브Bolus가 활성화 됩니다. Loop 모드가 저혈당 방지로 오직 6시간만 설정됩니다. Loop 모드에선 일반 Bolus만 지원합니다. + 위험한 사용: 펌프의 Basal양 프로파일이 펌프의 첫번째 Basal양 프로파일과 다릅니다. Loop가 비활성화되었습니다. 첫 번째 프로파일을 설정하고 새로 고침하십시오. + 2개의 동일한 양의 Bolus 주입이 요청되었습니다. 이중으로 Bolus가 주입 되는 사고를 막고 버그로부터 보호하기 위하여 이는 금지됩니다. 현재 펌프 이력 읽기 펌프 이력 - 기초주입 프로파일 설정 + Basal 프로파일 설정 펌프 카트리지 레벨이 낮습니다. 펌프배터리가 부족합니다. 펌프가 E%1$d: %2$s 에러를 보여줍니다. @@ -764,12 +764,12 @@ 펌프 시간 업데이트가 필요합니다. 경고 임시기초주입 취소 경고가 확인되었습니다. - 펌프를 사용할 수 없습니다. 식사주입이 실행되지 않았습니다. - 식사주입이 실패하였습니다. 전송된 식사주입이 없는 것으로 보입니다. 이중으로 식사주입이 되는 것을 방지하기 위해 펌프를 확인한 다음 다시 식사주입을 하세요. 버그를 방지하기 위해 식사주입이 자동으로 재시도되지 않습니다. - 에러로 인해 요청된 식사주입 %2$.2f U중 오직 %1$.2f U만 전달되었습니다. 펌프에서 직접 확인후 적절한 조치를 취하세요. - 식사주입을 실행하고 펌프 이력을 확인하는데 실패하였습니다. 펌프를 확인해보세요. 만약 식사주입이 실행되었다면 펌프와 다음번 연결시 그 내용이 관리에 추가될 것입니다. - 식사주입 위한 인슐린이 주사기에 부족합니다. - 확장식사주입 에러 + 펌프를 사용할 수 없습니다. Bolus 주입이 실행되지 않았습니다. + Bolus 주입이 실패하였습니다. 주입된 Bolus가 없는 것으로 보입니다. 이중으로 Bolus가 주입되는 것을 방지하기 위해 펌프를 확인한 다음 다시 Bolus를 주입하세요. 버그를 방지하기 위해 Bolus 주입이 자동으로 재시도되지 않습니다. + 에러로 인해 요청된 Bolus %2$.2f U중 오직 %1$.2f U만 주입되었습니다. 펌프에서 직접 확인후 적절한 조치를 취하세요. + Bolus를 주입하고 펌프 이력을 확인하는데 실패하였습니다. 펌프를 확인해보세요. 만약 Bolus 주입이 되었다면 펌프와 다음번 연결시 그 내용이 관리에 추가될 것입니다. + Bolus 주입 위한 인슐린이 주사기에 부족합니다. + 확장Bolus 주입 에러 Insight Insight 펌프 상태 @@ -815,7 +815,7 @@ AndroidAPS 화면을 열면 펌프 명령이 요청되기 전에 자동으로 연결하여 연결 지연을 줄입니다. 배터리 소모때문에 추천하지 않습니다. 항상 SMB를 사용합니다. - 식사주입과는 독립적으로 항상 SMB를 사용합니다. G5처럼 잘 필터된 혈당소스와만 사용이 가능합니다. + Bolus와 독립적으로 항상 SMB를 사용합니다. G5처럼 잘 필터된 혈당소스와만 사용이 가능합니다. 탄수화물 이후 SMB를 사용합니다. 탄수화물 이후 6시간동안 SMB를 사용합니다, 0 COB이라도 적용됩니다. G5처럼 잘 필터된 혈당소스와만 사용이 가능합니다. COB와 SMB를 사용합니다. @@ -824,7 +824,7 @@ 활성화된 임시 목표(식사직전, 운동)가 있으면 SMB를 사용합니다. 높은임시 목표와 SMB를 사용합니다. 활성화된 높은 임시 목표(운동)가 있으면 SMB를 사용합니다. - 임시 기초 주입 실행 허용 + 임시Basal 허용 음소거 인슐린 탄수화물 @@ -837,7 +837,7 @@ CGM 이력 브라우저 SMB 알림 - 일반 식사주입처럼 워치에서 SMB 표시 + 일반 Bolus처럼 워치에 SMB 표시 에러 발생시 알림 생성 에러 발생에 대한 Nightscout 알림과 자체 경고를 생성합니다. (케어포털 관리에서도 표시됩니다.) 워치페이스에서 예측치를 보여줍니다. @@ -849,55 +849,55 @@ 활동 임시목표 시작 식사직전 임시목표 시작 TT - 실제주입않고, 기록만 + 실제 Bolus 주입않고, 기록만 하기 분류 하위 분류 - 식사주입이 기록만 됩니다. + Bolus가 기록만 됩니다. NS에서 누락된 혈당이 자동으로 채워집니다. 펌프에 의한 SMB 설정 민감도 편차 체내탄수화물양(COB) 체내인슐린양(IOB) - 기초주입 + Basal 선택한 실행이 없습니다. 아무런 실행이 되지 않습니다. 저혈당 임시목표 시작 개발자버전을 실행중입니다. Closed Loop는 비활성화 됩니다. 전문가 모드 사용 전문가 모드가 활성화되어 있지 않고 Release 버전이 실행되고 있지 않습니다. %.2f U/h - 기초주입 프로파일 읽는중 - 식사주입 계산이 수행된 후 펌프 이력이 변경되었습니다. 식사주입이 전달되지 않았습니다. 식사주입이 필요하다면 다시 계산하세요. - 식사주입이 성공적으로 주입되었지만, 관리 항목에 추가하지 못했습니다. 이것은 동일한 양의 소량의 2개의 식사주입이 지난 2 분 이내에 주입되는 경우에 발생할 수 있습니다. 펌프 이력과 관리 항목을 확인하고 손실된 항목을 추가하기위해 케어포털을 이용하세요. 동일한 시간과 인슐린양의 항목을 추가하지 마세요. + Basal 프로파일 읽는중 + Bolus 계산이 수행된 후 펌프 이력이 변경되었습니다. Bolus가 주입되지 않았습니다. Bolus가 여전히 필요하다면 다시 계산하세요. + Bolus가 성공적으로 주입되었지만, 관리 항목에 추가하지 못했습니다. 이것은 동일한 양의 소량의 2개의 Bolus가 최근 2 분 이내에 주입되는 경우에 발생할 수 있습니다. 펌프 이력과 관리 항목을 확인하고 손실된 항목을 추가하기위해 케어포털을 이용하세요. 동일한 시간과 인슐린양의 항목을 추가하지 마세요. 계산기가 최근 변경된 펌프 이력을 고려하지 못해 임시기초주입 추가를 거절했습니다. 펌프상태 새로고침중 - 펌프의 기초주입량이 변경되었고 곧 업데이트됩니다. - 펌프의 기초주입량이 변경되었지만 읽기를 실패했습니다. + 펌프의 Basal 양이 변경되었고 곧 업데이트됩니다. + 펌프의 Basal 양이 변경되었지만 읽기를 실패했습니다. 이력 변경 확인중 - 같은 시간(분)에 동일한 양의 2개이상의 식사주입이 실행되었습니다. 오직 하나의 기록만이 관리에 입력될 수 있습니다. 펌프를 확인한 후 케어포털 탭에서 식사주입 기록을 수동으로 추가하세요. 동시에 같은 양의 식사주입이 없도록 하세요. + 동일한 시간(분)에 동일한 양의 2개이상의 Bolus가 주입되었습니다. 오직 하나의 기록만이 관리에 입력될 수 있습니다. 펌프를 확인한 후 케어포털 탭에서 Bolus 기록을 수동으로 추가하세요. 동일한 시간에 동일한 양의 Bolus를 주입하지 않도록 하세요. \n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de) - 최근의 식사주입이 24시간 전 혹은 미래에 있습니다. 펌프의 날짜가 제대로 설정되어 있는지 확인해보세요. - 펌프에서 전송된 식사주입의 시간/날짜가 잘못되었습니다. IOB가 부정확할 수 있습니다. 펌프 시간/날짜를 확인하세요. + 최근 Bolus가 24시간 전 혹은 미래에 있습니다. 펌프의 날짜가 제대로 설정되어 있는지 확인해보세요. + 펌프에서 주입된 Bolus의 시간/날짜가 잘못되었습니다. IOB가 부정확할 수 있습니다. 펌프 시간/날짜를 확인하세요. 프로파일변경 누락. 로컬 프로파일에서 프로파일 변경을 하거나 \"프로파일 활성화하기\"를 누르세요. - 식사주입 수 + Bolus 수 임시기초주입 수 목표%1$d이 시작되지 않았습니다. 목표%1$d이 완료되지 않았습니다. - 이 펌프 임시 기초 주입을 지원하지 않습니다. - 펌프에서 유효한 기초주입량을 읽을 수 없습니다. + 이 펌프 임시Basal을 지원하지 않습니다. + 펌프에서 유효한 Basal양을 읽을 수 없습니다. 설정에서 Closed Loop 모드가 비활성화되었습니다. 설정에서 Autosens가 비활성화 되었습니다. 설정에서 SMB가 비활성화 되었습니다. - %2$s로 인해 최대 기초주입량이 %1$.2f U/h으로 제한됩니다. + %2$s로 인해 최대 Basal양이 %1$.2f U/h으로 제한됩니다. 펌프 제한 양의 값이어야 합니다. - 최대 기초주입량 승수 - 최대 일 기초주입량 승수 - 최근 3분이내에 식사주입이 실행되었습니다. SMB를 건너뜁니다. - 기초주입이 정상적으로 설정되었습니다. + 최대 Basal 승수 + 최대 일 Basal 승수 + 최근 3분 이내에 Bolus가 주입되었습니다. SMB를 건너뜁니다. + Basal이 정상적으로 설정되었습니다. %2$s로 인해 최대 비율이 %1$d%%로 제한됩니다. - %2$s로 인해 식사주입이 %1$.1f U로 제한됩니다. - %2$s로 인해 확장식사주입이 %1$.1f U로 제한됩니다. + %2$s로 인해 Bolus가 %1$.1f U로 제한됩니다. + %2$s로 인해 확장Bolus가 %1$.1f U로 제한됩니다. %2$s로 인해 최대 IOB가 %1$.1f U로 제한됩니다. %2$s로 인해 탄수화물이 %1$d g로 제한됩니다. %2$s로 인해 IOB가 %1$.1f U으로 제한됩니다. @@ -947,12 +947,12 @@ 최저 autosens 비율 Bolus snooze DIA 나눗수 최대 일 안전 승수 - 현재 기초주입 안전 승수 + 현재 Basal 안전 승수 사용불가 가성펌프 종류 펌프 정의 - 식사주입: 스텝=%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 - * 가상펌프에서 Ranged 기초주입/식사주입이 지원되지 않습니다. + 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 + * 가상펌프에서 다른 범위의 Basal/Bolus가 지원되지 않습니다. 혈당 자동채움 마법사 설정 마법사 결과에 사용 된 계산: @@ -964,7 +964,7 @@ 상태 불러오기 오직 NS에서 변경해야합니다. 설정 마법사 건너뛰기 - AndroidAPS가 기초주입 변화를 제안 혹은 실행하게 하려면 아래 버튼을 누르세요. + AndroidAPS가 Basal 변화를 제안 혹은 실행하게 하려면 아래 버튼을 누르세요. 목표를 활성화하기 위해 아래 버튼을 누르세요. 이 마법사를 종료된 다음 AndroidAPS의 모든 기능을 이용하기 위해 목표 탭을 확인하세요.\n 목표 활성화하기 APS 플러그인 설정하기 @@ -1019,7 +1019,7 @@ 큰 시간 차이:\n펌프의 시간과 1.5시간 이상 차이가 납니다.\n펌프의 이력에서 잘못된 시간을 읽어들임으로써 예상치 못한 행동이 발생하지 않도록 펌프의 시간을 수동으로 변경하세요.\n가능하면 시간을 변경하기 전에 펌프의 이력을 삭제하거나, 설정된 DIA 시간동안 Closed Loop를 비활성화 하세요. \"AndroidAPS 시작\" 기록 삭제하기 저장된 설정이 있습니다. - 주의: 활성화하고 펌프에 연결하게되면, AndroidAPS는 프로파일의 기초설정을 복사해서 기존에 펌프에 저장되어 있던 기초주입설정을 덮어쓰게 될것입니다. AndroidAPS의 기초주입설정이 올바른지 반드시 확인하세요. 만약 확실치 않거나 기초주입설정을 덮어씌우길 원치않는다면, 취소버튼을 누르고 나중에 다시 연결하세요. + 주의: 활성화하고 펌프에 연결하게되면, AndroidAPS는 프로파일의 Basal설정을 복사해서 기존에 펌프에 저장되어 있던 Basal설정을 덮어쓰게 될것입니다. AndroidAPS의 Basal설정이 올바른지 반드시 확인하세요. 만약 확실치 않거나 Basal설정을 덮어씌우길 원치않는다면, 취소버튼을 누르고 나중에 다시 연결하세요. 관리 데이터가 불완전합니다 정비 설정 Email @@ -1044,10 +1044,12 @@ Calc 통신 확인 예상치 못한 상황 보고를 위해 오늘의 로그 파일을 개발자에게 전송합니다. - 최대 식사주입 위반 + 최대 Bolus 위반 명령 오류 속도 오류 인슐린 제한 위반 + 최소 요청 변화 [%] + 이 값보다 변화가 클때만 Loop가 새 변화 요청창을 띄울것 입니다. 기본 값은 30%입니다. %1$d 일 diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 31cfedbf43..e4ecf830c8 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -169,7 +169,7 @@ Desactivar Loop Activar Loop Disponível nova sugestão - Versão não suportada do NSClient + Versão não suportada do NSCliente Versão sem suporte do Nightscout NSCliente em falta. Perdido registo! Glic disponível no NS @@ -871,7 +871,13 @@ 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. A rejeitar a temporal alta uma vez que o cálculo não considerou as mudanças do histórico da bomba A actualizar estado bomba + O rácio da basal foi alterado na bomba e vai ser actualizado em breve + Rácio da basal foi alterado na bomba, mas a leitura falhou A verificar se há alterações de histórico + \n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de) + O último bólus tem mais de 24 horas ou está no futuro. Por favor verifique se a data está definida correctamente na bomba. + Hora/data da entrega do bólus na bomba parece errado, IOB aparentemente está incorrecto. Verifique hora/data na bomba. + TrocaPerfil em falta. Por favor faça uma troca de perfil ou pressione \"Activar Perfil\" em PerfilLocal. Contagem Bólus Contagem TBR Objetivo %1$d não iniciado @@ -888,24 +894,39 @@ multiplicador de basal máx diária Um bolus foi injectado nos últimos 3 minutos, saltando SMB Basal correctamente definida + A limitar rácio percentagem máx para %1$d%% porque %2$s + A limitar bólus para %1$.1f U porque %2$s + A limitar bólus estendido para %1$.1f U porque %2$s + A limitar IOB máx. para %1$.1f U porque %2$s + A limitar hidratos para %1$d g porque %2$s + A limitar IOB para %1$.1f U porque %2$s valor máx nas preferências + limite rígido uso não seguro Erro na leitura de estado Registar mudança de sítio Registar mudança cartucho + SMB sempre e depois dos hidratos desactivado por fonte da Glicemia activa não suportar filtro avançado SMB não permitido no modo open loop Alimentos repor + À espera da sincronização da hora (%1$d sec) Desligado (%1$d m) + Eventos careportal automáticos + Automaticamente envia mudança de insulina, canula, pilha e alarmes da bomba para o NightScout + Máximo total IOS OpenAPS não pode superar [U] Bomba parada Bomba iniciada Bomba suspensa + Tempo máx. absorção refeição [h] Hora + Mostrar campo de notas na janela de tratamentos Seguinte Anterior Assistente de Configuração TERMINAR Selecione o seu Idioma + Pedido: %1$.2fU Entregue: %2$.2fU Código Erro: %3$s Primeiro incremento insulina Segundo incremento insulina Terceiro incremento insulina @@ -921,37 +942,69 @@ Permitir ligação em roaming Rácio máx. autosens Rácio min. autosens + Pausa bólus divisor DIA + Multiplicador máx. diário de segurança + Multiplicador actual de segurança basal n/a + Tipo da Bomba Virtual Definição da Bomba + Preenchimentoauto Glicemia Definições do Assistente Rápido + Resultado cálculos incluídos no Assistente: Mostrar Configurações Configurações gerais + Activar NSCliente Configurações da bomba Ler estado + Alterações devem ser feitas no NS + Saltar assistente de configuração Activar Objectivos + Configurar plugin APS + Configurar plugin Sensibilidade + https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COB + NSCliente gere a ligação ao Nightscout. Pode saltar esta parte mas não será possível passar os objectivos até que o configure. Configure a fonte das glicemias Iniciar primeiro objectivo Permissão Pedir permissão + Aplicação requer permissão de localização para pesquisa BT Pedido + Configurar plugin Insulina Sair Opções do utilizador Formato hora + Botão rolamento + Sinal ao pressionar botão Alarme Som Vibrar Ambos + Desligar LCD [s] + Desligar luz de fundo [s] Unidades de Glucose + Desligar(horas) Reservatório baixo (Unidades) + Gravar opções para a bomba Ligado Desligado + Abrir a navegação + Fechar a navegação + Preferências plugin Terminado, parabéns! Incompleto Tempo decorrido %1$d. Objectivo + Poctech + Receber valores Glucose da app Poctech + Alto alvotempo aumenta sensibilidade + = 100]]> + Baixo alvotemp baixa sensibilidade + Personalizado Grande diferença Horária + Limpar AndroidAPS iniciado Configurações encontradas + Dados tratamento incompletos Configurações de manutenção Email E-mail Inválido @@ -960,14 +1013,24 @@ MANU Enviar Logs por e-mail Eliminar registos + eCarbs: %1$d g (%2$d h), atraso: %3$d m + Sem dados Autosens disponíveis Definições de registo Repor definições por defeito + Erro de funcionamento do NSCliente. Pondere reiniciar o NS e NSCliente. + AS Disponível %1$s disponível Fuso horário + Modo APS preferido Total Calc + Cumprimento + Enviar os ficheiros de registo do dia de hoje para os programadores. Situação inesperada. + Transgressão Bólus máx Erro no comando Erro velocidade + Transgressão limite insulina + Pedido de mudança mínima [%] %1$d dia %1$d dias @@ -976,4 +1039,8 @@ %1$d hora %1$d hora + + %1$d minuto + %1$d minutos + diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 812efd9635..02fd02137e 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1050,4 +1050,6 @@ Context | Edit Context Ошибка в команде Ошибка в скорости Нарушение ограничения инсулина + Минимальный запрос на изменения [%] + Алгоритм ИПЖ выдаст всплывающее окно с запросом на новые изменения, только если изменение больше, чем это значение. Значение по умолчанию — 30% From 7070c0a72bee7f6020d43c351d3725539751c72c Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Mon, 10 Sep 2018 19:28:03 +0200 Subject: [PATCH 40/41] allign Insight logging with AAPS --- .../plugins/PumpInsight/InsightFragment.java | 4 +- .../plugins/PumpInsight/InsightPlugin.java | 133 +++++++++++------- .../PumpInsight/connector/Connector.java | 95 ++++++++----- .../events/EventInsightCallback.java | 1 - .../history/HistoryIntentAdapter.java | 34 +++-- .../history/HistoryLogAdapter.java | 27 ++-- .../PumpInsight/history/HistoryReceiver.java | 4 - .../PumpInsight/history/PumpIdCache.java | 12 +- .../plugins/PumpInsight/utils/Helpers.java | 16 ++- .../PumpVirtual/VirtualPumpPlugin.java | 9 +- 10 files changed, 201 insertions(+), 134 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightFragment.java index 156c8271e3..5d3c3850b3 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightFragment.java @@ -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; 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 678b91dfec..8721c4d87e 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 @@ -85,6 +85,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; @@ -100,7 +101,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; @@ -120,16 +120,12 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai .preferencesId(R.xml.pref_insightpump) .description(R.string.description_pump_insight) ); - log("InsightPlugin instantiated"); + 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()); @@ -144,7 +140,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(); @@ -158,7 +155,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; } @@ -239,18 +237,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 @@ -260,54 +261,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(); @@ -316,7 +326,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"); } } @@ -344,7 +355,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)); @@ -373,8 +385,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 @@ -425,7 +438,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; @@ -437,10 +451,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(); @@ -489,25 +504,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); } @@ -519,7 +540,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) { @@ -536,7 +558,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(); @@ -549,13 +571,14 @@ 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(); realTBRCancel(); 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); @@ -576,7 +599,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); @@ -592,7 +616,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) { @@ -602,7 +626,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; @@ -613,7 +638,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(); @@ -625,7 +650,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); @@ -637,7 +663,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; } @@ -841,7 +868,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()); } } @@ -859,7 +886,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; } } @@ -870,7 +897,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; } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java index 82b6cc3cc8..111c2e0bd2 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java @@ -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. - * + *

* Connects to SightRemote app service using SightParser library - * + *

* SightRemote and SightParser created by Tebbe Ubben - * + *

* 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; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/events/EventInsightCallback.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/events/EventInsightCallback.java index 16cb5af457..753ac7f0e6 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/events/EventInsightCallback.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/events/EventInsightCallback.java @@ -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() { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryIntentAdapter.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryIntentAdapter.java index 87e427737b..192b048814 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryIntentAdapter.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryIntentAdapter.java @@ -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); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryLogAdapter.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryLogAdapter.java index bff37c9fdd..733f34f25e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryLogAdapter.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryLogAdapter.java @@ -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)); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryReceiver.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryReceiver.java index ca68a389c8..a66378ba54 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryReceiver.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryReceiver.java @@ -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(); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/PumpIdCache.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/PumpIdCache.java index 940a7af3cf..9a2bcfeff5 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/PumpIdCache.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/PumpIdCache.java @@ -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); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/utils/Helpers.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/utils/Helpers.java index 344bf638b2..bfdca16588 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/utils/Helpers.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/utils/Helpers.java @@ -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. - * + *

* 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 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) { 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 f1d620b92b..ecbca759c9 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 @@ -41,11 +41,12 @@ import info.nightscout.utils.SP; * Created by mike on 05.08.2016. */ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { - static Integer batteryPercent = 50; - static Integer reservoirInUnits = 50; - 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; - private static boolean fromNSAreCommingFakedExtendedBoluses = false; + private boolean fromNSAreCommingFakedExtendedBoluses = false; private PumpType pumpType = null; private long lastDataTime = 0; private PumpDescription pumpDescription = new PumpDescription(); From 93a4afd56709b891fe79526b6c7096bf230ac5b9 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Mon, 10 Sep 2018 20:28:45 +0200 Subject: [PATCH 41/41] Insight add 1 sec between cancel TBR and EB --- .../androidaps/plugins/PumpInsight/InsightPlugin.java | 3 +++ 1 file changed, 3 insertions(+) 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 8721c4d87e..e65d713112 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 @@ -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; @@ -576,7 +577,9 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai 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.PUMP)) log.debug("Canceling temp basal"); connector.requestHistorySync(5000);