diff --git a/app/src/main/java/info/nightscout/androidaps/MainActivity.java b/app/src/main/java/info/nightscout/androidaps/MainActivity.java index f0f5136937..b702897ba4 100644 --- a/app/src/main/java/info/nightscout/androidaps/MainActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/MainActivity.java @@ -112,12 +112,16 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe runOnUiThread(new Runnable() { @Override public void run() { - recreate(); - try { // activity may be destroyed - setUpTabs(true); - } catch (IllegalStateException e) { - log.error("Unhandled exception", e); + if(ev.recreate) { + recreate(); + }else { + try { // activity may be destroyed + setUpTabs(true); + } catch (IllegalStateException e) { + log.error("Unhandled exception", e); + } } + boolean lockScreen = BuildConfig.NSCLIENTOLNY && SP.getBoolean("lockscreen", false); if (lockScreen) getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); diff --git a/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java b/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java index ee3ac6eff3..ae3982ad68 100644 --- a/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java @@ -1,5 +1,6 @@ package info.nightscout.androidaps; +import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.EditTextPreference; @@ -59,8 +60,9 @@ public class PreferencesActivity extends PreferenceActivity implements SharedPre if (key.equals("language")) { String lang = sharedPreferences.getString("language", "en"); LocaleHelper.setLocale(getApplicationContext(), lang); - recreate(); - MainApp.bus().post(new EventRefreshGui()); + MainApp.bus().post(new EventRefreshGui(true)); + //recreate() does not update language so better close settings + finish(); } if (key.equals("short_tabtitles")) { MainApp.bus().post(new EventRefreshGui()); diff --git a/app/src/main/java/info/nightscout/androidaps/data/Profile.java b/app/src/main/java/info/nightscout/androidaps/data/Profile.java index 157427598d..e022969e32 100644 --- a/app/src/main/java/info/nightscout/androidaps/data/Profile.java +++ b/app/src/main/java/info/nightscout/androidaps/data/Profile.java @@ -23,6 +23,7 @@ import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.Overview.notifications.Notification; import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification; import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; +import info.nightscout.utils.DateUtil; import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.ToastUtils; @@ -163,15 +164,19 @@ public class Profile { for (Integer index = 0; index < array.length(); index++) { try { final JSONObject o = array.getJSONObject(index); - long tas = getShitfTimeSecs((int) o.getLong("timeAsSeconds")); + long tas = 0; + try { + tas = getShitfTimeSecs((int) o.getLong("timeAsSeconds")); + } catch (JSONException e) { + String time = o.getString("time"); + tas = getShitfTimeSecs(DateUtil.toSeconds(time)); + //log.debug(">>>>>>>>>>>> Used recalculated timeAsSecons: " + time + " " + tas); + } Double value = o.getDouble("value") * multiplier; sparse.put(tas, value); } catch (JSONException e) { log.error("Unhandled exception", e); - try { - log.error(array.getJSONObject(index).toString()); - } catch (JSONException e1) { - } + log.error(json.toString()); } } diff --git a/app/src/main/java/info/nightscout/androidaps/data/QuickWizardEntry.java b/app/src/main/java/info/nightscout/androidaps/data/QuickWizardEntry.java index e6130402b5..70dd37a6ab 100644 --- a/app/src/main/java/info/nightscout/androidaps/data/QuickWizardEntry.java +++ b/app/src/main/java/info/nightscout/androidaps/data/QuickWizardEntry.java @@ -80,7 +80,7 @@ public class QuickWizardEntry { // COB double cob = 0d; - AutosensData autosensData = IobCobCalculatorPlugin.getAutosensData(System.currentTimeMillis()); + AutosensData autosensData = IobCobCalculatorPlugin.getLastAutosensData(); if (autosensData != null && useCOB() == YES) { cob = autosensData.cob; } diff --git a/app/src/main/java/info/nightscout/androidaps/events/EventRefreshGui.java b/app/src/main/java/info/nightscout/androidaps/events/EventRefreshGui.java index 1dae34d2af..390ad8ea4f 100644 --- a/app/src/main/java/info/nightscout/androidaps/events/EventRefreshGui.java +++ b/app/src/main/java/info/nightscout/androidaps/events/EventRefreshGui.java @@ -4,4 +4,11 @@ package info.nightscout.androidaps.events; * Created by mike on 13.06.2016. */ public class EventRefreshGui extends Event { + public boolean recreate = false; + public EventRefreshGui(boolean recreate) { + this.recreate = recreate; + } + public EventRefreshGui(){ + this(false); + } } diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/ConstraintsInterface.java b/app/src/main/java/info/nightscout/androidaps/interfaces/ConstraintsInterface.java index 34b50e315f..aac7918bdc 100644 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/ConstraintsInterface.java +++ b/app/src/main/java/info/nightscout/androidaps/interfaces/ConstraintsInterface.java @@ -15,6 +15,8 @@ public interface ConstraintsInterface { boolean isAMAModeEnabled(); + boolean isSMBModeEnabled(); + Double applyBasalConstraints(Double absoluteRate); Integer applyBasalConstraints(Integer percentRate); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialog.java index 40eab27a5e..af9440bff1 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialog.java @@ -533,7 +533,7 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick if (options.eventType == R.id.careportal_combobolus) { Double enteredInsulin = SafeParse.stringToDouble(editInsulin.getText()); data.put("enteredinsulin", enteredInsulin); - data.put("insulin", enteredInsulin * SafeParse.stringToDouble(editInsulin.getText()) / 100); + data.put("insulin", enteredInsulin * SafeParse.stringToDouble(editSplit.getText()) / 100); data.put("relative", enteredInsulin * (100 - SafeParse.stringToDouble(editSplit.getText())) / 100 / SafeParse.stringToDouble(editDuration.getText()) * 60); } } catch (JSONException e) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPlugin.java index a570e11ea2..c6a5d4bbf9 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPlugin.java @@ -16,9 +16,9 @@ import info.nightscout.androidaps.Config; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.DetailedBolusInfo; +import info.nightscout.androidaps.data.Intervals; import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.data.MealData; -import info.nightscout.androidaps.data.Intervals; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.ProfileIntervals; import info.nightscout.androidaps.data.PumpEnactResult; @@ -40,8 +40,8 @@ import info.nightscout.androidaps.interfaces.SensitivityInterface; import info.nightscout.androidaps.interfaces.TreatmentsInterface; import info.nightscout.androidaps.plugins.Loop.APSResult; import info.nightscout.androidaps.plugins.Loop.LoopPlugin; -import info.nightscout.androidaps.plugins.Overview.notifications.Notification; import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; +import info.nightscout.androidaps.plugins.Overview.notifications.Notification; import info.nightscout.androidaps.plugins.PumpVirtual.VirtualPumpPlugin; import info.nightscout.androidaps.queue.Callback; import info.nightscout.androidaps.queue.CommandQueue; @@ -498,8 +498,7 @@ public class ConfigBuilderPlugin implements PluginBase, ConstraintsInterface, Tr @Override public boolean isAMAModeEnabled() { - SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext()); - boolean result = preferences.getBoolean("openapsama_useautosens", false); + boolean result = SP.getBoolean("openapsama_useautosens", false); ArrayList constraintsPlugins = MainApp.getSpecificPluginsListByInterface(ConstraintsInterface.class); for (PluginBase p : constraintsPlugins) { @@ -510,6 +509,19 @@ public class ConfigBuilderPlugin implements PluginBase, ConstraintsInterface, Tr return result; } + @Override + public boolean isSMBModeEnabled() { + boolean result = true; // TODO update for SMB // SP.getBoolean("openapsama_useautosens", false); + + ArrayList constraintsPlugins = MainApp.getSpecificPluginsListByInterface(ConstraintsInterface.class); + for (PluginBase p : constraintsPlugins) { + ConstraintsInterface constrain = (ConstraintsInterface) p; + if (!p.isEnabled(PluginBase.CONSTRAINTS)) continue; + result = result && constrain.isSMBModeEnabled(); + } + return result; + } + @Override public Double applyBasalConstraints(Double absoluteRate) { Double rateAfterConstrain = absoluteRate; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesPlugin.java index d898d48388..1f0e6704c3 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesPlugin.java @@ -14,9 +14,14 @@ import info.nightscout.androidaps.BuildConfig; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; +import info.nightscout.androidaps.interfaces.APSInterface; import info.nightscout.androidaps.interfaces.ConstraintsInterface; import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.ConstraintsSafety.SafetyPlugin; +import info.nightscout.androidaps.plugins.Loop.LoopPlugin; +import info.nightscout.androidaps.plugins.NSClientInternal.NSClientInternalPlugin; +import info.nightscout.androidaps.plugins.PumpVirtual.VirtualPumpPlugin; import info.nightscout.utils.SP; /** @@ -152,14 +157,35 @@ public class ObjectivesPlugin implements PluginBase, ConstraintsInterface { RequirementResult requirementsMet(Integer objNum) { switch (objNum) { case 0: - return new RequirementResult(bgIsAvailableInNS && pumpStatusIsAvailableInNS, + boolean isVirtualPump = VirtualPumpPlugin.getPlugin().isEnabled(PluginBase.PUMP); + boolean vpUploadEnabled = SP.getBoolean("virtualpump_uploadstatus", false); + boolean vpUploadNeeded = !isVirtualPump || vpUploadEnabled; + + boolean apsEnabled = false; + APSInterface usedAPS = ConfigBuilderPlugin.getActiveAPS(); + if (usedAPS != null && ((PluginBase) usedAPS).isEnabled(PluginBase.APS)) + apsEnabled = true; + + return new RequirementResult(bgIsAvailableInNS && pumpStatusIsAvailableInNS && NSClientInternalPlugin.getPlugin().hasWritePermission() && LoopPlugin.getPlugin().isEnabled(PluginBase.LOOP) && apsEnabled && vpUploadNeeded, MainApp.sResources.getString(R.string.objectives_bgavailableinns) + ": " + yesOrNo(bgIsAvailableInNS) - + " " + MainApp.sResources.getString(R.string.objectives_pumpstatusavailableinns) + ": " + yesOrNo(pumpStatusIsAvailableInNS)); + + " " + MainApp.sResources.getString(R.string.nsclienthaswritepermission) + ": " + yesOrNo(NSClientInternalPlugin.getPlugin().hasWritePermission()) + + (isVirtualPump ? " " + MainApp.sResources.getString(R.string.virtualpump_uploadstatus_title) + ": " + yesOrNo(vpUploadEnabled) : "") + + " " + MainApp.sResources.getString(R.string.objectives_pumpstatusavailableinns) + ": " + yesOrNo(pumpStatusIsAvailableInNS) + + " " + MainApp.sResources.getString(R.string.loopenabled) + ": " + yesOrNo(LoopPlugin.getPlugin().isEnabled(PluginBase.LOOP)) + + " " + MainApp.sResources.getString(R.string.apsselected) + ": " + yesOrNo(apsEnabled) + ); case 1: return new RequirementResult(manualEnacts >= manualEnactsNeeded, MainApp.sResources.getString(R.string.objectives_manualenacts) + ": " + manualEnacts + "/" + manualEnactsNeeded); case 2: return new RequirementResult(true, ""); + case 3: + boolean closedModeEnabled = SafetyPlugin.getPlugin().isClosedModeEnabled(); + return new RequirementResult(closedModeEnabled, MainApp.sResources.getString(R.string.closedmodeenabled) + ": " + yesOrNo(closedModeEnabled)); + case 4: + double maxIOB = MainApp.getConfigBuilder().applyMaxIOBConstraints(1000d); + boolean maxIobSet = maxIOB > 0; + return new RequirementResult(maxIobSet, MainApp.sResources.getString(R.string.maxiobset) + ": " + yesOrNo(maxIobSet)); default: return new RequirementResult(true, ""); } @@ -212,7 +238,13 @@ public class ObjectivesPlugin implements PluginBase, ConstraintsInterface { MainApp.sResources.getString(R.string.objectives_6_objective), "", new Date(0), - 14, + 28, + new Date(0))); + objectives.add(new Objective(7, + MainApp.sResources.getString(R.string.objectives_7_objective), + "", + new Date(0), + 28, new Date(0))); } @@ -260,7 +292,7 @@ public class ObjectivesPlugin implements PluginBase, ConstraintsInterface { **/ @Override public boolean isLoopEnabled() { - return objectives.get(1).started.getTime() > 0; + return objectives.get(0).started.getTime() > 0; } @Override @@ -278,6 +310,11 @@ public class ObjectivesPlugin implements PluginBase, ConstraintsInterface { return objectives.get(6).started.getTime() > 0; } + @Override + public boolean isSMBModeEnabled() { + return objectives.get(7).started.getTime() > 0; + } + @Override public Double applyMaxIOBConstraints(Double maxIob) { if (objectives.get(4).started.getTime() > 0 || objectives.get(2).accomplished.getTime() == 0) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPlugin.java index ecb7aad47d..42f50d52dd 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPlugin.java @@ -116,6 +116,11 @@ public class SafetyPlugin implements PluginBase, ConstraintsInterface { return true; } + @Override + public boolean isSMBModeEnabled() { + return true; + } + @Override public Double applyBasalConstraints(Double absoluteRate) { Double origAbsoluteRate = absoluteRate; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/events/BasalData.java b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/BasalData.java similarity index 71% rename from app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/events/BasalData.java rename to app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/BasalData.java index 4e1dcc1bf6..d8bde8acbb 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/events/BasalData.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/BasalData.java @@ -1,4 +1,4 @@ -package info.nightscout.androidaps.plugins.IobCobCalculator.events; +package info.nightscout.androidaps.plugins.IobCobCalculator; /** * Created by mike on 10.06.2017. diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java index 300bfb5cd1..33fec298a0 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java @@ -31,7 +31,6 @@ import info.nightscout.androidaps.events.EventNewBasalProfile; import info.nightscout.androidaps.events.EventPreferenceChange; import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; -import info.nightscout.androidaps.plugins.IobCobCalculator.events.BasalData; import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventAutosensCalculationFinished; import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventNewHistoryData; import info.nightscout.androidaps.plugins.OpenAPSSMB.OpenAPSSMBPlugin; @@ -597,6 +596,10 @@ public class IobCobCalculatorPlugin implements PluginBase { //log.debug(">>> getAutosensData Cache hit " + data.log(time)); return data; } else { + if (time > now) { + // data may not be calculated yet, use last data + return getLastAutosensData(); + } //log.debug(">>> getAutosensData Cache miss " + new Date(time).toLocaleString()); return null; } @@ -608,7 +611,7 @@ public class IobCobCalculatorPlugin implements PluginBase { if (autosensDataTable.size() < 1) return null; AutosensData data = autosensDataTable.valueAt(autosensDataTable.size() - 1); - if (data.time < System.currentTimeMillis() - 5 * 60 * 1000) { + if (data.time < System.currentTimeMillis() - 11 * 60 * 1000) { return null; } else { return data; 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 b1fb6dd893..1d6d3d8a3b 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 @@ -260,18 +260,6 @@ public class LoopPlugin implements PluginBase { if (!isEnabled(PluginBase.LOOP)) return; - if (isSuspended()) { - log.debug(MainApp.sResources.getString(R.string.loopsuspended)); - MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.sResources.getString(R.string.loopsuspended))); - return; - } - - if (pump.isSuspended()) { - log.debug(MainApp.sResources.getString(R.string.pumpsuspended)); - MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.sResources.getString(R.string.pumpsuspended))); - return; - } - if (MainApp.getConfigBuilder().getProfile() == null) { log.debug(MainApp.sResources.getString(R.string.noprofileselected)); MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.sResources.getString(R.string.noprofileselected))); @@ -281,7 +269,7 @@ public class LoopPlugin implements PluginBase { // Check if pump info is loaded if (pump.getBaseBasalRate() < 0.01d) return; - APSInterface usedAPS = MainApp.getConfigBuilder().getActiveAPS(); + APSInterface usedAPS = ConfigBuilderPlugin.getActiveAPS(); if (usedAPS != null && ((PluginBase) usedAPS).isEnabled(PluginBase.APS)) { usedAPS.invoke(initiator); result = usedAPS.getLastAPSResult(); @@ -312,6 +300,20 @@ public class LoopPlugin implements PluginBase { lastRun.source = ((PluginBase) usedAPS).getName(); lastRun.setByPump = null; + NSUpload.uploadDeviceStatus(); + + if (isSuspended()) { + log.debug(MainApp.sResources.getString(R.string.loopsuspended)); + MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.sResources.getString(R.string.loopsuspended))); + return; + } + + if (pump.isSuspended()) { + log.debug(MainApp.sResources.getString(R.string.pumpsuspended)); + MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.sResources.getString(R.string.pumpsuspended))); + return; + } + if (constraintsInterface.isClosedModeEnabled()) { if (result.changeRequested) { final PumpEnactResult waiting = new PumpEnactResult(); @@ -372,7 +374,6 @@ public class LoopPlugin implements PluginBase { } MainApp.bus().post(new EventLoopUpdateGui()); - NSUpload.uploadDeviceStatus(); } finally { if (Config.logFunctionCalls) log.debug("invoke end"); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientInternalPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientInternalPlugin.java index cdca4e5b41..a51ea18cc7 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientInternalPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientInternalPlugin.java @@ -222,4 +222,8 @@ public class NSClientInternalPlugin implements PluginBase { public String url() { return NSClientService.nsURL; } + + public boolean hasWritePermission() { + return nsClientService.hasWriteAuth; + } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/receivers/DBAccessReceiver.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/receivers/DBAccessReceiver.java index 3411659d0d..4590490ecf 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/receivers/DBAccessReceiver.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/receivers/DBAccessReceiver.java @@ -30,14 +30,6 @@ public class DBAccessReceiver extends BroadcastReceiver { PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, DBAccessReceiver.class.getSimpleName()); - NSClientInternalPlugin nsClientInternalPlugin = MainApp.getSpecificPlugin(NSClientInternalPlugin.class); - if (!nsClientInternalPlugin.isEnabled(PluginBase.GENERAL)) { - return; - } - if (SP.getBoolean(R.string.key_ns_noupload, false)) { - log.debug("Upload disabled. Message dropped"); - return; - } wakeLock.acquire(); try { Bundle bundles = intent.getExtras(); @@ -83,16 +75,22 @@ public class DBAccessReceiver extends BroadcastReceiver { } if (action.equals("dbRemove")) { - DbRequest dbr = new DbRequest(action, collection, nsclientid.toString(), _id); - UploadQueue.add(dbr); + if (shouldUpload()) { + DbRequest dbr = new DbRequest(action, collection, nsclientid.toString(), _id); + UploadQueue.add(dbr); + } } else { DbRequest dbr = new DbRequest(action, collection, nsclientid.toString(), data); // this is not used as mongo _id but only for searching in UploadQueue database // if record has to be removed from queue before upload dbr._id = nsclientid.toString(); - UploadQueue.add(dbr); - if (collection.equals("treatments")) + + if (shouldUpload()) { + UploadQueue.add(dbr); + } + if (collection.equals("treatments")) { genereateTreatmentOfflineBroadcast(dbr); + } } } finally { @@ -101,6 +99,11 @@ public class DBAccessReceiver extends BroadcastReceiver { } + public boolean shouldUpload() { + NSClientInternalPlugin nsClientInternalPlugin = MainApp.getSpecificPlugin(NSClientInternalPlugin.class); + return nsClientInternalPlugin.isEnabled(PluginBase.GENERAL) && !SP.getBoolean(R.string.key_ns_noupload, false); + } + public void genereateTreatmentOfflineBroadcast(DbRequest request) { if (request.action.equals("dbAdd")) { try { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java index eb46af6b30..af2266582b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java @@ -458,9 +458,9 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com // COB Double c_cob = 0d; if (cobCheckbox.isChecked()) { - AutosensData autosensData = IobCobCalculatorPlugin.getAutosensData(System.currentTimeMillis()); + AutosensData autosensData = IobCobCalculatorPlugin.getLastAutosensData(); - if(autosensData != null && autosensData.time > System.currentTimeMillis() - 11 * 60 * 1000L) { + if(autosensData != null) { c_cob = autosensData.cob; } } 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 a72feee5f0..52d225deae 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 @@ -177,6 +177,8 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, Handler sLoopHandler = new Handler(); Runnable sRefreshLoop = null; + final Object updateSync = new Object(); + private static final ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor(); private static ScheduledFuture scheduledUpdate = null; @@ -900,9 +902,9 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, } @SuppressLint("SetTextI18n") - public void updateGUI(String from) { + public void updateGUI(final String from) { log.debug("updateGUI entered from: " + from); - Date updateGUIStart = new Date(); + final Date updateGUIStart = new Date(); if (getActivity() == null) return; @@ -924,7 +926,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, BgReading actualBG = DatabaseHelper.actualBg(); BgReading lastBG = DatabaseHelper.lastBg(); - PumpInterface pump = ConfigBuilderPlugin.getActivePump(); + final PumpInterface pump = ConfigBuilderPlugin.getActivePump(); Profile profile = MainApp.getConfigBuilder().getProfile(); String units = profile.getUnits(); @@ -936,8 +938,8 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, return; } - double lowLine = SP.getDouble("low_mark", 0d); - double highLine = SP.getDouble("high_mark", 0d); + final double lowLine = SP.getDouble("low_mark", Profile.fromMgdlToUnits(OverviewPlugin.bgTargetLow, units)); + final double highLine = SP.getDouble("high_mark", Profile.fromMgdlToUnits(OverviewPlugin.bgTargetHigh, units)); //Start with updating the BG as it is unaffected by loop. // **** BG value **** @@ -1141,16 +1143,8 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, } - if (lowLine < 1) { - lowLine = Profile.fromMgdlToUnits(OverviewPlugin.bgTargetLow, units); - } - if (highLine < 1) { - highLine = Profile.fromMgdlToUnits(OverviewPlugin.bgTargetHigh, units); - } - // **** BG value **** if (lastBG == null) { //left this here as it seems you want to exit at this point if it is null... - return; } Integer flag = bgView.getPaintFlags(); @@ -1197,13 +1191,13 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, // cob if (cobView != null) { // view must not exists String cobText = ""; - AutosensData autosensData = IobCobCalculatorPlugin.getAutosensData(System.currentTimeMillis()); + AutosensData autosensData = IobCobCalculatorPlugin.getLastAutosensData(); if (autosensData != null) cobText = (int) autosensData.cob + " g"; cobView.setText(cobText); } - boolean predictionsAvailable = finalLastRun != null && finalLastRun.request.hasPredictions; + final boolean predictionsAvailable = finalLastRun != null && finalLastRun.request.hasPredictions; if (predictionsAvailable) { showPredictionView.setVisibility(View.VISIBLE); getActivity().findViewById(R.id.overview_showprediction_label).setVisibility(View.VISIBLE); @@ -1247,111 +1241,123 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, // ****** GRAPH ******* - // align to hours - Calendar calendar = Calendar.getInstance(); - calendar.setTimeInMillis(System.currentTimeMillis()); - calendar.set(Calendar.MILLISECOND, 0); - calendar.set(Calendar.SECOND, 0); - calendar.set(Calendar.MINUTE, 0); - calendar.add(Calendar.HOUR, 1); + new Thread(new Runnable() { + @Override + public void run() { + // allign to hours + Calendar calendar = Calendar.getInstance(); + calendar.setTimeInMillis(System.currentTimeMillis()); + calendar.set(Calendar.MILLISECOND, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.add(Calendar.HOUR, 1); - int hoursToFetch; - long toTime; - long fromTime; - long endTime; - if (predictionsAvailable && showPredictionView.isChecked()) { - int predHours = (int) (Math.ceil(finalLastRun.constraintsProcessed.getLatestPredictionsTime() - System.currentTimeMillis()) / (60 * 60 * 1000)); - predHours = Math.min(2, predHours); - predHours = Math.max(0, predHours); - hoursToFetch = rangeToDisplay - predHours; - toTime = calendar.getTimeInMillis() + 100000; // little bit more to avoid wrong rounding - Graphview specific - fromTime = toTime - hoursToFetch * 60 * 60 * 1000L; - endTime = toTime + predHours * 60 * 60 * 1000L; - } else { - hoursToFetch = rangeToDisplay; - toTime = calendar.getTimeInMillis() + 100000; // little bit more to avoid wrong rounding - Graphview specific - fromTime = toTime - hoursToFetch * 60 * 60 * 1000L; - endTime = toTime; - } + int hoursToFetch; + final long toTime; + final long fromTime; + final long endTime; + if (predictionsAvailable && showPredictionView.isChecked()) { + int predHours = (int) (Math.ceil(finalLastRun.constraintsProcessed.getLatestPredictionsTime() - System.currentTimeMillis()) / (60 * 60 * 1000)); + predHours = Math.min(2, predHours); + predHours = Math.max(0, predHours); + hoursToFetch = rangeToDisplay - predHours; + toTime = calendar.getTimeInMillis() + 100000; // little bit more to avoid wrong rounding - Graphview specific + fromTime = toTime - hoursToFetch * 60 * 60 * 1000L; + endTime = toTime + predHours * 60 * 60 * 1000L; + } else { + hoursToFetch = rangeToDisplay; + toTime = calendar.getTimeInMillis() + 100000; // little bit more to avoid wrong rounding - Graphview specific + fromTime = toTime - hoursToFetch * 60 * 60 * 1000L; + endTime = toTime; + } - long now = System.currentTimeMillis(); + final long now = System.currentTimeMillis(); - // 2nd graph - // remove old data - iobGraph.getSeries().clear(); + // ------------------ 1st graph + Profiler.log(log, from + " - 1st graph - START", updateGUIStart); - GraphData secondGraphData = new GraphData(); + final GraphData graphData = new GraphData(bgGraph); - boolean useIobForScale = false; - boolean useCobForScale = false; - boolean useDevForScale = false; - boolean useRatioForScale = false; - boolean useDSForScale = false; + // **** In range Area **** + graphData.addInRangeArea(fromTime, endTime, lowLine, highLine); - if (showIobView.isChecked()) { - useIobForScale = true; - } else if (showCobView.isChecked()) { - useCobForScale = true; - } else if (showDeviationsView.isChecked()) { - useDevForScale = true; - } else if (showRatiosView.isChecked()) { - useRatioForScale = true; - } else if (Config.displayDeviationSlope) { - useDSForScale = true; - } + // **** BG **** + if (predictionsAvailable && showPredictionView.isChecked()) + graphData.addBgReadings(fromTime, toTime, lowLine, highLine, finalLastRun.constraintsProcessed); + else + graphData.addBgReadings(fromTime, toTime, lowLine, highLine, null); - if (showIobView.isChecked()) - secondGraphData.addIob(iobGraph, fromTime, now, useIobForScale, 1d); - if (showCobView.isChecked()) - secondGraphData.addCob(iobGraph, fromTime, now, useCobForScale, useCobForScale ? 1d : 0.5d); - if (showDeviationsView.isChecked()) - secondGraphData.addDeviations(iobGraph, fromTime, now, useDevForScale, 1d); - if (showRatiosView.isChecked()) - secondGraphData.addRatio(iobGraph, fromTime, now, useRatioForScale, 1d); - if (Config.displayDeviationSlope) - secondGraphData.addDeviationSlope(iobGraph, fromTime, now, useDSForScale, 1d); + // set manual x bounds to have nice steps + graphData.formatAxis(fromTime, endTime); - if (showIobView.isChecked() || showCobView.isChecked() || showDeviationsView.isChecked() || showRatiosView.isChecked() || Config.displayDeviationSlope) { - iobGraph.setVisibility(View.VISIBLE); - } else { - iobGraph.setVisibility(View.GONE); - } + // Treatments + graphData.addTreatments(fromTime, endTime); - // remove old data from graph - bgGraph.getSeries().clear(); + // add basal data + if (pump.getPumpDescription().isTempBasalCapable && showBasalsView.isChecked()) { + graphData.addBasals(fromTime, now, lowLine / graphData.maxY / 1.2d); + } - GraphData graphData = new GraphData(); + // **** NOW line **** + graphData.addNowLine(now); + // ------------------ 2nd graph + Profiler.log(log, from + " - 2nd graph - START", updateGUIStart); - // **** In range Area **** - graphData.addInRangeArea(bgGraph, fromTime, endTime, lowLine, highLine); + final GraphData secondGraphData = new GraphData(iobGraph); - // **** BG **** - if (predictionsAvailable && showPredictionView.isChecked()) - graphData.addBgReadings(bgGraph, fromTime, toTime, lowLine, highLine, finalLastRun.constraintsProcessed); - else - graphData.addBgReadings(bgGraph, fromTime, toTime, lowLine, highLine, null); + boolean useIobForScale = false; + boolean useCobForScale = false; + boolean useDevForScale = false; + boolean useRatioForScale = false; + boolean useDSForScale = false; - // set manual x bounds to have nice steps - graphData.formatAxis(bgGraph, fromTime, endTime); - secondGraphData.formatAxis(iobGraph, fromTime, endTime); + if (showIobView.isChecked()) { + useIobForScale = true; + } else if (showCobView.isChecked()) { + useCobForScale = true; + } else if (showDeviationsView.isChecked()) { + useDevForScale = true; + } else if (showRatiosView.isChecked()) { + useRatioForScale = true; + } else if (Config.displayDeviationSlope) { + useDSForScale = true; + } - // Treatments - graphData.addTreatments(bgGraph, fromTime, endTime); + if (showIobView.isChecked()) + secondGraphData.addIob(fromTime, now, useIobForScale, 1d); + if (showCobView.isChecked()) + secondGraphData.addCob(fromTime, now, useCobForScale, useCobForScale ? 1d : 0.5d); + if (showDeviationsView.isChecked()) + secondGraphData.addDeviations(fromTime, now, useDevForScale, 1d); + if (showRatiosView.isChecked()) + secondGraphData.addRatio(fromTime, now, useRatioForScale, 1d); + if (Config.displayDeviationSlope) + secondGraphData.addDeviationSlope(fromTime, now, useDSForScale, 1d); - // add basal data - if (pump.getPumpDescription().isTempBasalCapable && showBasalsView.isChecked()) { - graphData.addBasals(bgGraph, fromTime, now, lowLine / graphData.maxY / 1.2d); - } + // **** NOW line **** + // set manual x bounds to have nice steps + secondGraphData.formatAxis(fromTime, endTime); + secondGraphData.addNowLine(now); - // **** NOW line **** - graphData.addNowLine(bgGraph, now); - secondGraphData.addNowLine(iobGraph, now); - - // finaly enforce drawing of graphs - bgGraph.onDataChanged(false, false); - iobGraph.onDataChanged(false, false); + // do GUI update + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + if (showIobView.isChecked() || showCobView.isChecked() || showDeviationsView.isChecked() || showRatiosView.isChecked()|| Config.displayDeviationSlope) { + iobGraph.setVisibility(View.VISIBLE); + } else { + iobGraph.setVisibility(View.GONE); + } + // finaly enforce drawing of graphs + graphData.performUpdate(); + secondGraphData.performUpdate(); + Profiler.log(log, from + " - onDataChanged", updateGUIStart); + } + }); + } + }).start(); Profiler.log(log, from, updateGUIStart); } @@ -1437,6 +1443,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, } } } + } void updateNotifications() { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java index 7a27546c19..a5b2143a94 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java @@ -26,7 +26,7 @@ import info.nightscout.androidaps.db.Treatment; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData; import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; -import info.nightscout.androidaps.plugins.IobCobCalculator.events.BasalData; +import info.nightscout.androidaps.plugins.IobCobCalculator.BasalData; import info.nightscout.androidaps.plugins.Loop.APSResult; import info.nightscout.androidaps.plugins.Overview.graphExtensions.AreaGraphSeries; import info.nightscout.androidaps.plugins.Overview.graphExtensions.DataPointWithLabelInterface; @@ -44,15 +44,18 @@ import info.nightscout.utils.Round; public class GraphData { - public GraphData() { - units = MainApp.getConfigBuilder().getProfileUnits(); - } - + private GraphView graph; public double maxY = 0; private List bgReadingsArray; private String units; + private List series = new ArrayList<>(); - public void addBgReadings(GraphView bgGraph, long fromTime, long toTime, double lowLine, double highLine, APSResult apsResult) { + public GraphData(GraphView graph) { + units = MainApp.getConfigBuilder().getProfileUnits(); + this.graph = graph; + } + + public void addBgReadings(long fromTime, long toTime, double lowLine, double highLine, APSResult apsResult) { double maxBgValue = 0d; bgReadingsArray = MainApp.getDbHelper().getBgreadingsDataFromTime(fromTime, true); List bgListArray = new ArrayList<>(); @@ -78,20 +81,18 @@ public class GraphData { DataPointWithLabelInterface[] bg = new DataPointWithLabelInterface[bgListArray.size()]; bg = bgListArray.toArray(bg); - if (bg.length > 0) { - addSeriesWithoutInvalidate(bgGraph, new PointsWithLabelGraphSeries<>(bg)); - } maxY = maxBgValue; // set manual y bounds to have nice steps - bgGraph.getViewport().setMaxY(maxY); - bgGraph.getViewport().setMinY(0); - bgGraph.getViewport().setYAxisBoundsManual(true); - bgGraph.getGridLabelRenderer().setNumVerticalLabels(numOfVertLines); + graph.getViewport().setMaxY(maxY); + graph.getViewport().setMinY(0); + graph.getViewport().setYAxisBoundsManual(true); + graph.getGridLabelRenderer().setNumVerticalLabels(numOfVertLines); + addSeries(new PointsWithLabelGraphSeries<>(bg)); } - public void addInRangeArea(GraphView bgGraph, long fromTime, long toTime, double lowLine, double highLine) { + public void addInRangeArea(long fromTime, long toTime, double lowLine, double highLine) { AreaGraphSeries inRangeAreaSeries; DoubleDataPoint[] inRangeAreaDataPoints = new DoubleDataPoint[]{ @@ -99,14 +100,15 @@ public class GraphData { new DoubleDataPoint(toTime, lowLine, highLine) }; inRangeAreaSeries = new AreaGraphSeries<>(inRangeAreaDataPoints); - addSeriesWithoutInvalidate(bgGraph, inRangeAreaSeries); inRangeAreaSeries.setColor(0); inRangeAreaSeries.setDrawBackground(true); inRangeAreaSeries.setBackgroundColor(MainApp.sResources.getColor(R.color.inrangebackground)); + + addSeries(inRangeAreaSeries); } // scale in % of vertical size (like 0.3) - public void addBasals(GraphView bgGraph, long fromTime, long toTime, double scale) { + public void addBasals(long fromTime, long toTime, double scale) { LineGraphSeries basalsLineSeries; LineGraphSeries absoluteBasalsLineSeries; LineGraphSeries baseBasalsSeries; @@ -191,7 +193,7 @@ public class GraphData { basalsLineSeries = new LineGraphSeries<>(basalLine); Paint paint = new Paint(); paint.setStyle(Paint.Style.STROKE); - paint.setStrokeWidth(MainApp.instance().getApplicationContext().getResources().getDisplayMetrics().scaledDensity*2); + paint.setStrokeWidth(MainApp.instance().getApplicationContext().getResources().getDisplayMetrics().scaledDensity * 2); paint.setPathEffect(new DashPathEffect(new float[]{2, 4}, 0)); paint.setColor(MainApp.sResources.getColor(R.color.basal)); basalsLineSeries.setCustomPaint(paint); @@ -201,19 +203,19 @@ public class GraphData { absoluteBasalsLineSeries = new LineGraphSeries<>(absoluteBasalLine); Paint absolutePaint = new Paint(); absolutePaint.setStyle(Paint.Style.STROKE); - absolutePaint.setStrokeWidth(MainApp.instance().getApplicationContext().getResources().getDisplayMetrics().scaledDensity*2); + absolutePaint.setStrokeWidth(MainApp.instance().getApplicationContext().getResources().getDisplayMetrics().scaledDensity * 2); absolutePaint.setColor(MainApp.sResources.getColor(R.color.basal)); absoluteBasalsLineSeries.setCustomPaint(absolutePaint); basalScale.setMultiplier(maxY * scale / maxBasalValueFound); - addSeriesWithoutInvalidate(bgGraph, baseBasalsSeries); - addSeriesWithoutInvalidate(bgGraph, tempBasalsSeries); - addSeriesWithoutInvalidate(bgGraph, basalsLineSeries); - addSeriesWithoutInvalidate(bgGraph, absoluteBasalsLineSeries); + addSeries(baseBasalsSeries); + addSeries(tempBasalsSeries); + addSeries(basalsLineSeries); + addSeries(absoluteBasalsLineSeries); } - public void addTreatments(GraphView bgGraph, long fromTime, long endTime) { + public void addTreatments(long fromTime, long endTime) { List filteredTreatments = new ArrayList<>(); List treatments = MainApp.getConfigBuilder().getTreatmentsFromHistory(); @@ -259,9 +261,7 @@ public class GraphData { DataPointWithLabelInterface[] treatmentsArray = new DataPointWithLabelInterface[filteredTreatments.size()]; treatmentsArray = filteredTreatments.toArray(treatmentsArray); - if (treatmentsArray.length > 0) { - addSeriesWithoutInvalidate(bgGraph, new PointsWithLabelGraphSeries<>(treatmentsArray)); - } + addSeries(new PointsWithLabelGraphSeries<>(treatmentsArray)); } private double getNearestBg(long date) { @@ -276,7 +276,7 @@ public class GraphData { } // scale in % of vertical size (like 0.3) - public void addIob(GraphView graph, long fromTime, long toTime, boolean useForScale, double scale) { + public void addIob(long fromTime, long toTime, boolean useForScale, double scale) { FixedLineGraphSeries iobSeries; List iobArray = new ArrayList<>(); Double maxIobValueFound = 0d; @@ -307,11 +307,11 @@ public class GraphData { iobScale.setMultiplier(maxY * scale / maxIobValueFound); - addSeriesWithoutInvalidate(graph, iobSeries); + addSeries(iobSeries); } // scale in % of vertical size (like 0.3) - public void addCob(GraphView graph, long fromTime, long toTime, boolean useForScale, double scale) { + public void addCob(long fromTime, long toTime, boolean useForScale, double scale) { FixedLineGraphSeries cobSeries; List cobArray = new ArrayList<>(); Double maxCobValueFound = 0d; @@ -346,11 +346,11 @@ public class GraphData { cobScale.setMultiplier(maxY * scale / maxCobValueFound); - addSeriesWithoutInvalidate(graph, cobSeries); + addSeries(cobSeries); } // scale in % of vertical size (like 0.3) - public void addDeviations(GraphView graph, long fromTime, long toTime, boolean useForScale, double scale) { + public void addDeviations(long fromTime, long toTime, boolean useForScale, double scale) { class DeviationDataPoint extends ScaledDataPoint { public int color; @@ -393,11 +393,11 @@ public class GraphData { devScale.setMultiplier(maxY * scale / maxDevValueFound); - addSeriesWithoutInvalidate(graph, devSeries); + addSeries(devSeries); } // scale in % of vertical size (like 0.3) - public void addRatio(GraphView graph, long fromTime, long toTime, boolean useForScale, double scale) { + public void addRatio(long fromTime, long toTime, boolean useForScale, double scale) { LineGraphSeries ratioSeries; List ratioArray = new ArrayList<>(); Double maxRatioValueFound = 0d; @@ -423,11 +423,11 @@ public class GraphData { ratioScale.setMultiplier(maxY * scale / maxRatioValueFound); - addSeriesWithoutInvalidate(graph, ratioSeries); + addSeries(ratioSeries); } // scale in % of vertical size (like 0.3) - public void addDeviationSlope(GraphView graph, long fromTime, long toTime, boolean useForScale, double scale) { + public void addDeviationSlope(long fromTime, long toTime, boolean useForScale, double scale) { LineGraphSeries dsMaxSeries; LineGraphSeries dsMinSeries; List dsMaxArray = new ArrayList<>(); @@ -466,12 +466,12 @@ public class GraphData { dsMaxScale.setMultiplier(maxY * scale / maxFromMaxValueFound); dsMinScale.setMultiplier(maxY * scale / maxFromMinValueFound); - addSeriesWithoutInvalidate(graph, dsMaxSeries); - addSeriesWithoutInvalidate(graph, dsMinSeries); + addSeries(dsMaxSeries); + addSeries(dsMinSeries); } // scale in % of vertical size (like 0.3) - public void addNowLine(GraphView graph, long now) { + public void addNowLine(long now) { LineGraphSeries seriesNow; DataPoint[] nowPoints = new DataPoint[]{ new DataPoint(now, 0), @@ -488,10 +488,10 @@ public class GraphData { paint.setColor(Color.WHITE); seriesNow.setCustomPaint(paint); - addSeriesWithoutInvalidate(graph, seriesNow); + addSeries(seriesNow); } - public void formatAxis(GraphView graph, long fromTime, long endTime) { + public void formatAxis(long fromTime, long endTime) { graph.getViewport().setMaxX(endTime); graph.getViewport().setMinX(fromTime); graph.getViewport().setXAxisBoundsManual(true); @@ -499,11 +499,23 @@ public class GraphData { graph.getGridLabelRenderer().setNumHorizontalLabels(7); // only 7 because of the space } - private void addSeriesWithoutInvalidate(GraphView bgGraph, Series s) { - if (!s.isEmpty()) { - s.onGraphViewAttached(bgGraph); - bgGraph.getSeries().add(s); - } + private void addSeries(Series s) { + series.add(s); } + public void performUpdate() { + // clear old data + graph.getSeries().clear(); + + // add precalculated series + for (Series s: series) { + if (!s.isEmpty()) { + s.onGraphViewAttached(graph); + graph.getSeries().add(s); + } + } + + // draw it + graph.onDataChanged(false, false); + } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java index affa668148..4ba660db66 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java @@ -785,6 +785,11 @@ public class DanaRPlugin implements PluginBase, PumpInterface, DanaRInterface, C return true; } + @Override + public boolean isSMBModeEnabled() { + return true; + } + @SuppressWarnings("PointlessBooleanExpression") @Override public Double applyBasalConstraints(Double absoluteRate) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java index 0caab03cc8..f269aff112 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java @@ -787,6 +787,11 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, DanaRInterf return true; } + @Override + public boolean isSMBModeEnabled() { + return true; + } + @SuppressWarnings("PointlessBooleanExpression") @Override public Double applyBasalConstraints(Double absoluteRate) { 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 fcbd89cfab..dceb7e66bc 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 @@ -289,6 +289,11 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface, return true; } + @Override + public boolean isSMBModeEnabled() { + return true; + } + @Override public Double applyBasalConstraints(Double absoluteRate) { double origAbsoluteRate = absoluteRate; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/events/EventDanaRSDeviceChange.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/events/EventDanaRSDeviceChange.java index 8ae02d47ff..dd9b86ebce 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/events/EventDanaRSDeviceChange.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/events/EventDanaRSDeviceChange.java @@ -1,8 +1,10 @@ package info.nightscout.androidaps.plugins.PumpDanaRS.events; +import info.nightscout.androidaps.events.Event; + /** * Created by mike on 05.09.2017. */ -public class EventDanaRSDeviceChange { +public class EventDanaRSDeviceChange extends Event { } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/events/EventDanaRSPacket.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/events/EventDanaRSPacket.java index 5815399194..e42b6b1440 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/events/EventDanaRSPacket.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/events/EventDanaRSPacket.java @@ -1,12 +1,13 @@ package info.nightscout.androidaps.plugins.PumpDanaRS.events; +import info.nightscout.androidaps.events.Event; import info.nightscout.androidaps.plugins.PumpDanaRS.comm.DanaRS_Packet; /** * Created by mike on 01.09.2017. */ -public class EventDanaRSPacket { +public class EventDanaRSPacket extends Event{ public EventDanaRSPacket(DanaRS_Packet data) { this.data = data; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/events/EventDanaRSPairingSuccess.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/events/EventDanaRSPairingSuccess.java index d50091de55..433cdec9bf 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/events/EventDanaRSPairingSuccess.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/events/EventDanaRSPairingSuccess.java @@ -1,8 +1,10 @@ package info.nightscout.androidaps.plugins.PumpDanaRS.events; +import info.nightscout.androidaps.events.Event; + /** * Created by mike on 01.09.2017. */ -public class EventDanaRSPairingSuccess { +public class EventDanaRSPairingSuccess extends Event{ } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java index f074cb84c0..deb1594c28 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java @@ -730,6 +730,11 @@ public class DanaRv2Plugin implements PluginBase, PumpInterface, DanaRInterface, return true; } + @Override + public boolean isSMBModeEnabled() { + return true; + } + @SuppressWarnings("PointlessBooleanExpression") @Override public Double applyBasalConstraints(Double absoluteRate) { 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 13d3f134f4..c543fe39bd 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 @@ -1,8 +1,6 @@ package info.nightscout.androidaps.plugins.PumpVirtual; -import android.content.SharedPreferences; import android.os.SystemClock; -import android.preference.PreferenceManager; import org.json.JSONException; import org.json.JSONObject; @@ -16,6 +14,7 @@ import info.nightscout.androidaps.Config; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.DetailedBolusInfo; +import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.ExtendedBolus; import info.nightscout.androidaps.db.Source; @@ -24,7 +23,6 @@ import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PumpDescription; import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.interfaces.TreatmentsInterface; -import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress; import info.nightscout.androidaps.plugins.PumpVirtual.events.EventVirtualPumpUpdateGui; import info.nightscout.utils.DateUtil; @@ -65,6 +63,7 @@ public class VirtualPumpPlugin implements PluginBase, PumpInterface { } private static VirtualPumpPlugin plugin = null; + public static VirtualPumpPlugin getPlugin() { loadFakingStatus(); if (plugin == null) @@ -401,8 +400,7 @@ public class VirtualPumpPlugin implements PluginBase, PumpInterface { @Override public JSONObject getJSONStatus() { - SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext()); - if (!preferences.getBoolean("virtualpump_uploadstatus", false)) { + if (!SP.getBoolean("virtualpump_uploadstatus", false)) { return null; } JSONObject pump = new JSONObject(); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java index 9050fb931e..da276af3c2 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java @@ -38,6 +38,7 @@ import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump; import info.nightscout.androidaps.plugins.PumpDanaR.comm.RecordTypes; import info.nightscout.androidaps.plugins.PumpDanaRKorean.DanaRKoreanPlugin; +import info.nightscout.androidaps.plugins.PumpDanaRS.DanaRSPlugin; import info.nightscout.androidaps.plugins.PumpDanaRv2.DanaRv2Plugin; import info.nightscout.androidaps.queue.Callback; import info.nightscout.utils.BolusWizard; @@ -268,13 +269,15 @@ public class ActionStringHandler { } else if ("tddstats".equals(act[0])) { Object activePump = MainApp.getConfigBuilder().getActivePump(); PumpInterface dana = MainApp.getSpecificPlugin(DanaRPlugin.class); + PumpInterface danaRS = MainApp.getSpecificPlugin(DanaRSPlugin.class); PumpInterface danaV2 = MainApp.getSpecificPlugin(DanaRv2Plugin.class); PumpInterface danaKorean = MainApp.getSpecificPlugin(DanaRKoreanPlugin.class); if ((dana == null || dana != activePump) && (danaV2 == null || danaV2 != activePump) && - (danaKorean == null || danaKorean != activePump) + (danaKorean == null || danaKorean != activePump) && + (danaRS == null || danaRS != activePump) ) { sendError("Pump does not support TDDs!"); return; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java index 944774baaa..73b6692904 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java @@ -533,7 +533,7 @@ public class WatchUpdaterService extends WearableListenerService implements String iobSum = DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob); String iobDetail = "(" + DecimalFormatter.to2Decimal(bolusIob.iob) + "|" + DecimalFormatter.to2Decimal(basalIob.basaliob) + ")"; String cobString = generateCOBString(); - String tempBasal = generateBasalString(treatmentsInterface); + String currentBasal = generateBasalString(treatmentsInterface); //bgi String bgiString = ""; @@ -543,7 +543,7 @@ public class WatchUpdaterService extends WearableListenerService implements bgiString = "" + ((bgi >= 0) ? "+" : "") + DecimalFormatter.to1Decimal(bgi); } - String status = generateStatusString(profile, tempBasal,iobSum, iobDetail, bgiString); + String status = generateStatusString(profile, currentBasal,iobSum, iobDetail, bgiString); //batteries int phoneBattery = getBatteryLevel(getApplicationContext()); @@ -567,7 +567,7 @@ public class WatchUpdaterService extends WearableListenerService implements dataMapRequest.getDataMap().putString("iobDetail", iobDetail); dataMapRequest.getDataMap().putBoolean("detailedIob", mPrefs.getBoolean("wear_detailediob", false)); dataMapRequest.getDataMap().putString("cob", cobString); - dataMapRequest.getDataMap().putString("tempBasal", tempBasal); + dataMapRequest.getDataMap().putString("currentBasal", currentBasal); dataMapRequest.getDataMap().putString("battery", "" + phoneBattery); dataMapRequest.getDataMap().putString("rigBattery", rigBattery); dataMapRequest.getDataMap().putLong("openApsStatus", openApsStatus); @@ -598,7 +598,7 @@ public class WatchUpdaterService extends WearableListenerService implements } @NonNull - private String generateStatusString(Profile profile, String tempBasal, String iobSum, String iobDetail, String bgiString) { + private String generateStatusString(Profile profile, String currentBasal, String iobSum, String iobDetail, String bgiString) { String status = ""; @@ -623,7 +623,7 @@ public class WatchUpdaterService extends WearableListenerService implements iobString = iobSum + "U"; } - status += tempBasal + " " + iobString; + status += currentBasal + " " + iobString; //add BGI if shown, otherwise return if (mPrefs.getBoolean("wear_showbgi", false)) { @@ -636,10 +636,16 @@ public class WatchUpdaterService extends WearableListenerService implements @NonNull private String generateBasalString(TreatmentsInterface treatmentsInterface) { - String basalStringResult = "-.--U/h"; + String basalStringResult; TemporaryBasal activeTemp = treatmentsInterface.getTempBasalFromHistory(System.currentTimeMillis()); if (activeTemp != null) { basalStringResult = activeTemp.toStringShort(); + } else { + if (SP.getBoolean(R.string.key_danar_visualizeextendedaspercentage, false)) { + basalStringResult = "100%"; + } else { + basalStringResult = DecimalFormatter.to2Decimal(MainApp.getConfigBuilder().getProfile().getBasal()) + "U/h"; + } } return basalStringResult; } @@ -648,7 +654,7 @@ public class WatchUpdaterService extends WearableListenerService implements private String generateCOBString() { String cobStringResult = "--"; - AutosensData autosensData = IobCobCalculatorPlugin.getAutosensData(System.currentTimeMillis()); + AutosensData autosensData = IobCobCalculatorPlugin.getLastAutosensData(); if (autosensData != null) { cobStringResult = (int) autosensData.cob + "g"; } diff --git a/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java b/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java index 1d12182df8..460366a872 100644 --- a/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java +++ b/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java @@ -128,7 +128,7 @@ public class CommandQueue { // After new command added to the queue // start thread again if not already running - private void notifyAboutNewCommand() { + private synchronized void notifyAboutNewCommand() { if (thread == null || thread.getState() == Thread.State.TERMINATED) { thread = new QueueThread(this); thread.start(); diff --git a/app/src/main/java/info/nightscout/androidaps/tabs/TabPageAdapter.java b/app/src/main/java/info/nightscout/androidaps/tabs/TabPageAdapter.java index 8dff2aec93..b5ed76af02 100644 --- a/app/src/main/java/info/nightscout/androidaps/tabs/TabPageAdapter.java +++ b/app/src/main/java/info/nightscout/androidaps/tabs/TabPageAdapter.java @@ -9,8 +9,12 @@ import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import android.view.ViewGroup; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.util.ArrayList; +import info.nightscout.androidaps.MainActivity; import info.nightscout.androidaps.interfaces.PluginBase; /** @@ -22,6 +26,8 @@ public class TabPageAdapter extends FragmentStatePagerAdapter { Context context; + private static Logger log = LoggerFactory.getLogger(TabPageAdapter.class); + public TabPageAdapter(FragmentManager fm, Context context) { super(fm); this.context = context; @@ -40,6 +46,8 @@ public class TabPageAdapter extends FragmentStatePagerAdapter { super.finishUpdate(container); } catch (NullPointerException nullPointerException){ System.out.println("Catch the NullPointerException in FragmentStatePagerAdapter.finishUpdate"); + } catch (IllegalStateException e){ + log.error(e.getMessage()); } } diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 85e22d48f4..8d178cb301 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1,11 +1,11 @@ - APS Modus - BZ verfügbar in NS + APS-Modus + BZ verfügbar in Nightscout Abbrechen - Kohlehydrate + Kohlenhydrate Careportal - Korrekturbolus + Korrektur-Bolus Messgerät Notiz Profil @@ -16,43 +16,42 @@ Tage OK Profil - NS Profil + Nightscout-Profil IOB: - Gesamt IOB: + Gesamt-IOB: Ins: Ratio: - Dur: - Bolus Abgabefehler - Batterie + Dauer: + Bolus-Abgabefehler OK Basal Bolus - Mahlzeiten Bolus - Sport - Combo Bolus - CGM Sensor Start + Mahlzeiten-Bolus + Bewegung + Combo-Bolus + CGM-Sensor Start Absolut - Kohlehydrate + Kohlenhydrate Insulin Glukose-Art Ereignis-Typ Ereignis-Zeit Prozent Notiz - OpenAPS Offline + OpenAPS offline Profilwechsel - Pumpenkatheterwechsel + Pumpenkatheter-Wechsel Frage - Snack Bolus - Temp Basal Ende - Temp Basal Start + Snack-Bolus + TBR-Ende + TBR-Start Ändere deine Eingabe! Closed Loop APS - BZ Quelle + BZ-Quelle Loop - Nightscout Version: - Temp Basals + Nightscout-Version: + TBR Delta Dauer English @@ -60,7 +59,7 @@ Glukose Backup Einstellungen - NSClient + Nightscout-Client Aktives Profil Basal DIA @@ -69,57 +68,54 @@ Ziel Einheiten Start - Verifizieren + Bestätigen OpenAPS MA - Glukose Status - Eingabeparamter - IOB Daten + Glukose-Status + Eingabeparameter + IOB-Daten Open Loop Bolus Rechner - TempBasal + TBR Rate Grund - Sicherheit: + Sicherheit SENDE Aktivität: - Kohlehydrate: + Kohlenhydrate: Insulin: IOB: - Aktives IOB total: - IOB total: - Basal IOB - E - Up + Aktives Gesamt-IOB: + Gesamt-IOB: + Basal-IOB + IE + Auf Virtuelle Pumpe - Reservoir xDrip VIRTUELLE PUMPE SQL Error - Extended bolus - Temp Basal + Verlängerter Bolus Sichtbar - Basis Basalrate - TOTAL - Nicht unterstützte Version von NSClient + GESAMT + Nicht unterstützte Version des Nightscout-Clients BZ - Bolus IOB - Kohlehydrate + Bolus-IOB + Kohlenhydrate Korr - Kohlehydrat Menge - Insulin Menge + Kohlenhydrat-Menge + Insulin-Menge Behandlungen - Max erlaubter Bolus [U] + Max erlaubter Bolus [IE] Max erlaubte Kohlehydrate [g] - Tratments Sicherheit + Sicherheitseinstellungen Behandlungen Einfaches Profil - Setze neuen extended Bolus: - Akzeptiere neue temp Basalrate: - Benutze extended Bolus für hohe temps (\>200%)> - Pumpen Status verfügbar in NS - % (100% = current) - Basal Wert [%] - Extended Bolus + Setze neuen verlängerten Bolus: + Akzeptiere neue TBR: + Benutze verlängerten Bolus für hohe TBR (>200%) + Pumpen-Status verfügbar in Nightscout + % (100% = aktuell) + Basal-Wert [%] + Verlängerter Bolus Übersicht Neue Empfehlung verfügbar Ergebnis @@ -127,52 +123,52 @@ Ausführen Keine Pumpe verfügbar Kein Profil verfügbar - Keine BZ Daten verfügbar - Mahlzeiten Daten + Keine BZ-Werte verfügbar + Mahlzeiten-Daten Letzte Ausführung Zuletzt abgegeben Plugin ist deaktiviert - Aktuelle temp - Gate: - Objective: + Aktuelle TBR + Beschränkung: + Ziel: Zielsetzungen KEIN PROFIL GESETZT - NSClient ist nicht installiert. Eintrag verloren! - Verwende absolute statt prozentuelle Basalwerte beim Upload zu NightScout - Bisher noch kein Profil von NS geladen + Nightscout-Client ist nicht installiert. Eintrag verloren! + Verwende absolute statt prozentuale Basalwerte beim Upload zu NightScout + Bisher noch kein Profil von Nightscout geladen Keine Anpassung benötigt - NO APS SELECTED OR PROVIDED RESULT + KEIN APS AUSGEWÄHLT ODER KEIN ERGEBNIS VORHANDEN Test Alarm - Avg. delta - Bolus Beschränkung angewendet + Durschn. Delta + Bolus-Beschränkung angewendet Ankündigung - BZ Check - Kohlehydrat Korrektur - CGM Sensor gesetzt - Insulin Reservoir wechsel + BZ-Test + Kohlenhydrat-Korrektur + CGM-Sensor gesetzt + Insulinreservoir-Wechsel Dauer - Carb time + KH-Zeit Eingegeben durch Anderes Split Beschränkungen Generell - Treatments - Beschränkungen sind aktiv! + Behandlungen + Beschränkungen angewendet! Beschränkungen wurden verletzt oder Limit erreicht Czech Gesetzt durch Pumpe - LOOP DEAKTIVIERT DURCH DIE BESCHRÄNKUNG - Nach Beschränkungen + LOOP DEAKTIVIERT DURCH BESCHRÄNKUNGEN + Beschränkungen angewendet Loop - Manuelle Eingriffe - Kohlenhydrate Beschränkung erreicht - Reset Datenbanken + Manuelle Aktionen + Kohlenhydrat-Beschränkung erreicht + Datenbanken zurücksetzen Minimale Dauer Erneure Behandlungen von NS Exit Fehlend - aktiviert + Aktiviert Eingabe neuer Behandlung: Einstellungen exportieren nach Datei nicht gefunden @@ -182,22 +178,22 @@ Einstellungen exportieren Einstellungen importieren German - Dieser Wert wird max basal in OpenAPS genannt - Maximale Menge von nicht bolus IOB die OpenAPs abgeben kann + Dieser Wert wird \"max basal\" in OpenAPS genannt + Maximale Menge von nicht Bolus-IOB, die OpenAPs abgeben kann Bulgarian Nightscout +XXXXXXXXXX;+YYYYYYYYYY Absolut Bolus fehlgeschlagen - Temp Basal abbrechen + TBR abbrechen Temoräres Ziel Temoräres Ziel abbrechen Kommentar Verbunden Verbinden - Pumpen Verbindungsfehler + Pumpen-Verbindungsfehler DanaR Blueetooth Gerät - Pumpen IOB + Pumpen-IOB DanaR Pumpen Einstellungen DanaR Getrennt @@ -208,40 +204,37 @@ Profil neuladen Speichern Erfolgreich - Letzte Verbindung - Letzter Bolus: Profil anzeigen - DanaR Profil Einstellungen + DanaR Profil-Einstellungen DIA [h] Manuell Einheiten (Tag) - ungültige Eingabe + Ungültige Eingabe Wert nicht korrekt gesetzt - ausgewähltes Gerät nicht gefunden + Ausgewähltes Gerät nicht gefunden VERWERFEN Endbenutzervereinbarung Ich verstehe und stimme zu - darf nicht eingestzt werden um med. Eintscheidungen zu treffen - Fehler beim aktualisieren der Basalrate - vor h - SMS Kommunikator - erlaubte Telefonnummern - auf Pumpenergebnis warten - Kein Bluetoothadapter gefunden - Remote Bolus ist nicht erlaubt - Um Bolus %.2fU bitte mit %s antworten + DAS PROGRAMM DARF NICHT FÜR MEDIZINISCHE ENTSCHEIDUNGEN BENUTZT WERDEN. ES GIBT IN DIESEM PROJEKT KEINE GEWÄHRLEISTUNG ODER GARANTIERTE UNTERSTÜTZUNG IN IRGENDEINER ART. WENN DU DICH ENTSCHEIDEST ES ZU NUTZEN, HÄNGT DIE QUALITÄT UND LEISTUNGSFÄHIGKEIT DIESES PROJEKTES VON DIR SELBST AB. ES WIRD \"WIE BESEHEN\" ZUR VERFÜGUNG GESTELLT. SOLLTE SICH DAS PROGRAMM ALS FEHLERHAFT ERWEISEN, ÜBERNEHMEN SIE DIE KOSTEN ALLER NOTWENDIGEN KRANKHEITSKOSTEN, SERVICELEISTUNGEN, REPARATUREN ODER KORREKTUREN. + Fehler beim Aktualisieren der Basalrate + "h her " + SMS-Kommunikator + Erlaubte Telefonnummern + Auf Pumpenergebnis warten + Kein Bluetooth-Adapter gefunden + Ferngesteuerter Bolus ist nicht erlaubt + Um einen Bolus von %.2f IE abzugeben, antworte mit dem Code %s Korean Limit erreicht Falsches Pumpen-Passwort! - Warte auf Pumpe. Klicke zum aktualisieren. + Warte auf Pumpe. Klicke zum Aktualisieren. Korr - Abgabe %.2fU - %.2fU Bolus erfolgreich abgegeben + Abgabe %.2f IE + %.2f IE Bolus erfolgreich abgegeben Alarm Kohlenhydrate Fehler - Glucose - Historie + Glukose Alarme Bolus Kohlenhydrate @@ -253,54 +246,54 @@ Pumpen-Passwort Essensbolus Kein Profil ausgewählt - Stop + Stopp Gestoppt - STOP GEDRÜCKT + STOPP GEDRÜCKT Löschen Hinzufügen Bearbeiten Basal-Stunden Verbindungsaufbau %d s Gültigkeit: - Kohlenhydrate - QuickWizard Einstellungen + Kohlenhydrate: + QuickWizard-Einstellungen Aktionen - Android APS gestartet + AndroidAPS gestartet Loop deaktiviert - Vorfüll-Standardmengen - Bitte vergewissern Sie sich, dass die Menge der Spezifikation des Katheters entspricht. - Zu NightScout nur hochladen (kein sync) - Zu NightScout nur hochladen. Nicht wirksam bei SGV wenn nicht eine lokale Quelle wie xDrip gewählt wird. Nicht wirksam bei Profilen, wenn NS-Profile verwendet werden. + Füll-/Vorfüll-Standardmengen + Bitte vergewissere Dich, dass die Menge den Eigenschaften des Katheters entspricht. + Zu Nightscout nur hochladen (keine Synchronisation) + Zu Nightscout nur hochladen. Nicht wirksam bei SGV, wenn nicht eine lokale Quelle wie xDrip gewählt wird. Nicht wirksam bei Profilen, wenn Nightscout-Profile verwendet werden. Andere Verstopfung Abgegeben - Es werden %.2fU abgegeben - Vorfüllen / Füllen + Es werden %.2f IE abgegeben + Vorfüllen/Füllen Hochladen Spanish Basalrate: - Basisprofil: + Basis-Profil: Pumpenbatterie entladen - neu laden - Hoch Markierung - Niedrig Markierung - Niedrige Batterie + Neu laden + Hoch-Markierung + Niedrig-Markierung + Niedriger Batteriestand Pumpe ist beschäftigt Pumpenfehler Zielbereich: Einheiten: Befüllen - EasyUI Modus in der Pumpe deaktivieren + EasyUI-Modus in der Pumpe deaktivieren Basal-Stunde - Knopf 1 - Knopf 2 - Knopf 3 - Config Builder - vor %d min + Button 1 + Button 2 + Button 3 + Konfigurations-Generator + vor %d Min. AKT WEAR VP - TREAT + BEH TT TB SMS @@ -315,18 +308,17 @@ CONF CPP CP - Bitte verwenden Sie nur Ziffern. + Bitte verwende nur Ziffern. Pflichtfeld Telefonnummer ist nicht gültig. - Bitte verwenden Sie nur Ziffern von %1$s - %2$s + Bitte verwende nur Ziffern von %1$s - %2$s. Warte auf Pumpe Wear - Bitte starte dein Telefon neu oder starte AndroidAPS in den System-Einstellungen neu. Anderenfalls hat AndroidAPS kein logging (wichtig zum Nachverfolgen und Verifizieren, dass der Algorithmus korrekt funktioniert) - Immer das kurze Durchschnitts-Delta statt dem einfachen Delta verwenden + Verwende das kurze durchschnittliche Delta statt des einfachen Deltas Sinnvoll, wenn die Daten von einer ungefilterten Quelle Signalrauschen haben. - Tagesinsulin-Limit wird erreicht. + Tagesinsulin-Limit wird erreicht BR - Kalibrierung an xDrip gesendet + Kalibrierung an xDrip+ gesendet Kind Warteschlange leeren Logs leeren @@ -343,123 +335,122 @@ xDrip+ nicht installiert Zeige BGI Füge BGI zur Statuszeile hinzu - Wear Einstellungen + Wear-Einstellungen Zeige detailliertes IOB - Trenne IOB in Bolus- und Basal-IOB auf dem Watchface + Differenziere IOB in Bolus- und Basal-IOB auf dem Watchface Falsches Passwort Italian Glimp MM640g - Zeit in Stunden in der zu erwarten ist, dass alle Kohlenhydrate resorbiert sein werden + Zeit in Stunden, in der zu erwarten ist, dass alle Kohlenhydrate resorbiert sein werden Maximale Essens-Resorptionszeit [h] Resorptions-Einstellungen Aktivität Erwachsener - Erweiterte Einstelungen + Erweiterte Einstellungen AndroidAPS BAS Basal-Schritt - Basal fehlt im Profil. Verwende Standardwert. - Basalwert unter dem Minimum. Profil nicht gesetzt! - Gerät untertützt anscheinend das deaktivieren der Akku-Leistungsoptimierung nicht. + Basalraten fehlen im Profil. Verwende Standard-Werte. + Wert der Basalrate unter Minimum. Profil nicht gesetzt! + Smartphone untertützt anscheinend das Deaktivieren der Akku-Leistungsoptimierung nicht! Bolus-Schritt - Werde %.2fE abgeben + Werde %.2f IE abgeben AKTIVITÄT & FEEDBACK Katheteralter CAGE CARBS & BOLUS CGM & OPENAPS Insulinalter - Dauer [min] - pausiert + Dauer [Min.] + Pausiert Patientenalter - Bitte wähle das Pateintenalter um die Sicherheits-Limits festzulegen - Ziel fehlt im Profil. Verwende Standardwert.h + Bitte wähle das Pateintenalter, um die Sicherheits-Limits festzulegen + BZ-Zielbereich fehlt im Profil. Verwende Standardwerte. Teenager - TempBasal - Tempbasal Abgabe-Fehler - TempZiel - Zeit in Stunden um die das profil zylindrisch verschoben wird. - 15Min Trend + TBR Abgabe-Fehler + Temporäres Ziel + Zeit in Stunden, um die das Profil verschoben wird. + 15-Min.-Trend COB - Nicht-unterstütze Nightscout-Version + Nicht unterstütze Nightscout-Version Uploader UPLD EXT Firmware - Virtuelle Pumpe Einstellungen + Einstellungen der virtuellen Pumpe Status zu Nightscout hochladen Superbolus - Pausiere Loop für 10h + Pausiere Loop für 10 h Insgesamt %d Einträge. Aktueller Wert: IAGE Batteriealter PUMP - Pumpen Batterie Wechsel + Pumpenbatterie-Wechsel SAGE Insulin Es sind nicht alle Profile geladen! - Aktivierung wird benötigt um Werte an die Pumpe zu senden! + muss aktiviert werden, um Werte an die Pumpe zu senden! Werte nicht gespeichert! - Aktiviere Extended Bolus in der Pumpe + Aktiviere verlängerten Bolus in der Pumpe DanaR Stats # Tage Basal Bolus Gewichtung - Zeige Extended Bolus als % an + Zeige verlängerten Bolus als % an DanaR Korean DanaRv2 - Abgeben + Jetzt abgeben DEV Gerät DIA: Deaktiviere Loop - Trenne - Trenne Pumpe für 10h - Trenne Pumpe für 1h - Trenne Pumpe für 2h - Trenne Pumpe für 30Min - Trenne Pumpe für 3h + Verbindung wird getrennt + Trenne Pumpe für 10 h + Trenne Pumpe für 1 h + Trenne Pumpe für 2 h + Trenne Pumpe für 30 Min. + Trenne Pumpe für 3 h Ignoriere Profilwechsel - Alle Profilwechsel werden ignorierd und nur das aktive Profil wird verwendet + Alle Profilwechsel werden ignoriert und nur das aktive Profil verwendet Nicht erneut anzeigen Bald essen Bearbeite Basis-Basal: Greek - aktiviere Loop + Aktiviere Loop Aktiviere SuperBolus im Wizard - Führe aus - ExtendedBolus + Wird ausgeführt + Verlängerter Bolus Fast Acting Insulin Novorapid, Novolog, Humalog Fast Acting Insulin Prolonged - Hole Pumpenstatus + Pumpenstatus wird geladen Stunden - Initialisierung... - Ungültiges oder defektes Profil!!! + Initialisierung … + Ungültiges oder defektes Profil! IOB Lokales Profil Sperrbildschirm Loop Menü - Superbolus (%d m) + Superbolus (%d Min.) Loop pausiert - pausiert (%d m) + Pausiert (%d Min.) Abbrechen OK mg/dl mmol/l Über Logs anzeigen - nicht erfolgreich - Bitte Telefon prüfen + nicht erfolgreich - bitte Telefon prüfen Nicht verfügbar - NSCLIENT hat keine Schreibrechte. Falscher API-Key? - Alarm Optionen - Aktiviere Broadcast für andere Apps (z.B. xDrip). - Aktiviere lokalen Broadcast. + NSClient hat keine Schreibrechte. Falscher API-Key? + Alarm-Optionen + Aktiviere Broadcasts für andere Apps (z. B. xDrip+). + Aktiviere lokale Broadcasts. Logge App-Start in NS - Kein Upload zu NS - Alle an NS gesendete Daten werden verworfen. AAPS ist verbunden, aber es wird keine Änderungen in NS gemacht + Kein Upload zu Nightscout + Alle an Nightscout gesendeten Daten werden verworfen. AAPS ist verbunden, aber Nightscout-Daten werden nicht geändert Hoch Niedrig Gesetzt zu %f @@ -468,16 +459,16 @@ Autoscroll Gerätenamen eingeben Gerätename - NS API-Key eingeben (min 12 Zeichen) - NightScout API-Key - NightScout API-Key + Nightscout API-Key eingeben (min. 12 Zeichen) + Nightscout API-Key + Nightscout API-Key URL: - Nightscout URL eingeben - Nightscout URL - Verifiziere, dass der BZ und Pumpen Insulin Daten in Nightscout erfolgreich hoch geladen wurden - Konfiguriere die Anzeige und das Monitoring (NS) und analysiere die Basal-Rate und die Faktoren - Lasse den OpenLoop Modus für ein paar Tage laufen und setzte manuell temp Basal-Raten - Starte den OpenLoop Modus + Nightscout-URL eingeben + Nightscout-URL + Verifiziere, dass BZ- und Pumpen-Insulin-Daten in Nightscout erfolgreich hoch geladen werden + Konfiguriere die Anzeige und das Monitoring (Nightscout) und analysiere Basal-Raten und Faktoren + Erprobe den Open Loop Modus für ein paar Tage und setze manuell temporäre Basal-Raten + Starte den Open Loop Modus VERALTETE DATEN Laufende Benachrichtigungen Öffne Einstellungen auf der Uhr @@ -485,196 +476,255 @@ OAPS OpenAPS AMA Skript Debug - Wert %s ist außerhalb des festen Limits. + Wert %s ist außerhalb des festen Limits Kalibrierung Kalibrierung - Button Text: - Extended Bolus abbrechen - Basal Wert [U/h] + Button-Text: + Verlängerten Bolus abbrechen + Basal Wert [IE/h] Profil - Setzten vom Basal Profil fehlgeschlagen - Basal Profil in der Pumpe aktualisiert + Setzen des Basal-Profils fehlgeschlagen + Basal-Profil in der Pumpe aktualisiert Profilwechsel Pumpe Pumpe nicht initialisiert! - Pumpe ist nicht initialisiert, Profil nicht gesetzt! + Pumpe nicht initialisiert, Profil nicht gesetzt! Pumpe stoppen Pumpe pausiert - Pumpe pausiert. Klicken zum aktualisieren des Status - Queue: + Pumpe pausiert. Klicke zum Aktualisieren des Status + Warteschlange: QuickWizard Aktualisiere Einträge von Nightscout Lösche Eintrag: Alle Daten erneut senden - Möchtest du die Datenbank wirklich zurücksetzten? - Restart - Beende Applikation um neue Einstellungen zu laden. - Fortsetzten + Möchtest du die Datenbank wirklich zurücksetzen? + Neustart + App wird beendet, um neue Einstellungen zu laden. + Fortsetzen Russisch - Kalibrierung %.1f an xDrip senden? + Kalibrierung %.1f an xDrip+ senden? Passwort für die Einstellungen - Setzte temp Basal + TBR wird gesetzt Kurze Tab-Überschriften Zeige Warteschlange - BZ + BZ: Basal: Bolus: Delta: IOB: Letzter BZ: Status: - Stoppe Extended Bolus - Stoppe temp Basal - Pausiere Loop für 1h - Pausiere Loop für 2h - Pausiere Loop für 3h + Verrlängerter Bolus wird abgebrochen + TBR wird abgebrochen + Pausiere Loop für 1 h + Pausiere Loop für 2 h + Pausiere Loop für 3 h Schwedish - Aktualisere Basal Raten + Basalraten werden aktualisiert Übersicht Benachrichtigungen Sensoralter - Wechsle Modus von U/d zu U/h in der Pumpe + Wechsle Modus von IE/d zu IE/h in der Pumpe Insgesamt %d Einträge erfolgreich hochgeladen Dauer der Insulinwirkung Bearbeite Basis-IC: Bearbeite Basis-ISF: - IC Angabe fehlt im Profil. Verwende default Wert. + IC-Angabe fehlt im Profil. Verwende Standard-Wert. INS - ISF fehlt im Profil. Verwende default Wert. + ISF fehlt im Profil. Verwende Standard-Wert. Sperr - %s benötigt Batterie-Optimierungs-Whitelisting um korrekt arbeiten zu können + %s benötigt Batterie-Optimierungs-Whitelisting, um korrekt arbeiten zu können Veraltete Daten - Veraltete Daten seit [Min] - Es wird verwendet für das enteredBy Feld - Autosens Daten - Max U/h die an Temp Basal gesetzt werden kann - Maximum Basal IOB, was OpenAPS abgeben darf [U] - Prozentialer Faktor um den das Basis Profil multipiziert wird. + Veraltete Daten seit [Min.] + Wird für das \"Eingegeben durch\"-Feld verwendet + Autosens-Daten + Max IE/h, die als TBR gesetzt werden können + Maximales Basal-IOB, das OpenAPS abgeben darf [IE] + Prozentualer Faktor, mit dem das Basis-Profil multipiziert wird. Bitte Rechte gewähren - Hoch und niedrig Werte für die Übersicht- und die Smartwatch-Anzeige + Hoch- und Niedrig-Werte für die Übersicht- und die Smartwatch-Anzeige Zielbereich für die Grafikanzeige - Bei aktivierter Autosense-Funktion, bitte stell sicher, das du alle gegessenen Kohlenhydrate eingibts. Ansonsten können die Kohlenhydrate-Abweichung als falsche Resistens/Empfindlichkeit identifziert werden!!! + Stelle bei aktivierter Autosense-Funktion sicher, dass du alle gegessenen Kohlenhydrate eingibst. Ansonsten können die Kohlenhydrate-Abweichung zu falsche Resistenz-/Empfindlichkeitswerten führen! Sensitivität AAPS Sensitivität Oref0 - Durschnittliche Sensitivität - Einstellung Extended Bolus - vor %dMin - Um das temp Basal zu stoppen, antworte mit dem Code %s - Bolus %.2fU erfolgreich abgegeben - xDrip hat die Kalbrierung nicht erhalten + Durchschnittliche Sensitivität + Verlängerter Bolus wird gesetzt + vor %d Min. + Um die TBR abzubrechen, antworte mit dem Code %s + Bolus %.2f IE erfolgreich abgegeben + xDrip+ hat die Kalbrierung nicht erhalten Um die Kalibrierung %.2f zu senden, antworte mit dem Code %s - Kalibrierung gesendet. Das empfangen von Kalbrierungen muss in xDrip aktiviert sein. - Falsche/Ungültige SMS Telefonnummer + Kalibrierung gesendet. Das Empfangen von Kalbrierungen muss in xDrip+ aktiviert sein. + Falsche/ungültige Telefonnummer Loop wurde deaktiviert Lopp wurde aktiviert Loop ist deaktiviert Loop ist aktiviert Loop wurde fortgesetzt Loop pausiert - Es fehlt das SMS-Recht - Basal Einstellungen per Remote ist nicht erlaubt - Kalibrierung per Remote ist nicht erlaubt - Externe Befehle sind nicht erlaubt + SMS-Steuerung nicht erlaubt + Ferngesteuerte Basal-Einstellungen sind nicht erlaubt + Ferngesteuerte Kalibrierung ist nicht erlaubt + Ferngesteuerte Befehle sind nicht erlaubt Erlaube externe Befehle per SMS - Um den Loop zu pausieren für %d Minuten, antworte mit dem Code %s - Temp Basal abgebrochen - Abbrechen des temp Basal ist fehlgeschlagen - Temp Basal starten ist fehlgeschlagen - Temp Basal %.2fU/h für %d min wurde erfolgreich gestartet + Um das Loopen für %d Minuten zu pausieren, antworte mit dem Code %s + TBR abgebrochen + Das Abbrechen der TBR ist fehlgeschlagen + Das Starten der TBR ist fehlgeschlagen + TBR mitl %.2f IE/h für %d Min. wurde erfolgreich gestartet Unbekannter Befehl oder falsche Antwort Falsche Dauer Einstellungen freischalten %.2f limitiert auf %.2f - S Bolus + S-Bolus Model: %02X Protokoll: %02X Code: %02X Empfindlichkeitserkennung COB - Aktiviere die SuperBolus-Funktion im Wizard. Nicht aktivieren, wenn du nicht weißt, was es macht! ES KANN ZU EINER ÜBERDOSIERUNG AN INSULIN KOMMEN, WENN DU ES BLIND BENUTZT! - Verstehen des OpenLoops und der Temp-Basal-Empfehlungen + Verstehen des Open Loops und der TBR-Empfehlungen Verwende AMA Autosense - Um Basal mit %.2fU/h zu starten, antworte mit dem Code %s + Um eine BR mit %.2f IE/h zu starten, antworte mit dem Code %s Fiasp Ultra-Rapid Oref - Zeige die Übersichtsbenachrichtigungen auch als Wear Bestätigungsmeldung auf der Uhr an. - Kurzes Durschnitts-Delta + Zeige die Übersichtsbenachrichtigungen auch auf der Uhr an. + Kurzes durchschnittl. Delta Rapid-Acting Oref - Default Eintrag: true. Erlaubt Autosense den Ziel-BZ-Bereich in Verbindung mit ISF und Basal anzupassen. + Vorgabe: true. Erlaubt Autosense den Ziel-BZ-Bereich in Verbindung mit ISF und Basal anzupassen. Intervall für Autosense [h] - Anzahl der Stunde von der Vergangenheit, die verwendet werden um die Sensitivität zu erkennen (Kohlenhydrate absorptuinszeit ist nicht enthalten) - Anhand von dieser Erfahrung, entscheide wie hoch max Basal sein sollte und setzte dies in der Pumpe und den Einstellungen - Lasse es im ClosedLoop Modus mit max IOB = 0 für ein paar Tage laufen ohne zu viele Unterzuckeren zu haben - Starte den ClosedLoop Modus mit Abschaltung bei niedrigen Werte - Verwende es ein paar Tage, und zumindest eine Nacht ohne Niedrig-Alarme (UZ), bevor du den BZ-Zielbereich senkst. - Fein-Einstellung des Closed-Loops, Erhöhen von max IOB über 0 und langsames Heruntersetzen des Zielbereichs. - Eine Woche erfolgreiches Looping am Tag mit regelmäßiger Kohlenhydrat-Eingabe - Passe Basal und Faktoren an, falls notwendig, und aktiviere dann die Autosense-Funktion - Aktiviere zusätzliche Funktionen tagsüber, wie z.B. den Mahlzeitenassistent + Anzahl der vergangenen Stunden, die verwendet werden, um die Sensitivität zu erkennen (Zeit, in der KH resorbiert werden, ist nicht berücksichtigt) + Entscheide anhand von dieser Erfahrung, wie hoch max Basal sein sollte, und übernehme den Wert in die Pumpen- und AAPS-Einstellungen + Erprobe den Closed Loop Modus mit max IOB = 0 für ein paar Tage, ohne zu viele Unterzuckerungen zu haben + Starte den Closed Loop Modus mit Abschaltung bei niedrigen Werte + Verwende es ein paar Tage und zumindest eine Nacht ohne Niedrig-Alarme (UZ), bevor du den BZ-Zielbereich senkst + Fein-Einstellung des Closed-Loops, Erhöhen von max IOB über 0 und langsames Heruntersetzen des Zielbereichs + Eine Woche erfolgreiches Loopen am Tag mit regelmäßiger Kohlenhydrat-Eingabe + Passe, falls notwendig, Basal und Faktoren an und aktiviere dann die Autosense-Funktion + Aktiviere zusätzliche Funktionen wie z. B. den Mahlzeitenassistent Stark veraltete Daten - Stark veraltete Daten nach [min] + Stark veraltete Daten seit [Min.] Dutch Peak Time [min] - IOB Kurve Peak Time + IOB Curve Peak Time Free-Peak Oref - DIA von %s ist zu kurz - aaps nutzt stattdessen %s! + DIA von %s ist zu kurz - AAPS nutzt stattdessen %s! Möglicherweise ungenau, wenn zum Befüllen ein Bolus verwendet wurde! Verhältnis - aktiviere Profil + AKTIVIERE PROFIL Aktivitätsdauer Aktivitätsziel BZ-Messung - Bolus Geschwindigkeit + Bolus-Geschwindigkeit Prozentsatz Zeitverschiebung BAT - CircadianPercantage - Verbindungs-Unterbrechungs-Dauer + CircadianPercentage-Profil + Zeitüberschreitung der Verbindung Füllen - DE Bolus - DS Bolus - E Bolus - Basalschritt setzen zu 0.01 U/h + DE-Bolus + DS-Bolus + E-Bolus + Setzte Basalschritt zu 0.01 IE/h Tägl. Basalmenge Tägl. Basalmenge * 2 Tägl. Gesamtdosis - Gerät nicht gefunden + Gerät noch nicht gefunden DanaRS Dana Datum - Standard Temp. Ziele - Eating Soon Dauer - Eating Soon Ziel + Standard temp. Ziele + Bald essen - Dauer + Bald essen - Ziel Reservoir leer Ausgeführt - Ermittle Bolus Status - Ermittle verz. Bolus Status - Ermittle Pumpen Einstell. - Ermittle Pumpenzeit - Ermittle temp. Basal Status + Status des verzögerten Bolus wird ermittelt + Pumpen-Einstellungen werden ermittelt + Pumpenzeit wird ermittelt + Status der TBR wird ermittelt Ungültig - Langes durchschn. Delta + Langes durchschnittl. Delta ICT - integrierter NSClient + Nighscout-Client Basaltyp - Verbindung Zeit überschritten + Zeitüberschreitung beim Pairing Verbinde neue Pumpe - Delta Einstellungen + Delta-Einstellungen Restinsulin erneut verwenden - ausgewählte Pumpe + Ausgewählte Pumpe Seriennummer - auf Verbindung warten - Setze temp. Ziele und Behandlungen auf Uhr - Steuerung von der Uhr + Auf Verbindung warten + Setze temporäre Ziele und Behandlungen mit der Uhr + Steuerung durch die Uhr SENS SEN - Verbindung OK - Verbindung + Pairing OK PRE - Interner NSClient + Nightscout-Client NSCI Lokale Alarme Benutze Systemmeldungen für Alarme und Meldungen Pumpe ist nicht erreichbar - Alarm wenn keine Glukose Daten empfangen werden - Alarm wenn die Pumpe nicht erreichbar ist - Pumpe ist nicht erreichbar Grenze [min] + Alarm, wenn keine Glukose-Daten empfangen werden + Alarm, wenn die Pumpe nicht erreichbar ist + Pumpe ist nicht erreichbar Grenze [Min.] + TZ + Bitte starte dein Telefon neu oder starte AndroidAPS in den System-Einstellungen neu. Andernfalls wird AndroidAPS nicht protokolliert (wichtig zum Nachverfolgen und Verifizieren, dass der Algorithmus korrekt funktioniert) + 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! + Status des Bolus wird ermittelt + PAIRING + Bolus-Abgabe gestartet + Warte auf Ende der Bolus-Abgabe. %d Sek. verbleiben. + Befehl wird zurzeit ausgeführt. + BZ-Werte fehlen + Deaktiviert Bluetooth kurzzeitig, falls keine Verbindung zur Pumpe besteht. Dies kann für Smartphones mit Verbindungsproblemen nützlich sein. + Essen + g + kJ + En + Pr + Fat + Wichtiger Alarm + INFO + Bluetooth + Speichere BZ-Werte in Nightscout + G5 Upload Einstellungen + Zeige detailliertes Delta + Zeige Delta mit Dezimalstelle + Nicht unterstützte Pumpen-Firmware + Sende BZ-Werte zu xDrip+ + Wähle in xDrip+ 640g/Eversense als Daten-Quelle + Nightscout-Client BZ + Basal-Wert wurde durch den kleinst möglichen Wert ersetzt + Ja + Nein + BZ Berechnung + Bolus IOB Berechnung + Basal IOB Berechnung + Trend Berechnung + Superbolus Berechnung + Nur positive + Nur negative + COB Berechnung + Temporäres Ziel Berechnung + Standardwert: 3\nDies ist eine wichtige Sicherheitseinstellung. Sie begrenzt das maximale Basal-IOB auf die dreifache Menge (im Standardfall) deiner größten Basalrate. In der Regel solltest Du diesen Wert nicht ändern. Aber Du solltest wissen, was \"3x max daily, 4x current\" als Sicherheitseinstellung bedeutet. + Standardwert: 4\nDies ist die andere wichtige Sicherheitseinstellung, die zweite Hälfte von \"3x max daily, 4x current\". Diese Grenze beschränkt das Basal-IOB auf die vierfache (im Standardfall) Menge der aktuellen Basalrate. Dies ist wichtig, um Nutzer davor zu bewahren, zuviel Basal-Insulin zu verabreichen. Nochmals, der Standardwert ist 4x. Die meisten Nutzer werden niemals diese Einstellung verändern, sondern andere Einstellungen anpassen, um sich nicht dieser Sicherheitsgrenze zu nähern. + Standardwert: 1.2\nDies ist eine Sicherheitsgrenze für autosens (und bald auch autotune), die besagt, wie hoch autosens Basalraten anpassen darf und wie niedrig der ISF (Insulin-Sensitivität-Faktor) und wie niedrig der BZ-Zielwert eingestellt werden kann. 1.2 ist dabei der Multiplikationsfaktor und erlaubt eine Anpassung um 20%. + Standardwert: 0.7\nDies ist die andere Sicherheitsgrenze für autosens. Sie beschränkt wie weit autosens Basalraten absenken und wie sehr ISF und BZ-Zielwerte erhöht werden können. + Standarwert: 2\nBolus snooze (\"Bolus-Schlummer\") bremst den Loop nach einem Mahleiten-Bolus, damit dieser nicht mit niedrigen TBR reagiert, wenn Du gerade gegessen hast. Beispiel: Der Standardwert 2 bewirkt, dass bei einem 3 Stunden DIA der Bolus snooze während 1.5 Stunden nach dem Bolus linear ausläuft (3 h Dia / 2 = 1.5 h Bolus snooze). + Standardwert: 3.0\nDies ist eine Einstellung für die Standard-Kohlenhydrat-Absorptionswirkung pro 5 Minuten. Der Standardwert ist 3mg/dl/5min. Dies wirkt sich darauf aus, wie schnell der COB-Wert fällt und wieviel KH-Absorption bei der Berechnung des vorhergesagten BZ angenommen wird, wenn der BZ stärker als erwartet fällt oder nicht so stark wie erwartet steigt. + Achtung! Normalerweise musst Du diese Werte nicht ändern. Bitte KLICKE HIER und LESE den Text. Verändere Werte erst, wenn Du den Inhalt des Textes verstanden hast. + APS ausgewählt + Loop aktiviert + Nightscout-Client hat Schreibrechte + Maximales IOB richtig gesetzt + Closed mode aktiviert + Letzte Verbindung + Basis-Basalrate + TBR + Batterie + Reservoir + Letzter Bolus: + Aktiviere zusätzliche Funktionen wie z. B. den SMB + BT Watchdog + DexcomG5 App (patched) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8d164666a3..89afa28d2e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -316,6 +316,7 @@ Adjust basals and ratios if needed, and then enable auto-sens 1 week successful daytime looping with regular carb entry Enabling additional features for daytime use, such as advanced meal assist + Enabling additional features for daytime use, such as SMB You reached allowed limit No profile selected Loop has been disabled @@ -811,5 +812,10 @@ Negative only COB calculation Temporary target calculation + Loop enabled + APS selected + NSClient has write permission + Closed mode enabled + Maximal IOB set properly diff --git a/wear/src/main/java/info/nightscout/androidaps/watchfaces/BaseWatchFace.java b/wear/src/main/java/info/nightscout/androidaps/watchfaces/BaseWatchFace.java index cb82daf3eb..c4b7c3c5f0 100644 --- a/wear/src/main/java/info/nightscout/androidaps/watchfaces/BaseWatchFace.java +++ b/wear/src/main/java/info/nightscout/androidaps/watchfaces/BaseWatchFace.java @@ -257,7 +257,7 @@ public abstract class BaseWatchFace extends WatchFace implements SharedPreferen if (layoutSet && bundle != null) { DataMap dataMap = DataMap.fromBundle(bundle); wakeLock.acquire(50); - sBasalRate = dataMap.getString("tempBasal"); + sBasalRate = dataMap.getString("currentBasal"); sUploaderBattery = dataMap.getString("battery"); sRigBattery = dataMap.getString("rigBattery"); detailedIOB = dataMap.getBoolean("detailedIob");