From 4ebc1497838b729a31e1abbe2af91da9e4bb3d8d Mon Sep 17 00:00:00 2001 From: Nico Schmitz Date: Tue, 12 Jun 2018 23:28:11 +0200 Subject: [PATCH 001/379] Add changes of schmitzn/reservoir-view --- .../androidaps/interfaces/PumpInterface.java | 2 + .../plugins/Overview/OverviewFragment.java | 59 +++++++++++++------ .../plugins/PumpCombo/ComboPlugin.java | 5 ++ .../PumpDanaR/AbstractDanaRPlugin.java | 3 + .../plugins/PumpDanaRS/DanaRSPlugin.java | 5 ++ .../plugins/PumpInsight/InsightPlugin.java | 3 + .../androidaps/plugins/PumpMDI/MDIPlugin.java | 3 + .../PumpVirtual/VirtualPumpPlugin.java | 3 + app/src/main/res/layout/overview_fragment.xml | 12 ++++ app/src/main/res/values-de/strings.xml | 2 + app/src/main/res/values/colors.xml | 11 ++-- app/src/main/res/values/strings.xml | 7 +++ app/src/main/res/xml/pref_overview.xml | 32 ++++++++++ 13 files changed, 126 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java b/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java index 65911f82c6..9030cf8bfd 100644 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java +++ b/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java @@ -33,6 +33,8 @@ public interface PumpInterface { double getBaseBasalRate(); // base basal rate, not temp basal + double getReservoirLevel(); + PumpEnactResult deliverTreatment(DetailedBolusInfo detailedBolusInfo); void stopBolusDelivering(); PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes, Profile profile, boolean enforceNew); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java index fadb30420c..a5f375a7bb 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java @@ -134,6 +134,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, TextView baseBasalView; TextView extendedBolusView; TextView activeProfileView; + TextView reservoirView; TextView iobView; TextView cobView; TextView apsModeView; @@ -232,6 +233,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, baseBasalView = (TextView) view.findViewById(R.id.overview_basebasal); extendedBolusView = (TextView) view.findViewById(R.id.overview_extendedbolus); activeProfileView = (TextView) view.findViewById(R.id.overview_activeprofile); + reservoirView = (TextView) view.findViewById(R.id.overview_reservoir); pumpStatusView = (TextView) view.findViewById(R.id.overview_pumpstatus); pumpDeviceStatusView = (TextView) view.findViewById(R.id.overview_pump); openapsDeviceStatusView = (TextView) view.findViewById(R.id.overview_openaps); @@ -1040,25 +1042,25 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, final LoopPlugin.LastRun finalLastRun = LoopPlugin.lastRun; if (Config.APS && pump.getPumpDescription().isTempBasalCapable) { apsModeView.setVisibility(View.VISIBLE); - apsModeView.setBackgroundColor(MainApp.gc(R.color.loopenabled)); - apsModeView.setTextColor(Color.BLACK); + apsModeView.setBackgroundColor(MainApp.gc(R.color.ribbonBgDefault)); + apsModeView.setTextColor(MainApp.gc(R.color.ribbonTextDefault)); final LoopPlugin loopPlugin = LoopPlugin.getPlugin(); if (loopPlugin.isEnabled(PluginType.LOOP) && loopPlugin.isSuperBolus()) { - apsModeView.setBackgroundColor(MainApp.gc(R.color.looppumpsuspended)); + apsModeView.setBackgroundColor(MainApp.gc(R.color.ribbonBgWarning)); apsModeView.setText(String.format(MainApp.gs(R.string.loopsuperbolusfor), loopPlugin.minutesToEndOfSuspend())); - apsModeView.setTextColor(Color.WHITE); + apsModeView.setTextColor(MainApp.gc(R.color.ribbonTextWarning)); } else if (loopPlugin.isEnabled(PluginType.LOOP) && loopPlugin.isDisconnected()) { - apsModeView.setBackgroundColor(MainApp.gc(R.color.looppumpsuspended)); + apsModeView.setBackgroundColor(MainApp.gc(R.color.ribbonBgWarning)); apsModeView.setText(String.format(MainApp.gs(R.string.loopdisconnectedfor), loopPlugin.minutesToEndOfSuspend())); - apsModeView.setTextColor(Color.WHITE); + apsModeView.setTextColor(MainApp.gc(R.color.ribbonTextWarning)); } else if (loopPlugin.isEnabled(PluginType.LOOP) && loopPlugin.isSuspended()) { - apsModeView.setBackgroundColor(MainApp.gc(R.color.looppumpsuspended)); + apsModeView.setBackgroundColor(MainApp.gc(R.color.ribbonBgWarning)); apsModeView.setText(String.format(MainApp.gs(R.string.loopsuspendedfor), loopPlugin.minutesToEndOfSuspend())); - apsModeView.setTextColor(Color.WHITE); + apsModeView.setTextColor(MainApp.gc(R.color.ribbonTextWarning)); } else if (pump.isSuspended()) { - apsModeView.setBackgroundColor(MainApp.gc(R.color.looppumpsuspended)); + apsModeView.setBackgroundColor(MainApp.gc(R.color.ribbonBgWarning)); apsModeView.setText(MainApp.gs(R.string.pumpsuspended)); - apsModeView.setTextColor(Color.WHITE); + apsModeView.setTextColor(MainApp.gc(R.color.ribbonTextWarning)); } else if (loopPlugin.isEnabled(PluginType.LOOP)) { if (closedLoopEnabled.value()) { apsModeView.setText(MainApp.gs(R.string.closedloop)); @@ -1066,9 +1068,9 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, apsModeView.setText(MainApp.gs(R.string.openloop)); } } else { - apsModeView.setBackgroundColor(MainApp.gc(R.color.loopdisabled)); + apsModeView.setBackgroundColor(MainApp.gc(R.color.ribbonBgCritical)); apsModeView.setText(MainApp.gs(R.string.disabledloop)); - apsModeView.setTextColor(Color.WHITE); + apsModeView.setTextColor(MainApp.gc(R.color.ribbonTextCritical)); } } else { apsModeView.setVisibility(View.GONE); @@ -1077,13 +1079,13 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, // temp target TempTarget tempTarget = TreatmentsPlugin.getPlugin().getTempTargetFromHistory(); if (tempTarget != null) { - tempTargetView.setTextColor(Color.BLACK); - tempTargetView.setBackgroundColor(MainApp.gc(R.color.tempTargetBackground)); + tempTargetView.setTextColor(MainApp.gc(R.color.ribbonTextWarning)); + tempTargetView.setBackgroundColor(MainApp.gc(R.color.ribbonBgWarning)); tempTargetView.setVisibility(View.VISIBLE); tempTargetView.setText(Profile.toTargetRangeString(tempTarget.low, tempTarget.high, Constants.MGDL, units) + " " + DateUtil.untilString(tempTarget.end())); } else { - tempTargetView.setTextColor(Color.WHITE); - tempTargetView.setBackgroundColor(MainApp.gc(R.color.tempTargetDisabledBackground)); + tempTargetView.setTextColor(MainApp.gc(R.color.ribbonTextDefault)); + tempTargetView.setBackgroundColor(MainApp.gc(R.color.ribbonBgDefault)); tempTargetView.setText(Profile.toTargetRangeString(profile.getTargetLow(), profile.getTargetHigh(), units, units)); tempTargetView.setVisibility(View.VISIBLE); } @@ -1190,7 +1192,30 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, } activeProfileView.setText(MainApp.getConfigBuilder().getProfileName()); - activeProfileView.setBackgroundColor(Color.GRAY); + activeProfileView.setBackgroundColor(MainApp.gc(R.color.ribbonBgDefault)); + activeProfileView.setTextColor(MainApp.gc(R.color.ribbonTextDefault)); + + if (reservoirView != null) { + boolean showReservoirView = SP.getBoolean(R.string.key_show_reservoirview, false); + int reservoirLevel = pump.isInitialized() ? (int) Math.round(pump.getReservoirLevel()) : -1; + if (showReservoirView && reservoirLevel != -1) { + int levelWarning = SP.getInt(R.string.key_reservoirview_levelwarning, 80); + int levelCritical = SP.getInt(R.string.key_reservoirview_levelcritical, 5); + reservoirView.setText(reservoirLevel + " " + MainApp.sResources.getString(R.string.insulin_unit_shortname)); + if (reservoirLevel <= levelCritical) { + reservoirView.setBackgroundColor(MainApp.gc(R.color.ribbonBgCritical)); + reservoirView.setTextColor(MainApp.gc(R.color.ribbonTextCritical)); + } else if (reservoirLevel <= levelWarning) { + reservoirView.setBackgroundColor(MainApp.gc(R.color.ribbonBgWarning)); + reservoirView.setTextColor(MainApp.gc(R.color.ribbonTextWarning)); + } else { + reservoirView.setBackgroundColor(MainApp.gc(R.color.ribbonBgDefault)); + reservoirView.setTextColor(MainApp.gc(R.color.ribbonTextDefault)); + } + } else { + reservoirView.setVisibility(View.GONE); + } + } tempTargetView.setOnLongClickListener(view -> { view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); 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 b1f2b076ae..c78af7a75b 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 @@ -423,6 +423,11 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint return pump.basalProfile.hourlyRates[currentHour]; } + @Override + public double getReservoirLevel() { + return pump.reservoirLevel; + } + private static BolusProgressReporter bolusProgressReporter = (state, percent, delivered) -> { EventOverviewBolusProgress event = EventOverviewBolusProgress.getInstance(); switch (state) { 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 1f51979126..77263e41b2 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 @@ -150,6 +150,9 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte return pump.currentBasal; } + @Override + public double getReservoirLevel() { return pump.reservoirRemainingUnits; } + @Override public void stopBolusDelivering() { if (sExecutionService == null) { 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 bf44745f4a..574a775426 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 @@ -352,6 +352,11 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte return pump.currentBasal; } + @Override + public double getReservoirLevel() { + return pump.reservoirRemainingUnits; + } + @Override public synchronized PumpEnactResult deliverTreatment(DetailedBolusInfo detailedBolusInfo) { detailedBolusInfo.insulin = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(detailedBolusInfo.insulin)).value(); 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 9fb98d3175..752360cbfc 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 @@ -385,6 +385,9 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai return basalRate; } + @Override + public double getReservoirLevel() { return reservoirInUnits; } + public String getBaseBasalRateString() { final DecimalFormat df = new DecimalFormat("#.##"); return df.format(basalRate); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java index 09cff7d97e..76068e71d4 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java @@ -129,6 +129,9 @@ public class MDIPlugin extends PluginBase implements PumpInterface { return 0d; } + @Override + public double getReservoirLevel() { return -1; } + @Override public PumpEnactResult deliverTreatment(DetailedBolusInfo detailedBolusInfo) { PumpEnactResult result = new PumpEnactResult(); 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 653ab66c21..bda4f2402e 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 @@ -197,6 +197,9 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { return 0d; } + @Override + public double getReservoirLevel() { return reservoirInUnits; } + @Override public PumpEnactResult deliverTreatment(DetailedBolusInfo detailedBolusInfo) { PumpEnactResult result = new PumpEnactResult(); diff --git a/app/src/main/res/layout/overview_fragment.xml b/app/src/main/res/layout/overview_fragment.xml index 8e37ae7675..8f68a3c834 100644 --- a/app/src/main/res/layout/overview_fragment.xml +++ b/app/src/main/res/layout/overview_fragment.xml @@ -47,6 +47,18 @@ android:textAppearance="?android:attr/textAppearanceSmall" /> + TBR Pumpen-Speicher Aktiviere die SuperBolus-Funktion im Wizard. Nicht aktivieren, wenn du nicht weißt, welche Auswirkungen dieser Bolus hat! ES KANN ZU EINER ÜBERDOSIERUNG AN INSULIN KOMMEN! + Zeige Reservoir-Füllstand in Übersicht + Zeigt den Füllstand des Reservoirs in der Übersicht an. Status des Bolus wird ermittelt PAIRING Bolus-Abgabe gestartet diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 7f1fcc268c..9811aff465 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -59,10 +59,6 @@ #de7550 #25912e - #47c8ff - #FFDD7792 - #ff0400 - #FF8C00 #ff0400 #ff5e55 @@ -75,4 +71,11 @@ #72FF0000 #72000000 + #424242 + #f4d700 + #ff0400 + #FFFFFF + #303030 + #FFFFFF + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index eb9e2cc36c..f478801797 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -607,6 +607,13 @@ key_usersuperbolus Enable superbolus in wizard Enable superbolus functionality in wizard. Do not enable until you learn what it really does. IT MAY CAUSE INSULIN OVERDOSE IF USED BLINDLY! + key_show_reservoirview + Show reservoir level in overview + Show the reservoir level on the overview page. + key_reservoirview_levelwarning + Level warning + key_reservoirview_levelcritical + Level critical IOB COB Firmware diff --git a/app/src/main/res/xml/pref_overview.xml b/app/src/main/res/xml/pref_overview.xml index 5d08cd671e..b235a97f1e 100644 --- a/app/src/main/res/xml/pref_overview.xml +++ b/app/src/main/res/xml/pref_overview.xml @@ -143,6 +143,38 @@ android:summary="@string/enablesuperbolus_summary" android:title="@string/enablesuperbolus" /> + + + + + + From 5ba6f02b93b5697f037b84e862e40eb94b116bb1 Mon Sep 17 00:00:00 2001 From: Nico Schmitz Date: Tue, 12 Jun 2018 23:31:46 +0200 Subject: [PATCH 002/379] Remove reservoir TextView --- .../plugins/Overview/OverviewFragment.java | 24 ------------------- app/src/main/res/layout/overview_fragment.xml | 12 ---------- 2 files changed, 36 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java index a5f375a7bb..9dddaa4bb8 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java @@ -134,7 +134,6 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, TextView baseBasalView; TextView extendedBolusView; TextView activeProfileView; - TextView reservoirView; TextView iobView; TextView cobView; TextView apsModeView; @@ -233,7 +232,6 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, baseBasalView = (TextView) view.findViewById(R.id.overview_basebasal); extendedBolusView = (TextView) view.findViewById(R.id.overview_extendedbolus); activeProfileView = (TextView) view.findViewById(R.id.overview_activeprofile); - reservoirView = (TextView) view.findViewById(R.id.overview_reservoir); pumpStatusView = (TextView) view.findViewById(R.id.overview_pumpstatus); pumpDeviceStatusView = (TextView) view.findViewById(R.id.overview_pump); openapsDeviceStatusView = (TextView) view.findViewById(R.id.overview_openaps); @@ -1195,28 +1193,6 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, activeProfileView.setBackgroundColor(MainApp.gc(R.color.ribbonBgDefault)); activeProfileView.setTextColor(MainApp.gc(R.color.ribbonTextDefault)); - if (reservoirView != null) { - boolean showReservoirView = SP.getBoolean(R.string.key_show_reservoirview, false); - int reservoirLevel = pump.isInitialized() ? (int) Math.round(pump.getReservoirLevel()) : -1; - if (showReservoirView && reservoirLevel != -1) { - int levelWarning = SP.getInt(R.string.key_reservoirview_levelwarning, 80); - int levelCritical = SP.getInt(R.string.key_reservoirview_levelcritical, 5); - reservoirView.setText(reservoirLevel + " " + MainApp.sResources.getString(R.string.insulin_unit_shortname)); - if (reservoirLevel <= levelCritical) { - reservoirView.setBackgroundColor(MainApp.gc(R.color.ribbonBgCritical)); - reservoirView.setTextColor(MainApp.gc(R.color.ribbonTextCritical)); - } else if (reservoirLevel <= levelWarning) { - reservoirView.setBackgroundColor(MainApp.gc(R.color.ribbonBgWarning)); - reservoirView.setTextColor(MainApp.gc(R.color.ribbonTextWarning)); - } else { - reservoirView.setBackgroundColor(MainApp.gc(R.color.ribbonBgDefault)); - reservoirView.setTextColor(MainApp.gc(R.color.ribbonTextDefault)); - } - } else { - reservoirView.setVisibility(View.GONE); - } - } - tempTargetView.setOnLongClickListener(view -> { view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); NewNSTreatmentDialog newTTDialog = new NewNSTreatmentDialog(); diff --git a/app/src/main/res/layout/overview_fragment.xml b/app/src/main/res/layout/overview_fragment.xml index 8f68a3c834..8e37ae7675 100644 --- a/app/src/main/res/layout/overview_fragment.xml +++ b/app/src/main/res/layout/overview_fragment.xml @@ -47,18 +47,6 @@ android:textAppearance="?android:attr/textAppearanceSmall" /> - Date: Wed, 13 Jun 2018 00:07:13 +0200 Subject: [PATCH 003/379] Integrate info fields from swissalpine/dev-work --- .../plugins/Overview/OverviewFragment.java | 84 +++++++++++++++++++ app/src/main/res/layout/overview_fragment.xml | 48 +++++++++++ 2 files changed, 132 insertions(+) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java index 9dddaa4bb8..025bedc789 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java @@ -95,6 +95,7 @@ import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventIobCalcul import info.nightscout.androidaps.plugins.Loop.LoopPlugin; import info.nightscout.androidaps.plugins.Loop.events.EventNewOpenLoopNotification; import info.nightscout.androidaps.plugins.NSClientInternal.data.NSDeviceStatus; +import info.nightscout.androidaps.plugins.NSClientInternal.data.NSSettingsStatus; import info.nightscout.androidaps.plugins.Overview.Dialogs.CalibrationDialog; import info.nightscout.androidaps.plugins.Overview.Dialogs.ErrorHelperActivity; import info.nightscout.androidaps.plugins.Overview.Dialogs.NewCarbsDialog; @@ -154,6 +155,12 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, TextView sage; TextView pbage; + TextView iageView; + TextView cageView; + TextView reservoirView; + TextView sageView; + TextView pbageView; + RecyclerView notificationsView; LinearLayoutManager llm; @@ -252,6 +259,12 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, sage = (TextView) view.findViewById(R.id.careportal_sensorage); pbage = (TextView) view.findViewById(R.id.careportal_pbage); + iageView = (TextView) view.findViewById(R.id.overview_insulinage); + cageView = (TextView) view.findViewById(R.id.overview_canulaage); + reservoirView = (TextView) view.findViewById(R.id.overview_reservoirlevel); + sageView = (TextView) view.findViewById(R.id.overview_sensorage); + pbageView = (TextView) view.findViewById(R.id.overview_pbage); + bgGraph = (GraphView) view.findViewById(R.id.overview_bggraph); iobGraph = (GraphView) view.findViewById(R.id.overview_iobgraph); @@ -1304,6 +1317,67 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, cobView.setText(cobText); } + CareportalEvent careportalEvent; + NSSettingsStatus nsSettings = new NSSettingsStatus().getInstance(); + + double iageUrgent = nsSettings.getExtendedWarnValue("iage", "urgent", 120); + double iageWarn = nsSettings.getExtendedWarnValue("iage", "warn", 96); + double cageUrgent = nsSettings.getExtendedWarnValue("cage", "urgent", 48); + double cageWarn = nsSettings.getExtendedWarnValue("cage", "warn", 24); + double sageUrgent = nsSettings.getExtendedWarnValue("sage", "urgent", 504); + double sageWarn = nsSettings.getExtendedWarnValue("sage", "warn", 336); + double pbageUrgent = nsSettings.getExtendedWarnValue("pgage", "urgent", 672); + double pbageWarn = nsSettings.getExtendedWarnValue("pgage", "warn", 504); + + if (cageView != null) { + careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.SITECHANGE); + if (careportalEvent != null) { + cageView.setTextColor(determineTextColor(careportalEvent, cageWarn, cageUrgent)); + cageView.setText("CAN"); //: " + careportalEvent.age()); + } else { + cageView.setText("n/a"); + } + } + + if (iageView != null) { + careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.INSULINCHANGE); + if (careportalEvent != null) { + iageView.setTextColor(determineTextColor(careportalEvent, iageWarn, iageUrgent)); + iageView.setText("INS"); //: + careportalEvent.age()); + } else { + iageView.setText("n/a"); + } + } + + if (reservoirView != null) { + if (pump.isInitialized() && pump.getReservoirLevel() < 50) { + reservoirView.setTextColor(MainApp.gc(R.color.low)); + } else { + reservoirView.setTextColor(MainApp.gc(R.color.colorLightGray)); + } + reservoirView.setText("RES"); + } + + if (sageView != null) { + careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.SENSORCHANGE); + if (careportalEvent != null) { + sageView.setTextColor(determineTextColor(careportalEvent, sageWarn, sageUrgent)); + sageView.setText("SEN"); // + careportalEvent.age()); + } else { + sageView.setText("n/a"); + } + } + + if (pbageView != null) { + careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.PUMPBATTERYCHANGE); + if (careportalEvent != null) { + pbageView.setTextColor(determineTextColor(careportalEvent, pbageWarn, pbageUrgent)); + pbageView.setText("BAT"); //careportalEvent.age()); + } else { + pbageView.setText("n/a"); + } + } + final boolean predictionsAvailable = finalLastRun != null && finalLastRun.request.hasPredictions; // pump status from ns if (pumpDeviceStatusView != null) { @@ -1466,4 +1540,14 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, } } + public static int determineTextColor(CareportalEvent careportalEvent, double warnThreshold, double urgentThreshold) { + if (careportalEvent.isOlderThan(urgentThreshold)) { + return MainApp.gc(R.color.low); + } else if (careportalEvent.isOlderThan(warnThreshold)) { + return MainApp.gc(R.color.high); + } else { + return MainApp.gc(R.color.colorLightGray); + } + } + } diff --git a/app/src/main/res/layout/overview_fragment.xml b/app/src/main/res/layout/overview_fragment.xml index 8e37ae7675..79e3c518fe 100644 --- a/app/src/main/res/layout/overview_fragment.xml +++ b/app/src/main/res/layout/overview_fragment.xml @@ -183,6 +183,54 @@ + + + + + + + + + + + + + + Date: Wed, 13 Jun 2018 00:28:17 +0200 Subject: [PATCH 004/379] Implement getBatteryLevel() in PumpInterface and for all pump plugins --- .../androidaps/interfaces/PumpInterface.java | 2 ++ .../androidaps/plugins/PumpCombo/ComboPlugin.java | 12 ++++++++++++ .../plugins/PumpDanaR/AbstractDanaRPlugin.java | 3 +++ .../androidaps/plugins/PumpDanaRS/DanaRSPlugin.java | 3 +++ .../plugins/PumpInsight/InsightPlugin.java | 3 +++ .../androidaps/plugins/PumpMDI/MDIPlugin.java | 3 +++ .../plugins/PumpVirtual/VirtualPumpPlugin.java | 3 +++ 7 files changed, 29 insertions(+) diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java b/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java index 9030cf8bfd..0200f7635a 100644 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java +++ b/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java @@ -35,6 +35,8 @@ public interface PumpInterface { double getReservoirLevel(); + int getBatteryLevel(); // in percent as integer + PumpEnactResult deliverTreatment(DetailedBolusInfo detailedBolusInfo); void stopBolusDelivering(); PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes, Profile profile, boolean enforceNew); 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 c78af7a75b..b11b0c4694 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 @@ -428,6 +428,18 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint return pump.reservoirLevel; } + @Override + public int getBatteryLevel() { + switch (pump.state.batteryState) { + case PumpState.EMPTY: + return 0; + case PumpState.LOW: + return 25; + default: + return 100; + } + } + private static BolusProgressReporter bolusProgressReporter = (state, percent, delivered) -> { EventOverviewBolusProgress event = EventOverviewBolusProgress.getInstance(); switch (state) { 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 77263e41b2..5deeac949f 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 @@ -153,6 +153,9 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte @Override public double getReservoirLevel() { return pump.reservoirRemainingUnits; } + @Override + public int getBatteryLevel() { return pump.batteryRemaining; } + @Override public void stopBolusDelivering() { if (sExecutionService == null) { 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 574a775426..10b7f0f4c2 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 @@ -357,6 +357,9 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte return pump.reservoirRemainingUnits; } + @Override + public int getBatteryLevel() { return pump.batteryRemaining; } + @Override public synchronized PumpEnactResult deliverTreatment(DetailedBolusInfo detailedBolusInfo) { detailedBolusInfo.insulin = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(detailedBolusInfo.insulin)).value(); 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 752360cbfc..2b31e4e3d7 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 @@ -388,6 +388,9 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai @Override public double getReservoirLevel() { return reservoirInUnits; } + @Override + public int getBatteryLevel() { return batteryPercent; } + public String getBaseBasalRateString() { final DecimalFormat df = new DecimalFormat("#.##"); return df.format(basalRate); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java index 76068e71d4..4247b2b45f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java @@ -132,6 +132,9 @@ public class MDIPlugin extends PluginBase implements PumpInterface { @Override public double getReservoirLevel() { return -1; } + @Override + public int getBatteryLevel() { return -1; } + @Override public PumpEnactResult deliverTreatment(DetailedBolusInfo detailedBolusInfo) { PumpEnactResult result = new PumpEnactResult(); 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 bda4f2402e..949f9c9875 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 @@ -200,6 +200,9 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { @Override public double getReservoirLevel() { return reservoirInUnits; } + @Override + public int getBatteryLevel() { return batteryPercent; } + @Override public PumpEnactResult deliverTreatment(DetailedBolusInfo detailedBolusInfo) { PumpEnactResult result = new PumpEnactResult(); From 217583d6011271a504c021170b34fcc9f44c5a9e Mon Sep 17 00:00:00 2001 From: Nico Schmitz Date: Wed, 13 Jun 2018 19:58:52 +0200 Subject: [PATCH 005/379] Use getBatteryLevel() for BAT status. Refactor code and layout. --- .../plugins/Overview/OverviewFragment.java | 64 ++++++++----------- app/src/main/res/layout/overview_fragment.xml | 27 ++++++-- 2 files changed, 48 insertions(+), 43 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java index 025bedc789..ec2b723bac 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java @@ -1331,51 +1331,30 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, if (cageView != null) { careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.SITECHANGE); - if (careportalEvent != null) { - cageView.setTextColor(determineTextColor(careportalEvent, cageWarn, cageUrgent)); - cageView.setText("CAN"); //: " + careportalEvent.age()); - } else { - cageView.setText("n/a"); - } + double canAge = careportalEvent != null ? careportalEvent.getHoursFromStart() : Double.MAX_VALUE; + applyRibbonView(cageView, "CAN", canAge, cageWarn, cageUrgent, Double.MAX_VALUE); } if (iageView != null) { careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.INSULINCHANGE); - if (careportalEvent != null) { - iageView.setTextColor(determineTextColor(careportalEvent, iageWarn, iageUrgent)); - iageView.setText("INS"); //: + careportalEvent.age()); - } else { - iageView.setText("n/a"); - } + double insulinAge = careportalEvent != null ? careportalEvent.getHoursFromStart() : Double.MAX_VALUE; + applyRibbonView(iageView, "INS", insulinAge, iageWarn, iageUrgent, Double.MAX_VALUE); } if (reservoirView != null) { - if (pump.isInitialized() && pump.getReservoirLevel() < 50) { - reservoirView.setTextColor(MainApp.gc(R.color.low)); - } else { - reservoirView.setTextColor(MainApp.gc(R.color.colorLightGray)); - } - reservoirView.setText("RES"); + double reservoirLevel = pump.isInitialized() ? pump.getReservoirLevel() : -1; + applyRibbonView(reservoirView, "RES", reservoirLevel, 80, 10, -1); } if (sageView != null) { careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.SENSORCHANGE); - if (careportalEvent != null) { - sageView.setTextColor(determineTextColor(careportalEvent, sageWarn, sageUrgent)); - sageView.setText("SEN"); // + careportalEvent.age()); - } else { - sageView.setText("n/a"); - } + double sensorAge = careportalEvent != null ? careportalEvent.getHoursFromStart() : Double.MAX_VALUE; + applyRibbonView(sageView, "SEN", sensorAge, sageWarn, sageUrgent, Double.MAX_VALUE); } if (pbageView != null) { - careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.PUMPBATTERYCHANGE); - if (careportalEvent != null) { - pbageView.setTextColor(determineTextColor(careportalEvent, pbageWarn, pbageUrgent)); - pbageView.setText("BAT"); //careportalEvent.age()); - } else { - pbageView.setText("n/a"); - } + double batteryLevel = pump.isInitialized() ? pump.getBatteryLevel() : -1; + applyRibbonView(pbageView, "BAT", batteryLevel, 25, 5, -1); } final boolean predictionsAvailable = finalLastRun != null && finalLastRun.request.hasPredictions; @@ -1540,14 +1519,23 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, } } - public static int determineTextColor(CareportalEvent careportalEvent, double warnThreshold, double urgentThreshold) { - if (careportalEvent.isOlderThan(urgentThreshold)) { - return MainApp.gc(R.color.low); - } else if (careportalEvent.isOlderThan(warnThreshold)) { - return MainApp.gc(R.color.high); + public static void applyRibbonView(TextView view, String text, double value, double warnThreshold, double urgentThreshold, double invalid) { + if (value != invalid) { + view.setText(text); + if (value <= urgentThreshold) { + view.setTextColor(MainApp.gc(R.color.ribbonTextCritical)); + view.setBackgroundColor(MainApp.gc(R.color.ribbonBgCritical)); + } else if (value <= warnThreshold) { + view.setTextColor(MainApp.gc(R.color.ribbonTextWarning)); + view.setBackgroundColor(MainApp.gc(R.color.ribbonBgWarning)); + } else { + view.setTextColor(MainApp.gc(R.color.ribbonTextDefault)); + view.setBackgroundColor(MainApp.gc(R.color.ribbonBgDefault)); + } + view.setVisibility(View.VISIBLE); } else { - return MainApp.gc(R.color.colorLightGray); + view.setVisibility(View.GONE); } - } + } } diff --git a/app/src/main/res/layout/overview_fragment.xml b/app/src/main/res/layout/overview_fragment.xml index 79e3c518fe..2e21c270cd 100644 --- a/app/src/main/res/layout/overview_fragment.xml +++ b/app/src/main/res/layout/overview_fragment.xml @@ -187,13 +187,18 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" + android:layout_marginTop="3dp" + android:layout_marginBottom="2dp" android:orientation="horizontal"> @@ -201,7 +206,10 @@ android:id="@+id/overview_insulinage" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:paddingLeft="10dp" + android:paddingLeft="5dp" + android:paddingRight="5dp" + android:layout_marginHorizontal="3dp" + android:gravity="center" android:text="" android:textSize="14sp" /> @@ -209,7 +217,10 @@ android:id="@+id/overview_reservoirlevel" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:paddingLeft="10dp" + android:paddingLeft="5dp" + android:paddingRight="5dp" + android:layout_marginHorizontal="3dp" + android:gravity="center" android:text="" android:textSize="14sp" /> @@ -217,7 +228,10 @@ android:id="@+id/overview_sensorage" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:paddingLeft="10dp" + android:paddingLeft="5dp" + android:paddingRight="5dp" + android:layout_marginHorizontal="3dp" + android:gravity="center" android:text="" android:textSize="14sp" /> @@ -225,7 +239,10 @@ android:id="@+id/overview_pbage" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:paddingLeft="10dp" + android:paddingLeft="5dp" + android:paddingRight="5dp" + android:layout_marginHorizontal="3dp" + android:gravity="center" android:text="" android:textSize="14sp" /> From 18c6bdd4ef29747276b327ab6b4bc6dbcacf7712 Mon Sep 17 00:00:00 2001 From: Nico Schmitz Date: Wed, 13 Jun 2018 21:35:21 +0200 Subject: [PATCH 006/379] Improve layout xml --- app/src/main/res/layout/overview_fragment.xml | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/app/src/main/res/layout/overview_fragment.xml b/app/src/main/res/layout/overview_fragment.xml index 2e21c270cd..5aae13e1f7 100644 --- a/app/src/main/res/layout/overview_fragment.xml +++ b/app/src/main/res/layout/overview_fragment.xml @@ -195,8 +195,7 @@ android:id="@+id/overview_canulaage" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:paddingLeft="5dp" - android:paddingRight="5dp" + android:paddingHorizontal="5dp" android:layout_marginHorizontal="3dp" android:gravity="center" android:text="" @@ -206,8 +205,7 @@ android:id="@+id/overview_insulinage" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:paddingLeft="5dp" - android:paddingRight="5dp" + android:paddingHorizontal="5dp" android:layout_marginHorizontal="3dp" android:gravity="center" android:text="" @@ -217,8 +215,7 @@ android:id="@+id/overview_reservoirlevel" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:paddingLeft="5dp" - android:paddingRight="5dp" + android:paddingHorizontal="5dp" android:layout_marginHorizontal="3dp" android:gravity="center" android:text="" @@ -228,8 +225,7 @@ android:id="@+id/overview_sensorage" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:paddingLeft="5dp" - android:paddingRight="5dp" + android:paddingHorizontal="5dp" android:layout_marginHorizontal="3dp" android:gravity="center" android:text="" @@ -239,8 +235,7 @@ android:id="@+id/overview_pbage" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:paddingLeft="5dp" - android:paddingRight="5dp" + android:paddingHorizontal="5dp" android:layout_marginHorizontal="3dp" android:gravity="center" android:text="" From 1604b533277a3b3702d3ca06bd094ea992270c5c Mon Sep 17 00:00:00 2001 From: Nico Schmitz Date: Thu, 14 Jun 2018 20:49:58 +0200 Subject: [PATCH 007/379] Fix bugs, refactor code and add preferences --- .../androidaps/db/CareportalEvent.java | 4 +- .../plugins/Overview/OverviewFragment.java | 90 +++++++++++-------- .../plugins/PumpCombo/ComboPlugin.java | 2 +- app/src/main/res/layout/overview_fragment.xml | 3 +- app/src/main/res/values-de/strings.xml | 8 +- app/src/main/res/values/strings.xml | 18 ++-- app/src/main/res/xml/pref_overview.xml | 46 +++++++--- 7 files changed, 110 insertions(+), 61 deletions(-) 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 72ff1ddab0..a963158f2f 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java +++ b/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java @@ -86,8 +86,8 @@ public class CareportalEvent implements DataPointWithLabelInterface { return System.currentTimeMillis() - date; } - public long getHoursFromStart() { - return (System.currentTimeMillis() - date) / (60 * 60 * 1000); + public double getHoursFromStart() { + return (System.currentTimeMillis() - date) / (60 * 60 * 1000.0); } public String age() { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java index eedf854860..02053c0b9c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java @@ -3,6 +3,7 @@ package info.nightscout.androidaps.plugins.Overview; import android.annotation.SuppressLint; import android.app.Activity; import android.app.NotificationManager; +import android.arch.core.util.Function; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; @@ -159,7 +160,8 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, TextView cageView; TextView reservoirView; TextView sageView; - TextView pbageView; + TextView batteryView; + LinearLayout statuslightsLayout; RecyclerView notificationsView; LinearLayoutManager llm; @@ -263,7 +265,8 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, cageView = (TextView) view.findViewById(R.id.overview_canulaage); reservoirView = (TextView) view.findViewById(R.id.overview_reservoirlevel); sageView = (TextView) view.findViewById(R.id.overview_sensorage); - pbageView = (TextView) view.findViewById(R.id.overview_pbage); + batteryView = (TextView) view.findViewById(R.id.overview_batterylevel); + statuslightsLayout = (LinearLayout) view.findViewById(R.id.overview_statuslights); bgGraph = (GraphView) view.findViewById(R.id.overview_bggraph); iobGraph = (GraphView) view.findViewById(R.id.overview_iobgraph); @@ -1321,44 +1324,54 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, cobView.setText(cobText); } - CareportalEvent careportalEvent; - NSSettingsStatus nsSettings = new NSSettingsStatus().getInstance(); + if (statuslightsLayout != null) { + if (SP.getBoolean(R.string.key_show_statuslights, false)) { + CareportalEvent careportalEvent; + NSSettingsStatus nsSettings = new NSSettingsStatus().getInstance(); + double iageUrgent = nsSettings.getExtendedWarnValue("iage", "urgent", 96); + double iageWarn = nsSettings.getExtendedWarnValue("iage", "warn", 72); + double cageUrgent = nsSettings.getExtendedWarnValue("cage", "urgent", 72); + double cageWarn = nsSettings.getExtendedWarnValue("cage", "warn", 48); + double sageUrgent = nsSettings.getExtendedWarnValue("sage", "urgent", 166); + double sageWarn = nsSettings.getExtendedWarnValue("sage", "warn", 164); + //double pbageUrgent = nsSettings.getExtendedWarnValue("pgage", "urgent", 360); + //double pbageWarn = nsSettings.getExtendedWarnValue("pgage", "warn", 240); + double batUrgent = SP.getDouble(R.string.key_statuslights_bat_critical, 5.0); + double batWarn = SP.getDouble(R.string.key_statuslights_bat_warning, 25.0); + double resUrgent = SP.getDouble(R.string.key_statuslights_res_critical, 10.0); + double resWarn = SP.getDouble(R.string.key_statuslights_res_warning, 80.0); - double iageUrgent = nsSettings.getExtendedWarnValue("iage", "urgent", 120); - double iageWarn = nsSettings.getExtendedWarnValue("iage", "warn", 96); - double cageUrgent = nsSettings.getExtendedWarnValue("cage", "urgent", 48); - double cageWarn = nsSettings.getExtendedWarnValue("cage", "warn", 24); - double sageUrgent = nsSettings.getExtendedWarnValue("sage", "urgent", 504); - double sageWarn = nsSettings.getExtendedWarnValue("sage", "warn", 336); - double pbageUrgent = nsSettings.getExtendedWarnValue("pgage", "urgent", 672); - double pbageWarn = nsSettings.getExtendedWarnValue("pgage", "warn", 504); + if (cageView != null) { + careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.SITECHANGE); + double canAge = careportalEvent != null ? careportalEvent.getHoursFromStart() : Double.MAX_VALUE; + applyRibbonView(cageView, "CAN", canAge, cageWarn, cageUrgent, Double.MAX_VALUE, true); + } - if (cageView != null) { - careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.SITECHANGE); - double canAge = careportalEvent != null ? careportalEvent.getHoursFromStart() : Double.MAX_VALUE; - applyRibbonView(cageView, "CAN", canAge, cageWarn, cageUrgent, Double.MAX_VALUE); - } + if (iageView != null) { + careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.INSULINCHANGE); + double insulinAge = careportalEvent != null ? careportalEvent.getHoursFromStart() : Double.MAX_VALUE; + applyRibbonView(iageView, "INS", insulinAge, iageWarn, iageUrgent, Double.MAX_VALUE, true); + } - if (iageView != null) { - careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.INSULINCHANGE); - double insulinAge = careportalEvent != null ? careportalEvent.getHoursFromStart() : Double.MAX_VALUE; - applyRibbonView(iageView, "INS", insulinAge, iageWarn, iageUrgent, Double.MAX_VALUE); - } + if (reservoirView != null) { + double reservoirLevel = pump.isInitialized() ? pump.getReservoirLevel() : -1; + applyRibbonView(reservoirView, "RES", reservoirLevel, resWarn, resUrgent, -1, false); + } - if (reservoirView != null) { - double reservoirLevel = pump.isInitialized() ? pump.getReservoirLevel() : -1; - applyRibbonView(reservoirView, "RES", reservoirLevel, 80, 10, -1); - } + if (sageView != null) { + careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.SENSORCHANGE); + double sensorAge = careportalEvent != null ? careportalEvent.getHoursFromStart() : Double.MAX_VALUE; + applyRibbonView(sageView, "SEN", sensorAge, sageWarn, sageUrgent, Double.MAX_VALUE, true); + } - if (sageView != null) { - careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.SENSORCHANGE); - double sensorAge = careportalEvent != null ? careportalEvent.getHoursFromStart() : Double.MAX_VALUE; - applyRibbonView(sageView, "SEN", sensorAge, sageWarn, sageUrgent, Double.MAX_VALUE); - } - - if (pbageView != null) { - double batteryLevel = pump.isInitialized() ? pump.getBatteryLevel() : -1; - applyRibbonView(pbageView, "BAT", batteryLevel, 25, 5, -1); + if (batteryView != null) { + double batteryLevel = pump.isInitialized() ? pump.getBatteryLevel() : -1; + applyRibbonView(batteryView, "BAT", batteryLevel, batWarn, batUrgent, -1, false); + } + statuslightsLayout.setVisibility(View.VISIBLE); + } else { + statuslightsLayout.setVisibility(View.GONE); + } } final boolean predictionsAvailable = finalLastRun != null && finalLastRun.request.hasPredictions; @@ -1523,13 +1536,14 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, } } - public static void applyRibbonView(TextView view, String text, double value, double warnThreshold, double urgentThreshold, double invalid) { + public static void applyRibbonView(TextView view, String text, double value, double warnThreshold, double urgentThreshold, double invalid, boolean checkAscending) { + Function check = checkAscending ? (Double threshold) -> value >= threshold : (Double threshold) -> value <= threshold; if (value != invalid) { view.setText(text); - if (value <= urgentThreshold) { + if (check.apply(urgentThreshold)) { view.setTextColor(MainApp.gc(R.color.ribbonTextCritical)); view.setBackgroundColor(MainApp.gc(R.color.ribbonBgCritical)); - } else if (value <= warnThreshold) { + } else if (check.apply(warnThreshold)) { view.setTextColor(MainApp.gc(R.color.ribbonTextWarning)); view.setBackgroundColor(MainApp.gc(R.color.ribbonBgWarning)); } else { 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 b11b0c4694..d4aa0d7da8 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 @@ -432,7 +432,7 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint public int getBatteryLevel() { switch (pump.state.batteryState) { case PumpState.EMPTY: - return 0; + return 5; case PumpState.LOW: return 25; default: diff --git a/app/src/main/res/layout/overview_fragment.xml b/app/src/main/res/layout/overview_fragment.xml index 5aae13e1f7..3dfe816f46 100644 --- a/app/src/main/res/layout/overview_fragment.xml +++ b/app/src/main/res/layout/overview_fragment.xml @@ -184,6 +184,7 @@ TBR Pumpen-Speicher Aktiviere die SuperBolus-Funktion im Wizard. Nicht aktivieren, wenn du nicht weißt, welche Auswirkungen dieser Bolus hat! ES KANN ZU EINER ÜBERDOSIERUNG AN INSULIN KOMMEN! - Zeige Reservoir-Füllstand in Übersicht - Zeigt den Füllstand des Reservoirs in der Übersicht an. + Zeige Status-Ampeln in der Übersicht + Aktiviert die Statusanzeige für CAGE, IAGE, SAGE, Reservoir- und Batteriestand auf dem Startbildschirm. + Reservoirfüllstand Warnung [IE] + Reservoirfüllstand Alarm [IE] + Batterieladung Warnung [%] + Batterieladung Alarm [%] Status des Bolus wird ermittelt PAIRING Bolus-Abgabe gestartet diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f478801797..4abf52f6d5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -607,13 +607,17 @@ key_usersuperbolus Enable superbolus in wizard Enable superbolus functionality in wizard. Do not enable until you learn what it really does. IT MAY CAUSE INSULIN OVERDOSE IF USED BLINDLY! - key_show_reservoirview - Show reservoir level in overview - Show the reservoir level on the overview page. - key_reservoirview_levelwarning - Level warning - key_reservoirview_levelcritical - Level critical + key_show_statuslights + Show status lights on home screen + Enable status lights for cage, iage, sage, reservoir and battery level on home screen. + key_statuslights_res_warning + Threshold warning reservoir level [U] + key_statuslights_res_critical + Threshold critical reservoir level [U] + key_statuslights_bat_warning + Threshold warning battery level [%] + key_statuslights_bat_critical + Threshold critical battery level [%] IOB COB Firmware diff --git a/app/src/main/res/xml/pref_overview.xml b/app/src/main/res/xml/pref_overview.xml index b235a97f1e..daf1605fb5 100644 --- a/app/src/main/res/xml/pref_overview.xml +++ b/app/src/main/res/xml/pref_overview.xml @@ -145,36 +145,62 @@ + android:key="@string/key_show_statuslights" + android:summary="@string/show_statuslights_summary" + android:title="@string/show_statuslights" /> + + + + From bf3ce735bcfbb78e540fd5015fe50cf5322170b6 Mon Sep 17 00:00:00 2001 From: Nico Schmitz Date: Thu, 14 Jun 2018 23:22:15 +0200 Subject: [PATCH 008/379] Set colors of profile view --- .../androidaps/plugins/Overview/OverviewFragment.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java index 02053c0b9c..4127ce49a0 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java @@ -1210,8 +1210,13 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, } activeProfileView.setText(MainApp.getConfigBuilder().getProfileName()); - activeProfileView.setBackgroundColor(MainApp.gc(R.color.ribbonBgDefault)); - activeProfileView.setTextColor(MainApp.gc(R.color.ribbonTextDefault)); + if (profile.getPercentage() != 100 || profile.getTimeshift() != 0) { + activeProfileView.setBackgroundColor(MainApp.gc(R.color.ribbonBgWarning)); + activeProfileView.setTextColor(MainApp.gc(R.color.ribbonTextWarning)); + } else { + activeProfileView.setBackgroundColor(MainApp.gc(R.color.ribbonBgDefault)); + activeProfileView.setTextColor(MainApp.gc(R.color.ribbonTextDefault)); + } tempTargetView.setOnLongClickListener(view -> { view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); From 14a17efecc420361e92abf004cda8fe78e732e14 Mon Sep 17 00:00:00 2001 From: Nico Schmitz Date: Fri, 15 Jun 2018 19:36:49 +0200 Subject: [PATCH 009/379] Update colors --- .../androidaps/plugins/Overview/OverviewFragment.java | 8 ++++---- app/src/main/res/values/colors.xml | 4 +++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java index 4127ce49a0..6a1812b228 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java @@ -1068,9 +1068,9 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, apsModeView.setText(String.format(MainApp.gs(R.string.loopsuperbolusfor), loopPlugin.minutesToEndOfSuspend())); apsModeView.setTextColor(MainApp.gc(R.color.ribbonTextWarning)); } else if (loopPlugin.isEnabled(PluginType.LOOP) && loopPlugin.isDisconnected()) { - apsModeView.setBackgroundColor(MainApp.gc(R.color.ribbonBgWarning)); + apsModeView.setBackgroundColor(MainApp.gc(R.color.ribbonBgCritical)); apsModeView.setText(String.format(MainApp.gs(R.string.loopdisconnectedfor), loopPlugin.minutesToEndOfSuspend())); - apsModeView.setTextColor(MainApp.gc(R.color.ribbonTextWarning)); + apsModeView.setTextColor(MainApp.gc(R.color.ribbonTextCritical)); } else if (loopPlugin.isEnabled(PluginType.LOOP) && loopPlugin.isSuspended()) { apsModeView.setBackgroundColor(MainApp.gc(R.color.ribbonBgWarning)); apsModeView.setText(String.format(MainApp.gs(R.string.loopsuspendedfor), loopPlugin.minutesToEndOfSuspend())); @@ -1552,8 +1552,8 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, view.setTextColor(MainApp.gc(R.color.ribbonTextWarning)); view.setBackgroundColor(MainApp.gc(R.color.ribbonBgWarning)); } else { - view.setTextColor(MainApp.gc(R.color.ribbonTextDefault)); - view.setBackgroundColor(MainApp.gc(R.color.ribbonBgDefault)); + view.setTextColor(MainApp.gc(R.color.ribbonTextDisabled)); + view.setBackgroundColor(MainApp.gc(R.color.ribbonBgDisabled)); } view.setVisibility(View.VISIBLE); } else { diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 9811aff465..37c11857e9 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -71,11 +71,13 @@ #72FF0000 #72000000 - #424242 + #5a595b #f4d700 #ff0400 #FFFFFF #303030 #FFFFFF + #424242 + #333333 From db36d6e3f53b2af7fe59139076858e98ef77e71b Mon Sep 17 00:00:00 2001 From: Nico Schmitz Date: Sat, 16 Jun 2018 02:18:03 +0200 Subject: [PATCH 010/379] Change colors and refactor code --- .../plugins/Overview/OverviewFragment.java | 41 +++++++++---------- app/src/main/res/values/colors.xml | 8 ++-- 2 files changed, 22 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java index 6a1812b228..e89a040316 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java @@ -1060,23 +1060,23 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, final LoopPlugin.LastRun finalLastRun = LoopPlugin.lastRun; if (Config.APS && pump.getPumpDescription().isTempBasalCapable) { apsModeView.setVisibility(View.VISIBLE); - apsModeView.setBackgroundColor(MainApp.gc(R.color.ribbonBgDefault)); + apsModeView.setBackgroundColor(MainApp.gc(R.color.ribbonDefault)); apsModeView.setTextColor(MainApp.gc(R.color.ribbonTextDefault)); final LoopPlugin loopPlugin = LoopPlugin.getPlugin(); if (loopPlugin.isEnabled(PluginType.LOOP) && loopPlugin.isSuperBolus()) { - apsModeView.setBackgroundColor(MainApp.gc(R.color.ribbonBgWarning)); + apsModeView.setBackgroundColor(MainApp.gc(R.color.ribbonWarning)); apsModeView.setText(String.format(MainApp.gs(R.string.loopsuperbolusfor), loopPlugin.minutesToEndOfSuspend())); apsModeView.setTextColor(MainApp.gc(R.color.ribbonTextWarning)); } else if (loopPlugin.isEnabled(PluginType.LOOP) && loopPlugin.isDisconnected()) { - apsModeView.setBackgroundColor(MainApp.gc(R.color.ribbonBgCritical)); + apsModeView.setBackgroundColor(MainApp.gc(R.color.ribbonCritical)); apsModeView.setText(String.format(MainApp.gs(R.string.loopdisconnectedfor), loopPlugin.minutesToEndOfSuspend())); apsModeView.setTextColor(MainApp.gc(R.color.ribbonTextCritical)); } else if (loopPlugin.isEnabled(PluginType.LOOP) && loopPlugin.isSuspended()) { - apsModeView.setBackgroundColor(MainApp.gc(R.color.ribbonBgWarning)); + apsModeView.setBackgroundColor(MainApp.gc(R.color.ribbonWarning)); apsModeView.setText(String.format(MainApp.gs(R.string.loopsuspendedfor), loopPlugin.minutesToEndOfSuspend())); apsModeView.setTextColor(MainApp.gc(R.color.ribbonTextWarning)); } else if (pump.isSuspended()) { - apsModeView.setBackgroundColor(MainApp.gc(R.color.ribbonBgWarning)); + apsModeView.setBackgroundColor(MainApp.gc(R.color.ribbonWarning)); apsModeView.setText(MainApp.gs(R.string.pumpsuspended)); apsModeView.setTextColor(MainApp.gc(R.color.ribbonTextWarning)); } else if (loopPlugin.isEnabled(PluginType.LOOP)) { @@ -1086,7 +1086,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, apsModeView.setText(MainApp.gs(R.string.openloop)); } } else { - apsModeView.setBackgroundColor(MainApp.gc(R.color.ribbonBgCritical)); + apsModeView.setBackgroundColor(MainApp.gc(R.color.ribbonCritical)); apsModeView.setText(MainApp.gs(R.string.disabledloop)); apsModeView.setTextColor(MainApp.gc(R.color.ribbonTextCritical)); } @@ -1098,12 +1098,12 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, TempTarget tempTarget = TreatmentsPlugin.getPlugin().getTempTargetFromHistory(); if (tempTarget != null) { tempTargetView.setTextColor(MainApp.gc(R.color.ribbonTextWarning)); - tempTargetView.setBackgroundColor(MainApp.gc(R.color.ribbonBgWarning)); + tempTargetView.setBackgroundColor(MainApp.gc(R.color.ribbonWarning)); tempTargetView.setVisibility(View.VISIBLE); tempTargetView.setText(Profile.toTargetRangeString(tempTarget.low, tempTarget.high, Constants.MGDL, units) + " " + DateUtil.untilString(tempTarget.end())); } else { tempTargetView.setTextColor(MainApp.gc(R.color.ribbonTextDefault)); - tempTargetView.setBackgroundColor(MainApp.gc(R.color.ribbonBgDefault)); + tempTargetView.setBackgroundColor(MainApp.gc(R.color.ribbonDefault)); tempTargetView.setText(Profile.toTargetRangeString(profile.getTargetLow(), profile.getTargetHigh(), units, units)); tempTargetView.setVisibility(View.VISIBLE); } @@ -1211,10 +1211,10 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, activeProfileView.setText(MainApp.getConfigBuilder().getProfileName()); if (profile.getPercentage() != 100 || profile.getTimeshift() != 0) { - activeProfileView.setBackgroundColor(MainApp.gc(R.color.ribbonBgWarning)); + activeProfileView.setBackgroundColor(MainApp.gc(R.color.ribbonWarning)); activeProfileView.setTextColor(MainApp.gc(R.color.ribbonTextWarning)); } else { - activeProfileView.setBackgroundColor(MainApp.gc(R.color.ribbonBgDefault)); + activeProfileView.setBackgroundColor(MainApp.gc(R.color.ribbonDefault)); activeProfileView.setTextColor(MainApp.gc(R.color.ribbonTextDefault)); } @@ -1349,29 +1349,29 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, if (cageView != null) { careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.SITECHANGE); double canAge = careportalEvent != null ? careportalEvent.getHoursFromStart() : Double.MAX_VALUE; - applyRibbonView(cageView, "CAN", canAge, cageWarn, cageUrgent, Double.MAX_VALUE, true); + applyStatuslight(cageView, "CAN", canAge, cageWarn, cageUrgent, Double.MAX_VALUE, true); } if (iageView != null) { careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.INSULINCHANGE); double insulinAge = careportalEvent != null ? careportalEvent.getHoursFromStart() : Double.MAX_VALUE; - applyRibbonView(iageView, "INS", insulinAge, iageWarn, iageUrgent, Double.MAX_VALUE, true); + applyStatuslight(iageView, "INS", insulinAge, iageWarn, iageUrgent, Double.MAX_VALUE, true); } if (reservoirView != null) { double reservoirLevel = pump.isInitialized() ? pump.getReservoirLevel() : -1; - applyRibbonView(reservoirView, "RES", reservoirLevel, resWarn, resUrgent, -1, false); + applyStatuslight(reservoirView, "RES", reservoirLevel, resWarn, resUrgent, -1, false); } if (sageView != null) { careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.SENSORCHANGE); double sensorAge = careportalEvent != null ? careportalEvent.getHoursFromStart() : Double.MAX_VALUE; - applyRibbonView(sageView, "SEN", sensorAge, sageWarn, sageUrgent, Double.MAX_VALUE, true); + applyStatuslight(sageView, "SEN", sensorAge, sageWarn, sageUrgent, Double.MAX_VALUE, true); } if (batteryView != null) { double batteryLevel = pump.isInitialized() ? pump.getBatteryLevel() : -1; - applyRibbonView(batteryView, "BAT", batteryLevel, batWarn, batUrgent, -1, false); + applyStatuslight(batteryView, "BAT", batteryLevel, batWarn, batUrgent, -1, false); } statuslightsLayout.setVisibility(View.VISIBLE); } else { @@ -1541,19 +1541,16 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, } } - public static void applyRibbonView(TextView view, String text, double value, double warnThreshold, double urgentThreshold, double invalid, boolean checkAscending) { + public static void applyStatuslight(TextView view, String text, double value, double warnThreshold, double urgentThreshold, double invalid, boolean checkAscending) { Function check = checkAscending ? (Double threshold) -> value >= threshold : (Double threshold) -> value <= threshold; if (value != invalid) { view.setText(text); if (check.apply(urgentThreshold)) { - view.setTextColor(MainApp.gc(R.color.ribbonTextCritical)); - view.setBackgroundColor(MainApp.gc(R.color.ribbonBgCritical)); + view.setTextColor(MainApp.gc(R.color.ribbonCritical)); } else if (check.apply(warnThreshold)) { - view.setTextColor(MainApp.gc(R.color.ribbonTextWarning)); - view.setBackgroundColor(MainApp.gc(R.color.ribbonBgWarning)); + view.setTextColor(MainApp.gc(R.color.ribbonWarning)); } else { - view.setTextColor(MainApp.gc(R.color.ribbonTextDisabled)); - view.setBackgroundColor(MainApp.gc(R.color.ribbonBgDisabled)); + view.setTextColor(MainApp.gc(R.color.ribbonDefault)); } view.setVisibility(View.VISIBLE); } else { diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 37c11857e9..0224c6c9f1 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -71,13 +71,11 @@ #72FF0000 #72000000 - #5a595b - #f4d700 - #ff0400 + #5a595b + #f4d700 + #ff0400 #FFFFFF #303030 #FFFFFF - #424242 - #333333 From 87d7fed75b159411aa9330822b8ed2fdb36eb9c6 Mon Sep 17 00:00:00 2001 From: Nico Schmitz Date: Sat, 16 Jun 2018 14:03:45 +0200 Subject: [PATCH 011/379] Remove margin of status light layout --- app/src/main/res/layout/overview_fragment.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/res/layout/overview_fragment.xml b/app/src/main/res/layout/overview_fragment.xml index 3dfe816f46..5a0ae676cd 100644 --- a/app/src/main/res/layout/overview_fragment.xml +++ b/app/src/main/res/layout/overview_fragment.xml @@ -188,8 +188,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" - android:layout_marginTop="3dp" - android:layout_marginBottom="2dp" android:orientation="horizontal"> Date: Sun, 17 Jun 2018 21:02:42 +0200 Subject: [PATCH 012/379] Add overview_statuslights to overview_fragment_smallheight.xml --- .../layout/overview_fragment_smallheight.xml | 62 ++++++++++++++++++- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/overview_fragment_smallheight.xml b/app/src/main/res/layout/overview_fragment_smallheight.xml index ca425337f6..c0bd01cf3b 100644 --- a/app/src/main/res/layout/overview_fragment_smallheight.xml +++ b/app/src/main/res/layout/overview_fragment_smallheight.xml @@ -183,6 +183,65 @@ + + + + + + + + + + + + + + + android:orientation="horizontal"> Date: Sun, 17 Jun 2018 22:41:34 +0200 Subject: [PATCH 013/379] Don't show statuslight preferences in NSCLIENT build --- .../nightscout/androidaps/PreferencesActivity.java | 12 ++++++++++++ app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/pref_overview.xml | 2 +- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java b/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java index 014dfcd863..c2d3e8411b 100644 --- a/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java @@ -9,6 +9,7 @@ import android.preference.PreferenceActivity; import android.preference.PreferenceFragment; import android.preference.PreferenceGroup; import android.preference.PreferenceManager; +import android.preference.PreferenceScreen; import android.text.TextUtils; import info.nightscout.androidaps.events.EventPreferenceChange; @@ -187,6 +188,17 @@ public class PreferencesActivity extends PreferenceActivity implements SharedPre addPreferencesFromResourceIfEnabled(StatuslinePlugin.getPlugin(), PluginType.GENERAL); } + if (Config.NSCLIENT || Config.G5UPLOADER) { + PreferenceScreen scrnAdvancedSettings = (PreferenceScreen)findPreference(getString(R.string.key_advancedsettings)); + if (scrnAdvancedSettings != null) { + scrnAdvancedSettings.removePreference(getPreference(getString(R.string.key_statuslights_res_warning))); + scrnAdvancedSettings.removePreference(getPreference(getString(R.string.key_statuslights_res_critical))); + scrnAdvancedSettings.removePreference(getPreference(getString(R.string.key_statuslights_bat_warning))); + scrnAdvancedSettings.removePreference(getPreference(getString(R.string.key_statuslights_bat_critical))); + scrnAdvancedSettings.removePreference(getPreference(getString(R.string.key_show_statuslights))); + } + } + initSummary(getPreferenceScreen()); } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 499679a44d..430ba8ebba 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -475,6 +475,7 @@ Always use short average delta instead of simple delta Useful when data from unfiltered sources like xDrip gets noisy. Advanced Settings + key_advancedsettings Model: %02X Protocol: %02X Code: %02X Profile Default value: 3 This is a key OpenAPS safety cap. What this does is limit your basals to be 3x (in this people) your biggest basal rate. You likely will not need to change this, but you should be aware that’s what is discussed about “3x max daily; 4x current” for safety caps. diff --git a/app/src/main/res/xml/pref_overview.xml b/app/src/main/res/xml/pref_overview.xml index daf1605fb5..af25a0cf9e 100644 --- a/app/src/main/res/xml/pref_overview.xml +++ b/app/src/main/res/xml/pref_overview.xml @@ -135,7 +135,7 @@ - + Date: Wed, 22 Aug 2018 19:22:30 +0200 Subject: [PATCH 014/379] send notification about tbr to watch if wearcontrol is false. Fixes #1318 --- .../info/nightscout/androidaps/plugins/Loop/LoopPlugin.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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..e0fc9c0b8a 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 @@ -399,8 +399,10 @@ public class LoopPlugin extends PluginBase { .setAutoCancel(true) .setPriority(Notification.PRIORITY_HIGH) .setCategory(Notification.CATEGORY_ALARM) - .setVisibility(Notification.VISIBILITY_PUBLIC) - .setLocalOnly(true); + .setVisibility(Notification.VISIBILITY_PUBLIC); + if (SP.getBoolean("wearcontrol", false)) { + builder.setLocalOnly(true); + } // Creates an explicit intent for an Activity in your app Intent resultIntent = new Intent(MainApp.instance().getApplicationContext(), MainActivity.class); From 29702757613f396e35746bf11bf81ca7d2dffe99 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Tue, 4 Sep 2018 10:13:24 +0200 Subject: [PATCH 015/379] Update ISSUE_TEMPLATE.md --- ISSUE_TEMPLATE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index db66ffec38..2465b9d9a5 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -1,10 +1,10 @@ Reporting bugs -------------- -- Note the precise time the problem occurred and describe the circumstances and steps that caused +- **Note the precise time the problem occurred** and describe the circumstances and steps that caused the problem - Note the Build version (found in the About dialog in the app, when pressing the three dots in the upper-right corner). - Obtain the app's log files, which can be found on the phone in _/storage/emulated/0/Android/data/info.nightscout.androidaps/_ See https://github.com/MilosKozak/AndroidAPS/wiki/Accessing-logfiles -- Open an issue at https://github.com/MilosKozak/AndroidAPS/issues/new \ No newline at end of file +- Open an issue at https://github.com/MilosKozak/AndroidAPS/issues/new From 92e5acbc2616bb49b3903366fbe20909e1b1e599 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Tue, 18 Sep 2018 13:31:32 +0200 Subject: [PATCH 016/379] Update strings.xml (#1452) --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7f6067898b..86a001cbc1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1089,7 +1089,7 @@ Virtual Pump Type Pump Definition Bolus: Step=%1$s\nExtended Bolus: [Step=%2$s, Duration=%3$smin-%4$sh]\nBasal: Step=%5$s\nTBR: %6$s (by %7$s), Duration=%8$smin-%9$sh\n%10$s - * Ranged basal/bolus values are not supported by Virtual Pump. + * Only discrete values no ranges are supported as granularity for basal/bolus in virtual pump. Autobackfill BG Irish Wizard Settings From 8ce4e01415df0d98bf7820a11d117b435349c002 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Wed, 19 Sep 2018 08:44:44 +0200 Subject: [PATCH 017/379] New Crowdin translations (#1447) --- app/src/main/res/values-bg/strings.xml | 2 +- app/src/main/res/values-cs/strings.xml | 2 +- app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values-el/insight_alerts.xml | 25 +- app/src/main/res/values-el/strings.xml | 696 ++++++++++++++++++ app/src/main/res/values-es/insight_alerts.xml | 25 +- app/src/main/res/values-es/strings.xml | 63 +- app/src/main/res/values-fr/insight_alerts.xml | 13 + app/src/main/res/values-fr/strings.xml | 67 +- app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-ko/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-pl/insight_alerts.xml | 25 +- app/src/main/res/values-pl/strings.xml | 2 +- app/src/main/res/values-pt/strings.xml | 1 - app/src/main/res/values-ro/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values-sk/strings.xml | 2 +- app/src/main/res/values-sv/insight_alerts.xml | 4 +- app/src/main/res/values-sv/strings.xml | 6 +- app/src/main/res/values-zh/strings.xml | 1 - 21 files changed, 897 insertions(+), 45 deletions(-) diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index d57fa1a13c..0e4cffb822 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -952,7 +952,7 @@ Виртуална помпа тип Описание на помпата Болус: Стъпка =%1$s\Удължен болус: [стъпка =%2$s, продължителност =%3$smin -%4$sh] \nБазал: стъпка =%5$s\ nTBR: %6$s (от %7$s), продължителност =%8$sмин -%9$sh\n%10$s - * Диапазонни стойности за базал/болус не се поддържат от Виртиална Помпа. + * Само конкретни стойности! Диапазони не се поддържат за базал/болус при виртуална помпа. Изтегляне КЗ от Найтскаут Настройки на съветник Изчисления, включени в резултата на съветника: diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 28fa6eaabd..5716a202b3 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -952,7 +952,7 @@ Typ virtuální pumpy Definice pumpy Bolus: Krok =%1$s\nProdl. bolus: [Krok=%2$s, Délka=%3$smin-%4$sh]\nBazál: Krok=%5$s\nDoč. bazál: %6$s (%7$s), Délka=%8$smin-%9$sh\n%10$s - * Rozdílné hodnoty podle rozsahu nejsou podporovány. + * Pouze diskrétní hodnoty a ne rozsahy jsou podporovány pro bazál/bolus ve virtuální pumpě. Doplňování glykémií z NS Nastavení wizardu Kalkulace použité ve výsledku wizardu: diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 9af4aae9a0..873e31dd16 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -953,7 +953,7 @@ maxIOB = durchschnittlicher Essensbolus + 3 x maximale Basalrate Typ der virtuellen Pumpe Pumpen-Definition Bolus: Schritt=%1$s\nVerzögerter Bolus: [Schritt=%2$s, Dauer=%3$smin-%4$sh]\nBasal: Schritt=%5$s\nTBR: %6$s (bei %7$s), Dauer=%8$smin-%9$sh\n%10$s - * Beschränkte Basal-/Boluswerte werden von der virtuellen Pumpe nicht unterstützt. + * Bei der virtuellen Pumpe können nur einzelne Werte und keine Bereiche zur Festlegung der Basal/Bolus-Granularität gewählt werden. BZ automatisch auffüllen Einrichtungsassistent Berechnungen, die im Assistenten berücksichtigt werden: diff --git a/app/src/main/res/values-el/insight_alerts.xml b/app/src/main/res/values-el/insight_alerts.xml index 70489fbc5e..dcae9b901d 100644 --- a/app/src/main/res/values-el/insight_alerts.xml +++ b/app/src/main/res/values-el/insight_alerts.xml @@ -1,3 +1,26 @@ - + + Ειδοποίηση W31: Χαμηλή αμπούλα + Ειδοποίηση W32: Χαμηλή μπαταρία + Ειδοποίηση W33: Μη έγκυρη ώρα/ημερομηνία + Ειδοποίηση W34: Λήξη εγγύησης + Ειδοποίηση W36: Ακύρωση TBR + Ειδοποίηση W38: Ακύρωση bolus + Ειδοποίηση W39: Ειδοποίηση διάρκειας + Συντήρηση M20: Η αμπούλα δεν έχει τοποθετηθεί + Συντήρηση M21: Αμπούλα άδεια + Συντήρηση M22: Μπαταρία άδεια + Συντήρηση Μ23: Αυτόματη απενεργοποίηση + Συντήρηση M24: Έμφραξη + Συντήρηση M25: Διάρκεια τέλος - τέλος της λειτουργίας + Συντήρηση M26: Η αλλαγή αμπούλας δεν έχει ολοκληρωθεί + Συντήρηση Μ27: Απέτυχε η λήψη δεδομένων + Συντήρηση M28: Λειτουργία παύσης έληξε + Συντήρηση M29: Ο τύπος μπαταρίας δεν ταιριάζει + Συντήρηση M30: Ο τύπος αμπούλας δεν ταιριάζει + Σφάλμα Ε6: Μηχανικό σφάλμα + Σφάλμα Ε7: Ηλεκτρονικό σφάλμα + Σφάλματος E10: Σφάλμα Rewind + Σφάλματος E13: Λάθος γλώσσα + diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 362d54a56f..34812523b1 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -20,6 +20,51 @@ Εμφανίζει τις επιλογές τροφίμων που ορίζεται στο Nightscout Η ινσουλίνη που ορίζεται Humalog και NovoRapid / NovoLog Η ινσουλίνη που ορίζεται για Fiasp + Σας επιτρέπει να ορίσετε το μέγιστο της δράσης της ινσουλίνης και πρέπει να χρησιμοποιείται μόνο από προχωρημένους χρήστες + Ενεργοποιήστε ή απενεργοποιήστε την εφαρμογή που ενεργοποιεί το κύκλωμα. + Συγχρονίζει τα δεδομένα σας με το Nightscout + Κατάσταση του αλγόριθμου για το 2016 + Κατάσταση του αλγόριθμου για το 2017 + Ο πιο πρόσφατος αλγόριθμος για προχωρημένους χρήστες + Εμφανίζει την τρέχουσα κατάσταση του κυκλώματός σας και τα πλήκτρα για τις πιο κοινές ενέργειες + Εμφανίζει μία τρέχουσα ειδοποίηση με σύντομη επισκόπηση του τι κάνει το κύκλωμα τώρα + Ορίστε ένα προφίλ το οποίο είναι διαθέσιμο εκτός σύνδεσης. + Παρέχει το προφίλ που έχετε ορίσει στο Nightscout + Ορίστε ένα προφίλ με μόνο μία χρονική περίοδο. + Η ολοκλήρωση της αντλίας, για τις αντλίες Accu-Check Combo, απαιτεί να έχετε εγκαταστήσει ruffy + Ολοκλήρωση αντλίας για τις αντλίες Dana Diabecare R + Ολοκλήρωση αντλίας για τις εγχώριες αντλίες Dana Diabecare R + Ολοκλήρωση αντλίας για τις αντλίες Dana Diabecare R με αναβαθμισμένο λογισμικό + Ολοκλήρωση αντλίας για τις αντλίες Dana Diabecare RS + Η ολοκλήρωση της αντλίας, για τις αντλίες Accu-Check Insight, απαιτεί να έχετε εγκαταστήσει το SightRemote + Ολοκλήρωση αντλίας για ανθρώπους που κάνουν εντατικοποιημένο σχήμα ενέσεων για την θεραπεία τους + Ολοκλήρωση αντλίας για αντλίες που δεν έχουν κανέναν οδηγό ακόμα (Ανοιχτό Κύκλωμα) + Η ευαισθησία υπολογίζεται με τον ίδιο τρόπο όπως το Oref0, αλλά μπορείτε να καθορίσετε το χρονικό διάστημα στο παρελθόν. Η ελάχιστη απορρόφηση υδατανθράκων υπολογίζεται από την μέγιστη απορρόφηση υδατανθράκων από τις επιλογές. + Η ευαισθησία υπολογίζεται από 24h δεδομένα στο παρελθόν και οι υδατάνθρακες (αν δεν έχουν απορροφηθεί) κόβονται μετά από χρονικό διάστημα που καθορίζεται στις επιλογές. + Η ευαισθησία υπολογίζεται από 8h δεδομένα στο παρελθόν και οι υδατάνθρακες (αν δεν έχουν απορροφηθεί) κόβονται μετά από χρονικό διάστημα που καθορίζεται στις επιλογές. Η προσθήκη υπολογίζει ακόμα το UAM. + Η ευαισθησία υπολογίζεται ως ο σταθμισμένος μέσος όρος των αποκλίσεων. Νεότερες αποκλίσεις έχουν μεγαλύτερο βάρος. Η ελάχιστη απορρόφηση υδατανθράκων υπολογίζεται από τον χρόνο της μέγιστης απορρόφησης υδατανθράκων από τις επιλογές. Αυτός ο αλγόριθμος είναι ο πιο γρήγορος για να ακολουθεί τις αλλαγές της ευαισθησίας. + Λάβετε τις τιμές BG από την εφαρμογή του Dexcom G5. + Λάβετε τις τιμές BG από το Glimp. + Λάβετε τις τιμές BG από το 600SeriesAndroidUploader. + Λήψη δεδομένων BG από Nightscout + Λάβετε τις τιμές BG από το xDrip. + Σώζει όλες τις θεραπείες που έγιναν + Παρακολουθεί και ελέγχει το AndroidAPS χρησιμοποιώντας το ρολόι σας WearOS. + Δείτε πληροφορίες σχετικά με το κύκλωμά σας στην πρόσοψη xDrip +. + Ελεγξτε απομακρυσμένα το AndroidAPS χρησιμοποιώντας τις εντολές SMS. + Έναρξη + Επικύρωση + Μονάδες + DIA + IC + ISF + Βασικός ρυθμός + Στόχος + Δεν ορίστηκε προφίλ + Ινσουλίνη: + Υδατάνθρακες: + IOB: + IOB: Δραστηριότητα: Συνολική IOB: Συνολική δραστηριότητα IOB: @@ -70,13 +115,26 @@ Προσωρινός Ρυθμός Θεραπείες Εικονική Αντλία + Φροντίδα + Αντλία + Ποια αντλία θα θέλατε να χρησιμοποιήσετε με το AndroidAPS; + Θεραπείες + Ποια προσθήκη πρέπει να χρησιμοποιηθεί για το χειρισμό της θεραπείας; Προφίλ + Ποιο προφίλ πρέπει να χρησιμοποιήσει το AndroidAPS; + APS + Ποιος APS αλγόριθμος πρέπει να κάνει θεραπείες; Γενικά + Αυτά είναι μερικά πρόσθετα που μπορεί να βρείτε χρήσιμα. + Ποιοι περιορισμοί έχουν εφαρμοστεί; ημέρες Περιορισμοί Κύκλωμα Κύκλωμα + Χρησιμοποιήστε αυτό για να ενεργοποιήσετε την ενσωμάτωση του κυκλώματος AndroidAPS. + APS Μετά από επεξεργασία περιορισμών + Προσωρινός Ρυθμός ορίστηκε από την αντλία Τελευταία εφαρμογή ΟΚ Ακύρωση @@ -162,6 +220,48 @@ Χαμένες Επιλογές εξήχθησαν Εξαγωγή ρυθμίσεων σε + Εισαγωγή ρυθμίσεων από + Ρυθμίσεις εισήχθησαν + Μη εύρεση φακέλου + Εξαγωγή ρυθμίσεων + Εισαγωγή ρυθμίσεων + Μέγιστο U/hr Προσωρινού Ρυθμού μπορεί να είναι + Αυτή η τιμή ονομάζεται μέγιστο βασικού ρυθμού στο περιεχόμενο του OpenAPS + Μέγιστο βασικής IOB που το OpenAPS μπορεί να δώσει [U] + Αυτή η τιμή ονομάζεται μέγιστο IOB στο OpenAPS \nΑυτή είναι η μέγιστη ινσουλίνη [U] που το APS μπορεί να δώσει με την μία. + ΑΠΟΡΡΙΨΗ + DanaR + Συνδέεται + Συνδέθηκε + Αποσυνδέθηκε + Ρυθμίσεις αντλίας DanaR + Άδεια χρήσης τελικού χρήστη + ΔΕΝ ΠΡΕΠΕΙ ΝΑ ΧΡΗΣΙΜΟΠΟΙΗΘΕΙ ΓΙΑ ΝΑ ΚΑΝΕΤΕ ΙΑΤΡΙΚΗ ΑΠΟΦΑΣΗ. ΔΕΝ ΥΠΑΡΧΕΙ ΕΓΓΥΗΣΗ ΓΙΑ ΤΟ ΠΡΟΓΡΑΜΜΑ, ΣΤΟ ΒΑΘΜΟ ΠΟΥ ΕΠΙΤΡΕΠΕΤΑΙ ΑΠΟ ΤΟ ΕΦΑΡΜΟΣΤΕΟ ΔΙΚΑΙΟ. ΕΚΤΟΣ ΟΠΟΙΑΣΔΗΠΟΤΕ ΔΙΑΒΑΘΜΙΣΜΕΝΗ ΚΑΤΑ ΤΗΝ ΕΓΓΡΑΦΗ ΤΩΝ ΚΑΤΟΧΟΙ ΠΝΕΥΜΑΤΙΚΩΝ ΔΙΚΑΙΩΜΑΤΩΝ ΚΑΙ/Ή ΑΛΛΑ ΜΕΡΗ ΠΑΡΕΧΟΝΤΑΙ ΤΟ ΠΡΟΓΡΑΜΜΑ \"ΩΣ ΕΧΕΙ\" ΧΩΡΙΣ ΕΓΓΥΗΣΗ ΟΠΟΙΟΥΔΗΠΟΤΕ ΕΙΔΟΥΣ, ΕΞΑΙΡΟΥΜΕΝΕΣ Ή ΣΙΩΠΗΡΕΣ, ΣΥΜΠΕΡΙΛΑΜΒΑΝΟΜΕΝΩΝ, ΕΝΔΕΙΚΤΙΚΑ, ΤΩΝ ΣΙΩΠΗΡΩΝ ΕΓΓΥΗΣΕΩΝ ΕΜΠΟΡΕΥΣΙΜΟΤΗΤΑΣ ΚΑΙ ΚΑΤΑΛΛΗΛΟΤΗΤΑΣ ΓΙΑ ΣΥΓΚΕΚΡΙΜΕΝΟ ΣΚΟΠΟ. Ο ΟΛΟΚΛΗΡΩΜΕΝΟΣ ΚΙΝΔΥΝΟΣ ΟΣΟΝ ΑΦΟΡΑ ΤΗΝ ΠΟΙΟΤΗΤΑ ΚΑΙ ΤΗΝ ΑΠΟΔΟΣΗ ΤΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ ΕΙΝΑΙ ΔΙΚΟ ΣΑΣ. ΕΑΝ ΤΟ ΠΡΟΓΡΑΜΜΑ ΔΕΝ ΕΙΝΑΙ ΕΛΑΤΤΩΜΑΤΙΚΟ, ΠΡΕΠΕΙ ΝΑ ΕΞΕΤΑΣΤΕ ΤΟ ΚΟΣΤΟΣ ΟΛΩΝ ΤΩΝ ΑΠΑΡΑΙΤΗΤΩΝ ΣΥΝΤΗΡΗΣΕΩΝ, ΕΠΙΣΚΕΥΩΝ Ή ΔΙΟΡΘΩΣΕΩΝ. + ΚΑΤΑΛΑΒΑ ΚΑΙ ΣΥΜΦΩΝΩ + Αποθήκευση + Δεν βρέθηκε προσαρμογέας Bluetooth + Δεν βρέθηκε η επιλεγμένη συσκευή + Λάθος σύνδεσης αντλίας + IOB αντλίας + Μονάδες ανά ημέρα + Τελευταίο Bolus: + πριν από %.1fh + Μη έγκυρα δεδομένα + Η τιμή δεν μπήκε σωστά + Ξαναφορτώστε το προφίλ + Δείτε το προφίλ + Ενεργοποιήθηκε + Σχόλιο + Επιτυχία + Ποσοστό + Απόλυτο + Ακύρωση Προσωρινού Ρυθμού + SMS Επικοινωνία + Περιμένετε για αποτέλεσμα + Επιτρεπτά τηλεφωνικά νούμερα + +XXXXXXXXXX;+YYYYYYYYYY + Για έγχυση bolus %1$.2fU στείλτε με κωδικό %2$s + Για αποστολή καλιμπραρίσματος %1$.2f στείλτε με κωδικό %2$s Αποτυχία Bolus Bolus %.2fU παραδόθηκε επιτυχώς Προς έγχυση %.2fU @@ -182,6 +282,7 @@ Ανέβασμα E bolus Διφασικό άμεσο bolus + Διφασικό εκτεταμένο bolus σφάλμα ξαναγέμισμα ώρα βασικού @@ -189,6 +290,7 @@ υδατάνθρακες συναγερμός Ανέβηκαν συνολικά %1$d εγγραφές + Άμεσο bolus Συναγερμοί Ώρες Βασικού Bolus @@ -198,15 +300,63 @@ Γλυκόζη Ξαναγέμισμα Αναστολή + Σύνδεση για %1$d δευτερόλεπτα Κωδικός αντλίας Λάθος κωδικός αντλίας! Αντλία απασχολημένη Παραδόθηκε Σταμάτησε Το bolus σταμάτησε + Το bolus σταματάει Έμφραξη + Stop Πιέστε STOP Αναμονή για αντλία + Προς έγχυση %.2fU + Δημιουργία παρακολούθησης και ανάλυση βασικού ρυθμού και αναλογιών + Επιβεβαιώστε ότι η BG φαίνεται στο Nightscout και τα δεδομένα της αντλίας φορτώθηκαν + Ξεκινήστε σε ανοιχτό κύκλωμα + Εκτελέστε σε ανοιχτό κύκλωμα για μερικές ημέρες και χειροκίνητα κάντε πολλές παρεμβάσεις με προσωρινό ρυθμό. Ρυθμίστε και χρησιμοποιήστε προσωρινούς στόχους (π.χ. για αθλήματα ή υπογλυκαιμία) + Κατανοήστε το ανοιχτό κύκλωμα, περιλαμβάνοντας τις προτάσεις για Προσωρινό ρυθμό + Βάση της εμπειρίας σας, αποφασίστε ποιο είναι το μέγιστο βασικής δόσης και αποθηκεύστε το στην αντλία και στις Επιλογές + Ξεκινήστε να κλείσετε το κύκλωμα με Σταμάτημα Χαμηλής Γλυκόζης (Low Glucose Suspend) + Εκτελέστε σε κλειστό κύκλωμα με μέγιστο IOB = 0 για μερικές ημέρες χωρίς πολλά LGS - υπογλυκαιμίες + Ρυθμίζοντας το κλειστό κύκλωμα, αυξήστε το μέγιστο IOB πάνω από 0 και σταδιακά μειώστε τους στόχους BG + Τρέξτε το για λίγες ημέρες, και τουλάχιστον μία νύχτα χωρίς χαμηλό συναγερμό BG, πριν χαμηλώσετε τα όρια + Ρυθμίστε τον βασικό ρυθμό και τις αναλογίες αν χρειάζεται, και μετά ενεργοποιήστε το auto-sens + 1 επιτυχής εβδομάδα ημερήσιου κυκλώματος με κανονική εισαγωγή υδατανθράκων + Ενεργοποιώντας επιπρόσθετα χαρακτηριστικά για χρήση κατά την ημέρα, όπως τον Προχωρημένο Βοηθό Γεύματος + Ενεργοποιήστε άλλες λειτουργίες για χρήση κατά την ημέρα, όπως SMB + Πρέπει να διαβάσετε τον οδηγό wiki και να αυξήσετε το ανώτατο όριο του IOB για να μπορέσει να λειτουργήσει σωστά η SMB! Μια καλή αρχή είναι μέγιστο IOB= μέσο bolus γεύματος + 3 x το μέγιστο ημερήσιο βασικού ρυθμού + Φτάσατε το επιτρεπτό όριο + Δεν επηλέχθηκε προφίλ + Το κύκλωμα απενεργοποιήθηκε + Το κύκλωμα ενεργοποιήθηκε + Κύκλωμα απενεργοποιημένο + Κύκλωμα ενεργοποιημένο + Το %1$.2f περιορίζεται σε %2$.2f + Η τιμή %s είναι έξω από τα όρια + Δεν επιτρέπεται η απομακρυσμένη ρύθμιση βασικού ρυθμού + Δεν επιτρέπεται απομακρυσμένη εντολή + Για έναρξη βασικού %1$.2fU/h στείλτε με κωδικό %2$s + Για αναστολή κυκλκώματος για %1$d λεπτών στείλτε με κωδικό %2$s + Προσωρινός Ρυθμός %1$.2fU/h για %2$d λεπτά ξεκίνησε επιτυχώς + Εκκίνηση Προσωρινού Ρυθμού απέτυχε + Για να σταματήσετε Προσωρινό Ρυθμό στείλτε με κωδικό %s + Ο Προσωρινός Ρυθμός ακυρώθηκε + Ακύρωση Προσωρινού Ρυθμού απέτυχε + Άγνωστη εντολή ή λάθος απάντηση + Γρήγορος Οδηγός + Ρυθμίσεις Γρήγορου Οδηγού + Κείμενο στο πλήκτρο: + Υδατάνθρακες: + Ισχύς: + Προσθήκη + Διαμόρφωση + Μετακίνηση + Γεύμα + Διορθ + Ενέργειες AndroidAPS ξεκίνησε NS φορτώνεται μόνο (απενεργοποίηση συγχρ) NS φορτώνεται μόνο. Δεν είναι αποτελεσματικό στο SGV εκτός εάν έχει επιλεγεί μία τοπική πηγή όπως το xDrip. Δεν είναι αποτελεσματικό στα Προφίλ ενώ χρησιμοποιείται το NS-Profiles. @@ -221,11 +371,14 @@ Πλήκτρο 3 Μονάδες: mg/dl + mmol/l + DIA: Εύρος στόχου: Εύρος εμφάνισης Υψηλό και Χαμηλό σημείο για την γραφική στην Επισκόπηση και Smartwatch ΧΑΜΗΛΟ σημείο ΥΨΗΛΟ σημείο + Wear Ξαναστείλτε όλα τα Δεδομένα Ρυθμίσεις στο Wear Σφάλμα Αντλίας @@ -242,15 +395,71 @@ Τιμή βασικού κάτω από το ελάχιστο. Δεν έχει ρυθμιστεί το προφίλ! BG: Τελευταία BG: + MDI + MM640g Συνεχής Ειδοποίηση Παλιά Δεδομένα + πριν από %1$d λεπτά + πριν από %1$d λεπτά Τοπικό Προφίλ + OpenAPS AMA Βραχυπρόθεσμος Μέσος Όρος + Μακροπρόθεσμος Μέσος Όρος + Πεδίο %1$d Στοιχεία.\nΤρέχουσα τιμή: Δεδομένα Autosens + Εντοπισμός σφαλμάτων δέσμης ενεργειών + Χρήση του AMA autosense + Ανανέωσε συμβάντα από NS + Διαγραφή συμβάντων στο μέλλον + Γεύμα Σύντομα + Υπογλυκαιμία + Άσκηση + Διαγραφή εγγραφής: + Στατιστικά DanaR + Άθροισμα TDD + Εκθετικά Σταθμισμένο TDD + Βασικός Ρυθμός + Bolus + TDD + Ημερομηνία + Αναλογία + # Ημέρες + Βάρος + Πιθανώς ανακριβής όταν χρησιμοποιείτε bolus για πλήρωση/γέμισμα! + Παλιά Δεδομένα Παρακαλώ Πατήστε \"Ξαναφόρτωση\" + Συνολικός Βασικός Ρυθμός + TBB * 2 + Παραμετροποίηση... + ΔΡΑΣΗ + Διαμόρφωση + ΚΥΚΛΩΜΑ + SP + OAPS + LP + DANA + ΑΡΧΙΚΗ + Εικ. αντλία + NSPROFILE + ΘΕΡΑΠ + CP + ΣΤΟΧΟΙ + WEAR + SMS + Συντομογραφίες ενοτήτων + Χρησιμοποιείτε πάντα τη βραχυπρόθεσμη μέση διαφορά αντί της απλής διαφοράς Χρήσιμο όταν δεδομένα από μη φιλτραρισμένες πηγές όπως το xDrip αποκτούν θόρυβο. Ρυθμίσεις για Προχωρημένους + Μοντέλο: %1$02X Πρωτόκολλο: %2$02X Κωδικός: %3$02X Προφίλ Προεπιλεγμένη τιμή: 3 Αυτό είναι ένα κλειδί ασφαλείας του OpenAPS. Αυτό περιορίζει την αύξηση του βασικού x3 (σε αυτούς τους ανθρώους) από την μεγαλύτερη τιμή του. Συνήθως δεν χρειάζεται να το αλλάξετε, αλλά πρέπει να ξέρετε τι σημαίνει “3x μέγιστο ημερήσιο; 4x τρέχων” για λόγους ασφαλείας. + Προεπιλεγμένη τιμή: 4 Αυτό είναι το μισό του θέματος ασφαλείας του OpenAPS, και το άλλο μισό του «3 x μέγιστο ημέρας: 4 x τρέχων» των θεμάτων ασφαλείας. Αυτό σημαίνει ότι ο βασικός ρυθμός, ανεξάρτητα από την μέγιστη τιμή βασικού ρυθμού στην αντλία σας, δεν μπορεί να είναι υψηλότερος από το πολλαπλάσιο αυτού του αριθμού. Αυτό γίνεται για να αποτρέψει τους ανθρώπους από το να μπουν σε επικίνδυνες καταστάσεις θέτωντας υψηλό βασικό πριν κατανοήσουν πλήρως πώς λειτουργεί ο αλγόριθμος. Και πάλι, η προεπιλεγμένη τιμή είναι 4x: οι περισσότεροι άνθρωποι ποτέ δεν θα χρειαστεί να το προσαρμόσουν και αντίθετα είναι πιο πιθανό να χρειαστεί να προσαρμόσουν άλλες ρυθμίσεις αν αισθάνονται ότι κινούνται με ασφάλεια. + Προεπιλεγμένη τιμή: 1.2\nΑυτός είναι ένας πολλαπλασιαστής για το autosens (και σύντομα autotune) για να ορίσετε ένα 20% ανώτατο όριο στο πόσο ψηλά μπορεί να είναι ο λόγος autosens, που με τη σειρά του καθορίζει πόσο ψηλά το autosens μπορεί να ρυθμίσει τον βασικό ρυθμό, πόσο χαμηλά μπορεί να ρυθμίσει την ISF, και πόσο χαμηλά μπορεί να ορίσει το στόχο της BG. + Προεπιλεγμένη τιμή: 0.7\n H άλλη πλευρά από τα όρια ασφαλείας του autosens, θέτοντας ένα ανώτατο όριο στο πόσο χαμηλά to autosens μπορεί να προσαρμόσει τον βασικό ρυθμό και πόσο ψηλά μπορεί να ρυθμίσει τη ISF και τον στόχο του BG. + Το autosens ρυθμίζει στόχους + Προεπιλεγμένη τιμή: true\nΑυτό χρησιμοποιείται για να επιτρέψει στο autosens να προσαρμόσει τον στόχο BG, επιπρόσθετα από το ISF και βασικό ρυθμό. + Προεπιλεγμένη τιμή: 2\nΗ αναβολή Bolus ενεργοποιείται αφού κάνετε ένα γευματικό bolus, έτσι το κύκλωμα δεν θα εξουδετερώσει με χαμηλό προσωρινό μόλις έχετε φάει. Το παράδειγμα εδώ και η προεπιλογή είναι 2: έτσι μια τρίωρη DIA σημαίνει ότι το bolus αναβολής θα είναι σταδιακά πάνω από 1,5 ώρα (3DIA/2). + Προεπιλεγμένη τιμή: 3.0 (AMA) ή 8.0 (SMB). Αυτό είναι μια ρύθμιση για την επίπτωση της προεπιλεγμένης απορρόφησης υδατανθράκων ανά 5 λεπτά. Η προεπιλογή είναι μια αναμενόμενη 3mg/dl/5min. Αυτό επηρεάζει το πόσο γρήγορα το COB ελλατώνεται, και πόση απορρόφηση υδατανθράκων θα υποθέτει για τον υπολογισμό της μελλοντικής πρόβλεψης BG, όταν το BG πέφτει περισσότερο από το αναμενόμενο ή δεν αυξάνεται όσο το αναμενόμενο. + Προσοχή!\nΣυνήθως δεν χρειάζεται να αλλάξετε αυτές τις τιμές. Κάντε κλικ ΕΔΩ, ΔΙΑΒΑΣΤΕ τις πληροφορίες και σιγουρευτείτε ότι τις καταλαβαίνετε πριν τις αλλάξετε. Μόνο αριθμητικά ψηφία επιτρέπονται. Μόνο αριθμητικά ψηφία μέσα στο εύρος %1$s - %2$s επιτρέπονται. Το πεδίο αυτό δεν πρέπει να είναι κενό @@ -280,30 +489,83 @@ Φτάνετε το ημερήσιο όριο ινσουλίνης NSClient NSCI + URL: Αυτόματη κύλιση Επανεκκίνηση + NSClient Διεύθυνση Nightscout Βάλτε την διεύθυνσή σας Nightscout Μυστικός κωδικός NS API secret Mυστικός κωδικός NS API secret + Βάλτε 12ψήφιο μυστικό κωδικό + Έγχυση τώρα + Διαγραφή σειράς + Δείξε σειρά + Σειρά: + Κατάσταση: + Παύση + Διαγραφή αρχείου καταγραφής + Ο NSCLIENT δεν έχει άδεια εγγραφής. Λάθος κωδικός API; + Ρυθμίσεις Wear + Δείξε αναλυτικά IOB + Χώρισε την IOB σε bolus και βασικό στο ρολόι + αποτυχία - ελέγξτε τηλέφωνο + Μη διαθέσιμο + Ηλικία χρήστη + Παιδί + Έφηβος + Ενήλικας + Αντίσταση ινσουλίνης ενηλίκων + Παρακαλώ επιλέξτε ηλικία χρήστη για να ορισθούν όρια ασφαλείας + Glimp + Το %s πρέπει να απενεργοποιήσει τη βελτιστοποίηση της μπαταρίας για βέλτιστη απόδοση + Κύκλωμα σε αναστολή + Αναστολή (%1$d m) + Superbolus (%1$d m) + Κύκλωμα σε αναστολή για 1h + Κύκλωμα σε αναστολή για 2h + Κύκλωμα σε αναστολή για 3h + Κύκλωμα σε αναστολή για 10h + Αποσύνδεση αντλίας για 15 λεπτά + Αποσύνδεση αντλίας για 30 λεπτά + Αποσύνδεση αντλίας για 1h + Αποσύνδεση αντλίας για 2h + Αποσύνδεση αντλίας για 3h + Επαναφορά + Λάθος διάρκεια + Κύκλωμα σε αναστολή + Επαναφορά κυκλώματος + Γραφική 15min + COB + Superbolus Η εφαρμογή καταγραφής ξεκινά από το NS Έξοδος από το application για την εφαρμογή των ρυθμίσεων + DanaRv2 Ινσουλίνη + Ποιο τύπο ινσουλίνης χρησιμοποιείτε; Γρήγορη Ινσουλίνη + Novorapid, Novolog, Humalog + Fiasp + INS Ενεργοποίηση superbolus στον σύντομο οδηγό Ενεργοποιήστε την λειτουργία superbolus στον σύντομο οδηγό. Μην το κάνετε μέχρι να μάθετε τι ακριβώς κάνει. ΜΠΟΡΕΙ ΝΑ ΕΓΧΥΣΕΙ ΠΑΡΑΠΑΝΩ ΔΟΣΕΙΣ ΙΝΣΟΥΛΙΝΗΣ ΑΝ ΧΡΗΣΙΜΟΠΟΙΗΘΕΙ ΛΑΝΘΑΣΜΕΝΑ! + IOB + COB + Έκδοση Τελευταία σύνδεση Κατάσταση Bluetooth Σχετικά με Απουσία δικαιωμάτων SMS Κατάσταση xDrip (ρολόι) Γραμμή Κατάστασης xDrip (ρολόι) + xds Δείξε BGI Πρόσθεσε BGI στην γραμμή κατάστασης Μη φόρτωση στο NS Όλα τα δεδομένα που αποστέλλονται στην NS έχουν καταργηθεί. Το AAPS συνδέεται με NS, αλλά δεν γίνεται καμία αλλαγή στα NS Βήμα Βασικού Βήμα Bolus + Εκτεταμένο Bolus Στόχος Προσ Ρυθμού Ακύρωση Εκτεταμμένου bolus Χρόνος ζωής Αισθητήρα @@ -312,6 +574,7 @@ ώρες Τύπος Βασικού Μη έγκυρο προφίλ!!! + Μεταβείτε στο προφίλ Χρόνος ζωής μπαταρίας αντλίας Αλλαγή μπαταρίας αντλίας Επιλογές συναγερμού @@ -323,11 +586,54 @@ Επείγον παλιά δεδομένα Οριακή τιμή για παλιά δεδομένα [min] Επείγουσα οριακή τιμή για παλιά δεδομένα [min] + Εσωτερικά διαστήματα για autosense [h] + Ποσότητα ωρών κατά το παρελθόν για ανίχνευση ευαισθησίας (εξαιρείται ο χρόνος απορρόφησης υδατανθράκων) + Αντλία + OpenAPS + Uploader + Ανίχνευση ευαισθησίας + Ποιος αλγόριθμος ευαισθησίας να χρησιμοποιηθεί; + SENS + Ευαισθησία Oref0 + Ευαισθησία Oref1 + Ευαισθησία AAPS + Ρύθμιση απορρόφησης + Μέγιστος χρόνος απορρόφησης γεύματος [h] + Χρόνος σε ώρες που περιμένουμε να απορροφηθούν όλοι οι υδατάνθρακες ενός γεύματος + Εμφάνιση εκτεταμένου bolus σε % + SAGE + IAGE + CAGE + PBAGE + OAPS + UPLD + BAS + EXT + Κρατήστε την οθόνη ενεργή + Αποτρέψετε το Android να απενεργοποιήσει την οθόνη. Χωρίς σύνδεση με το φορτιστή, αποφορτίζει πολύ γρήγορα την μπαταρία. + Ενεργοποιώντας το autosense θυμηθείτε να εισάγετε όλους τους υδατάνθρακες. Διαφορετικά, οι αποκλίσεις των υδατανθράκων θα εντοπιστούν λανθασμένα ως αλλαγή ευαισθησίας!! + Ευαισθησία WeightedAverage + ΟΚ + Ακύρωση + Δεν έχουν φορτωθεί όλα τα προφίλ! + Οι τιμές δεν αποθηκεύτηκαν! + Ενεργοποιήστε την αποστολή σε άλλες εφαρμογές (όπως xDrip). + Ενεργοποιήστε τις τοπικές αποστολές. + ΔΡΑΣΤΗΡΙΟΤΗΤΑ & FEEDBACK + ΥΔΑΤΑΝΘΡΑΚΕΣ & BOLUS + CGM & OPENAPS + ΑΝΤΛΙΑ Τιμή Βασικού ρυθμού [U/h] Διάρκεια [min] OpenAPS SMB + SMB + Ενεργοποίηση UAM + Ενεργοποίηση SMB + Χρησιμοποιήστε Super Micro Boluses αντί προσωρινού ρυθμού για ταχύτερα αποτελέσματα + Ανίχνευση απαρατήρητων γευμάτων Μέγιστη τιμή καμπύλης IOB Μέγιστο καμπύλης [λεπτά] + Προαιρετικά-αιχμή Oref Γρήγορη δράση - Oref Έξτρα Γρήγορη δράση - Oref DIA για %1$f πολύ μικρή - χρησιμοποιήστε %2$f! @@ -335,6 +641,8 @@ Ημερομηνία ΜΗ ΕΓΚΥΡΟ Περιμένετε για σύζευξη με αντλία + Σύζευξη ΟΚ + Τέλος χρόνου σύζευξης ΣΥΖΕΥΞΗ Δεν βρέθηκε συσκευή ακόμα Άδεια αμπούλα @@ -346,6 +654,7 @@ Σύζευξη νέας αντλίας Ταχύτητα Bolus Ρυθμίστε το βήμα βασικού στο 0.01 U/h + Serial number Ποσοστό Αλλαγή της ώρας Προκαθορισμένος Στόχος-Προσ Ρυθμού @@ -353,7 +662,10 @@ στόχος για γεύμα διάρκεια άσκησης στόχος άσκησης + διάρκεια υπογλυκαιμίας + στόχος υπογλυκαιμίας Πλήρωση + Κατάσταση εκτεταμένου bolus Κατάσταση bolus Λήψη κατάστασης Προσ Ρυθμού Λήψη ρυθμίσεων αντλίας @@ -361,9 +673,393 @@ επαναχρησιμοποίηση Έλεγχος από ρολόι Ρυθμίστε Στόχους-Προσ Ρυθμού και βάλτε Θεραπείες από το ρολόι. + Ο χρόνος σύνδεσης έληξε + Γεύμα + g + m + h + ]]> + kj + Ενέργεια + Πρωτεΐνες + Λίπος + ]]> + Αναμονή για το τέλος του bolus. Απομένουν %1$d δευτερόλεπτα. + Επεξεργασία συμβάντος + Έναρξη bolus + Η εντολή εκτελείται τώρα + Ο οδηγός αντλίας διορθώθηκε + Η αντλία δεν είναι διαθέσιμη + Χαμένες μετρήσεις BG + Χρησιμοποιήστε ειδοποιήσεις συστήματος για ειδοποιήσεις και συναγερμούς + Τοπικές Ειδοποιήσεις + Προειδοποίηση αν δεν ληφθούν δεδομένα μετρήσεων BG + Προειδοποίηση αν η αντλία δεν είναι διαθέσιμη + Όριο για μη διαθεσιμότητα της αντλίας [λεπτά] + Συναγερμός έκτακτης ανάγκης + Πληροφορίες + Bluetooth + BT Watchdog + Απενεργοποιεί το bluetooth του τηλεφώνου για ένα δευτερόλεπτο αν δεν είναι δυνατή η σύνδεση με την αντλία. Αυτό μπορεί να βοηθήσει σε ορισμένα τηλέφωνα όπου το bluetooth παγώνει. + Εφαρμογή DexcomG5 (τροποποιημένη) + Ανέβασμα δεδομένων BG στο NS + Ανέβασμα ρυθμίσεων G5 + Ανέβασμα ρυθμίσεων Poctech + Εμφάνιση λεπτομερών στατιστικών + Δείξτε τη διαφορά με ένα επιπλέον δεκαδικό ψηφίο + Τα μέγιστα λεπτά του βασικού ρυθμού που περιορίζουν το SMB να + Μη υποστηριζόμενη έκδοση στην αντλία + Αποστολή δεδομένων BG στο xDrip+ + Στο xDrip+, επιλέξτε την πηγή δεδομένων 640g / Eversense + NSClient BG + Η τιμή του βασικού αντικαταστάθηκε από την ελάχιστη υποστηριζόμενη τιμή: %s + Η τιμή του βασικού αντικαταστάθηκε από την μέγιστη υποστηριζόμενη τιμή: %s + Υπολογισμός BG + Υπολογισμός του IOB bolus + Υπολογισμός βασικού IOB + Υπολογισμός τάσης + Υπολογισμός superbolus + Ναι + Όχι + Μόνο θετική + Μόνο αρνητική + Υπολογισμός COB + Υπολογισμός προσωρινού στόχου + Κύκλωμα ενεργοποιημένο + Επιλέχθηκε APS + Το NSClient έχει άδεια εγγραφής + Ενεργοποιήθηκε η κλειστή λειτουργία + Το μέγιστο IOB έχει ρυθμιστεί σωστά + BG διαθέσιμη από επιλεγμένη πηγή + Οι τιμές του βασικού ρυθμού δεν αντιστοιχούν σε ώρες: %s + Μη έγκυρο προφίλ: %s + Προγραμματισμός της αντλίας για bolus + Ανανέωση + Κατάσταση + Άσκηση + Δεν υπάρχει σύνδεση για %1$d λεπτά + %1$d%% (%2$d λεπτά απομένουν) + Εκκίνηση + Αναστολή λόγω σφάλματος + Αναστολή από το χρήστη + Εκτελείτε + Ακυρώνεται TBR + Ρύθμιση TBR (%1$d%% / %2$d λεπτά) + Bolus (%.1f U) + Ανανέωση + Η λειτουργία που ζητήθηκε δεν υποστηρίζεται από την αντλία + Επικίνδυνη χρήση: Εκτεταμένο ή πολλαπλά bolus είναι ενεργό. Το κύκλωμα απενεργοποιήθηκε λόγω low-suspend μόνο για 6 ώρες. Επιτρέπονται μόνο κανονικά bolus + Επικίνδυνη χρήση: η αντλία χρησιμοποιεί διαφορετικό προφίλ βασικού από το πρώτο. Το κύκλωμα έχει σταματήσει. Επιλέξτε το πρώτο προφίλ στην αντλία και ανανεώστε. + Ένα bolus με την ίδια ποσότητα ζητήθηκε τα τελευταία 2 λεπτά. Για την αποφυγή κατά λάθους διπλών bolus και για ασφάλεια από λάθος του προγράμματος αυτό απαγορεύεται. + Τώρα + Ανάγνωση ιστορικού αντλίας ιστορικό αντλίας + Ρύθμιση βασικού προφίλ + Η στάθμη της αμπούλας της αντλίας είναι χαμηλά + Η μπαταρία της αντλίας είναι χαμηλά + Η αντλία δείχνει το σφάλμα Ε%1$d: %2$s + Χαμηλή + Κενή + Κανονική + Η ώρα της αντλίας χρειάζεται ανανέωση + Προειδοποίηση + Επιβεβαιώθηκε η ειδοποίηση ΑΚΥΡΩΣΗΣ TBR + Η αντλία δεν είναι διαθέσιμη. Δεν χορηγήθηκε το bolus + Η έγχυση bolus απέτυχε. Δεν φαίνεται να παραδόθηκε κάποιο bolus. Για να σιγουρευτείτε, ελέγξτε την αντλία για να αποφευχθεί διπλό bolus. Για ασφάλεια σε λάθος του προγράμματος, δεν επιτρέπετε ξανά bolus αυτόματα. + Μόνο %1$.2f U του ζητούμενου bolus %2$.2f U παραδόθηκε εξαιτίας ενός σφάλματος. Παρακαλούμε ελέγξτε την αντλία για να το επιβεβαιώσετε και να κάνετε τις απαραίτητες ενέργειες. + Η έγχυση του bolus και η επαλήθευση του ιστορικού αντλίας απέτυχε, ελέγξτε την αντλία. Εάν έχει γίνει έγχυση bolus, θα προστεθεί στις θεραπείες κατά την επόμενη σύνδεση με την αντλία. + Δεν υπάρχει αρκετή ινσουλίνη στην αμπούλα για το bolus + Σφάλμα έγχυσης εκτεταμένου bolus + Insight + Αντλία Insight + Κατάσταση + Τροποποίηση + Η ΑΝΤΛΙΑ ΣΤΑΜΑΤΗΣΕ + Ενημέρωση Κατάστασης + πριν + με + Ενεργό TBR + λεπτά απομένουν + Βιβλίο καταγραφής + Η τελευταία εντολή που εκτελέστηκε + min + παραμένει πάνω + συνολικά με + εκ των προτέρων με + Μείνετε συνδεδεμένοι + IDLE + ΣΥΓΧΡΟΝΙΣΜΟΣ + ΑPASXOLHMENH + ΣΥΓΧΡΟΝΙΣΜΕΝΟ + ΕΚΚΊΝΗΣΗ + ανάγκες + Δεν έχει συνδεθεί στην εφαρμογή υποστήριξης! + Η εφαρμογή υποστήριξης δεν φαίνεται να είναι εγκατεστημένη! + Μη συμβατή εφαρμογή υποστήριξης, απαιτείται η έκδοση + Άγνωστο + Αναμονή για επιβεβαίωση κωδικού + Κωδικός απορρίφθηκε + Σύνδεση εφαρμογής + Μη εξουσιοδοτημένο + Μη συμβατό + δευτερόλεπτο + λεπτό + ώρα + ημέρα + εβδομάδα + δευτ + %1$ds λήγει σε %2$s + Διατηρήστε την κατάσταση ενεργή + Στατιστικά + Συνδέστε προληπτικά + Συνδεθείτε αυτόματα όταν ανοίγουν οι οθόνες AndroidAPS, πριν ζητηθεί η οποιαδήποτε εντολή αντλίας, για να μειωθεί η καθυστέρηση σύνδεσης + Δεν συνιστάται λόγω εξάντλησης μπαταρίας + Πάντα ενεργό SMB + Ενεργοποιήστε τις ΜΜΕ ανεξάρτητα από τα bolus. Πιθανόν μόνο με πηγές BG με καλό φιλτράρισμα δεδομένων, όπως το G5 + Ενεργοποίηση SMB μετά από υδατάνθρακες + Ενεργοποίηση SMB για 6 ώρες μετά από υδατάνθρακες, ακόμη και με 0 COB. Πιθανόν μόνο με πηγή BG με καλό φιλτράρισμα δεδομένων όπως το G5 + Ενεργοποίηση SMB με COB + Ενεργοποίηση SMB όταν υπάρχει ενεργό COB. + Ενεργοποίηση SMB με προσωρινούς στόχους + Ενεργοποίηση του SMB όταν υπάρχει ενεργός προσωρινός στόχος (τρώω σύντομα, άσκηση) + Ενεργοποίηση SMB με υψηλούς προσωρινούς στόχους + Ενεργοποίηση SMB όταν υπάρχει ενεργός υψηλός προσωρινός στόχος (άσκηση) + Αφήστε τον προσωρινό ρυθμό ενεργό + Σίγαση + Ινσουλίνη + Υδατάνθρακες + Πλήκτρα + Στέλνει καλιμπράρισμα στο xDrip + ή ανοίγει το παράθυρο διαλόγου καλιμπραρίσματος του G5 + Ανοίγει το xDrip +, το πλήκτρο πίσω επιστρέφει στο AndroidAPS + Αριθμός υδατανθράκων να προστεθεί όταν πατήσετε το πλήκτρο + Ποσότητα ινσουλίνης να προστεθεί όταν πατήσετε το πλήκτρο + Δεν είναι δυνατή η εκκίνηση της εφαρμογής CGM. Βεβαιωθείτε ότι έχει εγκατασταθεί. + CGM + Ιστορικό περιήγησης + Ειδοποίηση στο SMB + Εμφάνιση SMB στο ρολόι όπως ένα τυπικό bolus. + Δημιουργήστε ειδοποιήσεις σφαλμάτων + Δημιουργήστε μια ειδοποίηση Ns για σφάλματα διαλόγων και τοπικούς συναγερμούς (που φαίνονται στο Careportal κάτω από τις Θεραπείες) + Προβολή πρόβλεψης στο ρολόι. + Προβλέψεις + Επιλογές δεδομένων + Αποστολή δεδομένων στο εργοστάσιο + Να επιτρέπεται η αυτόματη αποστολή αναφορών σφάλματος και χαρακτηριστικά χρήσης δεδομένων στους προγραμματιστές μέσω του fabric.io. service. + Ενημερώστε την εφαρμογή G5 στην υποστηριζόμενη έκδοση + Εκκίνηση δραστηριότητας TT + Εκκίνηση Τρώω σύντομα ΤΤ + TT + Μην κάνετε bolus, μόνο να καταγράφετε + Κατηγορία + Υποκατηγορία + Το bolus θα εγγραφεί μόνο + Συμπληρώνεται αυτόματα η BG που λείπει από το NS + Το SMB ρυθμίστηκε από την αντλία + Ευαισθησία + Αποκλίσεις + Ενεργοί Υδατάνθρακες + Ενεργή Ινσουλίνη + Βασικοί + Δεν έχει επιλεγεί καμία ενέργεια, δεν υπάρχει τίποτα να κάνει + Εκκίνηση TT Υπογλυκαιμίας + Εκτελείται έκδοση Dev. Το κλειστό κύκλωμα είναι απενεργοποιημένο. + Μηχανική λειτουργία ενεργοποιημένη + Η μηχανική λειτουργία δεν είναι ενεργοποιημένη και δεν είναι ελευθερωμένη + %.2f U/h + Ανάγνωση βασικού προφίλ + Το ιστορικό της αντλίας έχει αλλάξει μετά την εκτέλεση του υπολογισμού του bolus. Το bolus δεν εκτελέστηκε. Παρακαλούμε να υπολογίσετε ξανά αν είναι ακόμα απαραίτητο. + Το bolus εκτελέστηκε με επιτυχία, αλλά η καταχώριση στην θεραπεία απέτυχε. Αυτό μπορεί να συμβεί εάν χορηγηθούν δύο bolus ίδιου μεγέθους μέσα σε 2 λεπτά. Ελέγξτε το ιστορικό της αντλίας και το ιστορικό στο μενού Θεραπείες και χρησιμοποιείστε το Careportal για να εισαγάγετε τα στοιχεία που λείπουν. Βεβαιωθείτε ότι δεν εισάγετε το ίδιο μέγεθος στον ακριβώς ίδιο χρόνο. + Η υψηλή προσωρινή βασική απορρίφθηκε επειδή οι υπολογισμοί δεν αντικατοπτρίζουν τις τελευταίες αλλαγές στο ιστορικό της αντλίας + Επαναφορά της κατάστασης της αντλίας + Ο βασικός ρυθμός της αντλίας έχει αλλάξει και θα ενημερωθεί σύντομα + Ο βασικός ρυθμός της αντλίας έχει αλλάξει αλλά η ανάγνωση έχει αποτύχει + Έλεγχος για αλλαγές στο ιστορικό + Πολλαπλά bolus της ίδιας ποσότητας φορτώθηκαν μέσα σε ένα λεπτό. Μόνο μία εγγραφή μπορεί να προστεθεί στη θεραπεία. Ελέγξτε την αντλία και προσθέστε χειροκίνητα το bolus χρησιμοποιώντας το Careportal. Σιγουρευτείτε ότι δημιουργήσατε ένα bolus σε χρόνο που να μη γίνεται άλλο bolus. + \n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de) + Το τελευταίο bolus είναι παλαιότερο από 24 ώρες ή είναι προγραμματισμένο στο μέλλον. Ελέγξτε αν είναι σωστή η ώρα στην αντλία. + Η ημερομηνία/ώρα έγχυσης του bolus φαίνεται λάθος. Το IOB είναι λάθος. Ελέγξτε την ώρα/ημερομηνία της αντλίας. + Η αλλαγή προφίλ λείπει. Αλλάξτε το προφίλ ή πατήστε \"Ενεργοποίηση Προφίλ\" στο Τοπικό Προφίλ. + Αριθμός bolus + Αριθμός TBR + Ο στόχος %1$d δεν ξεκίνησε + Ο στόχος %1$d δεν ολοκληρώθηκε + Η αντλία δεν υποστηρίζει προσωρινό βασικό ρυθμό + Διαβάζεται από την αντλία μη έγκυρος βασικός ρυθμός + Το κλειστό κύκλωμα είναι απενεργοποιημένο στις Επιλογές + Το Autosens είναι απενεργοποιημένο στις Επιλογές + Το SMB απενεργοποιήθηκε στις Επιλογές + Ο μέγιστος βασικός ρυθμός περιορίζεται σε %1$.2f U/h λόγω ότι %2$s + όριο αντλίας + πρέπει να είναι θετική τιμή + πολλαπλασιαστής μέγιστου βασικού + πολλαπλασιαστής ημερήσιου μέγιστου βασικού + Ένα bolus παραδόθηκε μέσα στα τελευταία 3 λεπτά, παράκαμψη SMB + Ο βασικός ρυθμός ορίστηκε σωστά + Περιορίζεται το μέγιστο επί τοις εκατό ποσοστό σε %1$d%% λόγω %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 λόγω %2$s + μέγιστη τιμή στις Επιλογές + σταθερό όριο + μη ασφαλής χρήση + Η ανάγνωση κατάστασης απέτυχε + Καταγράψτε την αλλαγή της τοποθεσίας αντλίας + Καταγράψτε την αλλαγή της τοποθεσίας καθετήρα + Το SMB πάντα και μετά το γεύμα απενεργοποιείται επειδή η ενεργή πηγή BG δεν υποστηρίζει προηγμένο φιλτράρισμα + To SMB δεν επιτρέπεται σε λειτουργία ανοιχτού κυκλώματος + Φαγητό + επαναφορά + Αναμονή για συγχρονισμό ώρας (%1$d δευτ) + Αποσυνδέθηκε (%1$d m) + Αυτόματα συμβάντα careportal + Αυτόματο ανέβασμα ινσουλίνης, κάνουλας και αλλαγή μπαταρίας και συναγερμούς αντλίας στο Nightscout + Μέγιστη συνολική IOB το OpenAPS δεν μπορεί να πάει πάνω από [U] + Αυτή η τιμή ονομάζεται μέγιστη IOB στο OpenAPS\nTο OpenAPS δεν θα προσθέσει περισσότερη ινσουλίνη αν η τρέχουσα IOB είναι μεγαλύτερη από αυτή την τιμή + Η αντλία σταμάτησε + Η αντλία ξεκίνησε + Παύση της αντλίας + Μέγιστος χρόνος απορρόφησης γεύματος [h] + Χρόνος κατά τον οποίο οποιοδήποτε γεύμα θεωρείται απορροφημένο. Οι υπόλοιποι υδατάνθρακες θα αποκοπούν. + Χρόνος + Εμφάνιση πεδίου σημειώσεων στους διαλόγους θεραπείας + Επόμενο + Προηγ + Οδηγός εγκατάστασης + ΤΕΛΟΣ + Επιλέξτε τη γλώσσα σας + Απαιτείται: %1$.2fU Παραδόθηκε: %2$.2fU Κωδικός σφάλματος: %3$s + Πρώτη αύξηση ινσουλίνης + Δεύτερη αύξηση ινσουλίνης + Τρίτη αύξηση ινσουλίνης + Πρώτη αύξηση υδατανθράκων + Δεύτερη αύξηση υδατανθράκων + Τρίτη αύξηση υδατανθράκων + CGM + Χρησιμοποιήστε μόνο σύνδεση Wi-Fi + WiFi SSID + Μόνο κατά τη φόρτιση + Ρυθμίσεις σύνδεσης + Επιτρέπονται SSID (διαχωρίζονται με ελληνικό ερωτηματικό) + Επιτρέψτε τη σύνδεση περιαγωγής + Μέγιστη αναλογία autosens + Ελάχιστη αναλογία autosens + Διαιρέτης Αναβολής bolus + Μέγιστος ημερήσιος πολλαπλασιαστής ασφαλείας + Τρέχων πολλαπλασιαστής ασφαλείας βασικού ρυθμού + n/a + Τύπος εικονικής αντλίας + Ορισμός Αντλίας + Bolus: Άμεσο=%1$s\nΕκτεταμένο Bolus: [Άμεσο=%2$s, Διάρκεια=%3$smin-%4$sh]\nΒασικός: Άμεσο=%5$s\nTBR: %6$s (με %7$s), Διάρκεια=%8$smin-%9$sh\n%10$s + * Υποστηρίζονται μόνο διακριτές τιμές και όχι εύρος τιμών για βασικό/bolus στην εικονική αντλία. + Αυτόματη φόρτωση BG + Ρυθμίσεις Γρήγορου Οδηγού + Υπολογισμοί που περιλαμβάνονται στο αποτέλεσμα του γρήγορου οδηγού: + Ρυθμίσεις Εμφάνισης + Γενικές Ρυθμίσεις + Ενεργοποίηση NSClient + Καλώς ήρθατε στον οδηγό εγκατάστασης. Θα σας καθοδηγήσει μέσα από το πρόγραμμα εγκατάστασης\n + Ρύθμιση αντλίας + Κατάσταση ανάγνωσης + Αλλαγές πρέπει να γίνουν στο NS + Παράλειψη του \"Οδηγού εγκατάστασης\" + Πατήστε το παρακάτω πλήκτρο για να ενεργοποιήσετε το AndroidAPS για να προτείνει/κάνει αλλαγές στον βασικό ρυθμό + Πατήστε το πλήκτρο παρακάτω για να ενεργοποιήσετε τους Στόχους. Δείτε την καρτέλα \"Στόχοι\", αφού ολοκληρώσετε αυτόν τον οδηγό, για να κάνετε το AndroidAPS πλήρως λειτουργικό.\n + Ενεργοποιήσετε τους Στόχους + Ρυθμίστε την προσθήκη APS + Ρυθμίσετε την προσθήκη Ευαισθησία + Η προσθήκη Ευαισθησία χρησιμοποιείται για την ανίχνευση αλλαγών στην ευαισθησία και τον υπολογισμό του COB. Για περισσότερες πληροφορίες εδώ: + https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COB + Το NSClient χειρίζεται τη σύνδεση με το Nightscout. Μπορείτε να παραλείψετε αυτό τώρα αλλά δεν θα μπορείτε να ολοκληρώσετε τους Στόχους μέχρι να κάνετε τις ρυθμίσεις του. + Προσοχή: Τα νέα προφίλ ινσουλίνης απαιτούν DIA τουλάχιστον 5 ωρών. Η DIA 5-6 ώρες στα νέα προφίλ είναι ισοδύναμα με DIA των 3 ωρών στα παλιά προφίλ ινσουλινών. + Διαμόρφωση πηγής BG + Επιλέξτε μια πηγή του προφίλ. Για ένα παιδί, χρησιμοποιήστε το προφίλ NS. Εάν κανείς δεν σας ακολουθεί μέσω NS, πιθανότατα προτιμάτε Τοπικό προφίλ. Σημειώστε ότι ορίζετε μόνο την πηγή προφίλ. Για να χρησιμοποιείται το προφίλ πρέπει να το ενεργοποιήσετε εκτελώντας το \"Προφίλ αλλαγής\" + Επιλέξτε έναν από τους διαθέσιμους αλγόριθμους. Ταξινομούνται από το παλαιότερο στον νεότερο. Ένας νεότερος είναι συνήθως καλύτερος και πιο επιθετικός. Επομένως, αν είστε καινούριος στο κλειστό κύκλωμα, θα πρέπει πρώτα να επιλέξετε μόνο το AMA και όχι το τελευταίο. Μην ξεχάσετε να διαβάσετε το εγχειρίδιο του OpenAPS και να κάνετε τις ρυθμίσεις προτού αρχίσετε να το χρησιμοποιείτε. + Ξεκινήστε τον πρώτο στόχο + Άδεια + Ζητείστε άδεια + Η εφαρμογή απαιτεί άδεια τοποθεσίας για την αναζήτηση συσκευών BT + Η εφαρμογή απαιτεί πρόσβαση στη μνήμη για την αποθήκευση αρχείων καταγραφής + Αίτημα + Ρυθμίστε την προσθήκη ινσουλίνης + Έξοδος + Ρυθμίσεις χρήστη + Μορφή ώρας + Πλήκτρα κύλισης + Ήχος πλήκτρων + Συναγερμός + Ήχος + Δόνηση + Και τα δύο + Χρόνος ενεργής οθόνης [s] + Χρόνος οπίσθιου φωτισµού [s] + Μονάδες γλυκόζης + Απενεργοποίηση(ώρες) + Χαμηλή αμπούλα (μονάδες) + Αποθήκευση ρυθμίσεων στην αντλία + Ενεργό + Ανενεργό + Άνοιγμα μενού πλοήγησης + Κλείσιμο μενού πλοήγησης + Επιλογές προσθήκης + Ολοκληρώθηκε, συγχαρητήρια! + Δεν ολοκληρώθηκε ακόμη + Ο χρόνος που πέρασε + %1$d. Στόχος + Poctech + Λάβετε τις τιμές BG από την εφαρμογή Poctech + Ο υψηλός προσωρινός στόχος ανεβάζει την ευαισθησία + = 100]]> + Ο χαμηλός προσωρινός στόχος μειώνει την ευαισθησία + + Εσφαλμένη ρύθμιση αντλίας. Ελέγξτε τα κείμενα και βεβαιωθείτε ότι η Quick Info ονομάζεται QUICK INFO χρησιμοποιώντας το λογισμικό διαμόρφωσης 360. + Προσαρμογή + Μεγάλη χρονική διαφορά + Μεγάλη χρονική διαφορά:\nΗ ώρα στην αντλία διαφέρει περισσότερο από 1,5 ώρες. \nΠαρακαλώ ρυθμίστε την ώρα χειροκίνητα στην αντλία και βεβαιωθείτε ότι η ανάγνωση του ιστορικού από την αντλία δεν προκαλεί απροσδόκητη συμπεριφορά. \nΑν είναι δυνατόν, αφαιρέστε το ιστορικό από την αντλία πριν την αλλαγή της ώρας ή κλείστε το κλειστό κύκλωμα για μία DIA μετά την τελευταία λάθος καταχώρηση ιστορικού αλλά κατ΄ελάχιστο μία DIA από τώρα. + Ξεκίνησε το AndroidAPS καθαρό + Βρέθηκαν αποθηκευμένες ρυθμίσεις + Προσοχή: Εάν ενεργοποιήσετε και συνδεθείτε με μια αντλία, το AndroidAPS θα αντιγράψει τις ρυθμίσεις βασικού από το προφίλ στην αντλία, αντικαθιστώντας τον υπάρχων βασικό ρυθμό της αντλίας. Βεβαιωθείτε ότι έχετε τον σωστό βασικό ρυθμό στο AndroidAPS. Εάν δεν είστε βέβαιοι ή δεν θέλετε να αντικαταστήσετε τον βασικό ρυθμό στην αντλία σας, πατήστε Άκυρο και επαναλάβετε εναλλαγή προς την αντλία σε μεταγενέστερο χρόνο. + Ελλιπή δεδομένα θεραπείας + Ρυθμίσεις συντήρησης + E-mail + Μη έγκυρο Email + Αριθμός αρχείων καταγραφής για αποστολή + Συντήρηση + ΣΥΝΤΗΡ + Παρέχει λειτουργίες συντήρησης (π. χ. αποστολή, καθαρισμό καταγραφής). + Αποστολή αρχείων καταγραφής μέσω Email + Διαγραφή αρχείων καταγραφής + Μια θεραπεία (ινσουλίνη: %1$.2f, υδατάνθρακες: %2$d, στο: %3$s) δεν μπορεί να προστεθεί στις θεραπείες. Παρακαλούμε ελέγξτε και προσθέστε χειροκίνητα μια εγγραφή ανάλογα με την περίπτωση. + eCarbs: %1$d g (%2$d h), καθυστέρηση: %3$d m + Μη διαθέσιμα δεδομένα autosens + Ρυθμίσεις Αρχείου Καταγραφής + Επαναφορά προεπιλογών + Δυσλειτουργία NSClient. Εξετάστε την επανεκκίνηση του NS και του NSClient. + AS + Έκδοση %1$s διαθέσιμη + Χρονική μετατόπιση + Προτιμώμενη λειτουργία APS + Σύνολο + Υπολογ + Δημιουργία σύνδεσης + Στείλτε τα αρχεία καταγραφής της ημέρας στους προγραμματιστές μαζί με αυτή τη φορά. Απροσδόκητη κατάσταση. + Υπέρβαση μέγιστου bolus + Σφάλμα εντολής + Σφάλμα ταχύτητας + Υπέρβαση του ορίου ινσουλίνης + Ελάχιστο αίτημα για αλλαγή [%] + Το κύκλωμα δημιουργεί μια νέα αίτηση αλλαγής μόνο αν η αλλαγή είναι μεγαλύτερη από αυτήν την τιμή. Η προεπιλεγμένη τιμή είναι 20% %1$d ημέρα %1$d ημέρες + + %1$d ώρα + %1$d ώρες + + + %1$d λεπτό + %1$d λεπτά + diff --git a/app/src/main/res/values-es/insight_alerts.xml b/app/src/main/res/values-es/insight_alerts.xml index 70489fbc5e..d30421507a 100644 --- a/app/src/main/res/values-es/insight_alerts.xml +++ b/app/src/main/res/values-es/insight_alerts.xml @@ -1,3 +1,26 @@ - + + ADVERTENCIA W31: Cartucho bajo + ADVERTENCIA W32: Batería baja + ADVERTENCIA W33: Fecha/Hora no válida + ADVERTENCIA W34: Fin de la garantía + ADVERTENCIA W36: TBR cancelada + ADVERTENCIA W38: Bolo cancelado + W39 Advertencia: Advertencia de tiempo préstamo + Mantenimiento M20: Cartucho no insertado + Mantenimiento M21: Cartucho vacío + Mantenimiento M22: Batería vacía + Mantenimiento M23: Apagado automático + Mantenimiento M24: oclusión + Mantenimiento M25: Tiempo préstamo finalizado - final de la operación + Mantenimiento M26: Cambio de cartucho no completado + Mantenimiento M27: Error de descarga de datos + Mantenimiento M28: Tiempo de espera vencido + Mantenimiento M29: Tipo de batería no establecido + Mantenimiento M30: Tipo cartucho no establecido + Error E6: Error mecánico + Error E7: Error electrónico + Error E10: Error de rebobinado + Error E13: Error de lenguaje + diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index ab5bdf0d2e..15cd8c4f33 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -5,23 +5,23 @@ Máximo Bolo permitido [U] Máximos carbohidratos permitidos [g] Preferencias - Actualizar tratamientos de NS + Actualizar los tratamientos desde NS Restablecer las bases de datos - ¿Realmente quiere restablecer la base de datos? + ¿Realmente quiere restablecer las bases de datos? Salir Usar bolos extendidos para >200% Dispositivo Bluetooth DanaR - Usar siempre valor basal absoluto + Usar siempre valores basales absolutos Por favor reinicia el teléfono o AndroidAPS desde ajustes de sistema, sino AndroidAPS no guardará registros (importante para trazar y verificar que el algoritmo funcione correctamente) Botones para acceso rápido a funciones básicas - Insertar notas de registro avanzado. + Insertar notas de registro avanzadas. Utilizado para configurar complementos activos Programa de aprendizaje Muestra los ajustes preestablecidos de alimentos definidos en Nightscout Ajustes de insulina preestablecidos para Humalog y NovoRapid /NovoLog Ajuste preestablecido para insulina Fiasp Permite definir el pico de la actividad de la insulina. Debe ser utilizado únicamente por usuarios avanzados - Activar o desactivar la posibilidad para activar el lazo. + Permitir o denegar la activación del lazo. Sincroniza tus datos con Nightscout Condición del algoritmo en 2016 Condición del algoritmo en 2017 @@ -42,36 +42,36 @@ Sensibilidad calculada de la misma manera que Oref0, pero puede especificarse el rango de tiempo. Absorción de carbohidratos mínima se calcula con el máximo tiempo de absorción de carbohidratos en preferencias. La sensibilidad se calcula con las últimas 24 h y los carbohidratos (si no son absorbidos) se anulan después del tiempo indicado en preferencias. La sensibilidad se calcula con las últimas 8 h y los carbohidratos (si no son absorbidos) se anulan después del tiempo indicado en preferencias. El complemento también calcula UAM. - La sensibilidad se calcula como un promedio ampliado de las desviaciones. Desviaciones más recientes tienen mayor impacto. Absorción de carbohidratos mínima se calcula desde el tiempo de absorción de carbohidratos máximo en preferencias. Este algoritmo es el más rápido en los siguientes cambios de sensibilidad. + La sensibilidad se calcula como un promedio ampliado de las desviaciones. Desviaciones más recientes tienen mayor impacto. Absorción de carbohidratos mínima se calcula desde el tiempo de absorción de carbohidratos máximo en preferencias. Este algoritmo es el más rápido siguiendo los cambios de sensibilidad. Recibir valores de glucosa de la app parcheada de Dexcom G5. Recibir valores de glucosa de Glimp. Recibir valores de glucosa del 600SeriesAndroidUploader. - Descarga datos de glucosa de Nightscout - Recibir valores de glucosa de xDrip. + Descarga los datos de glucosa de Nightscout + Recibir los valores de glucosa de xDrip. Guarda todos los tratamientos que se realizaron - Observar y controlar AndroidAPS usando tu reloj WearOs. + Usar tu reloj WearOS para observar y controlar AndroidAPS. Mostrar información sobre tu lazo en tu esfera xDrip+. Control remoto de AndroidAPS mediante comandos SMS. Inicio Verificar Unidades DIA (Duración Insulina Activa) - IC (Insulina/Carbohidratos Ratio) + IC (Ratio Insulina/Carbohidratos) ISF (Factor Sensibilidad Insulina) Dosis Basal Objetivo - NINGUN PERFIL ACTIVO + NINGÚN PERFIL ACTIVO Insulina: Carbohidratos: - IOB: - IOB: + IOB (Insulina Activa): + IOB (Insulina Activa): Actividad: IOB total: Actividad total IOB: Dur: - Dosis: + Relación: Ins: - IOB: + IOB (Insulina Activa): IOB Total: Insulina [U] Carbohidratos [g] @@ -89,11 +89,11 @@ Batería Depósito Ok - Última ejecución + Última acción Parámetros de entrada Estado de glucosa Basal temporal actual - IOB datos + Datos IOB Perfil Datos de comidas Resultado @@ -102,20 +102,20 @@ Solicitud Dosis Duración - Razón + Motivo Glucosa Variación Variación: Tabla de configuraciones Objetivos - OpenAPS AMA + OpenAPS MA Inicio Perfil NS Perfil simple Basal temporal Tratamientos Bomba virtual - Portal Tratamientos + Portal de Tratamientos Bomba ¿Qué bomba quieres utilizar con AndroidAPS? Tratamientos @@ -133,7 +133,7 @@ Lazo Utiliza esto para activar la integración del lazo de AndroidAPS. APS - Tras procesar restricciones + Tras procesar las restricciones Basal temporal en la bomba Última aceptada Ok @@ -458,6 +458,7 @@ 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). + Valor por defecto: 3.0 (AMA) o 8.0 (SMB). Este es un escenario de impacto de absorción de carbohidratos por defecto por 5 minutos. El valor predeterminado es un esperado 3mg/dl / 5min. Esto afecta la rapidez con la que los COB decaen, y cuánta absorción de carbohidratos se supone en el cálculo de futuras BG, cuando BG está cayendo más que esperado, o no aumento tanto como esperaba. 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 @@ -640,6 +641,8 @@ Fecha INVALIDO Esperando para conectar con bomba + Conexión OK + Tiempo de Vinculación agotado CONECTANDO Aparato no encontrado Deposito vacío @@ -894,6 +897,7 @@ Basal establecida correctamente Limitando porcentaje máximo de dosis a %1$d%% debido a %2$s Limitando el bolo a %1$.1f U debido a %2$s + Limitando el bolo extendido a %1$.1f U debido a %2$s Limitando max IOB a %1$.1f U debido a %2$s Limitando carbohidratos a %1$d g debido a %2$s Limitando IOB a %1$.1f U debido a %2$s @@ -925,6 +929,7 @@ Asistente de configuración FINALIZAR Selecciona tu idioma + Solicitado: %1$.2fU Entregado: %2$.2fU Código de error: %3$s Primer incremento insulina Segundo incremento insulina Tercer incremento insulina @@ -944,6 +949,10 @@ Máximo multiplicador diario de seguridad Multiplicador de seguridad basal actual n/a + Bomba virtual + Definición de la bomba + Bolo: Paso =%1$s\nBolo Extendido: [paso =%2$s, duración =%3$smin -%4$sh] \nBasal: paso =%5$s\nTBR: %6$s ( %7$s), duración =%8$smin -%9$sh\n%10$s + * Sólo se soportan valores discretos, no rangos, como entrada de datos para basal/bolo en la bomba virtual. Auto Rellenar mediciones perdidas Configuración del Asistente Cálculos incluidos en el resultado del asistente: @@ -1022,6 +1031,7 @@ Enviar registros por email Borrar registros Un tratamiento (insulina: %1$.2f, carbs: %2$d, at: %3$s) no ha podido ser añadido a tratamientos. Por favor compruebe y añada manualmente el registro apropiadamente. + eCarbs: %1$d g (%2$d h), retraso: %3$d m Sin datos autosens disponibles Ajustes del registro Restablecer valores predeterminados @@ -1029,6 +1039,17 @@ AS Versión %1$s disponible Retardo + Modo preferido de APS + Total + Calculado + De acuerdo + Enviar los archivos de registro de hoy a los desarrolladores. Situación inesperada. + Violación de bolo Max + Error de comando + Error de velocidad + Violación del límite de insulina + Valor mínimo de cambio [%] + El lazo mostrará una petición de cambio sólo si éste es mayor que este valor. El valor predeterminado es 20% %1$d día %1$d días diff --git a/app/src/main/res/values-fr/insight_alerts.xml b/app/src/main/res/values-fr/insight_alerts.xml index 378d0f57fd..b631d8f7af 100644 --- a/app/src/main/res/values-fr/insight_alerts.xml +++ b/app/src/main/res/values-fr/insight_alerts.xml @@ -7,7 +7,20 @@ Alerte W34 : Fin de garantie Alerte W36 : TBR annulé Alerte W38 : Bolus annulé + Alerte W39 : Avertissement Loantime + Maintenance M20 : Cartouche pas inséré + Maintenance M21 : Cartouche vide + Maintenance M22 : Batterie vide + Maintenance M23 : Arrêt automatique + Maintenance M24 : Occlusion + Maintenance M25 : Loantime terminé - fin d’opération + Maintenance M26 : Changement de cartouche non terminé + Maintenance M27 : Le téléchargement de données a échoué + Maintenance M28 : Pause mode timeout + Maintenance M29 : Type de batterie non défini + Maintenance M30 : Réservoir type non défini Erreur E6 : Problème mécanique Erreur E7 : Problème d\'électronique + Erreur E10 : Erreur de rembobinage Erreur E13 : Erreur de langage diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 58da7d951d..e4fe9e83cb 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -50,7 +50,7 @@ Recevoir les glycémies depuis xDrip. Enregistre tous les traitements qui ont été effectués Surveillez et contrôlez AndroidAPS en utilisant votre montre WearOS. - Afficher les informations de votre Boucle sur votre xDrip+ watchface. + Afficher les informations de votre Boucle sur votre écran de montre xDrip+. Commander à distance AndroidAPS en utilisant les commandes SMS. Démarrer Vérifier @@ -261,6 +261,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Attente de résultat Numéros de tél autorisés +XXXXXXXXXX;+YYYYYYYYYY + Renvoyer le code %2$s pour injecter le bolus %1$.2fU Renvoyer le code %2$s pour envoyer la calibration %1$.2f Échec du Bolus Bolus %.2fU délivré avec succès @@ -295,6 +296,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Heures Basal Bolus Glucides + Insuline quotidienne Erreurs Glycémie Remplir @@ -319,10 +321,13 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Comprendre votre système Boucle Ouverte, y compris ses recommandations de débit de Basal temporaire Partant de ce constat, décidez quel est le débit de base maximum à choisir, et entrez le dans la pompe et les préférences Commencez par utiliser la Boucle Fermée avec le système Arrêt Glycémie Basse + Utiliser la Boucle Fermée avec max IA = 0 pour quelques jours sans avoir trop d’événements AGB Arrêt Glycémie Basse (LGS Low Glucose Suspend) Ajustez votre système Boucle Fermée, augmentez la fonction « max IOB » au delà de 0 et diminuez progressivement vos cibles glycémiques Utiliser pendant quelques jours, et au moins une nuit sans les alarmes d’hypoglycémie, avant la baisse de G Ajustez si besoin les débits de base et les ratios, activez ensuite « Autosens » Une semaine réussie avec des journées en Boucle Fermée, avec des entrées normales des glucides + Activer d’autres fonctionnalités pour l’utilisation dans la journée, tel que Assistance Repas Avancée (AMA Advanced Meal Assist) + Activer des fonctionnalités supplémentaires pour l\'utilisation dans la journée, telles que la fonction SMB Vous devez lire le wiki et augmenter les max IA pour faire fonctionner SMB ! Un bon début est max IA = moyenne bolus repas + 3 fois max daily basal Vous avez atteint la limite maximale Aucun profil séléctionné @@ -344,6 +349,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Commande inconnue ou fausse réponse Assistant Rapide Paramètres de l\'Assistant Rapide + Texte du bouton : Glucides: Valide: Ajouter @@ -381,8 +387,13 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Arrêt de la Pompe Batterie Pompe Déchargée DanaR Coréenne + Débit Basal : + L\'enregistrement du profil Basal a échoué Profil Basal mise à jour dans la pompe + Désactiver le mode FacileUI (EasyUI) de la pompe Activer les bolus étendus dans la pompe + Changer le mode de U/d en U/h sur la pompe + Le débit Basal est inférieur au minimum autorisé. Profil non accepté ! G: Dernière G: MIQ (Multiples Injections Quotidiennes) @@ -404,7 +415,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Repas imminent Hypo Activité - Retirer l\'enregistrement: + Retirer l\'enregistrement : Dana Stats DTI cumulé DTI avec Pondération Exponentielle @@ -423,12 +434,15 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S ACT CONF BOUCLE + SP OAPS + LP DANA ACCUEIL POMPEV PROFIL NS TRAITER + CP OBJ WEAR SMS @@ -438,10 +452,14 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Paramètres Avancés Modèle: %1$02X Protocole: %2$02X Code: %3$02X Profil + Valeur par défaut : 3 Ceci est un paramètre important de sécurité de l’OpenAPS. Ceci va limiter vos débits basal à 3 fois votre débit Basal maximum. Il est probable que vous n’aurez pas besoin de changer cela, mais vous devez être conscient de ce qui est discuté pour les limites de sécurité dans “3x max daily; 4x current”. Valeur par défaut : 4 Ceci est l’autre moitié des paramètres de sécurité limitant l’OpenAPS, et l’autre moitié de “3x max daily, 4x current” des paramètres de sécurité. Quel que soit le basal maximum prédéfini dans votre pompe, il ne pourra pas être plus haut que ce nombre multiplié par le Basal actuel. Ceci est fait pour ne pas mettre l’utilisateur en danger en programmant des débits Basal maximum trop élevés avant de comprendre comment l’algorithme fonctionne. Encore une fois, la valeur par défaut est 4x, la plupart des gens n’auront jamais besoin d’ajuster ce paramètre, plutôt ils auront tendance à ajuster d’autres paramètres s’ils voient qu’ils atteignent ce paramètre de limite de sécurité. + Valeur par défaut: 1.2\nCeci est la limite du multiplicateur utilisé par Autosens (ensuite Autotune) pour definir +20% en limite maximale du ratio Autosens. En consequence, ceci dit va définir pour Autosens, la valeur limite maximale du Basal, la valeur limite minimale de la Sensibilité à l\'insuline (SI, ISF), et la valeur limite minimale de la cible glycémique. + Valeur par défaut: 0.7\nL’autre aspect pour les limites de sécurité pour Autosens. Cette valeur va créer une limite qui définit jusqu\'à quelle valeur minimale Autosens va pouvoir ajuster le basal , et jusqu\'à quelles valeurs maximales Autosens pourra ajuster la Sensibilité à l\'Insuline (SI, ISF) et les cibles glycémiques. Autosens ajuste aussi les cibles Valeur par défaut : true\nCeci est utilisé pour autoriser Autosens à ajuster les cibles de glycémie en plus de SI et les basals. Valeur par défaut : 2\nBolus snooze est activé apres votre bolus de repas, la boucle ne réagira pas avec des valeurs basses temporaire quand vous venez juste de manger. L’exemple ici et la valeur par défaut est 2 ; donc avec une Durée d\'Action (DIA) de 3 heures signifie que snooze bolus sera graduellement éliminé après 1,5 heures (3DIA/2). + Valeur par défaut : 3.0 (AMA) ou 8.0 (SMB). Il s’agit d’un paramètre décrivant l’absorption des glucides par 5 minutes. La valeur par défaut est de 3mg/dl/5min. Cela influe sur la vitesse calculée de disparition des Glucides Actifs (GA), et comment sera estimée la consommation des glucides pour calculer les valeurs futures de glycémies, lorsque la glycémie chute plus que prévu ou n\'augmente pas autant que calculé. Attention !\nNormalement vous n\'avez pas à changer les valeurs mentionnées ci-dessous. SVP CLIQUEZ ICI et LISEZ bien le texte. Assurez-vous de bien le COMPRENDRE avant de changer n’importe laquelle de ces valeurs. Seuls les chiffres sont autorisés. Seuls les chiffres qui se trouvent dans la fourchette %1$s - %2$s sont autorisés. @@ -469,7 +487,9 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Mauvais mot de passe Mot de passe pour paramètres Déverrouiller les paramètres + L\'insuline journalière s\'approche de la limite NSClient + NSCI URL : Défilement automatique Redémarrer @@ -479,6 +499,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S NS API Secret NS API Secret Entrez NS API secret (12 carac. min) + Transmettre maintenant Vider la file d\'attente Afficher la file d\'attente File d\'attente : @@ -498,6 +519,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Adulte résistant à l\'insuline Veuillez svp sélectionner l’âge du patient pour définir les limites de sécurité Glimp + %s a besoin de la liste blanche de l’optimisation batterie pour une bonne performance La Boucle est suspendue Suspendu (%1$d m) Superbolus (%1$d m) @@ -517,6 +539,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Tendance 15 min GA Superbolus + Démarrage de l\'app journaux vers NS Sortie de l’application pour appliquer de nouveaux paramètres. DanaRv2 Insuline @@ -538,6 +561,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Barre d\'état pour xDrip (Montre) xds Afficher l’Impact Glycémie + Ajouter l’IG sur la vue générale Pas de téléchargement vers NS Toutes les données envoyées à NS sont abandonnées. AAPS est connecté à NS mais aucun changement n’est fait dans NS Incrément Basal @@ -549,16 +573,25 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Age Cathéter Age Insuline heures + Type du Basal + Profil incorrect !!! Changement de Profil Age batterie pompe Changement Batterie Pompe Options d\'alarme + Haute urgent + Haute + Basse + Basse urgent + Données obsolètes + Urgent données obsolètes Seuil des données obsolètes [min] Seuil d\'urgence pour les données obsolètes [min] Plage pour Autosens [h] Le nombre d’heures écoulées pour l\'estimation de Sensibilité (le temps d’absorption des glucides est exclu) Pompe OpenAPS + Logiciel pour télécharger vers Internet Estimation de la Sensibilité Quel algorithme de Sensibilité doit être utilisé ? SENS @@ -571,7 +604,10 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Afficher le bolus étendu en % AgeC AgeI + AgeC + PBAGE OAPS + UPLD BAS EXT Garder l\'écran allumé @@ -665,12 +701,14 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S INFO Bluetooth BT Watchdog + Ceci va arrêter le Bluetooth du téléphone pour une seconde si la connexion pompe n’est pas possible. Cela peut assister certains téléphones dont la connexion Bluetooth se bloque. App Dexcom G5 (adaptée) Remonter les données glycémiques vers NS Paramètres de téléchargement du G5 Paramètres de téléchargement Poctech Afficher le delta détaillé Afficher delta avec une décimale supplémentaire + Max. minutes de basal pour limiter le SMB Firmware pompe incompatible Transmettre les données G vers xDrip+ Dans xDrip+ veuillez séléctionner 640g/Eversense comme source de données @@ -694,6 +732,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Mode boucle fermée activé Maximum IA réglé correctement Glycémie disponible depuis la source sélectionnée + Les changements de Basal doivent être aux heures entières : %s Profile incorrect: %s Programmer la pompe pour injecter un bolus Actualiser @@ -705,6 +744,8 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Arrêté pour cause d\'erreur Arrêté par l\'utilisateur En cours d\'exécution + Annulation en cours du TBR + Paramétrer TBR (%1$d%% / %2$d min) Injection du bolus en cours (%.1f U) Actualisation en cours L\'opération demandée n\'est pas prise en charge par la pompe @@ -738,6 +779,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S L\'état du programme mis à jour passé(e)s avec + TBR actif il vous reste min Carnet Dernière action terminée @@ -768,6 +810,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S semaine s %1$ds expire le %2$s + Statut Rester Actif Statistiques Se connecter de façon préventive Se connecter automatiquement lorsque les écrans AndroidAPS sont ouverts, avant même qu\'une commande de la pompe soit envoyée afin de réduire le délai de connexion @@ -781,6 +824,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Activer SMB avec les cibles temporaires Activer SMB lorsqu\'il y a une cible temporaire active (repas imminent, exercise) Autoriser SMB avec des cibles élevées temporaires + Activer SMB lorsqu\'il y a une cible tempo active haute (exercice) Laisser démarrer le Basal temporaire Coupure du son Insuline @@ -793,6 +837,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Impossible d’exécuter l’application de MCG. Assurez-vous de que celle-ci est installée. MCG Historique + Notifier en SMB Afficher SMB sur la montre comme un bolus standard. Créer des messages d’erreurs Créer des annonces Nightscout pour les dialogues d’erreur et alertes locales (également visible dans Careportal sous Traitements) @@ -802,7 +847,8 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Téléchargement Fabric Autoriser l\'envoi automatique des rapports d\'erreur et des données d\'utilisation aux développeurs via le service fabric.io Svp actualisez votre app G5 vers une version compatible - Traitement Repas imminent + Début Activités + Début Repas imminent Traitement Ne pas administrer de bolus, enregistrer uniquement Catégorie @@ -816,7 +862,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Insuline Active Basals Aucune action sélectionnée, rien ne se passera - Démarrer traitement hypo + Début traitement hypo Version Dev. La Boucle Fermée est désactivée. Mode ingénierie actif Le mode Ingénierie n\'est pas activé et n\'existe pas sur cette version @@ -824,14 +870,18 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Lecture du profil basal L\'historique de la pompe a été modifié depuis le calcul du bolus. Le bolus n\'a pas été administré. Merci de recalculer le bolus s\'il est toujours nécessaire. Le bolus a été délivré mais il n\'a pas pu être ajouté à l\'historique des traitements. Ceci peut se produire lorsque deux petits bolus de la même taille sont gérés dans les deux dernières minutes. Merci de vérifier l\'historique de la pompe et les entrées de traitements puis utilisez le Careportal pour y ajouter les entrées manquantes. Assurez-vous de ne pas ajouter des entrées au cours de la même minute et pour la même quantité d\'insuline. + Rejet cible temporaire haute parce que le calcul ne prend pas en compte les changements récents de l\'historique pompe Actualisation de l\'état de la pompe Le taux basal de la pompe a été modifié et sera bientôt actualisé Le pourcentage de basal a changé dans la pompe mais sa lecture a échoué Vérification des modifications de l\'historique + De multiples bolus similaires viennent d\'être importés dans la même minute. Un seul enregistrement a pu être ajouté aux traitements. Merci de vérifier la pompe et d\'ajouter manuellement un enregistrement de bolus en utilisant l\'onglet Careportal. Assurez vous de créer ce bolus avec un temps différent de tous les autres Bolus. + \n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de) Le dernier bolus enregistré date d\'il y a plus de 24h ou est dans le futur. Vérifiez que la date dans la pompe est correctement définie. L\'heure/date sur la pompe du dernier bolus administré semble erroné. L\'IA est probablement incorrecte. Vérifiez l\'heure/date de la pompe. ProfileSwitch manquant. S’il vous plaît faire un changement de profil ou appuyez sur « Activer le profil » dans le LocalProfile. Nombre de bolus + Nombre de TBR Objectif %1$d non démarré Objectif %1$d non terminé Pompe n’est pas capable de basals temporaires @@ -874,6 +924,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Durée maximale d’absorption pour un repas [h] Moment où n’importe quel repas est considéré absorbé. Les glucides restants ne seront pas pris en compte. Temps + Affiche les notes dans la boîte de dialogue de traitement Suivant Préc Assistant de configuration @@ -895,10 +946,15 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Autoriser connexion pendant itinérance de données Maximum Ratio Autosens Minimum Ratio Autosens + Diviseur de Bolus snooze DIA + Maximum multiplicateur quotidien de sécurité + Multiplicateur actuel de sécurité du Basal ND Type de pompe virtuelle Définition de pompe Bolus : Étape =%1$s\nExtended Bolus : [Étape =%2$s, Durée =%3$smin -%4$sh]\nBasal : Étape =%5$s\nTBR : %6$s (par %7$s), Durée =%8$smin -%9$sh\n%10$s + * Uniquement les valeurs discrètes sont acceptées. Les plages ou fourchettes basal-bolus ne sont pas pris en charge par les pompes virtuelles (granularité). + Remplissage automatique G Paramètres de l’Assistant Calculs inclus dans le résultat de l’Assistant : Parametres d\'affichage @@ -964,6 +1020,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S La différence horaire importante:\nTime avec la pompe de plus d\'1,5 heure.\nMerci d\'ajuster manuellement l\'heure de la pompe et assurez-vous que la lecture de l\'historique de la pompe ne cause pas de dysfonctionnements.\nSi possible, effacez l\'historique de la pompe avant de modifier l\'heure ou désactivez la Boucle Fermée pour une DIA après la dernière entrée erronée de l\'historique et en tout état de cause au minimum une DIA à partir de maintenant. AndroidAPS reinitialisé Paramètres sauvegardés trouvés + ATTENTION : Si vous activez et connectez à une vraie pompe, AndroidAPS copiera les paramètres Basals du profil vers la pompe, écrasant le taux basal existant stocké sur la pompe. Assurez-vous d\'avoir correctement saisi et réglé les paramètres Basal dans AndroidAPS. Si vous ne savez pas ou si ne voulez pas écraser les paramètres Basal sur votre pompe, appuyez sur Annuler et reporter le passage à la pompe à une date ultérieure. Données de traitement incomplètes Paramètres de maintenance E-mail @@ -992,6 +1049,8 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Erreur de commande Erreur de vitesse Violation d\'une limite d\'insuline + Changement minimum possible [%] + Le fonctionnement de la Boucle demandera une confirmation uniquement si le changement est supérieur à cette valeur. Par défaut, la valeur est 20% %1$d jour %1$d jours diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 3ae470a845..f21b0b832b 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -952,7 +952,6 @@ Micro virtuale Definizione del micro Bolo: Passo =%1$s\n bolo esteso: [step =%2$s, durata =%3$smin -%4$sh] \n Basale: Step =%5$s\nTBR: %6$s (di %7$s), durata =%8$smin -%9$sh\n%10$s - * Target basale/bolo non sono supportati dal micro di virtuale. Autobackfill BG Impostazioni della procedura guidata Calcoli inclusi nel risultato della procedura guidata: diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 634dffe18b..72234be308 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -952,7 +952,6 @@ 가성펌프 종류 펌프 정의 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가 지원되지 않습니다. 혈당 자동채움 마법사 설정 마법사 결과에 사용 된 계산: diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 18ad8b2ac6..5df9d99522 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -953,7 +953,6 @@ Stel in en gebruik tijdelijk en standaard tijdelijke streefdoelen (bv. bij sport Virtuele pomp Type Pomp definitie Bolus: Stap=%1$s\nExtended Bolus: [Stap=%2$s, Duur=%3$smin-%4$sh]\nBasaal: Stap=%5$s\nTBR: %6$s (by %7$s), Duur=%8$smin-%9$sh\n%10$s - * Basaal- /boluswaarden worden niet ondersteund door virtuele pomp. Automatische BG aanvullen Wizard instellingen Berekeningen inclusief in het resultaat van de wizard diff --git a/app/src/main/res/values-pl/insight_alerts.xml b/app/src/main/res/values-pl/insight_alerts.xml index 70489fbc5e..5cd5a79e75 100644 --- a/app/src/main/res/values-pl/insight_alerts.xml +++ b/app/src/main/res/values-pl/insight_alerts.xml @@ -1,3 +1,26 @@ - + + Ostrzeżenie W31: Niski poziom insuliny + Ostrzeżenie W32: Niski stan baterii + Ostrzeżenie W33: Nieprawidłowa godzina/data + Ostrzeżenie W34: Koniec gwarancji + Ostrzeżenie W36: Anulowana baza tymczasowa [TBR] + Ostrzeżenie W38: Bolus anulowany + Ostrzeżenie W39: ostrzeżenie o użyczonym/przyznanym czasie + Konserwacja M20: Brak pojemnika na isulinę + Konserwacja M21: Pusty zbiornik na insulinę + Konserwacja M22: Koniec baterii + Konserwacja M23: Wyłącz automatycznie + Konserwacja M24: Niedrożność + Obsługa M25: koniec użyczonego czasu - koniec działania + Konserwacja M26: Nie zakończono wymiany zbiornika + Konserwacja M27: Błąd pobierania danych + Obsługa M28: koniec czasu trybu pauza + Konserwacja M29: Nie wybrano rodzaju baterii + Konserwacja M30: Nie ustawiono rodzaju pojemnika + Błąd E6: Usterka mechaniczna + Błąd E7: Usterka elektroniczna + Błąd E10: Usterka przewijania + Błąd E6: Błąd języka + diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 74760d065d..a0ca5bc2c3 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -953,7 +953,7 @@ Pompa wirtualna Definicja Pompy Bolus: Krok =%1$s\nBolus Przedłużony: [krok =%2$s, czas trwania =%3$smin -%4$sh] \nBasal: krok =%5$s\nTBR: %6$s (przez %7$s), czas trwania =%8$smin -%9$sh\n%10$s - * Wartości baza-bolus nie są obsługiwane przez wirtualną pompę w danym zakresie. + *Tylko wartości dyskretne, nie zakresy są wspierane jako dawki bazowe/bolusy w pompie wirtualnej. Automatycznie uzupełnij BG Ustawienia kreatora Obliczenia uwzględnione w wynikach kreatora: diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index adf8819a74..ec90620ffe 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -952,7 +952,6 @@ Tipo da Bomba Virtual Definição da Bomba Bólus: Passo=%1$s\nBólus Estendido: [Passo=%2$s, Duração=%3$smin -%4$sh] \nBasal: Passo=%5$s\ nTBR: %6$s (por %7$s), Duração=%8$smin-%9$sh\n%10$s - *Intervalo dos valores basal/bólus não são suportados pela Bomba Virtual. Preenchimentoauto Glicemia Definições do Assistente Rápido Resultado cálculos incluídos no Assistente: diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index f2e60784be..136501fa3d 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -952,7 +952,7 @@ Tipul pompei virtuale Definirea pompei Bolus: Pas=%1$s\nBolus Extins: [Pas=%2$s, Durată=%3$smin-%4$sh]\nBazală: Pas=%5$s\nRBT: %6$s (cu %7$s), Durată=%8$smin-%9$sh\n%10$s - Valorile bazalei/bolusului variate nu sunt suportate de căter Pompa Virtuală. + * Doar valorile discrete, nu şi intervalele de valori sunt suportate ca şi incremente în pompa virtuală. Autocompletează glicemiile lipsă Asistent setări Calcule incluse în rezultatul asistentului: diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 18b0a72853..e4a34b617c 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -952,7 +952,6 @@ Тип виртуальной помпы Определение помпы Болюс: Шаг =%1$s\nПродленный Болюс: [Шаг =%2$s, Длительность =%3$sмин -%4$sh] \nБазал: Шаг =%5$s\ nTBR: %6$s (на %7$s), Длительность =%8$sмин -%9$sh\n%10$s - * Величины в данных диапазонах не поддерживаются Виртуальной Помпой. Автозаполнение пропущенных данных СК Параметры мастера настройки смарт-часов wear Расчеты, включены в результат мастера настройки смарт-часов wear: diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index ca452725a9..48aafeb771 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -953,7 +953,7 @@ 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é. + * Iba diskrétne hodnoty a nie rozsahy sú podporované pre bazál/bolus vo virtuálnej pumpe. Automatické doplňovanie glykémií z NS Nastavenie wizardu Kalkulácia použitá vo výsledku wizardu: diff --git a/app/src/main/res/values-sv/insight_alerts.xml b/app/src/main/res/values-sv/insight_alerts.xml index 4581ae98f1..a35ec49e8e 100644 --- a/app/src/main/res/values-sv/insight_alerts.xml +++ b/app/src/main/res/values-sv/insight_alerts.xml @@ -2,7 +2,7 @@ Varning W31: Reservoarnivå låg - Varning W32: Batterinivån låg + Varning W32: Batterinivå låg Varning W33: Ogiltig tid/datum Varning W34: Garantiperioden har upphört Varning W36: Tempbasal avbruten @@ -10,7 +10,7 @@ Varning W39: Låneperioden upphör snart Underhåll M20: Reservoar inte monterad Underhåll M21: Reservoar tom - Underhåll M22: Batteriet tomt + Underhåll M22: Batteri tomt Underhåll M23: Automatisk avstängning Underhåll M24: Ocklusion Underhåll M25: Låneperioden över. Stänger av pumpen diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 322d206e13..7919d5c5af 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -691,7 +691,7 @@ Pumpdrivrutin justerad Pumpen kan inte nås BG-värden saknas - Systemaviseringar för larm och info + Systemaviseringar för larm & info Lokala larm Varna om BG-data saknas Varna om pumpen inte går att nå @@ -952,7 +952,7 @@ 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. + * Inga spann stöds som granularitet för basal/bolus i den virtuella pumpen. Endast enkla värden. Auto Backfill BG Kalkylatorinställningar Kalkyler inkluderade i resultatet @@ -1042,7 +1042,7 @@ Föredraget APS-läge Total Kalkyl - Verifierar anslutningen + Anslutningen verifieras Skicka dagens loggfiler till utvecklarna tillsammans med denna datumstämpel. Oväntad situation. Max bolus nådd Kommandofel diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 6dd67b910e..b4c2055644 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -952,7 +952,6 @@ 虚拟泵类型 泵定义 大剂量: Step=%1$s\n扩展大剂量: [Step=%2$s, 持续时间=%3$smin-%4$sh]\n基础率: Step=%5$s\nTBR临时基础率: %6$s (by %7$s), 持续时间=%8$smin-%9$sh\n%10$s - * 虚拟泵不支持远程修改基础率或输注大剂量 Autobackfill 血糖 向导设置 包含在向导中的计算结果: From 1d3c4509f21eb0d963c994c1b8947e7f3934aee2 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Wed, 19 Sep 2018 20:56:05 +0200 Subject: [PATCH 018/379] New Crowdin translations (#1454) * New translations strings.xml (Russian) * New translations strings.xml (Spanish) * New translations strings.xml (Spanish) * New translations strings.xml (Spanish) --- app/src/main/res/values-es/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 15cd8c4f33..ab8cf0dfa2 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1041,7 +1041,7 @@ Retardo Modo preferido de APS Total - Calculado + Cálculo De acuerdo Enviar los archivos de registro de hoy a los desarrolladores. Situación inesperada. Violación de bolo Max diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index e4a34b617c..f710b790de 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -952,6 +952,7 @@ Тип виртуальной помпы Определение помпы Болюс: Шаг =%1$s\nПродленный Болюс: [Шаг =%2$s, Длительность =%3$sмин -%4$sh] \nБазал: Шаг =%5$s\ nTBR: %6$s (на %7$s), Длительность =%8$sмин -%9$sh\n%10$s + * В виртуальной помпе поддерживаются только дискретные величины для обработки базала/болюса. Автозаполнение пропущенных данных СК Параметры мастера настройки смарт-часов wear Расчеты, включены в результат мастера настройки смарт-часов wear: From e32050d565bedc2397ac38684ac25903523c51c8 Mon Sep 17 00:00:00 2001 From: Nico Schmitz Date: Wed, 19 Sep 2018 21:13:02 +0200 Subject: [PATCH 019/379] Replace constants by comparator enum --- .../general/automation/triggers/Trigger.java | 71 ++++++++++++------- .../automation/triggers/TriggerBg.java | 32 +++------ 2 files changed, 57 insertions(+), 46 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/Trigger.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/Trigger.java index 8cfa2156d9..20bf93de9c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/Trigger.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/Trigger.java @@ -7,13 +7,54 @@ import info.nightscout.androidaps.R; public abstract class Trigger { - protected static final int ISLOWER = -2; - protected static final int ISEQUALORLOWER = -1; - protected static final int ISEQUAL = 0; - protected static final int ISEQUALORGREATER = 1; - protected static final int ISGREATER = 2; + public enum Comparator { + IS_LOWER, + IS_EQUAL_OR_LOWER, + IS_EQUAL, + IS_EQUAL_OR_GREATER, + IS_GREATER, + IS_NOT_AVAILABLE; - protected static final int ISNOTAVAILABLE = 10; + public int getStringRes() { + switch (this) { + case IS_LOWER: + return R.string.islower; + case IS_EQUAL_OR_LOWER: + return R.string.isequalorlower; + case IS_EQUAL: + return R.string.isequal; + case IS_EQUAL_OR_GREATER: + return R.string.isequalorgreater; + case IS_GREATER: + return R.string.isgreater; + case IS_NOT_AVAILABLE: + return R.string.isnotavailable; + default: + return R.string.unknown; + } + } + + public boolean check(T obj1, T obj2) { + if (obj1 == null || obj2 == null) + return this.equals(Comparator.IS_NOT_AVAILABLE); + + int comparison = obj1.compareTo(obj2); + switch (this) { + case IS_LOWER: + return comparison < 0; + case IS_EQUAL_OR_LOWER: + return comparison <= 0; + case IS_EQUAL: + return comparison == 0; + case IS_EQUAL_OR_GREATER: + return comparison >= 0; + case IS_GREATER: + return comparison > 0; + default: + return false; + } + } + } Trigger() { } @@ -43,22 +84,4 @@ public abstract class Trigger { return null; } - - public static int toComparatorString(int comparator) { - switch (comparator) { - case ISLOWER: - return R.string.islower; - case ISEQUALORLOWER: - return R.string.isequalorlower; - case ISEQUAL: - return R.string.isequal; - case ISEQUALORGREATER: - return R.string.isequalorgreater; - case ISGREATER: - return R.string.isgreater; - case ISNOTAVAILABLE: - return R.string.isnotavailable; - } - return R.string.unknown; - } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerBg.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerBg.java index 5939502163..7024eecd3f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerBg.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerBg.java @@ -12,32 +12,20 @@ import info.nightscout.utils.JsonHelper; public class TriggerBg extends Trigger { - double threshold; - int comparator = ISEQUAL; - String units = ProfileFunctions.getInstance().getProfileUnits(); + protected double threshold; + protected Comparator comparator = Comparator.IS_EQUAL; + protected String units = ProfileFunctions.getInstance().getProfileUnits(); @Override synchronized boolean shouldRun() { GlucoseStatus glucoseStatus = GlucoseStatus.getGlucoseStatusData(); - if (glucoseStatus == null && comparator == ISNOTAVAILABLE) + if (glucoseStatus == null && comparator.equals(Comparator.IS_NOT_AVAILABLE)) return true; if (glucoseStatus == null) return false; - switch (comparator) { - case ISLOWER: - return glucoseStatus.glucose < Profile.toMgdl(threshold, units); - case ISEQUALORLOWER: - return glucoseStatus.glucose <= Profile.toMgdl(threshold, units); - case ISEQUAL: - return glucoseStatus.glucose == Profile.toMgdl(threshold, units); - case ISEQUALORGREATER: - return glucoseStatus.glucose >= Profile.toMgdl(threshold, units); - case ISGREATER: - return glucoseStatus.glucose > Profile.toMgdl(threshold, units); - } - return false; + return comparator.check(glucoseStatus.glucose, Profile.toMgdl(threshold, units)); } @Override @@ -47,7 +35,7 @@ public class TriggerBg extends Trigger { o.put("type", TriggerBg.class.getName()); JSONObject data = new JSONObject(); data.put("threshold", threshold); - data.put("comparator", comparator); + data.put("comparator", comparator.toString()); data.put("units", units); o.put("data", data.toString()); } catch (JSONException e) { @@ -61,7 +49,7 @@ public class TriggerBg extends Trigger { try { JSONObject d = new JSONObject(data); threshold = JsonHelper.safeGetDouble(d, "threshold"); - comparator = JsonHelper.safeGetInt(d, "comparator"); + comparator = Comparator.valueOf(JsonHelper.safeGetString(d, "comparator")); units = JsonHelper.safeGetString(d, "units"); } catch (JSONException e) { e.printStackTrace(); @@ -76,10 +64,10 @@ public class TriggerBg extends Trigger { @Override String friendlyDescription() { - if (comparator == Trigger.ISNOTAVAILABLE) + if (comparator.equals(Comparator.IS_NOT_AVAILABLE)) return MainApp.gs(R.string.glucoseisnotavailable); else - return MainApp.gs(R.string.glucosecompared, Trigger.toComparatorString(comparator), threshold, units); + return MainApp.gs(R.string.glucosecompared, comparator.getStringRes(), threshold, units); } TriggerBg threshold(double threshold) { @@ -87,7 +75,7 @@ public class TriggerBg extends Trigger { return this; } - TriggerBg comparator(int comparator) { + TriggerBg comparator(Comparator comparator) { this.comparator = comparator; return this; } From 4985864343e9b22f0edb8a153a84d05a8e546465 Mon Sep 17 00:00:00 2001 From: Nico Schmitz Date: Wed, 19 Sep 2018 22:27:30 +0200 Subject: [PATCH 020/379] Add title. Generate getters. --- .../general/automation/AutomationEvent.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationEvent.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationEvent.java index c0de76ee37..8e71c19d6e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationEvent.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationEvent.java @@ -8,9 +8,23 @@ import info.nightscout.androidaps.plugins.general.automation.triggers.Trigger; public class AutomationEvent { - Trigger trigger; - List actions = new ArrayList<>(); + private Trigger trigger; + private List actions = new ArrayList<>(); + private String title; - AutomationEvent() { + AutomationEvent(String title) { + this.title = title; + } + + public Trigger getTrigger() { + return trigger; + } + + public List getActions() { + return actions; + } + + public String getTitle() { + return title; } } From b5f30a0f462c7ed78333a9884a998c8d95722e39 Mon Sep 17 00:00:00 2001 From: Nico Schmitz Date: Wed, 19 Sep 2018 22:29:35 +0200 Subject: [PATCH 021/379] Add some content to automation plugin fragment --- .../automation/AutomationFragment.java | 78 ++++++++++++++++++- .../general/automation/AutomationPlugin.java | 24 +++++- .../automation/dialogs/EditEventDialog.java | 16 ++++ .../main/res/drawable/ic_add_black_24dp.xml | 9 +++ .../main/res/layout/automation_event_item.xml | 20 +++++ .../main/res/layout/automation_fragment.xml | 25 +++++- 6 files changed, 166 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/general/automation/dialogs/EditEventDialog.java create mode 100644 app/src/main/res/drawable/ic_add_black_24dp.xml create mode 100644 app/src/main/res/layout/automation_event_item.xml diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationFragment.java index 0e9eccd84e..7dce538747 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationFragment.java @@ -1,24 +1,100 @@ package info.nightscout.androidaps.plugins.general.automation; +import android.app.Activity; import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.design.widget.FloatingActionButton; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.TextView; + +import java.util.List; import info.nightscout.androidaps.R; import info.nightscout.androidaps.plugins.Common.SubscriberFragment; +import info.nightscout.androidaps.plugins.general.automation.dialogs.EditEventDialog; public class AutomationFragment extends SubscriberFragment { + private RecyclerView mEventListView; + private FloatingActionButton mFabAddEvent; + private EventListAdapter mEventListAdapter; + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.automation_fragment, container, false); + + mEventListView = view.findViewById(R.id.eventListView); + mFabAddEvent = view.findViewById(R.id.fabAddEvent); + + mFabAddEvent.setOnClickListener(this::onClickAddEvent); + + final AutomationPlugin plugin = AutomationPlugin.getPlugin(); + mEventListAdapter = new EventListAdapter(plugin.getAutomationEvents()); + mEventListView.setLayoutManager(new LinearLayoutManager(getContext())); + mEventListView.setAdapter(mEventListAdapter); + + updateGUI(); + return view; } @Override protected void updateGUI() { - + Activity activity = getActivity(); + if (activity != null) + activity.runOnUiThread(() -> { + mEventListAdapter.notifyDataSetChanged(); + }); } + + private void onClickAddEvent(View v) { + /*EditEventDialog dialog = EditEventDialog.newInstance(); + FragmentManager manager = getFragmentManager(); + dialog.show(manager, "EditEventDialog");*/ + + final AutomationPlugin plugin = AutomationPlugin.getPlugin(); + plugin.getAutomationEvents().add(new AutomationEvent("Test")); + updateGUI(); + } + + public static class EventListAdapter extends RecyclerView.Adapter { + private final List mEvents; + + EventListAdapter(List events) { + this.mEvents = events; + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.automation_event_item, parent, false); + return new ViewHolder(v); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + final AutomationEvent event = mEvents.get(position); + holder.eventTitle.setText(event.getTitle()); + } + + @Override + public int getItemCount() { + return mEvents.size(); + } + + static class ViewHolder extends RecyclerView.ViewHolder { + TextView eventTitle; + + public ViewHolder(View itemView) { + super(itemView); + eventTitle = itemView.findViewById(R.id.viewEventTitle); + } + } + } + } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationPlugin.java index 22526a50df..aef640129c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationPlugin.java @@ -31,10 +31,10 @@ public class AutomationPlugin extends PluginBase { return plugin; } - List automationEvents = new ArrayList<>(); - EventLocationChange eventLocationChange; - EventChargingState eventChargingState; - EventNetworkChange eventNetworkChange; + private final List automationEvents = new ArrayList<>(); + private EventLocationChange eventLocationChange; + private EventChargingState eventChargingState; + private EventNetworkChange eventNetworkChange; private AutomationPlugin() { super(new PluginDescription() @@ -64,6 +64,22 @@ public class AutomationPlugin extends PluginBase { MainApp.bus().unregister(this); } + public List getAutomationEvents() { + return automationEvents; + } + + public EventLocationChange getEventLocationChange() { + return eventLocationChange; + } + + public EventChargingState getEventChargingState() { + return eventChargingState; + } + + public EventNetworkChange getEventNetworkChange() { + return eventNetworkChange; + } + @Subscribe public void onEventPreferenceChange(EventPreferenceChange e) { if (e.isChanged(R.string.key_location)) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/dialogs/EditEventDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/dialogs/EditEventDialog.java new file mode 100644 index 0000000000..c7ab2dbf7b --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/dialogs/EditEventDialog.java @@ -0,0 +1,16 @@ +package info.nightscout.androidaps.plugins.general.automation.dialogs; + +import android.os.Bundle; +import android.support.v4.app.DialogFragment; + +public class EditEventDialog extends DialogFragment { + public static EditEventDialog newInstance() { + + Bundle args = new Bundle(); + + EditEventDialog fragment = new EditEventDialog(); + fragment.setArguments(args); + + return fragment; + } +} diff --git a/app/src/main/res/drawable/ic_add_black_24dp.xml b/app/src/main/res/drawable/ic_add_black_24dp.xml new file mode 100644 index 0000000000..0258249cc4 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/automation_event_item.xml b/app/src/main/res/layout/automation_event_item.xml new file mode 100644 index 0000000000..92c9ba93bc --- /dev/null +++ b/app/src/main/res/layout/automation_event_item.xml @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/automation_fragment.xml b/app/src/main/res/layout/automation_fragment.xml index 64cdf916fb..4b6ee5c71d 100644 --- a/app/src/main/res/layout/automation_fragment.xml +++ b/app/src/main/res/layout/automation_fragment.xml @@ -1,9 +1,32 @@ + + + + + + + From 58b3f96c9e38293febd9ac6ab1c74e0355aeeb8d Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 20 Sep 2018 09:05:35 +0200 Subject: [PATCH 022/379] New Crowdin translations (#1456) --- app/src/main/res/values-fr/strings.xml | 112 ++++++++++++------------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index e4fe9e83cb..4b122a6fae 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -2,8 +2,8 @@ Sécurités des traitements - Bolus max. autorisé [U] - Glucides max. autorisés [g] + Maximum Bolus autorisé [U] + Maximum de Glucides autorisé [g] Préférences Actualiser les données depuis NS Réinitialiser les Bases de Données @@ -57,7 +57,7 @@ Unités DAI I:G (Ratio Insuline/Glucides) - SI + SI Sensibilité Insuline Basal Cible PAS DE PROFIL PRÉDÉFINI @@ -75,19 +75,19 @@ IA Totale : Insuline Glucides - G - CT + Gly + TT Glucides Corr U Bolus IA Exécuter maintenant POMPE VIRTUELLE - Taux du Débit de Base - Basal Temporaire + Taux du débit Basal + Basal temporaire Bolus étendu - Niveau Batterie - Niveau Réservoir + Niveau batterie + Niveau réservoir OK Dernière exécution Paramètres de saisie @@ -96,7 +96,7 @@ Données IA Profil Données repas - Résultat + Résultats Pas de données glycémiques disponibles Pas de changement demandé Requête @@ -112,7 +112,7 @@ Aperçu Profil NS Profil simple - Basal Temporaire + Basal temporaire Traitements Pompe virtuelle Careportal @@ -148,7 +148,7 @@ % (100% = actuel) Accepter nouveau basal temporaire : Traitement - Calculateur de Bolus + Calculatrice Restriction appliquée ! Confirmation Entrez le nouveau traitement : @@ -179,7 +179,7 @@ Basal IA Restriction du Bolus appliquée Restriction des Glucides appliquée - Contrôle de Glycémie + Contrôle Glycémie Notification Remarque Question @@ -188,7 +188,7 @@ Insertion Capteur MCG Début Capteur MCG Changement du Réservoir - Changement de Profil + Changement de profil Bolus Goûter Bolus Repas Bolus de correction @@ -208,7 +208,7 @@ Durée Pour cent Absolu - Remarques + Notes Heure de l\'événement Profil Entré par @@ -217,7 +217,7 @@ Basal Temporaire Bolus étendu Version Nightscout : - Manquants + Manque Préférences exportées Exporter les paramètres au Importer les paramètres depuis @@ -225,10 +225,10 @@ Fichier introuvable Exporter les paramètres Importer les paramètres - U/hr Max avec laquelle le débit temp pourra être programmé - Cette valeur est appelée basal maximum dans le contexte OpenAPS + Max. U/hr pour le débit temp Basal + Cette valeur est appelée Basal Maximum dans le contexte OpenAPS Le Basal IA maximum que l\'OpenAPS pourra délivrer [U] - Cette valeur est appelée Max IA dans le contexte OpenAPS\nC\'estlle maximum d\'insuline en [U] que APS peut délivrer en une seule fois. + Cette valeur est appelée Max IA (Insuline Active) dans le contexte OpenAPS\nC\'estlle maximum d\'insuline en [U] que APS peut délivrer en une seule fois. REJETER DanaR Connection en cours @@ -243,8 +243,8 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S L\'adaptateur bluetooth est introuvable L\'appareil sélectionné est introuvable Erreur connection pompe - IA calculée par la pompe - Unités Journalières + Insuline Active pompe + Unités journalières Dernier bolus %.1fh passées Données saisies invalides @@ -273,7 +273,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Doigt Capteur Manuel - Cible Temporaire + Cible temporaire Annulation Cible Temporaire Paramètres du profil DanaR Durée d\'Action [h] @@ -377,8 +377,8 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Fourchette cible : Fourchette de visualisation Les repères hauts et bas sur les graphiques pour l\'aperçu et la montre - Repère BAS - Repère HAUT + Ligne BASSE + Ligne HAUTE Wear Renvoyer toutes les données Afficher les Paramètres sur la Montre @@ -441,14 +441,14 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S ACCUEIL POMPEV PROFIL NS - TRAITER + TRAIT CP OBJ WEAR SMS Raccourcir les titres des onglets - Utilisez toujours un delta basé sur une moyenne courte au lieu d’une moyenne normale - Utile lorsque les données provenant de sources non filtrées comme xDrip devient incohérentes. + Utiliser un delta basé sur une moyenne plus courte + Utiliser toujours un delta basé sur une moyenne courte au lieu d’une moyenne normale. Utile lorsque les données provenant de sources non filtrées comme xDrip devient incohérentes. Paramètres Avancés Modèle: %1$02X Protocole: %2$02X Code: %3$02X Profil @@ -575,9 +575,9 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S heures Type du Basal Profil incorrect !!! - Changement de Profil + Changement Profil Age batterie pompe - Changement Batterie Pompe + Nouvelle Batterie Pompe Options d\'alarme Haute urgent Haute @@ -585,14 +585,14 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Basse urgent Données obsolètes Urgent données obsolètes - Seuil des données obsolètes [min] + Seuil sans nouvelle donnée Glyc. [min] Seuil d\'urgence pour les données obsolètes [min] Plage pour Autosens [h] Le nombre d’heures écoulées pour l\'estimation de Sensibilité (le temps d’absorption des glucides est exclu) Pompe OpenAPS Logiciel pour télécharger vers Internet - Estimation de la Sensibilité + Estimation de Sensibilité Quel algorithme de Sensibilité doit être utilisé ? SENS Sensibilité Oref0 @@ -628,7 +628,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Durée [min] OpenAPS SMB SMB - Activer RNS (UAM) + Activer RNS Activer SMB Utiliser les Super Micro Bolus au lieu des débits de base temporaires pour une action rapide Détection des Repas Non Signalés @@ -659,12 +659,12 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Pourcentage Décalage horaire Cibles Temporaires par défaut - Durée pour le prochain repas - Cible pour le prochain repas + Durée pour le prochain repas [min] + Cible Glyc. pour le prochain repas Durée d\'activité - Cible pour l\'activité - durée de l’hypo - cible de l’hypo + Cible Glycémie pour l\'activité + Durée de période hypo [min] + Cible Glycémie pendant l’hypo Amorcer Obtenir l\'état du bolus étendu Obtenir l\'état du bolus @@ -694,9 +694,9 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Valeurs de glycémie manquantes Utiliser le système de notification pour les alertes et les notifications Alertes locales - Alerte si aucune donnée glycémique n’est reçue + Alerte pas nouvelle donnée glycémique Alerte si la pompe est hors de portée - Seuil de \"hors portée\" pour la pompe + Seuil alerte pompe hors de portée [min] Alarme d\'urgence INFO Bluetooth @@ -823,8 +823,8 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Activer SMB tant que des Glucides sont actifs. Activer SMB avec les cibles temporaires Activer SMB lorsqu\'il y a une cible temporaire active (repas imminent, exercise) - Autoriser SMB avec des cibles élevées temporaires - Activer SMB lorsqu\'il y a une cible tempo active haute (exercice) + Activer SMB avec cibles temp. hautes + Activer SMB lorsqu\'il y a une cible temporaire haute (activités, exercice,..) Laisser démarrer le Basal temporaire Coupure du son Insuline @@ -848,7 +848,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Autoriser l\'envoi automatique des rapports d\'erreur et des données d\'utilisation aux développeurs via le service fabric.io Svp actualisez votre app G5 vers une version compatible Début Activités - Début Repas imminent + Début Repas Imminent Traitement Ne pas administrer de bolus, enregistrer uniquement Catégorie @@ -862,7 +862,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Insuline Active Basals Aucune action sélectionnée, rien ne se passera - Début traitement hypo + Début Traitement Hypo Version Dev. La Boucle Fermée est désactivée. Mode ingénierie actif Le mode Ingénierie n\'est pas activé et n\'existe pas sur cette version @@ -916,15 +916,15 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Déconnecté (%1$d m) Événements automatiques de Careportal Télécharger automatiquement les changements d\'’insuline, de cathéter et de batterie ainsi que les alarmes pompe sur Nightscout - IA totale maximale que OpenAPS ne peut pas dépasser [U] - Cette valeur est appelée Max IA (IOB) dans OpenAPS context\nOpenAPS n’ajoutera pas plus d’insuline si l\'IA (IOB) actuelle est supérieure à cette valeur + Maximum Insuline Active IA pour OpenAPS [U] + Cette valeur est appelée Max IA (Insuline Active) dans le contaxte OpenAPS\nOpenAPS n’ajoutera pas plus d’insuline si l\'IA (Insuline Active) actuelle est supérieure à cette valeur Pompe arrêtée Pompe démarrée Pompe suspendue Durée maximale d’absorption pour un repas [h] - Moment où n’importe quel repas est considéré absorbé. Les glucides restants ne seront pas pris en compte. + Durée où n’importe quel repas est considéré absorbé. Les glucides restants ne seront pas pris en compte. Temps - Affiche les notes dans la boîte de dialogue de traitement + Affiche les notes dans les dialogues Suivant Préc Assistant de configuration @@ -938,12 +938,12 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Deuxième incrément de glucides Troisième incrément de glucides MCG - Utilisez uniquement connexion WiFi - WiFi SSID - Uniquement pendant la charge + Utilisez uniquement connexion Wi-fi + Wi-fi SSID + Wi-fi uniquement pendant la charge Paramètres de connexion SSIDs autorisés (séparés par point-virgule) - Autoriser connexion pendant itinérance de données + Autoriser connexion données itinérance Maximum Ratio Autosens Minimum Ratio Autosens Diviseur de Bolus snooze DIA @@ -1010,15 +1010,15 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S %1$d. Objectif Poctech Recevoir les glycémies depuis l\'app Poctech - Un objectif temporaire élevé augmente la sensibilité - = 100]]> - Un objectif temporaire bas abaisse la sensibilité - + Cible temp. haute élève la sensibilité + = 100]]> + Cible temp. basse abaisse la sensibilité + Paramétrage de la pompe invalide. Vérifiez la documentation et le menu QUICK INFO en utilisant le logiciel de configuration 360. Personnalisé Différence horaire importante La différence horaire importante:\nTime avec la pompe de plus d\'1,5 heure.\nMerci d\'ajuster manuellement l\'heure de la pompe et assurez-vous que la lecture de l\'historique de la pompe ne cause pas de dysfonctionnements.\nSi possible, effacez l\'historique de la pompe avant de modifier l\'heure ou désactivez la Boucle Fermée pour une DIA après la dernière entrée erronée de l\'historique et en tout état de cause au minimum une DIA à partir de maintenant. - AndroidAPS reinitialisé + Réinitialiser AndroidAPS Paramètres sauvegardés trouvés ATTENTION : Si vous activez et connectez à une vraie pompe, AndroidAPS copiera les paramètres Basals du profil vers la pompe, écrasant le taux basal existant stocké sur la pompe. Assurez-vous d\'avoir correctement saisi et réglé les paramètres Basal dans AndroidAPS. Si vous ne savez pas ou si ne voulez pas écraser les paramètres Basal sur votre pompe, appuyez sur Annuler et reporter le passage à la pompe à une date ultérieure. Données de traitement incomplètes From 48e4a041f8d3bd977e510c091e9df3e29c4adbca Mon Sep 17 00:00:00 2001 From: Andy Rozman Date: Thu, 20 Sep 2018 17:23:36 +0100 Subject: [PATCH 023/379] - First changes for CustomActions - changed PumpInterface to add CustomActions - added class CustomActions and CustomActionType - changed all PumpImplementations to use new methods - started changing ActionsFragment (most should be done) --- .../androidaps/interfaces/PumpInterface.java | 9 ++ .../plugins/Actions/ActionsFragment.java | 121 ++++++++++++++++++ .../plugins/Actions/defs/CustomAction.java | 43 +++++++ .../Actions/defs/CustomActionType.java | 11 ++ .../plugins/PumpCombo/ComboPlugin.java | 13 ++ .../PumpDanaR/AbstractDanaRPlugin.java | 14 ++ .../plugins/PumpDanaRS/DanaRSPlugin.java | 14 ++ .../plugins/PumpInsight/InsightPlugin.java | 12 ++ .../androidaps/plugins/PumpMDI/MDIPlugin.java | 14 ++ .../PumpVirtual/VirtualPumpPlugin.java | 14 ++ app/src/main/res/layout/actions_fragment.xml | 1 + 11 files changed, 266 insertions(+) create mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/Actions/defs/CustomAction.java create mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/Actions/defs/CustomActionType.java diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java b/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java index 614c6033d3..2f8e92dcc7 100644 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java +++ b/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java @@ -2,9 +2,13 @@ package info.nightscout.androidaps.interfaces; import org.json.JSONObject; +import java.util.List; + import info.nightscout.androidaps.data.DetailedBolusInfo; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.PumpEnactResult; +import info.nightscout.androidaps.plugins.Actions.defs.CustomAction; +import info.nightscout.androidaps.plugins.Actions.defs.CustomActionType; /** * Created by mike on 04.06.2016. @@ -57,4 +61,9 @@ public interface PumpInterface { PumpEnactResult loadTDDs(); + + List getCustomActions(); + + PumpEnactResult executeCustomAction(CustomActionType customActionType); + } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/ActionsFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/ActionsFragment.java index ea17a30218..6a8422b2dd 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/ActionsFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/ActionsFragment.java @@ -9,10 +9,16 @@ import android.support.v4.app.FragmentManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.LinearLayout; import com.crashlytics.android.answers.CustomEvent; import com.squareup.otto.Subscribe; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import info.nightscout.androidaps.Config; import info.nightscout.androidaps.activities.HistoryBrowseActivity; import info.nightscout.androidaps.MainApp; @@ -25,6 +31,8 @@ import info.nightscout.androidaps.events.EventInitializationChanged; import info.nightscout.androidaps.events.EventRefreshOverview; import info.nightscout.androidaps.events.EventTempBasalChange; import info.nightscout.androidaps.interfaces.PumpInterface; +import info.nightscout.androidaps.plugins.Actions.defs.CustomAction; +import info.nightscout.androidaps.plugins.Actions.defs.CustomActionType; import info.nightscout.androidaps.plugins.Actions.dialogs.FillDialog; import info.nightscout.androidaps.plugins.Actions.dialogs.NewExtendedBolusDialog; import info.nightscout.androidaps.plugins.Actions.dialogs.NewTempBasalDialog; @@ -49,6 +57,7 @@ public class ActionsFragment extends SubscriberFragment implements View.OnClickL return actionsPlugin; } + View actionsFragmentView; SingleClickButton profileSwitch; SingleClickButton tempTarget; SingleClickButton extendedBolus; @@ -90,6 +99,8 @@ public class ActionsFragment extends SubscriberFragment implements View.OnClickL history.setOnClickListener(this); tddStats.setOnClickListener(this); + actionsFragmentView = view; + updateGUI(); return view; } catch (Exception e) { @@ -194,11 +205,121 @@ public class ActionsFragment extends SubscriberFragment implements View.OnClickL if (!ConfigBuilderPlugin.getActivePump().getPumpDescription().supportsTDDs) tddStats.setVisibility(View.GONE); else tddStats.setVisibility(View.VISIBLE); + + checkCustomActions(); + } }); } + private String activePumpName; + private Map currentCustomActions = new HashMap<>(); + private List customButtons = new ArrayList<>(); + + View.OnClickListener customActionsListener = v -> { + + SingleClickButton btn = (SingleClickButton)v; + + CustomAction customAction = this.currentCustomActions.get(btn.getText().toString()); + + ConfigBuilderPlugin.getActivePump().executeCustomAction(customAction.getCustomActionType()); + + }; + + + + private void checkCustomActions() { + + PumpInterface activePump = ConfigBuilderPlugin.getActivePump(); + + if (activePump==null) { + removeCustomActions(); + return; + } + + String newPump = activePump.getClass().getSimpleName(); + + if (newPump.equals(activePumpName)) + return; + + removeCustomActions(); + + // add new actions + List customActions = activePump.getCustomActions(); + + if (customActions!=null) + { + + LinearLayout ll = (LinearLayout)actionsFragmentView.findViewById(R.id.action_buttons_layout); + + for (CustomAction customAction : customActions) { + // TODO + + + SingleClickButton btn = new SingleClickButton(MainApp.instance().getApplicationContext()); + btn.setText(customAction.getName()); + + //btn.setTextAppearance(R.style.buttonStyle); + + + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, 0.5f); + layoutParams.setMargins(10, 3, 10, 3); + + btn.setLayoutParams(layoutParams); + btn.setOnClickListener(customActionsListener); + + + ll.addView(btn); + + this.currentCustomActions.put(customAction.getName(), customAction); + this.customButtons.add(btn); + + + // TODO add to map + + +// + + + + + + } + } + + activePumpName = newPump; + } + + private void removeCustomActions() { + + if (currentCustomActions.size()==0) + return; + + LinearLayout ll = (LinearLayout)actionsFragmentView.findViewById(R.id.action_buttons_layout); + + for (SingleClickButton customButton : customButtons) { + ll.removeView(customButton); + } + + customButtons.clear(); + currentCustomActions.clear(); + } + + @Override public void onClick(View view) { FragmentManager manager = getFragmentManager(); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/defs/CustomAction.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/defs/CustomAction.java new file mode 100644 index 0000000000..f32959cc33 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/defs/CustomAction.java @@ -0,0 +1,43 @@ +package info.nightscout.androidaps.plugins.Actions.defs; + +/** + * Created by andy on 9/20/18. + */ + +public class CustomAction { + + private String name; + private String iconName; + private CustomActionType customActionType; + + + public String getName() { + + return name; + } + + public void setName(String name) { + + this.name = name; + } + + public String getIconName() { + + return iconName; + } + + public void setIconName(String iconName) { + + this.iconName = iconName; + } + + public CustomActionType getCustomActionType() { + + return customActionType; + } + + public void setCustomActionType(CustomActionType customActionType) { + + this.customActionType = customActionType; + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/defs/CustomActionType.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/defs/CustomActionType.java new file mode 100644 index 0000000000..640371bf9c --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/defs/CustomActionType.java @@ -0,0 +1,11 @@ +package info.nightscout.androidaps.plugins.Actions.defs; + +/** + * Created by andy on 9/20/18. + */ + +public interface CustomActionType { + + String getKey(); + +} 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 f6f1de2ad0..54d6a6d621 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 @@ -39,6 +39,8 @@ import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.interfaces.PumpDescription; import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.logging.L; +import info.nightscout.androidaps.plugins.Actions.defs.CustomAction; +import info.nightscout.androidaps.plugins.Actions.defs.CustomActionType; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions; @@ -1374,4 +1376,15 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint maxIob.setIfSmaller(0d, String.format(MainApp.gs(R.string.limitingmaxiob), 0d, MainApp.gs(R.string.unsafeusage)), this); return maxIob; } + + @Override + public List getCustomActions() { + return null; + } + + @Override + public PumpEnactResult executeCustomAction(CustomActionType customActionType) { + return null; + } + } \ No newline at end of file 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 c50e635eb8..31cb635fec 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 @@ -8,6 +8,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Date; +import java.util.List; import info.nightscout.androidaps.BuildConfig; import info.nightscout.androidaps.MainApp; @@ -27,6 +28,8 @@ import info.nightscout.androidaps.interfaces.ProfileInterface; import info.nightscout.androidaps.interfaces.PumpDescription; import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.logging.L; +import info.nightscout.androidaps.plugins.Actions.defs.CustomAction; +import info.nightscout.androidaps.plugins.Actions.defs.CustomActionType; import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification; import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; import info.nightscout.androidaps.plugins.Overview.notifications.Notification; @@ -467,4 +470,15 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte } // TODO: daily total constraint + + @Override + public List getCustomActions() { + return null; + } + + @Override + public PumpEnactResult executeCustomAction(CustomActionType customActionType) { + return null; + } + } 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 e3c8f9de94..9610a07e75 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 @@ -16,6 +16,8 @@ import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.List; + import info.nightscout.androidaps.BuildConfig; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; @@ -36,6 +38,8 @@ import info.nightscout.androidaps.interfaces.ProfileInterface; import info.nightscout.androidaps.interfaces.PumpDescription; import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.logging.L; +import info.nightscout.androidaps.plugins.Actions.defs.CustomAction; +import info.nightscout.androidaps.plugins.Actions.defs.CustomActionType; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment; import info.nightscout.androidaps.plugins.ConfigBuilder.DetailedBolusInfoStorage; import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions; @@ -806,4 +810,14 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte return loadHistory(RecordTypes.RECORD_TYPE_DAILY); } + @Override + public List getCustomActions() { + return null; + } + + @Override + public PumpEnactResult executeCustomAction(CustomActionType customActionType) { + return null; + } + } 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 c72da31fdf..b1ac8a065b 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 @@ -32,6 +32,8 @@ import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.interfaces.PumpDescription; import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.logging.L; +import info.nightscout.androidaps.plugins.Actions.defs.CustomAction; +import info.nightscout.androidaps.plugins.Actions.defs.CustomActionType; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment; import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions; import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload; @@ -932,4 +934,14 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai return insulin; } + @Override + public List getCustomActions() { + return null; + } + + @Override + public PumpEnactResult executeCustomAction(CustomActionType customActionType) { + return null; + } + } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java index 27651a7cfb..b40c40acca 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java @@ -5,6 +5,8 @@ import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.List; + import info.nightscout.androidaps.BuildConfig; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; @@ -17,6 +19,8 @@ import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.interfaces.PumpDescription; import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.logging.L; +import info.nightscout.androidaps.plugins.Actions.defs.CustomAction; +import info.nightscout.androidaps.plugins.Actions.defs.CustomActionType; import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; import info.nightscout.utils.DateUtil; @@ -239,4 +243,14 @@ public class MDIPlugin extends PluginBase implements PumpInterface { return deviceID(); } + @Override + public List getCustomActions() { + return null; + } + + @Override + public PumpEnactResult executeCustomAction(CustomActionType customActionType) { + return null; + } + } 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 a21b1ca22b..670ee2397b 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 @@ -9,6 +9,8 @@ import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.List; + import info.nightscout.androidaps.BuildConfig; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.MainApp; @@ -26,6 +28,8 @@ import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.interfaces.PumpDescription; import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.logging.L; +import info.nightscout.androidaps.plugins.Actions.defs.CustomAction; +import info.nightscout.androidaps.plugins.Actions.defs.CustomActionType; import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions; import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload; import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; @@ -140,6 +144,16 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { return new PumpEnactResult(); } + @Override + public List getCustomActions() { + return null; + } + + @Override + public PumpEnactResult executeCustomAction(CustomActionType customActionType) { + return null; + } + @Override public boolean isInitialized() { return true; diff --git a/app/src/main/res/layout/actions_fragment.xml b/app/src/main/res/layout/actions_fragment.xml index 3b322b26dd..04f2a9e5d3 100644 --- a/app/src/main/res/layout/actions_fragment.xml +++ b/app/src/main/res/layout/actions_fragment.xml @@ -9,6 +9,7 @@ android:layout_height="wrap_content"> From e2ddb484983d44b1cf500e8ae258ee1ab14f3c2a Mon Sep 17 00:00:00 2001 From: Andy Rozman Date: Thu, 20 Sep 2018 18:04:06 +0100 Subject: [PATCH 024/379] Some extension on VirtualPump for testing. --- .../plugins/Actions/ActionsFragment.java | 9 +++--- .../plugins/Actions/defs/CustomAction.java | 16 ++++++---- .../PumpVirtual/VirtualPumpFragment.java | 30 +++++++++++++++++++ 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/ActionsFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/ActionsFragment.java index 6a8422b2dd..dd48054738 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/ActionsFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/ActionsFragment.java @@ -254,15 +254,15 @@ public class ActionsFragment extends SubscriberFragment implements View.OnClickL LinearLayout ll = (LinearLayout)actionsFragmentView.findViewById(R.id.action_buttons_layout); for (CustomAction customAction : customActions) { - // TODO - SingleClickButton btn = new SingleClickButton(MainApp.instance().getApplicationContext()); - btn.setText(customAction.getName()); + btn.setText(MainApp.gs(customAction.getName())); + // TODO style and drawableTop //btn.setTextAppearance(R.style.buttonStyle); + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, 0.5f); layoutParams.setMargins(10, 3, 10, 3); @@ -273,11 +273,10 @@ public class ActionsFragment extends SubscriberFragment implements View.OnClickL ll.addView(btn); - this.currentCustomActions.put(customAction.getName(), customAction); + this.currentCustomActions.put(MainApp.gs(customAction.getName()), customAction); this.customButtons.add(btn); - // TODO add to map // Date: Fri, 21 Sep 2018 11:09:41 +0200 Subject: [PATCH 025/379] Fix TBR maximum for Animas Vibe Animas actually supports 300% TBR, but uses a different way of displaying it: 0% is the same as 100% in AAPS. -100% (OFF) is 0% in AAPS 200% therefore is 300% in AAPS. Maybe there should be a better indicator for this in AAPS, but for now this fix gives better control of the TBR values, if using the open loop. --- .../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 1c064d0cf0..ab97f2cff2 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 @@ -56,7 +56,7 @@ public enum PumpType { AnimasVibe("Animas Vibe", 0.05d, null, // AnimasBolus? new DoseSettings(0.05d, 30, 12*60, 0.05d), // PumpTempBasalType.Percent, // - new DoseSettings(10, 30, 24*60, 0d, 200d), PumpCapability.BasalRate_Duration30minAllowed, // + new DoseSettings(10, 30, 24*60, 0d, 300d), PumpCapability.BasalRate_Duration30minAllowed, // 0.025d, 5d, 0d, null, PumpCapability.VirtualPumpCapabilities), // AnimasPing("Animas Ping", AnimasVibe), From eb1075dd048364868c706164b9c974f97ab270e5 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 21 Sep 2018 13:01:16 +0200 Subject: [PATCH 026/379] New Crowdin translations (#1457) --- app/src/main/res/values-af/insight_alerts.xml | 3 +++ app/src/main/res/values-af/strings.xml | 3 +++ app/src/main/res/values-es/strings.xml | 27 ++++--------------- app/src/main/res/values-fr/strings.xml | 10 +++---- app/src/main/res/values-it/strings.xml | 1 + app/src/main/res/values-ko/strings.xml | 1 + 6 files changed, 18 insertions(+), 27 deletions(-) create mode 100644 app/src/main/res/values-af/insight_alerts.xml create mode 100644 app/src/main/res/values-af/strings.xml diff --git a/app/src/main/res/values-af/insight_alerts.xml b/app/src/main/res/values-af/insight_alerts.xml new file mode 100644 index 0000000000..70489fbc5e --- /dev/null +++ b/app/src/main/res/values-af/insight_alerts.xml @@ -0,0 +1,3 @@ + + + diff --git a/app/src/main/res/values-af/strings.xml b/app/src/main/res/values-af/strings.xml new file mode 100644 index 0000000000..70489fbc5e --- /dev/null +++ b/app/src/main/res/values-af/strings.xml @@ -0,0 +1,3 @@ + + + diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index ab8cf0dfa2..26b9821c50 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1,31 +1,14 @@ - Seguridad de tratamientos Máximo Bolo permitido [U] - Máximos carbohidratos permitidos [g] + Carbohidratos máximo permitidos [g] Preferencias - Actualizar los tratamientos desde NS - Restablecer las bases de datos - ¿Realmente quiere restablecer las bases de datos? - Salir - Usar bolos extendidos para >200% - Dispositivo Bluetooth DanaR - Usar siempre valores basales absolutos - Por favor reinicia el teléfono o AndroidAPS desde ajustes de sistema, sino AndroidAPS no guardará registros (importante para trazar y verificar que el algoritmo funcione correctamente) - Botones para acceso rápido a funciones básicas - Insertar notas de registro avanzadas. + Algunos botones para acceder rápidamente a funciones comunes Utilizado para configurar complementos activos - Programa de aprendizaje - Muestra los ajustes preestablecidos de alimentos definidos en Nightscout - Ajustes de insulina preestablecidos para Humalog y NovoRapid /NovoLog - Ajuste preestablecido para insulina Fiasp - Permite definir el pico de la actividad de la insulina. Debe ser utilizado únicamente por usuarios avanzados - Permitir o denegar la activación del lazo. - Sincroniza tus datos con Nightscout - Condición del algoritmo en 2016 - Condición del algoritmo en 2017 - Algoritmo más reciente para usuarios avanzados + Activar o desactivar la posibilidad para activar el lazo. + Estado del algoritmo en 2016 + Estado del algoritmo en 2017 Muestra el estado actual de tu lazo y los botones para las acciones más usadas Muestra una notificación en curso con un breve resumen de lo que está haciendo tu lazo Define un perfil que estará disponible sin conexión. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 4b122a6fae..78d9e4f8f1 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -188,7 +188,7 @@ Insertion Capteur MCG Début Capteur MCG Changement du Réservoir - Changement de profil + Changement profil Bolus Goûter Bolus Repas Bolus de correction @@ -366,7 +366,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Amorcer/Remplir Veuillez à ce que la quantité corresponde aux caractéristiques de votre cathéter ! Autres - Remplir/Amorcer des quantités standard d’insuline + Valeurs prédéfinies pour remplir&amorcer Bouton 1 Bouton 2 Bouton 3 @@ -447,7 +447,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S WEAR SMS Raccourcir les titres des onglets - Utiliser un delta basé sur une moyenne plus courte + Utiliser delta basé sur moyenne courte Utiliser toujours un delta basé sur une moyenne courte au lieu d’une moyenne normale. Utile lorsque les données provenant de sources non filtrées comme xDrip devient incohérentes. Paramètres Avancés Modèle: %1$02X Protocole: %2$02X Code: %3$02X @@ -523,7 +523,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S La Boucle est suspendue Suspendu (%1$d m) Superbolus (%1$d m) - Suspendre Loop pour 1h + Suspendre la Boucle pour 1h Suspendre la Boucle pour 2h Suspendre la Boucle pour 3h Suspendre la Boucle pour 10h @@ -692,7 +692,7 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Pilote pompe corrigé Pompe hors de portée Valeurs de glycémie manquantes - Utiliser le système de notification pour les alertes et les notifications + Utiliser le système des notifications Alertes locales Alerte pas nouvelle donnée glycémique Alerte si la pompe est hors de portée diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index f21b0b832b..4c04d7223e 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -952,6 +952,7 @@ Micro virtuale Definizione del micro Bolo: Passo =%1$s\n bolo esteso: [step =%2$s, durata =%3$smin -%4$sh] \n Basale: Step =%5$s\nTBR: %6$s (di %7$s), durata =%8$smin -%9$sh\n%10$s + * Solo valori nell\'intervallo sono supportati come dato per basale / bolo nella pompa virtuale. Autobackfill BG Impostazioni della procedura guidata Calcoli inclusi nel risultato della procedura guidata: diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 72234be308..5904683a63 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -952,6 +952,7 @@ 가성펌프 종류 펌프 정의 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에 대해 범위로 지정이 될 수 없고, 이산값(discrete values)만 지원 됩니다. 혈당 자동채움 마법사 설정 마법사 결과에 사용 된 계산: From 6403c5d9976f73d4b88b9f3b982f65c080d1650e Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 21 Sep 2018 23:24:50 +0200 Subject: [PATCH 027/379] fix carb generator --- .../androidaps/plugins/Treatments/CarbsGenerator.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/CarbsGenerator.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/CarbsGenerator.java index 90436f5eb2..b98e225eb2 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/CarbsGenerator.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/CarbsGenerator.java @@ -11,6 +11,7 @@ import info.nightscout.androidaps.db.Source; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.Overview.Dialogs.ErrorHelperActivity; import info.nightscout.androidaps.queue.Callback; +import info.nightscout.utils.DateUtil; import static info.nightscout.utils.DateUtil.now; @@ -28,8 +29,11 @@ public class CarbsGenerator { } public static void createCarb(int carbs, long time, String eventType, @Nullable String notes) { + long now = DateUtil.now(); + int carbTime = (int) ((time - now) / 1000 / 60); DetailedBolusInfo carbInfo = new DetailedBolusInfo(); - carbInfo.date = time; + carbInfo.date = now; + carbInfo.carbTime = carbTime; carbInfo.eventType = eventType; carbInfo.carbs = carbs; carbInfo.context = MainApp.instance(); From 1c449814941296cd86b271a241f972d00c03d22b Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 22 Sep 2018 21:25:07 +0200 Subject: [PATCH 028/379] Fix wrong message during refill --- .../androidaps/plugins/Actions/dialogs/FillDialog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 880bee86a8..aed10c9e2f 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 @@ -185,7 +185,7 @@ public class FillDialog extends DialogFragment implements OnClickListener { confirmMessage.add(MainApp.gs(R.string.fillwarning)); confirmMessage.add(""); confirmMessage.add(MainApp.gs(R.string.bolus) + ": " + "" + DecimalFormatter.toPumpSupportedBolus(insulinAfterConstraints) + "U" + ""); - if (!insulinAfterConstraints.equals(insulin)) + if (Math.abs(insulinAfterConstraints - insulin) > 0.01d) confirmMessage.add("" + MainApp.gs(R.string.bolusconstraintapplied) + ""); } From b474e9146f1216b616f94aab24079a0d5b9a87ab Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sun, 23 Sep 2018 10:16:25 +0200 Subject: [PATCH 029/379] New Crowdin translations (#1463) * New translations strings.xml (Spanish) * New translations strings.xml (Chinese Simplified) --- app/src/main/res/values-es/strings.xml | 5 +---- app/src/main/res/values-zh/strings.xml | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 26b9821c50..954ba4a6cf 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -9,10 +9,7 @@ Activar o desactivar la posibilidad para activar el lazo. Estado del algoritmo en 2016 Estado del algoritmo en 2017 - Muestra el estado actual de tu lazo y los botones para las acciones más usadas - Muestra una notificación en curso con un breve resumen de lo que está haciendo tu lazo - Define un perfil que estará disponible sin conexión. - Usa el perfil introducido en Nightscout + Proporciona el perfil definidos en Nightscout Definir un perfil con un solo bloque de tiempo. Integración de bombas de insulina Accu-Check Combo, necesita tener ruffy instalado Integración de bombas de insulina de DANA Diabecare R diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index b4c2055644..9779435cd1 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -34,7 +34,7 @@ 与Accu-Check Combo 胰岛素泵集成,需要安装ruffy软件 与丹纳R泵集成 与韩版丹纳R泵集成 - 与升级固件后的丹纳R泵集成 + 与 DanaRv2 泵集成 与丹纳RS泵集成 与Accu-Check Insight 胰岛素泵集成,需要安装 SightRemote软件 与用于糖尿病治疗的多次每日注射的泵集成 From d707ea7fb0752a950dff8a9a293038ff374c4a7f Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sun, 23 Sep 2018 18:58:13 +0200 Subject: [PATCH 030/379] fix addToHistoryTreatment --- .../plugins/Treatments/TreatmentService.java | 18 ++++++-- .../plugins/Treatments/TreatmentsPlugin.java | 44 ++++++++++++------- 2 files changed, 44 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentService.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentService.java index 8c01db13fd..ed936f57c9 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentService.java @@ -506,14 +506,26 @@ public class TreatmentService extends OrmLiteBaseService { return null; } - public class UpdateReturn { + public static class UpdateReturn { + + boolean newRecord; + boolean success; + + public UpdateReturn() { + success = false; + newRecord = false; + } + + public UpdateReturn(boolean success, boolean newRecord) { this.success = success; this.newRecord = newRecord; } - boolean newRecord; - boolean success; + public void or(UpdateReturn ur) { + success = success || ur.success; + newRecord = newRecord || ur.newRecord; + } } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsPlugin.java index aeacddb89c..4f76d68836 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsPlugin.java @@ -43,6 +43,7 @@ import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions; import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData; import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; +import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload; import info.nightscout.androidaps.plugins.Overview.Dialogs.ErrorHelperActivity; import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification; import info.nightscout.androidaps.plugins.Overview.notifications.Notification; @@ -50,7 +51,6 @@ import info.nightscout.androidaps.plugins.Sensitivity.SensitivityAAPSPlugin; import info.nightscout.androidaps.plugins.Sensitivity.SensitivityWeightedAveragePlugin; import info.nightscout.utils.DateUtil; import info.nightscout.utils.FabricPrivacy; -import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload; import info.nightscout.utils.SP; import info.nightscout.utils.T; @@ -184,7 +184,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface InsulinInterface insulinInterface = ConfigBuilderPlugin.getPlugin().getActiveInsulin(); if (insulinInterface == null) - return total; + return total; double dia = profile.getDia(); @@ -259,7 +259,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface if (t > absorptionTime_ago && t <= now) { if (treatment.carbs >= 1) { result.carbs += treatment.carbs; - if(t > result.lastCarbTime) + if (t > result.lastCarbTime) result.lastCarbTime = t; } } @@ -312,7 +312,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface } } if (L.isEnabled(L.DATATREATMENTS)) - log.debug("Last bolus time: " + new Date(last).toLocaleString()); + log.debug("Last bolus time: " + new Date(last).toLocaleString()); return last; } @@ -341,7 +341,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface @Subscribe public void onStatusEvent(final EventReloadTreatmentData ev) { if (L.isEnabled(L.DATATREATMENTS)) - log.debug("EventReloadTreatmentData"); + log.debug("EventReloadTreatmentData"); initializeTreatmentData(); initializeExtendedBolusData(); updateTotalIOBTreatments(); @@ -352,7 +352,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface @SuppressWarnings("unused") public void onStatusEvent(final EventReloadTempBasalData ev) { if (L.isEnabled(L.DATATREATMENTS)) - log.debug("EventReloadTempBasalData"); + log.debug("EventReloadTempBasalData"); initializeTempBasalData(); updateTotalIOBTempBasals(); } @@ -372,14 +372,14 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface InsulinInterface insulinInterface = ConfigBuilderPlugin.getPlugin().getActiveInsulin(); if (insulinInterface == null) - return total; + return total; synchronized (tempBasals) { for (Integer pos = 0; pos < tempBasals.size(); pos++) { TemporaryBasal t = tempBasals.get(pos); if (t.date > time) continue; IobTotal calc; - if(truncate && t.end() > truncateTime){ + if (truncate && t.end() > truncateTime) { TemporaryBasal dummyTemp = new TemporaryBasal(); dummyTemp.copyFrom(t); dummyTemp.cutEndTo(truncateTime); @@ -398,7 +398,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface ExtendedBolus e = extendedBoluses.get(pos); if (e.date > time) continue; IobTotal calc; - if(truncate && e.end() > truncateTime){ + if (truncate && e.end() > truncateTime) { ExtendedBolus dummyExt = new ExtendedBolus(); dummyExt.copyFrom(e); dummyExt.cutEndTo(truncateTime); @@ -495,6 +495,12 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface // return true if new record is created @Override public boolean addToHistoryTreatment(DetailedBolusInfo detailedBolusInfo, boolean allowUpdate) { + + if (detailedBolusInfo.insulin == 0 && detailedBolusInfo.carbs == 0) { + log.error("Not valid record"); + return false; + } + Treatment treatment = new Treatment(); treatment.date = detailedBolusInfo.date; treatment.source = detailedBolusInfo.source; @@ -507,19 +513,27 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface treatment.source = detailedBolusInfo.source; treatment.mealBolus = treatment.carbs > 0; treatment.boluscalc = detailedBolusInfo.boluscalc != null ? detailedBolusInfo.boluscalc.toString() : null; - TreatmentService.UpdateReturn creatOrUpdateResult = getService().createOrUpdate(treatment); - boolean newRecordCreated = creatOrUpdateResult.newRecord; - //log.debug("Adding new Treatment record" + treatment.toString()); - if (detailedBolusInfo.carbTime != 0) { + TreatmentService.UpdateReturn creatOrUpdateResult = new TreatmentService.UpdateReturn(); + TreatmentService.UpdateReturn creatOrUpdateResultCarbs = new TreatmentService.UpdateReturn(); + if (treatment.insulin > 0) { + creatOrUpdateResult = getService().createOrUpdate(treatment); + //log.debug("Adding new Treatment record" + treatment.toString()); + } + + if (detailedBolusInfo.carbTime != 0 && detailedBolusInfo.carbs > 0) { Treatment carbsTreatment = new Treatment(); carbsTreatment.source = detailedBolusInfo.source; carbsTreatment.pumpId = detailedBolusInfo.pumpId; // but this should never happen - carbsTreatment.date = detailedBolusInfo.date + detailedBolusInfo.carbTime * 60 * 1000L + 1000L; // add 1 sec to make them different records + carbsTreatment.date = detailedBolusInfo.date + T.mins(detailedBolusInfo.carbTime).msecs() + T.secs(1).msecs(); // add 1 sec to make them different records carbsTreatment.carbs = detailedBolusInfo.carbs; carbsTreatment.source = detailedBolusInfo.source; - getService().createOrUpdate(carbsTreatment); + creatOrUpdateResultCarbs = getService().createOrUpdate(carbsTreatment); //log.debug("Adding new Treatment record" + carbsTreatment); } + + creatOrUpdateResult.or(creatOrUpdateResultCarbs); + boolean newRecordCreated = creatOrUpdateResult.newRecord; + if (newRecordCreated && detailedBolusInfo.isValid) NSUpload.uploadTreatmentRecord(detailedBolusInfo); From f128a332660073cb3611921f7ce67af1ccddcd44 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Mon, 24 Sep 2018 22:11:12 +0200 Subject: [PATCH 031/379] New Crowdin translations (#1466) --- app/src/main/res/values-es/strings.xml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 954ba4a6cf..bd31f67f2d 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1,14 +1,34 @@ + Seguridad de tratamientos Máximo Bolo permitido [U] Carbohidratos máximo permitidos [g] Preferencias + Actualizar los tratamientos desde NS + Restablecer las bases de datos + ¿Realmente quiere restablecer las bases de datos? + Salir + Usar bolos extendidos para >200% + Dispositivo Bluetooth DanaR + Usar siempre valores basales absolutos + Por favor reinicia el teléfono o AndroidAPS desde ajustes de sistema, sino AndroidAPS no guardará registros (importante para trazar y verificar que el algoritmo funcione correctamente) Algunos botones para acceder rápidamente a funciones comunes + Insertar notas de registro avanzadas. Utilizado para configurar complementos activos + Programa de aprendizaje + Muestra los ajustes preestablecidos de alimentos definidos en Nightscout + Ajustes de insulina preestablecidos para Humalog y NovoRapid /NovoLog + Ajuste preestablecido para insulina Fiasp + Permite definir el pico de la actividad de la insulina. Debe ser utilizado únicamente por usuarios avanzados Activar o desactivar la posibilidad para activar el lazo. + Sincroniza tus datos con Nightscout Estado del algoritmo en 2016 Estado del algoritmo en 2017 + Algoritmo más reciente para usuarios avanzados + Muestra el estado actual de tu lazo y los botones para las acciones más usadas + Muestra una notificación en curso con un breve resumen de lo que está haciendo tu lazo + Define un perfil que estará disponible sin conexión. Proporciona el perfil definidos en Nightscout Definir un perfil con un solo bloque de tiempo. Integración de bombas de insulina Accu-Check Combo, necesita tener ruffy instalado From 794c80f7e320cd3d0d7f9a19f6523f7cc4df1884 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Mon, 24 Sep 2018 22:43:23 +0200 Subject: [PATCH 032/379] Fix accesing wrong DanaRPump instance --- .../plugins/PumpDanaR/DanaRPump.java | 3 +- .../AbstractDanaRExecutionService.java | 1 - .../services/DanaRExecutionService.java | 36 ++++++++++-------- .../services/DanaRKoreanExecutionService.java | 27 +++++++------ .../services/DanaRv2ExecutionService.java | 38 +++++++++++-------- 5 files changed, 59 insertions(+), 46 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPump.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPump.java index 3a6b3b5786..df9b48f795 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPump.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPump.java @@ -20,7 +20,7 @@ import info.nightscout.utils.SP; * Created by mike on 04.07.2016. */ public class DanaRPump { - private Logger log = LoggerFactory.getLogger(L.PUMP); + private static Logger log = LoggerFactory.getLogger(L.PUMP); private static DanaRPump instance = null; @@ -30,6 +30,7 @@ public class DanaRPump { } public static void reset() { + log.debug("DanaRPump reset"); instance = null; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/AbstractDanaRExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/AbstractDanaRExecutionService.java index f45f222861..1848f29e3b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/AbstractDanaRExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/AbstractDanaRExecutionService.java @@ -55,7 +55,6 @@ public abstract class AbstractDanaRExecutionService extends Service { protected BluetoothSocket mRfcommSocket; protected BluetoothDevice mBTDevice; - protected DanaRPump mDanaRPump = DanaRPump.getInstance(); protected Treatment mBolusingTreatment = null; protected boolean mConnectionInProgress = false; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/DanaRExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/DanaRExecutionService.java index 425e72ea04..268d5378c1 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/DanaRExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/DanaRExecutionService.java @@ -133,6 +133,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService { } public void getPumpStatus() { + DanaRPump danaRPump = DanaRPump.getInstance(); try { MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpstatus))); MsgStatus statusMsg = new MsgStatus(); @@ -141,7 +142,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService { MsgStatusBolusExtended exStatusMsg = new MsgStatusBolusExtended(); MsgCheckValue checkValue = new MsgCheckValue(); - if (mDanaRPump.isNewPump) { + if (danaRPump.isNewPump) { mSerialIOThread.sendMessage(checkValue); if (!checkValue.received) { return; @@ -157,11 +158,11 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService { MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingbolusstatus))); long now = System.currentTimeMillis(); - mDanaRPump.lastConnection = now; + danaRPump.lastConnection = now; Profile profile = ProfileFunctions.getInstance().getProfile(); PumpInterface pump = ConfigBuilderPlugin.getPlugin().getActivePump(); - if (profile != null && Math.abs(mDanaRPump.currentBasal - profile.getBasal()) >= pump.getPumpDescription().basalStep) { + if (profile != null && Math.abs(danaRPump.currentBasal - profile.getBasal()) >= pump.getPumpDescription().basalStep) { MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpsettings))); mSerialIOThread.sendMessage(new MsgSettingBasal()); if (!pump.isThisProfileSet(profile) && !ConfigBuilderPlugin.getPlugin().getCommandQueue().isRunning(Command.CommandType.BASALPROFILE)) { @@ -169,7 +170,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService { } } - if (mDanaRPump.lastSettingsRead + 60 * 60 * 1000L < now || !pump.isInitialized()) { + if (danaRPump.lastSettingsRead + 60 * 60 * 1000L < now || !pump.isInitialized()) { MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpsettings))); mSerialIOThread.sendMessage(new MsgSettingShippingInfo()); mSerialIOThread.sendMessage(new MsgSettingActiveProfile()); @@ -184,29 +185,29 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService { mSerialIOThread.sendMessage(new MsgSettingUserOptions()); MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumptime))); mSerialIOThread.sendMessage(new MsgSettingPumpTime()); - long timeDiff = (mDanaRPump.pumpTime - System.currentTimeMillis()) / 1000L; + long timeDiff = (danaRPump.pumpTime - System.currentTimeMillis()) / 1000L; if (L.isEnabled(L.PUMP)) log.debug("Pump time difference: " + timeDiff + " seconds"); if (Math.abs(timeDiff) > 10) { mSerialIOThread.sendMessage(new MsgSetTime(new Date())); mSerialIOThread.sendMessage(new MsgSettingPumpTime()); - timeDiff = (mDanaRPump.pumpTime - System.currentTimeMillis()) / 1000L; + timeDiff = (danaRPump.pumpTime - System.currentTimeMillis()) / 1000L; if (L.isEnabled(L.PUMP)) log.debug("Pump time difference: " + timeDiff + " seconds"); } - mDanaRPump.lastSettingsRead = now; + danaRPump.lastSettingsRead = now; } MainApp.bus().post(new EventDanaRNewStatus()); MainApp.bus().post(new EventInitializationChanged()); NSUpload.uploadDeviceStatus(); - if (mDanaRPump.dailyTotalUnits > mDanaRPump.maxDailyTotalUnits * Constants.dailyLimitWarning) { + if (danaRPump.dailyTotalUnits > danaRPump.maxDailyTotalUnits * Constants.dailyLimitWarning) { if (L.isEnabled(L.PUMP)) - log.debug("Approaching daily limit: " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.maxDailyTotalUnits); + log.debug("Approaching daily limit: " + danaRPump.dailyTotalUnits + "/" + danaRPump.maxDailyTotalUnits); if (System.currentTimeMillis() > lastApproachingDailyLimit + 30 * 60 * 1000) { Notification reportFail = new Notification(Notification.APPROACHING_DAILY_LIMIT, MainApp.gs(R.string.approachingdailylimit), Notification.URGENT); MainApp.bus().post(new EventNewNotification(reportFail)); - NSUpload.uploadError(MainApp.gs(R.string.approachingdailylimit) + ": " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.maxDailyTotalUnits + "U"); + NSUpload.uploadError(MainApp.gs(R.string.approachingdailylimit) + ": " + danaRPump.dailyTotalUnits + "/" + danaRPump.maxDailyTotalUnits + "U"); lastApproachingDailyLimit = System.currentTimeMillis(); } } @@ -216,8 +217,9 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService { } public boolean tempBasal(int percent, int durationInHours) { + DanaRPump danaRPump = DanaRPump.getInstance(); if (!isConnected()) return false; - if (mDanaRPump.isTempBasalInProgress) { + if (danaRPump.isTempBasalInProgress) { MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStop()); SystemClock.sleep(500); @@ -262,6 +264,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService { } public boolean bolus(double amount, int carbs, long carbtime, final Treatment t) { + DanaRPump danaRPump = DanaRPump.getInstance(); if (!isConnected()) return false; if (BolusProgressDialog.stopPressed) return false; @@ -335,13 +338,13 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService { ConfigBuilderPlugin.getPlugin().getCommandQueue().independentConnect("bolusingInterrupted", new Callback() { @Override public void run() { - if (mDanaRPump.lastBolusTime > System.currentTimeMillis() - 60 * 1000L) { // last bolus max 1 min old - t.insulin = mDanaRPump.lastBolusAmount; + if (danaRPump.lastBolusTime > System.currentTimeMillis() - 60 * 1000L) { // last bolus max 1 min old + t.insulin = danaRPump.lastBolusAmount; if (L.isEnabled(L.PUMP)) - log.debug("Used bolus amount from history: " + mDanaRPump.lastBolusAmount); + log.debug("Used bolus amount from history: " + danaRPump.lastBolusAmount); } else { if (L.isEnabled(L.PUMP)) - log.debug("Bolus amount in history too old: " + DateUtil.dateAndTimeFullString(mDanaRPump.lastBolusTime)); + log.debug("Bolus amount in history too old: " + DateUtil.dateAndTimeFullString(danaRPump.lastBolusTime)); } synchronized (o) { o.notify(); @@ -379,6 +382,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService { } public boolean updateBasalsInPump(final Profile profile) { + DanaRPump danaRPump = DanaRPump.getInstance(); if (!isConnected()) return false; MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.updatingbasalrates))); double[] basal = DanaRPump.getInstance().buildDanaRProfileRecord(profile); @@ -386,7 +390,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService { mSerialIOThread.sendMessage(msgSet); MsgSetActivateBasalProfile msgActivate = new MsgSetActivateBasalProfile((byte) 0); mSerialIOThread.sendMessage(msgActivate); - mDanaRPump.lastSettingsRead = 0; // force read full settings + danaRPump.lastSettingsRead = 0; // force read full settings getPumpStatus(); MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTING)); return true; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/services/DanaRKoreanExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/services/DanaRKoreanExecutionService.java index d419d7c1f1..9014b490a2 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/services/DanaRKoreanExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/services/DanaRKoreanExecutionService.java @@ -137,6 +137,7 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { } public void getPumpStatus() { + DanaRPump danaRPump = DanaRPump.getInstance(); try { MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpstatus))); //MsgStatus_k statusMsg = new MsgStatus_k(); @@ -145,7 +146,7 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { MsgStatusBolusExtended exStatusMsg = new MsgStatusBolusExtended(); MsgCheckValue_k checkValue = new MsgCheckValue_k(); - if (mDanaRPump.isNewPump) { + if (danaRPump.isNewPump) { mSerialIOThread.sendMessage(checkValue); if (!checkValue.received) { return; @@ -161,11 +162,11 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingbolusstatus))); long now = System.currentTimeMillis(); - mDanaRPump.lastConnection = now; + danaRPump.lastConnection = now; Profile profile = ProfileFunctions.getInstance().getProfile(); PumpInterface pump = ConfigBuilderPlugin.getPlugin().getActivePump(); - if (profile != null && Math.abs(mDanaRPump.currentBasal - profile.getBasal()) >= pump.getPumpDescription().basalStep) { + if (profile != null && Math.abs(danaRPump.currentBasal - profile.getBasal()) >= pump.getPumpDescription().basalStep) { MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpsettings))); mSerialIOThread.sendMessage(new MsgSettingBasal()); if (!pump.isThisProfileSet(profile) && !ConfigBuilderPlugin.getPlugin().getCommandQueue().isRunning(Command.CommandType.BASALPROFILE)) { @@ -173,7 +174,7 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { } } - if (mDanaRPump.lastSettingsRead + 60 * 60 * 1000L < now || !pump.isInitialized()) { + if (danaRPump.lastSettingsRead + 60 * 60 * 1000L < now || !pump.isInitialized()) { MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpsettings))); mSerialIOThread.sendMessage(new MsgSettingShippingInfo()); mSerialIOThread.sendMessage(new MsgSettingMeal()); @@ -184,29 +185,29 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { mSerialIOThread.sendMessage(new MsgSettingProfileRatios()); MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumptime))); mSerialIOThread.sendMessage(new MsgSettingPumpTime()); - long timeDiff = (mDanaRPump.pumpTime - System.currentTimeMillis()) / 1000L; + long timeDiff = (danaRPump.pumpTime - System.currentTimeMillis()) / 1000L; if (L.isEnabled(L.PUMP)) log.debug("Pump time difference: " + timeDiff + " seconds"); if (Math.abs(timeDiff) > 10) { mSerialIOThread.sendMessage(new MsgSetTime(new Date())); mSerialIOThread.sendMessage(new MsgSettingPumpTime()); - timeDiff = (mDanaRPump.pumpTime - System.currentTimeMillis()) / 1000L; + timeDiff = (danaRPump.pumpTime - System.currentTimeMillis()) / 1000L; if (L.isEnabled(L.PUMP)) log.debug("Pump time difference: " + timeDiff + " seconds"); } - mDanaRPump.lastSettingsRead = now; + danaRPump.lastSettingsRead = now; } MainApp.bus().post(new EventDanaRNewStatus()); MainApp.bus().post(new EventInitializationChanged()); NSUpload.uploadDeviceStatus(); - if (mDanaRPump.dailyTotalUnits > mDanaRPump.maxDailyTotalUnits * Constants.dailyLimitWarning) { + if (danaRPump.dailyTotalUnits > danaRPump.maxDailyTotalUnits * Constants.dailyLimitWarning) { if (L.isEnabled(L.PUMP)) - log.debug("Approaching daily limit: " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.maxDailyTotalUnits); + log.debug("Approaching daily limit: " + danaRPump.dailyTotalUnits + "/" + danaRPump.maxDailyTotalUnits); if (System.currentTimeMillis() > lastApproachingDailyLimit + 30 * 60 * 1000) { Notification reportFail = new Notification(Notification.APPROACHING_DAILY_LIMIT, MainApp.gs(R.string.approachingdailylimit), Notification.URGENT); MainApp.bus().post(new EventNewNotification(reportFail)); - NSUpload.uploadError(MainApp.gs(R.string.approachingdailylimit) + ": " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.maxDailyTotalUnits + "U"); + NSUpload.uploadError(MainApp.gs(R.string.approachingdailylimit) + ": " + danaRPump.dailyTotalUnits + "/" + danaRPump.maxDailyTotalUnits + "U"); lastApproachingDailyLimit = System.currentTimeMillis(); } } @@ -216,8 +217,9 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { } public boolean tempBasal(int percent, int durationInHours) { + DanaRPump danaRPump = DanaRPump.getInstance(); if (!isConnected()) return false; - if (mDanaRPump.isTempBasalInProgress) { + if (danaRPump.isTempBasalInProgress) { MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStop()); SystemClock.sleep(500); @@ -318,12 +320,13 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { } public boolean updateBasalsInPump(final Profile profile) { + DanaRPump danaRPump = DanaRPump.getInstance(); if (!isConnected()) return false; MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.updatingbasalrates))); double[] basal = DanaRPump.getInstance().buildDanaRProfileRecord(profile); MsgSetSingleBasalProfile msgSet = new MsgSetSingleBasalProfile(basal); mSerialIOThread.sendMessage(msgSet); - mDanaRPump.lastSettingsRead = 0; // force read full settings + danaRPump.lastSettingsRead = 0; // force read full settings getPumpStatus(); MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTING)); return true; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java index 073cbbde1e..0095d41db3 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java @@ -156,6 +156,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { } public void getPumpStatus() { + DanaRPump danaRPump = DanaRPump.getInstance(); try { MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpstatus))); MsgStatus statusMsg = new MsgStatus(); @@ -164,7 +165,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { MsgStatusBolusExtended_v2 exStatusMsg = new MsgStatusBolusExtended_v2(); MsgCheckValue_v2 checkValue = new MsgCheckValue_v2(); - if (mDanaRPump.isNewPump) { + if (danaRPump.isNewPump) { mSerialIOThread.sendMessage(checkValue); if (!checkValue.received) { return; @@ -179,11 +180,11 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingextendedbolusstatus))); mSerialIOThread.sendMessage(exStatusMsg); - mDanaRPump.lastConnection = System.currentTimeMillis(); + danaRPump.lastConnection = System.currentTimeMillis(); Profile profile = ProfileFunctions.getInstance().getProfile(); PumpInterface pump = ConfigBuilderPlugin.getPlugin().getActivePump(); - if (profile != null && Math.abs(mDanaRPump.currentBasal - profile.getBasal()) >= pump.getPumpDescription().basalStep) { + if (profile != null && Math.abs(danaRPump.currentBasal - profile.getBasal()) >= pump.getPumpDescription().basalStep) { MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpsettings))); mSerialIOThread.sendMessage(new MsgSettingBasal()); if (!pump.isThisProfileSet(profile) && !ConfigBuilderPlugin.getPlugin().getCommandQueue().isRunning(Command.CommandType.BASALPROFILE)) { @@ -193,7 +194,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumptime))); mSerialIOThread.sendMessage(new MsgSettingPumpTime()); - long timeDiff = (mDanaRPump.pumpTime - System.currentTimeMillis()) / 1000L; + long timeDiff = (danaRPump.pumpTime - System.currentTimeMillis()) / 1000L; if (L.isEnabled(L.PUMP)) log.debug("Pump time difference: " + timeDiff + " seconds"); if (Math.abs(timeDiff) > 3) { @@ -209,7 +210,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { MainApp.instance().startActivity(i); //deinitialize pump - mDanaRPump.lastConnection = 0; + danaRPump.lastConnection = 0; MainApp.bus().post(new EventDanaRNewStatus()); MainApp.bus().post(new EventInitializationChanged()); return; @@ -218,14 +219,14 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { // add 10sec to be sure we are over minute (will be cutted off anyway) mSerialIOThread.sendMessage(new MsgSetTime(new Date(DateUtil.now() + T.secs(10).msecs()))); mSerialIOThread.sendMessage(new MsgSettingPumpTime()); - timeDiff = (mDanaRPump.pumpTime - System.currentTimeMillis()) / 1000L; + timeDiff = (danaRPump.pumpTime - System.currentTimeMillis()) / 1000L; if (L.isEnabled(L.PUMP)) log.debug("Pump time difference: " + timeDiff + " seconds"); } } long now = System.currentTimeMillis(); - if (mDanaRPump.lastSettingsRead + 60 * 60 * 1000L < now || !pump.isInitialized()) { + if (danaRPump.lastSettingsRead + 60 * 60 * 1000L < now || !pump.isInitialized()) { MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpsettings))); mSerialIOThread.sendMessage(new MsgSettingShippingInfo()); mSerialIOThread.sendMessage(new MsgSettingActiveProfile()); @@ -238,7 +239,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { mSerialIOThread.sendMessage(new MsgSettingProfileRatios()); mSerialIOThread.sendMessage(new MsgSettingUserOptions()); mSerialIOThread.sendMessage(new MsgSettingProfileRatiosAll()); - mDanaRPump.lastSettingsRead = now; + danaRPump.lastSettingsRead = now; } loadEvents(); @@ -246,13 +247,13 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { MainApp.bus().post(new EventDanaRNewStatus()); MainApp.bus().post(new EventInitializationChanged()); NSUpload.uploadDeviceStatus(); - if (mDanaRPump.dailyTotalUnits > mDanaRPump.maxDailyTotalUnits * Constants.dailyLimitWarning) { + if (danaRPump.dailyTotalUnits > danaRPump.maxDailyTotalUnits * Constants.dailyLimitWarning) { if (L.isEnabled(L.PUMP)) - log.debug("Approaching daily limit: " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.maxDailyTotalUnits); + log.debug("Approaching daily limit: " + danaRPump.dailyTotalUnits + "/" + danaRPump.maxDailyTotalUnits); if (System.currentTimeMillis() > lastApproachingDailyLimit + 30 * 60 * 1000) { Notification reportFail = new Notification(Notification.APPROACHING_DAILY_LIMIT, MainApp.gs(R.string.approachingdailylimit), Notification.URGENT); MainApp.bus().post(new EventNewNotification(reportFail)); - NSUpload.uploadError(MainApp.gs(R.string.approachingdailylimit) + ": " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.maxDailyTotalUnits + "U"); + NSUpload.uploadError(MainApp.gs(R.string.approachingdailylimit) + ": " + danaRPump.dailyTotalUnits + "/" + danaRPump.maxDailyTotalUnits + "U"); lastApproachingDailyLimit = System.currentTimeMillis(); } } @@ -262,8 +263,9 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { } public boolean tempBasal(int percent, int durationInHours) { + DanaRPump danaRPump = DanaRPump.getInstance(); if (!isConnected()) return false; - if (mDanaRPump.isTempBasalInProgress) { + if (danaRPump.isTempBasalInProgress) { MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStop()); SystemClock.sleep(500); @@ -277,8 +279,9 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { } public boolean highTempBasal(int percent) { + DanaRPump danaRPump = DanaRPump.getInstance(); if (!isConnected()) return false; - if (mDanaRPump.isTempBasalInProgress) { + if (danaRPump.isTempBasalInProgress) { MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStop()); SystemClock.sleep(500); @@ -292,13 +295,14 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { } public boolean tempBasalShortDuration(int percent, int durationInMinutes) { + DanaRPump danaRPump = DanaRPump.getInstance(); if (durationInMinutes != 15 && durationInMinutes != 30) { log.error("Wrong duration param"); return false; } if (!isConnected()) return false; - if (mDanaRPump.isTempBasalInProgress) { + if (danaRPump.isTempBasalInProgress) { MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStop()); SystemClock.sleep(500); @@ -449,6 +453,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { } public PumpEnactResult loadEvents() { + DanaRPump danaRPump = DanaRPump.getInstance(); if (!MainApp.getSpecificPlugin(DanaRv2Plugin.class).isInitialized()) { PumpEnactResult result = new PumpEnactResult().success(false); @@ -479,11 +484,12 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { lastHistoryFetched = MsgHistoryEvents_v2.lastEventTimeLoaded - T.mins(1).msecs(); else lastHistoryFetched = 0; - mDanaRPump.lastConnection = System.currentTimeMillis(); + danaRPump.lastConnection = System.currentTimeMillis(); return new PumpEnactResult().success(true); } public boolean updateBasalsInPump(final Profile profile) { + DanaRPump danaRPump = DanaRPump.getInstance(); if (!isConnected()) return false; MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.updatingbasalrates))); double[] basal = DanaRPump.getInstance().buildDanaRProfileRecord(profile); @@ -491,7 +497,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { mSerialIOThread.sendMessage(msgSet); MsgSetActivateBasalProfile msgActivate = new MsgSetActivateBasalProfile((byte) 0); mSerialIOThread.sendMessage(msgActivate); - mDanaRPump.lastSettingsRead = 0; // force read full settings + danaRPump.lastSettingsRead = 0; // force read full settings getPumpStatus(); MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTING)); return true; From c60aae863019a23283fe62ca64d798fa44c45628 Mon Sep 17 00:00:00 2001 From: Nico Schmitz Date: Tue, 25 Sep 2018 00:00:09 +0200 Subject: [PATCH 033/379] Work on implementation for automation plugin. - Use butterknife - Import weekdays selector - Implement layout for trigger connection and trigger time - Implement view holders - Implement adapters - Implement dummy code for quick testings - Refactor code --- app/build.gradle | 3 + .../general/automation/AutomationEvent.java | 6 +- .../automation/AutomationFragment.java | 97 +++++++-- .../automation/dialogs/EditEventDialog.java | 80 ++++++- .../general/automation/triggers/Trigger.java | 50 ++++- .../automation/triggers/TriggerAnd.java | 87 -------- .../automation/triggers/TriggerBg.java | 13 +- .../automation/triggers/TriggerConnector.java | 205 ++++++++++++++++++ .../automation/triggers/TriggerOr.java | 87 -------- .../automation/triggers/TriggerTime.java | 191 ++++++++++------ .../res/drawable/border_automation_unit.xml | 7 + .../res/layout/automation_dialog_event.xml | 31 +++ .../main/res/layout/automation_event_item.xml | 20 +- .../main/res/layout/automation_fragment.xml | 1 + .../layout/automation_trigger_connector.xml | 46 ++++ .../res/layout/automation_trigger_time.xml | 14 ++ app/src/main/res/values/strings.xml | 14 ++ .../automation/triggers/TriggerAndTest.java | 3 - .../automation/triggers/TriggerOrTest.java | 3 - 19 files changed, 670 insertions(+), 288 deletions(-) delete mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerAnd.java create mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerConnector.java delete mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerOr.java create mode 100644 app/src/main/res/drawable/border_automation_unit.xml create mode 100644 app/src/main/res/layout/automation_dialog_event.xml create mode 100644 app/src/main/res/layout/automation_trigger_connector.xml create mode 100644 app/src/main/res/layout/automation_trigger_time.xml diff --git a/app/build.gradle b/app/build.gradle index 1f86c015dd..f56f727cd4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -155,6 +155,7 @@ allprojects { flatDir { dirs 'libs' } + maven { url 'https://jitpack.io' } } } @@ -216,6 +217,8 @@ dependencies { implementation "com.jakewharton:butterknife:${butterknifeVersion}" annotationProcessor "com.jakewharton:butterknife-compiler:${butterknifeVersion}" + implementation 'com.github.DavidProdinger:weekdays-selector:1.0.4' + testImplementation "junit:junit:4.12" testImplementation "org.json:json:20140107" testImplementation "org.mockito:mockito-core:2.7.22" diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationEvent.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationEvent.java index 8e71c19d6e..f7cd5c6510 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationEvent.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationEvent.java @@ -12,9 +12,9 @@ public class AutomationEvent { private List actions = new ArrayList<>(); private String title; - AutomationEvent(String title) { - this.title = title; - } + public void setTitle(String title) { this.title = title; } + + public void setTrigger(Trigger trigger) { this.trigger = trigger; } public Trigger getTrigger() { return trigger; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationFragment.java index 7dce538747..8efc953bc7 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationFragment.java @@ -3,35 +3,38 @@ package info.nightscout.androidaps.plugins.general.automation; import android.app.Activity; import android.os.Bundle; import android.support.annotation.NonNull; -import android.support.design.widget.FloatingActionButton; +import android.support.v4.app.FragmentManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.LinearLayout; import android.widget.TextView; +import java.util.ArrayList; import java.util.List; +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; import info.nightscout.androidaps.R; import info.nightscout.androidaps.plugins.Common.SubscriberFragment; import info.nightscout.androidaps.plugins.general.automation.dialogs.EditEventDialog; +import info.nightscout.androidaps.plugins.general.automation.triggers.Trigger; public class AutomationFragment extends SubscriberFragment { - private RecyclerView mEventListView; - private FloatingActionButton mFabAddEvent; + @BindView(R.id.eventListView) + RecyclerView mEventListView; + private EventListAdapter mEventListAdapter; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.automation_fragment, container, false); - - mEventListView = view.findViewById(R.id.eventListView); - mFabAddEvent = view.findViewById(R.id.fabAddEvent); - - mFabAddEvent.setOnClickListener(this::onClickAddEvent); + unbinder = ButterKnife.bind(this, view); final AutomationPlugin plugin = AutomationPlugin.getPlugin(); mEventListAdapter = new EventListAdapter(plugin.getAutomationEvents()); @@ -44,7 +47,7 @@ public class AutomationFragment extends SubscriberFragment { } @Override - protected void updateGUI() { + public void updateGUI() { Activity activity = getActivity(); if (activity != null) activity.runOnUiThread(() -> { @@ -52,21 +55,21 @@ public class AutomationFragment extends SubscriberFragment { }); } - private void onClickAddEvent(View v) { - /*EditEventDialog dialog = EditEventDialog.newInstance(); + @OnClick(R.id.fabAddEvent) + void onClickAddEvent(View v) { + EditEventDialog dialog = EditEventDialog.newInstance(new AutomationEvent()); FragmentManager manager = getFragmentManager(); - dialog.show(manager, "EditEventDialog");*/ - - final AutomationPlugin plugin = AutomationPlugin.getPlugin(); - plugin.getAutomationEvents().add(new AutomationEvent("Test")); - updateGUI(); + dialog.show(manager, "EditEventDialog"); } + /** + * RecyclerViewAdapter to display event lists. + */ public static class EventListAdapter extends RecyclerView.Adapter { - private final List mEvents; + private final List mEventList; EventListAdapter(List events) { - this.mEvents = events; + this.mEventList = events; } @NonNull @@ -78,23 +81,71 @@ public class AutomationFragment extends SubscriberFragment { @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { - final AutomationEvent event = mEvents.get(position); + final AutomationEvent event = mEventList.get(position); holder.eventTitle.setText(event.getTitle()); + + // TODO: check null + holder.eventDescription.setText(event.getTrigger().friendlyDescription()); } @Override public int getItemCount() { - return mEvents.size(); + return mEventList.size(); } static class ViewHolder extends RecyclerView.ViewHolder { TextView eventTitle; + TextView eventDescription; - public ViewHolder(View itemView) { - super(itemView); - eventTitle = itemView.findViewById(R.id.viewEventTitle); + public ViewHolder(View view) { + super(view); + eventTitle = view.findViewById(R.id.viewEventTitle); + eventDescription = view.findViewById(R.id.viewEventDescription); } } } + /** + * Custom Adapter to display triggers dynamically with nested linear layouts. + */ + public static class TriggerListAdapter { + private final LinearLayout mRootLayout; + private final LayoutInflater mInflater; + private final List mTriggerList; + + public TriggerListAdapter(LayoutInflater inflater, LinearLayout rootLayout, List triggers) { + mRootLayout = rootLayout; + mInflater = inflater; + mTriggerList = triggers; + build(); + } + + public TriggerListAdapter(LayoutInflater inflater, LinearLayout rootLayout, Trigger trigger) { + mRootLayout = rootLayout; + mInflater = inflater; + mTriggerList = new ArrayList<>(); + mTriggerList.add(trigger); + build(); + } + + public void destroy() { + mRootLayout.removeAllViews(); + for(Trigger trigger : mTriggerList) { + trigger.destroyViewHolder(); + } + } + + private void build() { + for(Trigger trigger : mTriggerList) { + Trigger.ViewHolder viewHolder = trigger.createViewHolder(mInflater); + mRootLayout.addView(viewHolder.getView()); + } + } + + public void rebuild() { + destroy(); + build(); + } + } + } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/dialogs/EditEventDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/dialogs/EditEventDialog.java index c7ab2dbf7b..fa9150033a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/dialogs/EditEventDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/dialogs/EditEventDialog.java @@ -1,16 +1,92 @@ package info.nightscout.androidaps.plugins.general.automation.dialogs; import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.design.widget.TextInputEditText; import android.support.v4.app.DialogFragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; +import butterknife.Unbinder; +import info.nightscout.androidaps.R; +import info.nightscout.androidaps.plugins.general.automation.AutomationEvent; +import info.nightscout.androidaps.plugins.general.automation.AutomationFragment; +import info.nightscout.androidaps.plugins.general.automation.AutomationPlugin; +import info.nightscout.androidaps.plugins.general.automation.triggers.TriggerConnector; +import info.nightscout.androidaps.plugins.general.automation.triggers.TriggerTime; public class EditEventDialog extends DialogFragment { - public static EditEventDialog newInstance() { + + private static AutomationEvent mEvent; + + @BindView(R.id.inputEventTitle) + TextInputEditText mEditEventTitle; + + @BindView(R.id.layoutTrigger) + LinearLayout mLayoutTrigger; + + private Unbinder mUnbinder; + private AutomationFragment.TriggerListAdapter mTriggerListAdapter; + + public static EditEventDialog newInstance(AutomationEvent event) { + mEvent = event; Bundle args = new Bundle(); - EditEventDialog fragment = new EditEventDialog(); fragment.setArguments(args); return fragment; } + + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.automation_dialog_event, container, false); + mUnbinder = ButterKnife.bind(this, view); + + // dummy initialization + TriggerConnector to = new TriggerConnector(TriggerConnector.Type.OR); + to.add(new TriggerTime()); + to.add(new TriggerTime()); + TriggerConnector ta = new TriggerConnector(); + ta.add(to); + mEvent.setTrigger(ta); + + // display triggers + mTriggerListAdapter = new AutomationFragment.TriggerListAdapter(getLayoutInflater(), mLayoutTrigger, mEvent.getTrigger()); + + return view; + } + + @Override + public void onDestroyView() { + mTriggerListAdapter.destroy(); + mUnbinder.unbind(); + super.onDestroyView(); + } + + @OnClick(R.id.ok) + public void onButtonOk(View view) { + String title = mEditEventTitle.getText().toString(); + if (title.isEmpty()) return; + + mEvent.setTitle(title); + + + final AutomationPlugin plugin = AutomationPlugin.getPlugin(); + plugin.getAutomationEvents().add(mEvent); + + dismiss(); + } + + @OnClick(R.id.cancel) + public void onButtonCancel(View view) { + dismiss(); + } + + } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/Trigger.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/Trigger.java index 20bf93de9c..582080ee58 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/Trigger.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/Trigger.java @@ -1,8 +1,15 @@ package info.nightscout.androidaps.plugins.general.automation.triggers; +import android.support.annotation.LayoutRes; +import android.support.annotation.StringRes; +import android.view.LayoutInflater; +import android.view.View; + import org.json.JSONException; import org.json.JSONObject; +import butterknife.ButterKnife; +import butterknife.Unbinder; import info.nightscout.androidaps.R; public abstract class Trigger { @@ -15,7 +22,7 @@ public abstract class Trigger { IS_GREATER, IS_NOT_AVAILABLE; - public int getStringRes() { + public @StringRes int getStringRes() { switch (this) { case IS_LOWER: return R.string.islower; @@ -56,18 +63,26 @@ public abstract class Trigger { } } + protected ViewHolder viewHolder = null; + + protected TriggerConnector connector = null; + Trigger() { } - abstract boolean shouldRun(); + public Trigger getConnector() { + return connector; + } + + public abstract boolean shouldRun(); abstract String toJSON(); abstract Trigger fromJSON(String data); - abstract int friendlyName(); + public abstract int friendlyName(); - abstract String friendlyDescription(); + public abstract String friendlyDescription(); void notifyAboutRun(long time) { } @@ -82,6 +97,33 @@ public abstract class Trigger { e.printStackTrace(); } return null; + } + public abstract ViewHolder createViewHolder(LayoutInflater inflater); + + public ViewHolder getViewHolder() { + return viewHolder; + } + + public void destroyViewHolder() { + if (viewHolder != null) { + viewHolder.destroy(); + } + } + + public static abstract class ViewHolder { + final View view; + final Unbinder unbinder; + + public ViewHolder(LayoutInflater inflater, @LayoutRes int layout) { + view = inflater.inflate(layout, null); + unbinder = ButterKnife.bind(this, view); + } + + public void destroy() { + unbinder.unbind(); + } + + public View getView() { return view; } } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerAnd.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerAnd.java deleted file mode 100644 index 3e791afcc7..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerAnd.java +++ /dev/null @@ -1,87 +0,0 @@ -package info.nightscout.androidaps.plugins.general.automation.triggers; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.List; - -import info.nightscout.androidaps.R; - -public class TriggerAnd extends Trigger { - - private List list = new ArrayList<>(); - - @Override - synchronized boolean shouldRun() { - boolean result = true; - - for (Trigger t : list) { - result = result && t.shouldRun(); - } - return result; - } - - @Override - synchronized String toJSON() { - JSONObject o = new JSONObject(); - try { - o.put("type", TriggerAnd.class.getName()); - JSONArray array = new JSONArray(); - for (Trigger t : list) { - array.put(t.toJSON()); - } - o.put("data", array.toString()); - } catch (JSONException e) { - e.printStackTrace(); - } - return o.toString(); - } - - @Override - Trigger fromJSON(String data) { - try { - JSONArray array = new JSONArray(data); - for (int i = 0; i < array.length(); i++) { - Trigger newItem = instantiate(new JSONObject(array.getString(i))); - list.add(newItem); - } - } catch (JSONException e) { - e.printStackTrace(); - } - return this; - } - - @Override - int friendlyName() { - return R.string.and; - } - - @Override - String friendlyDescription() { - int counter = 0; - StringBuilder result = new StringBuilder(); - for (Trigger t : list) { - if (counter++ > 0) result.append(R.string.and); - result.append(t.friendlyDescription()); - } - return result.toString(); - } - - synchronized void add(Trigger t) { - list.add(t); - } - - synchronized boolean remove(Trigger t) { - return list.remove(t); - } - - int size() { - return list.size(); - } - - Trigger get(int i) { - return list.get(i); - } -} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerBg.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerBg.java index 7024eecd3f..2a91f2ddd6 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerBg.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerBg.java @@ -1,5 +1,7 @@ package info.nightscout.androidaps.plugins.general.automation.triggers; +import android.view.LayoutInflater; + import org.json.JSONException; import org.json.JSONObject; @@ -17,7 +19,7 @@ public class TriggerBg extends Trigger { protected String units = ProfileFunctions.getInstance().getProfileUnits(); @Override - synchronized boolean shouldRun() { + public synchronized boolean shouldRun() { GlucoseStatus glucoseStatus = GlucoseStatus.getGlucoseStatusData(); if (glucoseStatus == null && comparator.equals(Comparator.IS_NOT_AVAILABLE)) @@ -58,18 +60,23 @@ public class TriggerBg extends Trigger { } @Override - int friendlyName() { + public int friendlyName() { return R.string.glucose; } @Override - String friendlyDescription() { + public String friendlyDescription() { if (comparator.equals(Comparator.IS_NOT_AVAILABLE)) return MainApp.gs(R.string.glucoseisnotavailable); else return MainApp.gs(R.string.glucosecompared, comparator.getStringRes(), threshold, units); } + @Override + public ViewHolder createViewHolder(LayoutInflater inflater) { + return null; + } + TriggerBg threshold(double threshold) { this.threshold = threshold; return this; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerConnector.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerConnector.java new file mode 100644 index 0000000000..0e3528dc02 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerConnector.java @@ -0,0 +1,205 @@ +package info.nightscout.androidaps.plugins.general.automation.triggers; + +import android.support.annotation.StringRes; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.TextView; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +import butterknife.BindView; +import butterknife.OnClick; +import info.nightscout.androidaps.R; +import info.nightscout.androidaps.plugins.general.automation.AutomationFragment; +import info.nightscout.utils.JsonHelper; + +public class TriggerConnector extends Trigger { + public enum Type { + AND, + OR; + + public boolean apply(boolean a, boolean b) { + switch (this) { + case AND: + return a && b; + case OR: + return a || b; + } + return false; + } + + public @StringRes int getStringRes() { + switch (this) { + case OR: + return R.string.or; + + default: + case AND: + return R.string.and; + } + } + } + + protected List list = new ArrayList<>(); + private Type connectorType; + + public TriggerConnector() { + connectorType = Type.AND; + } + + public TriggerConnector(Type connectorType) { + this.connectorType = connectorType; + } + + public void changeConnectorType(Type type) { this.connectorType = type; } + + public Type getConnectorType() { return connectorType; } + + public synchronized void add(Trigger t) { + list.add(t); + t.connector = this; + } + + public synchronized boolean remove(Trigger t) { + return list.remove(t); + } + + public int size() { + return list.size(); + } + + public Trigger get(int i) { + return list.get(i); + } + + @Override + public synchronized boolean shouldRun() { + boolean result = false; + + for (Trigger t : list) { + result = connectorType.apply(result, t.shouldRun()); + } + return result; + } + + @Override + synchronized String toJSON() { + JSONObject o = new JSONObject(); + try { + o.put("type", TriggerConnector.class.getName()); + JSONObject data = new JSONObject(); + data.put("connectorType", connectorType.toString()); + JSONArray array = new JSONArray(); + for (Trigger t : list) { + array.put(t.toJSON()); + } + data.put("triggerList", array); + o.put("data", data); + } catch (JSONException e) { + e.printStackTrace(); + } + return o.toString(); + } + + @Override + Trigger fromJSON(String data) { + try { + JSONObject d = new JSONObject(data); + connectorType = Type.valueOf(JsonHelper.safeGetString(d, "connectorType")); + JSONArray array = d.getJSONArray("triggerList"); + for (int i = 0; i < array.length(); i++) { + Trigger newItem = instantiate(new JSONObject(array.getString(i))); + add(newItem); + } + } catch (JSONException e) { + e.printStackTrace(); + } + return this; + } + + @Override + public int friendlyName() { + return connectorType.getStringRes(); + } + + @Override + public String friendlyDescription() { + int counter = 0; + StringBuilder result = new StringBuilder(); + for (Trigger t : list) { + if (counter++ > 0) result.append(friendlyName()); + result.append(t.friendlyDescription()); + } + return result.toString(); + } + + @Override + public ViewHolder createViewHolder(LayoutInflater inflater) { + ViewHolder v = new ViewHolder(inflater); + viewHolder = v; + return v; + } + + + class ViewHolder extends Trigger.ViewHolder { + + @BindView(R.id.triggerListLayout) + LinearLayout triggerListLayout; + + @BindView(R.id.title) + TextView titleView; + + AutomationFragment.TriggerListAdapter adapter; + + public ViewHolder(LayoutInflater inflater) { + super(inflater, R.layout.automation_trigger_connector); + titleView.setText(friendlyName()); + adapter = new AutomationFragment.TriggerListAdapter(inflater, triggerListLayout, list); + } + + @OnClick(R.id.buttonRemove) + public void onButtonClickRemove(View view) { + if (connector != null) { + connector.remove(TriggerConnector.this); + ((TriggerConnector.ViewHolder)connector.getViewHolder()).adapter.rebuild(); + } else { + // no parent + list.clear(); + adapter.rebuild(); + } + } + + @OnClick(R.id.buttonAddAnd) + public void onButtonClickAnd(View view) { + addTrigger(new TriggerTime(), Type.AND); + } + + @OnClick(R.id.buttonAddOr) + public void onButtonClickOr(View view) { + addTrigger(new TriggerTime(), Type.OR); + } + + private void addTrigger(Trigger trigger, Type connection) { + if (getConnectorType().equals(connection)) { + add(trigger); + } else { + TriggerConnector t = new TriggerConnector(connection); + t.add(trigger); + add(t); + } + adapter.rebuild(); + } + + @Override + public void destroy() { + adapter.destroy(); + super.destroy(); + } + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerOr.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerOr.java deleted file mode 100644 index 309838b25f..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerOr.java +++ /dev/null @@ -1,87 +0,0 @@ -package info.nightscout.androidaps.plugins.general.automation.triggers; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; -import java.util.List; - -import info.nightscout.androidaps.R; - -public class TriggerOr extends Trigger { - - private List list = new ArrayList<>(); - - @Override - synchronized boolean shouldRun() { - boolean result = false; - - for (Trigger t : list) { - result = result || t.shouldRun(); - } - return result; - } - - @Override - synchronized String toJSON() { - JSONObject o = new JSONObject(); - try { - o.put("type", TriggerOr.class.getName()); - JSONArray array = new JSONArray(); - for (Trigger t : list) { - array.put(t.toJSON()); - } - o.put("data", array.toString()); - } catch (JSONException e) { - e.printStackTrace(); - } - return o.toString(); - } - - @Override - Trigger fromJSON(String data) { - try { - JSONArray array = new JSONArray(data); - for (int i = 0; i < array.length(); i++) { - Trigger newItem = instantiate(new JSONObject(array.getString(i))); - list.add(newItem); - } - } catch (JSONException e) { - e.printStackTrace(); - } - return this; - } - - @Override - int friendlyName() { - return R.string.or; - } - - @Override - String friendlyDescription() { - int counter = 0; - StringBuilder result = new StringBuilder(); - for (Trigger t : list) { - if (counter++ > 0) result.append(R.string.or); - result.append(t.friendlyDescription()); - } - return result.toString(); - } - - synchronized void add(Trigger t) { - list.add(t); - } - - synchronized boolean remove(Trigger t) { - return list.remove(t); - } - - int size() { - return list.size(); - } - - Trigger get(int i) { - return list.get(i); - } -} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerTime.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerTime.java index b5f0e6e072..b18236569b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerTime.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerTime.java @@ -1,10 +1,18 @@ package info.nightscout.androidaps.plugins.general.automation.triggers; +import android.support.annotation.StringRes; +import android.view.LayoutInflater; + +import com.dpro.widgets.WeekdaysPicker; + import org.json.JSONException; import org.json.JSONObject; +import java.util.ArrayList; import java.util.Calendar; +import java.util.List; +import butterknife.BindView; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.utils.DateUtil; @@ -13,6 +21,68 @@ import info.nightscout.utils.T; public class TriggerTime extends Trigger { + public enum DayOfWeek { + MONDAY, + TUESDAY, + WEDNESDAY, + THURSDAY, + FRIDAY, + SATURDAY, + SUNDAY; + + private static final int[] calendarInts = new int[] { + Calendar.MONDAY, + Calendar.TUESDAY, + Calendar.WEDNESDAY, + Calendar.THURSDAY, + Calendar.FRIDAY, + Calendar.SATURDAY, + Calendar.SUNDAY + }; + + private static final int[] fullNames = new int[] { + R.string.weekday_monday, + R.string.weekday_tuesday, + R.string.weekday_wednesday, + R.string.weekday_thursday, + R.string.weekday_friday, + R.string.weekday_saturday, + R.string.weekday_sunday + }; + + private static final int[] shortNames = new int[] { + R.string.weekday_monday_short, + R.string.weekday_tuesday_short, + R.string.weekday_wednesday_short, + R.string.weekday_thursday_short, + R.string.weekday_friday_short, + R.string.weekday_saturday_short, + R.string.weekday_sunday_short + }; + + public int toCalendarInt() { + return calendarInts[ordinal()]; + } + + public static DayOfWeek fromCalendarInt(int day) { + for(int i = 0; i < calendarInts.length; ++i) { + if (calendarInts[i] == day) + return values()[i]; + } + return null; + } + + public @StringRes int getFullName() { + return fullNames[ordinal()]; + } + + public @StringRes int getShortName() { + return shortNames[ordinal()]; + } + } + + private final boolean[] weekdays = new boolean[DayOfWeek.values().length]; + long lastRun; // Single execution @@ -20,20 +90,28 @@ public class TriggerTime extends Trigger { // Recurring boolean recurring; - boolean monday = true; - boolean tuesday = true; - boolean wednesday = true; - boolean thursday = true; - boolean friday = true; - boolean saturday = true; - boolean sunday = true; int hour; int minute; long validTo; + public TriggerTime() { + for(DayOfWeek day : DayOfWeek.values()) { + set(day, true); + } + } + + public TriggerTime set(DayOfWeek day, boolean value) { + weekdays[day.ordinal()] = value; + return this; + } + + public boolean isSet(DayOfWeek day) { + return weekdays[day.ordinal()]; + } + @Override - boolean shouldRun() { + public boolean shouldRun() { if (recurring) { if (validTo != 0 && DateUtil.now() > validTo) return false; @@ -46,13 +124,7 @@ public class TriggerTime extends Trigger { scheduledCal.set(Calendar.SECOND, 0); long scheduled = scheduledCal.getTimeInMillis(); - if (monday && scheduledDayOfWeek == Calendar.MONDAY || - tuesday && scheduledDayOfWeek == Calendar.TUESDAY || - wednesday && scheduledDayOfWeek == Calendar.WEDNESDAY || - thursday && scheduledDayOfWeek == Calendar.THURSDAY || - friday && scheduledDayOfWeek == Calendar.FRIDAY || - saturday && scheduledDayOfWeek == Calendar.SATURDAY || - sunday && scheduledDayOfWeek == Calendar.SUNDAY) { + if (isSet(DayOfWeek.fromCalendarInt(scheduledDayOfWeek))) { if (DateUtil.now() >= scheduled && DateUtil.now() - scheduled < T.mins(5).msecs()) { if (lastRun < scheduled) return true; @@ -75,13 +147,9 @@ public class TriggerTime extends Trigger { data.put("lastRun", lastRun); data.put("runAt", runAt); data.put("recurring", recurring); - data.put("monday", monday); - data.put("tuesday", tuesday); - data.put("wednesday", wednesday); - data.put("thursday", thursday); - data.put("friday", friday); - data.put("saturday", saturday); - data.put("sunday", sunday); + for(int i = 0; i < weekdays.length; ++i) { + data.put(DayOfWeek.values()[i].name(), weekdays[i]); + } data.put("hour", hour); data.put("minute", minute); data.put("validTo", validTo); @@ -101,13 +169,9 @@ public class TriggerTime extends Trigger { lastRun = JsonHelper.safeGetLong(o, "lastRun"); runAt = JsonHelper.safeGetLong(o, "runAt"); recurring = JsonHelper.safeGetBoolean(o, "recurring"); - monday = JsonHelper.safeGetBoolean(o, "monday"); - tuesday = JsonHelper.safeGetBoolean(o, "tuesday"); - wednesday = JsonHelper.safeGetBoolean(o, "wednesday"); - thursday = JsonHelper.safeGetBoolean(o, "thursday"); - friday = JsonHelper.safeGetBoolean(o, "friday"); - saturday = JsonHelper.safeGetBoolean(o, "saturday"); - sunday = JsonHelper.safeGetBoolean(o, "sunday"); + for(int i = 0; i < weekdays.length; ++i) { + weekdays[i] = JsonHelper.safeGetBoolean(o, DayOfWeek.values()[i].name()); + } hour = JsonHelper.safeGetInt(o, "hour"); minute = JsonHelper.safeGetInt(o, "minute"); validTo = JsonHelper.safeGetLong(o, "validTo"); @@ -118,12 +182,12 @@ public class TriggerTime extends Trigger { } @Override - int friendlyName() { + public int friendlyName() { return R.string.time; } @Override - String friendlyDescription() { + public String friendlyDescription() { if (recurring) { // TODO return "Every "; @@ -152,41 +216,6 @@ public class TriggerTime extends Trigger { return this; } - TriggerTime monday(boolean monday) { - this.monday = monday; - return this; - } - - TriggerTime tuesday(boolean tuesday) { - this.tuesday = tuesday; - return this; - } - - TriggerTime wednesday(boolean wednesday) { - this.wednesday = wednesday; - return this; - } - - TriggerTime thursday(boolean thursday) { - this.thursday = thursday; - return this; - } - - TriggerTime friday(boolean friday) { - this.friday = friday; - return this; - } - - TriggerTime saturday(boolean saturday) { - this.saturday = saturday; - return this; - } - - TriggerTime sunday(boolean sunday) { - this.sunday = sunday; - return this; - } - TriggerTime validTo(long validTo) { this.validTo = validTo; return this; @@ -202,4 +231,34 @@ public class TriggerTime extends Trigger { return this; } + @Override + public ViewHolder createViewHolder(LayoutInflater inflater) { + ViewHolder v = new ViewHolder(inflater); + viewHolder = v; + return v; + } + + class ViewHolder extends Trigger.ViewHolder { + + @BindView(R.id.weekdays) + WeekdaysPicker weekdaysPicker; + + public ViewHolder(LayoutInflater inflater) { + super(inflater, R.layout.automation_trigger_time); + + List selectedDays = new ArrayList<>(); + for(int i = 0; i < weekdays.length; ++i) { + DayOfWeek day = DayOfWeek.values()[i]; + boolean selected = weekdays[i]; + if (selected) selectedDays.add(day.toCalendarInt()); + } + weekdaysPicker.setSelectedDays(selectedDays); + + weekdaysPicker.setOnWeekdaysChangeListener((view, i, list) -> { + set(DayOfWeek.fromCalendarInt(i), list.contains(i)); + }); + } + + } + } diff --git a/app/src/main/res/drawable/border_automation_unit.xml b/app/src/main/res/drawable/border_automation_unit.xml new file mode 100644 index 0000000000..6ac70390ae --- /dev/null +++ b/app/src/main/res/drawable/border_automation_unit.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/automation_dialog_event.xml b/app/src/main/res/layout/automation_dialog_event.xml new file mode 100644 index 0000000000..3b49181008 --- /dev/null +++ b/app/src/main/res/layout/automation_dialog_event.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/automation_event_item.xml b/app/src/main/res/layout/automation_event_item.xml index 92c9ba93bc..dc80aeaf15 100644 --- a/app/src/main/res/layout/automation_event_item.xml +++ b/app/src/main/res/layout/automation_event_item.xml @@ -1,20 +1,26 @@ - + android:layout_height="wrap_content" + android:orientation="vertical" + android:layout_marginBottom="8dp" + android:layout_marginEnd="8dp" + android:layout_marginStart="8dp" + android:layout_marginTop="8dp"> - \ No newline at end of file + + + \ No newline at end of file diff --git a/app/src/main/res/layout/automation_fragment.xml b/app/src/main/res/layout/automation_fragment.xml index 4b6ee5c71d..a43225cb44 100644 --- a/app/src/main/res/layout/automation_fragment.xml +++ b/app/src/main/res/layout/automation_fragment.xml @@ -1,3 +1,4 @@ + + + + + + + + + +