* A summary of event-receiver calls that occurred so far is logged
* after 10s (after startup) and then again every 60s.
- * */
+ */
public class LoggingBus extends Bus {
- private static Logger log = LoggerFactory.getLogger(LoggingBus.class);
+ private static Logger log = LoggerFactory.getLogger(L.EVENTS);
private static long everyMinute = System.currentTimeMillis() + 10 * 1000;
private Map> event2Receiver = new HashMap<>();
@@ -48,7 +51,10 @@ public class LoggingBus extends Bus {
log.debug(" source: ");
}
- super.post(event);
+ try {
+ super.post(event);
+ } catch (IllegalStateException ignored) {
+ }
}
@Override
@@ -70,16 +76,19 @@ public class LoggingBus extends Bus {
log.debug(" receiver: ");
}
- if (everyMinute < System.currentTimeMillis()) {
- log.debug("***************** Event -> receiver pairings seen so far ****************");
- for (Map.Entry> stringSetEntry : event2Receiver.entrySet()) {
- log.debug(" " + stringSetEntry.getKey());
- for (String s : stringSetEntry.getValue()) {
- log.debug(" -> " + s);
+ try {
+ if (everyMinute < System.currentTimeMillis()) {
+ log.debug("***************** Event -> receiver pairings seen so far ****************");
+ for (Map.Entry> stringSetEntry : event2Receiver.entrySet()) {
+ log.debug(" " + stringSetEntry.getKey());
+ for (String s : stringSetEntry.getValue()) {
+ log.debug(" -> " + s);
+ }
}
+ log.debug("*************************************************************************");
+ everyMinute = System.currentTimeMillis() + 60 * 1000;
}
- log.debug("*************************************************************************");
- everyMinute = System.currentTimeMillis() + 60 * 1000;
+ } catch (ConcurrentModificationException ignored) {
}
super.dispatch(event, wrapper);
diff --git a/app/src/main/java/info/nightscout/androidaps/Config.java b/app/src/main/java/info/nightscout/androidaps/Config.java
index a12e0a9ea0..ae0e14c9b6 100644
--- a/app/src/main/java/info/nightscout/androidaps/Config.java
+++ b/app/src/main/java/info/nightscout/androidaps/Config.java
@@ -6,39 +6,19 @@ package info.nightscout.androidaps;
public class Config {
public static int SUPPORTEDNSVERSION = 1002; // 0.10.00
- // MAIN FUCTIONALITY
- public static final boolean APS = BuildConfig.APS;
- // PLUGINS
- public static final boolean NSCLIENT = BuildConfig.NSCLIENTOLNY;
- public static final boolean G5UPLOADER = BuildConfig.G5UPLOADER;
- public static final boolean PUMPCONTROL = BuildConfig.PUMPCONTROL;
+ public static final boolean APS = BuildConfig.FLAVOR.equals("full");
- public static final boolean HWPUMPS = BuildConfig.PUMPDRIVERS;
+ public static final boolean NSCLIENT = BuildConfig.FLAVOR.equals("nsclient") || BuildConfig.FLAVOR.equals("nsclient2");
+ public static final boolean PUMPCONTROL = BuildConfig.FLAVOR.equals("pumpcontrol");
- public static final boolean ACTION = !BuildConfig.NSCLIENTOLNY && !BuildConfig.G5UPLOADER;
- public static final boolean MDI = !BuildConfig.NSCLIENTOLNY && !BuildConfig.G5UPLOADER;
- public static final boolean OTHERPROFILES = !BuildConfig.NSCLIENTOLNY && !BuildConfig.G5UPLOADER;
- public static final boolean SAFETY = !BuildConfig.NSCLIENTOLNY && !BuildConfig.G5UPLOADER;
+ public static final boolean PUMPDRIVERS = BuildConfig.FLAVOR.equals("full") || BuildConfig.FLAVOR.equals("pumpcontrol");
- public static final boolean SMSCOMMUNICATORENABLED = !BuildConfig.NSCLIENTOLNY && !BuildConfig.G5UPLOADER;
+ public static final boolean ACTION = !NSCLIENT;
+ public static final boolean MDI = !NSCLIENT;
+ public static final boolean OTHERPROFILES = !NSCLIENT;
+ public static final boolean SAFETY = !NSCLIENT;
+
+ public static final boolean SMSCOMMUNICATORENABLED = !NSCLIENT;
- public static final boolean detailedLog = true;
- public static final boolean logFunctionCalls = true;
- public static final boolean logIncommingData = true;
- public static final boolean logAPSResult = true;
- public static final boolean logPumpComm = true;
- public static final boolean logPrefsChange = true;
- public static final boolean logConfigBuilder = true;
- public static final boolean logNSUpload = true;
- public static final boolean logPumpActions = true;
- public static final boolean logCongigBuilderActions = true;
- public static final boolean logAutosensData = false;
- public static final boolean logEvents = false;
- public static final boolean logProfile = false;
-
- // DanaR specific
- public static final boolean logDanaBTComm = true;
- public static boolean logDanaMessageDetail = true;
- public static final boolean logDanaSerialEngine = true;
}
diff --git a/app/src/main/java/info/nightscout/androidaps/Constants.java b/app/src/main/java/info/nightscout/androidaps/Constants.java
index a66d4e77f1..ffe227dc1b 100644
--- a/app/src/main/java/info/nightscout/androidaps/Constants.java
+++ b/app/src/main/java/info/nightscout/androidaps/Constants.java
@@ -67,4 +67,5 @@ public class Constants {
//SMS Communicator
public static final long SMS_CONFIRM_TIMEOUT = T.mins(5).msecs();
+
}
diff --git a/app/src/main/java/info/nightscout/androidaps/HistoryBrowseActivity.java b/app/src/main/java/info/nightscout/androidaps/HistoryBrowseActivity.java
deleted file mode 100644
index 636db14086..0000000000
--- a/app/src/main/java/info/nightscout/androidaps/HistoryBrowseActivity.java
+++ /dev/null
@@ -1,410 +0,0 @@
-package info.nightscout.androidaps;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.support.v4.content.res.ResourcesCompat;
-import android.support.v7.app.AppCompatActivity;
-import android.support.v7.widget.PopupMenu;
-import android.text.SpannableString;
-import android.text.style.ForegroundColorSpan;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.Button;
-import android.widget.ImageButton;
-import android.widget.SeekBar;
-import android.widget.TextView;
-
-import com.jjoe64.graphview.GraphView;
-import com.squareup.otto.Subscribe;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Calendar;
-
-import butterknife.BindView;
-import butterknife.ButterKnife;
-import butterknife.OnClick;
-import butterknife.OnLongClick;
-import info.nightscout.androidaps.data.Profile;
-import info.nightscout.androidaps.events.EventCustomCalculationFinished;
-import info.nightscout.androidaps.interfaces.PumpInterface;
-import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
-import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
-import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventAutosensCalculationFinished;
-import info.nightscout.androidaps.plugins.Overview.OverviewFragment;
-import info.nightscout.androidaps.plugins.Overview.OverviewPlugin;
-import info.nightscout.androidaps.plugins.Overview.graphData.GraphData;
-import info.nightscout.utils.DateUtil;
-import info.nightscout.utils.SP;
-
-public class HistoryBrowseActivity extends AppCompatActivity {
- private static Logger log = LoggerFactory.getLogger(HistoryBrowseActivity.class);
-
-
- ImageButton chartButton;
-
- boolean showBasal = true;
- boolean showIob, showCob, showDev, showRat, showDevslope;
-
-
- @BindView(R.id.historybrowse_date)
- Button buttonDate;
- @BindView(R.id.historybrowse_zoom)
- Button buttonZoom;
- @BindView(R.id.historyybrowse_bggraph)
- GraphView bgGraph;
- @BindView(R.id.historybrowse_iobgraph)
- GraphView iobGraph;
- @BindView(R.id.historybrowse_seekBar)
- SeekBar seekBar;
- @BindView(R.id.historybrowse_noprofile)
- TextView noProfile;
-
- private int rangeToDisplay = 24; // for graph
- private long start;
-
- IobCobCalculatorPlugin iobCobCalculatorPlugin;
-
- EventCustomCalculationFinished eventCustomCalculationFinished = new EventCustomCalculationFinished();
-
- public HistoryBrowseActivity() {
- iobCobCalculatorPlugin = new IobCobCalculatorPlugin();
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_historybrowse);
-
- ButterKnife.bind(this);
-
- bgGraph.getGridLabelRenderer().setGridColor(MainApp.gc(R.color.graphgrid));
- bgGraph.getGridLabelRenderer().reloadStyles();
- iobGraph.getGridLabelRenderer().setGridColor(MainApp.gc(R.color.graphgrid));
- iobGraph.getGridLabelRenderer().reloadStyles();
- iobGraph.getGridLabelRenderer().setHorizontalLabelsVisible(false);
- bgGraph.getGridLabelRenderer().setLabelVerticalWidth(50);
- iobGraph.getGridLabelRenderer().setLabelVerticalWidth(50);
- iobGraph.getGridLabelRenderer().setNumVerticalLabels(5);
-
- setupChartMenu();
-
- // set start of current day
- Calendar calendar = Calendar.getInstance();
- calendar.setTimeInMillis(System.currentTimeMillis());
- calendar.set(Calendar.MILLISECOND, 0);
- calendar.set(Calendar.SECOND, 0);
- calendar.set(Calendar.MINUTE, 0);
- calendar.set(Calendar.HOUR_OF_DAY, 0);
- start = calendar.getTimeInMillis();
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- updateGUI("onResume");
- }
-
-
- @OnClick(R.id.historybrowse_start)
- void onClickStart() {
- }
-
- @OnClick(R.id.historybrowse_left)
- void onClickLeft() {
- start -= rangeToDisplay * 60 * 60 * 1000L;
- updateGUI("left");
- iobCobCalculatorPlugin.clearCache();
- iobCobCalculatorPlugin.runCalculation("onClickLeft", start, true, eventCustomCalculationFinished);
- }
-
- @OnClick(R.id.historybrowse_right)
- void onClickRight() {
- start += rangeToDisplay * 60 * 60 * 1000L;
- updateGUI("right");
- iobCobCalculatorPlugin.clearCache();
- iobCobCalculatorPlugin.runCalculation("onClickRight", start, true, eventCustomCalculationFinished);
- }
-
- @OnClick(R.id.historybrowse_end)
- void onClickEnd() {
- Calendar calendar = Calendar.getInstance();
- calendar.setTimeInMillis(System.currentTimeMillis());
- calendar.set(Calendar.MILLISECOND, 0);
- calendar.set(Calendar.SECOND, 0);
- calendar.set(Calendar.MINUTE, 0);
- calendar.set(Calendar.HOUR_OF_DAY, 0);
- start = calendar.getTimeInMillis();
- updateGUI("resetToMidnight");
- iobCobCalculatorPlugin.clearCache();
- iobCobCalculatorPlugin.runCalculation("onClickEnd", start, true, eventCustomCalculationFinished);
- }
-
- @OnClick(R.id.historybrowse_zoom)
- void onClickZoom() {
- rangeToDisplay += 6;
- rangeToDisplay = rangeToDisplay > 24 ? 6 : rangeToDisplay;
- updateGUI("rangeChange");
- }
-
- @OnLongClick(R.id.historybrowse_zoom)
- boolean onLongClickZoom() {
- Calendar calendar = Calendar.getInstance();
- calendar.setTimeInMillis(start);
- calendar.set(Calendar.MILLISECOND, 0);
- calendar.set(Calendar.SECOND, 0);
- calendar.set(Calendar.MINUTE, 0);
- calendar.set(Calendar.HOUR_OF_DAY, 0);
- start = calendar.getTimeInMillis();
- updateGUI("resetToMidnight");
- iobCobCalculatorPlugin.clearCache();
- iobCobCalculatorPlugin.runCalculation("onLongClickZoom", start, true, eventCustomCalculationFinished);
- return true;
- }
-
- @OnClick(R.id.historybrowse_date)
- void onClickDate() {
- }
-
- @Subscribe
- public void onStatusEvent(final EventAutosensCalculationFinished e) {
- Activity activity = this;
- if (activity != null && e.cause == eventCustomCalculationFinished) {
- log.debug("EventAutosensCalculationFinished");
- activity.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- synchronized (HistoryBrowseActivity.this) {
- updateGUI("EventAutosensCalculationFinished");
- }
- }
- });
- }
- }
-
- void updateGUI(String from) {
-
- if (noProfile == null || buttonDate == null || buttonZoom == null || bgGraph == null || iobGraph == null || seekBar == null)
- return;
-
- final PumpInterface pump = ConfigBuilderPlugin.getActivePump();
- final Profile profile = MainApp.getConfigBuilder().getProfile();
-
- if (profile == null) {
- noProfile.setVisibility(View.VISIBLE);
- return;
- } else {
- noProfile.setVisibility(View.GONE);
- }
-
- final String units = profile.getUnits();
-
- double lowLineSetting = SP.getDouble("low_mark", Profile.fromMgdlToUnits(OverviewPlugin.bgTargetLow, units));
- double highLineSetting = SP.getDouble("high_mark", Profile.fromMgdlToUnits(OverviewPlugin.bgTargetHigh, units));
-
- if (lowLineSetting < 1)
- lowLineSetting = Profile.fromMgdlToUnits(76d, units);
- if (highLineSetting < 1)
- highLineSetting = Profile.fromMgdlToUnits(180d, units);
-
- final double lowLine = lowLineSetting;
- final double highLine = highLineSetting;
-
- final boolean showPrediction = false;
-
- int hoursToFetch;
- final long toTime;
- final long fromTime;
- //if (showPrediction) {
- //int predHours = (int) (Math.ceil(((DetermineBasalResultAMA) 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 {
- fromTime = start + 100000;
- toTime = start + rangeToDisplay * 60 * 60 * 1000L;
- //}
-
- buttonDate.setText(DateUtil.dateAndTimeString(start));
- buttonZoom.setText(String.valueOf(rangeToDisplay));
-
- log.debug("Period: " + DateUtil.dateAndTimeString(fromTime) + " - " + DateUtil.dateAndTimeString(toTime));
-
- final long pointer = System.currentTimeMillis();
-
- // ------------------ 1st graph
-
- final GraphData graphData = new GraphData(bgGraph, IobCobCalculatorPlugin.getPlugin());
-
- // **** In range Area ****
- graphData.addInRangeArea(fromTime, toTime, lowLine, highLine);
-
- // **** BG ****
- if (showPrediction)
-//graphData.addBgReadings(fromTime, toTime, lowLine, highLine, (DetermineBasalResultAMA) finalLastRun.constraintsProcessed);
- ;
- else
- graphData.addBgReadings(fromTime, toTime, lowLine, highLine, null);
-
- // set manual x bounds to have nice steps
- graphData.formatAxis(fromTime, toTime);
-
- // Treatments
- graphData.addTreatments(fromTime, toTime);
-
- // add basal data
- if (pump.getPumpDescription().isTempBasalCapable && showBasal) {
- graphData.addBasals(fromTime, toTime, lowLine / graphData.maxY / 1.2d);
- }
-
- // **** NOW line ****
- graphData.addNowLine(pointer);
-
- // ------------------ 2nd graph
-
- final GraphData secondGraphData = new GraphData(iobGraph, iobCobCalculatorPlugin);
-
- boolean useIobForScale = false;
- boolean useCobForScale = false;
- boolean useDevForScale = false;
- boolean useRatioForScale = false;
- boolean useDevSlopeForScale = false;
-
- if (showIob) {
- useIobForScale = true;
- } else if (showCob) {
- useCobForScale = true;
- } else if (showDev) {
- useDevForScale = true;
- } else if (showRat) {
- useRatioForScale = true;
- } else if (showDevslope) {
- useDevSlopeForScale = true;
- }
-
- if (showIob)
- secondGraphData.addIob(fromTime, toTime, useIobForScale, 1d);
- if (showCob)
- secondGraphData.addCob(fromTime, toTime, useCobForScale, useCobForScale ? 1d : 0.5d);
- if (showDev)
- secondGraphData.addDeviations(fromTime, toTime, useDevForScale, 1d);
- if (showRat)
- secondGraphData.addRatio(fromTime, toTime, useRatioForScale, 1d);
- if (showDevslope)
- secondGraphData.addDeviationSlope(fromTime, toTime, useDevSlopeForScale, 1d);
-
- // **** NOW line ****
- // set manual x bounds to have nice steps
- secondGraphData.formatAxis(fromTime, toTime);
- secondGraphData.addNowLine(pointer);
-
- // do GUI update
- if (showIob || showCob || showDev || showRat || showDevslope) {
- iobGraph.setVisibility(View.VISIBLE);
- } else {
- iobGraph.setVisibility(View.GONE);
- }
- // finally enforce drawing of graphs
- graphData.performUpdate();
- secondGraphData.performUpdate();
- }
-
- private void setupChartMenu() {
- chartButton = (ImageButton) findViewById(R.id.overview_chartMenuButton);
- chartButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- MenuItem item;
- CharSequence title;
- SpannableString s;
- PopupMenu popup = new PopupMenu(v.getContext(), v);
-
-
- item = popup.getMenu().add(Menu.NONE, OverviewFragment.CHARTTYPE.BAS.ordinal(), Menu.NONE, MainApp.gs(R.string.overview_show_basals));
- title = item.getTitle();
- s = new SpannableString(title);
- s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.basal, null)), 0, s.length(), 0);
- item.setTitle(s);
- item.setCheckable(true);
- item.setChecked(showBasal);
-
- item = popup.getMenu().add(Menu.NONE, OverviewFragment.CHARTTYPE.IOB.ordinal(), Menu.NONE, MainApp.gs(R.string.overview_show_iob));
- title = item.getTitle();
- s = new SpannableString(title);
- s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.iob, null)), 0, s.length(), 0);
- item.setTitle(s);
- item.setCheckable(true);
- item.setChecked(showIob);
-
- item = popup.getMenu().add(Menu.NONE, OverviewFragment.CHARTTYPE.COB.ordinal(), Menu.NONE, MainApp.gs(R.string.overview_show_cob));
- title = item.getTitle();
- s = new SpannableString(title);
- s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.cob, null)), 0, s.length(), 0);
- item.setTitle(s);
- item.setCheckable(true);
- item.setChecked(showCob);
-
- item = popup.getMenu().add(Menu.NONE, OverviewFragment.CHARTTYPE.DEV.ordinal(), Menu.NONE, MainApp.gs(R.string.overview_show_deviations));
- title = item.getTitle();
- s = new SpannableString(title);
- s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.deviations, null)), 0, s.length(), 0);
- item.setTitle(s);
- item.setCheckable(true);
- item.setChecked(showDev);
-
- item = popup.getMenu().add(Menu.NONE, OverviewFragment.CHARTTYPE.SEN.ordinal(), Menu.NONE, MainApp.gs(R.string.overview_show_sensitivity));
- title = item.getTitle();
- s = new SpannableString(title);
- s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.ratio, null)), 0, s.length(), 0);
- item.setTitle(s);
- item.setCheckable(true);
- item.setChecked(showRat);
-
- if (MainApp.devBranch) {
- item = popup.getMenu().add(Menu.NONE, OverviewFragment.CHARTTYPE.DEVSLOPE.ordinal(), Menu.NONE, "Deviation slope");
- title = item.getTitle();
- s = new SpannableString(title);
- s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.devslopepos, null)), 0, s.length(), 0);
- item.setTitle(s);
- item.setCheckable(true);
- item.setChecked(showDevslope);
- }
-
- popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
- @Override
- public boolean onMenuItemClick(MenuItem item) {
- if (item.getItemId() == OverviewFragment.CHARTTYPE.BAS.ordinal()) {
- showBasal = !item.isChecked();
- } else if (item.getItemId() == OverviewFragment.CHARTTYPE.IOB.ordinal()) {
- showIob = !item.isChecked();
- } else if (item.getItemId() == OverviewFragment.CHARTTYPE.COB.ordinal()) {
- showCob = !item.isChecked();
- } else if (item.getItemId() == OverviewFragment.CHARTTYPE.DEV.ordinal()) {
- showDev = !item.isChecked();
- } else if (item.getItemId() == OverviewFragment.CHARTTYPE.SEN.ordinal()) {
- showRat = !item.isChecked();
- } else if (item.getItemId() == OverviewFragment.CHARTTYPE.DEVSLOPE.ordinal()) {
- showDevslope = !item.isChecked();
- }
- updateGUI("onGraphCheckboxesCheckedChanged");
- return true;
- }
- });
- chartButton.setImageResource(R.drawable.ic_arrow_drop_up_white_24dp);
- popup.setOnDismissListener(new PopupMenu.OnDismissListener() {
- @Override
- public void onDismiss(PopupMenu menu) {
- chartButton.setImageResource(R.drawable.ic_arrow_drop_down_white_24dp);
- }
- });
- popup.show();
- }
- });
- }
-
-}
diff --git a/app/src/main/java/info/nightscout/androidaps/MainActivity.java b/app/src/main/java/info/nightscout/androidaps/MainActivity.java
index 8a19a05f4d..6c3d6f9820 100644
--- a/app/src/main/java/info/nightscout/androidaps/MainActivity.java
+++ b/app/src/main/java/info/nightscout/androidaps/MainActivity.java
@@ -38,27 +38,30 @@ import com.squareup.otto.Subscribe;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import info.nightscout.androidaps.activities.AgreementActivity;
+import info.nightscout.androidaps.activities.HistoryBrowseActivity;
+import info.nightscout.androidaps.activities.PreferencesActivity;
+import info.nightscout.androidaps.activities.SingleFragmentActivity;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.events.EventAppExit;
import info.nightscout.androidaps.events.EventFeatureRunning;
import info.nightscout.androidaps.events.EventPreferenceChange;
import info.nightscout.androidaps.events.EventRefreshGui;
import info.nightscout.androidaps.interfaces.PluginBase;
-import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
-import info.nightscout.androidaps.plugins.Food.FoodPlugin;
-import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
+import info.nightscout.androidaps.plugins.NSClientInternal.data.NSSettingsStatus;
import info.nightscout.androidaps.setupwizard.SetupWizardActivity;
import info.nightscout.androidaps.tabs.TabPageAdapter;
import info.nightscout.utils.AndroidPermission;
-import info.nightscout.utils.ImportExportPrefs;
import info.nightscout.utils.LocaleHelper;
-import info.nightscout.utils.LogDialog;
import info.nightscout.utils.OKDialog;
import info.nightscout.utils.PasswordProtection;
import info.nightscout.utils.SP;
+import info.nightscout.utils.VersionChecker;
public class MainActivity extends AppCompatActivity {
- private static Logger log = LoggerFactory.getLogger(MainActivity.class);
+ private static Logger log = LoggerFactory.getLogger(L.CORE);
protected PowerManager.WakeLock mWakeLock;
@@ -70,7 +73,7 @@ public class MainActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- if (Config.logFunctionCalls)
+ if (L.isEnabled(L.CORE))
log.debug("onCreate");
Iconify.with(new FontAwesomeModule());
@@ -111,6 +114,7 @@ public class MainActivity extends AppCompatActivity {
public void onPageScrollStateChanged(int state) {
}
});
+ VersionChecker.check();
}
private void checkPluginPreferences(ViewPager viewPager) {
@@ -130,6 +134,9 @@ public class MainActivity extends AppCompatActivity {
protected void onResume() {
super.onResume();
+ if (L.isEnabled(L.CORE))
+ log.debug("onResume");
+
if (!SP.getBoolean(R.string.key_setupwizard_processed, false)) {
Intent intent = new Intent(this, SetupWizardActivity.class);
startActivity(intent);
@@ -139,7 +146,7 @@ public class MainActivity extends AppCompatActivity {
AndroidPermission.notifyForStoragePermission(this);
AndroidPermission.notifyForBatteryOptimizationPermission(this);
- if (BuildConfig.APS || BuildConfig.PUMPCONTROL) {
+ if (Config.PUMPDRIVERS) {
AndroidPermission.notifyForLocationPermissions(this);
AndroidPermission.notifyForSMSPermissions(this);
}
@@ -149,6 +156,8 @@ public class MainActivity extends AppCompatActivity {
@Override
public void onDestroy() {
+ if (L.isEnabled(L.CORE))
+ log.debug("onDestroy");
if (mWakeLock != null)
if (mWakeLock.isHeld())
mWakeLock.release();
@@ -187,7 +196,7 @@ public class MainActivity extends AppCompatActivity {
}
}
- boolean keepScreenOn = BuildConfig.NSCLIENTOLNY && SP.getBoolean(R.string.key_keep_screen_on, false);
+ boolean keepScreenOn = Config.NSCLIENT && SP.getBoolean(R.string.key_keep_screen_on, false);
if (keepScreenOn)
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
else
@@ -281,7 +290,7 @@ public class MainActivity extends AppCompatActivity {
private void checkUpgradeToProfileTarget() { // TODO: can be removed in the future
boolean oldKeyExists = SP.contains("openapsma_min_bg");
if (oldKeyExists) {
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
String oldRange = SP.getDouble("openapsma_min_bg", 0d) + " - " + SP.getDouble("openapsma_max_bg", 0d);
String newRange = "";
if (profile != null) {
@@ -344,7 +353,6 @@ public class MainActivity extends AppCompatActivity {
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
pluginPreferencesMenuItem = menu.findItem(R.id.nav_plugin_preferences);
- menu.findItem(R.id.nav_historybrowser).setVisible(MainApp.devBranch);
checkPluginPreferences(findViewById(R.id.pager));
return true;
}
@@ -366,42 +374,16 @@ public class MainActivity extends AppCompatActivity {
case R.id.nav_setupwizard:
startActivity(new Intent(this, SetupWizardActivity.class));
return true;
- case R.id.nav_resetdb:
- new AlertDialog.Builder(this)
- .setTitle(R.string.nav_resetdb)
- .setMessage(R.string.reset_db_confirm)
- .setNegativeButton(android.R.string.cancel, null)
- .setPositiveButton(android.R.string.ok, (dialog, which) -> {
- MainApp.getDbHelper().resetDatabases();
- // should be handled by Plugin-Interface and
- // additional service interface and plugin registry
- FoodPlugin.getPlugin().getService().resetFood();
- TreatmentsPlugin.getPlugin().getService().resetTreatments();
- })
- .create()
- .show();
- return true;
- case R.id.nav_export:
- ImportExportPrefs.verifyStoragePermissions(this);
- ImportExportPrefs.exportSharedPreferences(this);
- return true;
- case R.id.nav_import:
- ImportExportPrefs.verifyStoragePermissions(this);
- ImportExportPrefs.importSharedPreferences(this);
- return true;
- case R.id.nav_show_logcat:
- LogDialog.showLogcat(this);
- return true;
case R.id.nav_about:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(MainApp.gs(R.string.app_name) + " " + BuildConfig.VERSION);
- if (Config.NSCLIENT || Config.G5UPLOADER)
+ if (Config.NSCLIENT)
builder.setIcon(R.mipmap.yellowowl);
else
builder.setIcon(R.mipmap.blueowl);
String message = "Build: " + BuildConfig.BUILDVERSION + "\n";
message += "Flavor: " + BuildConfig.FLAVOR + BuildConfig.BUILD_TYPE + "\n";
- message += MainApp.gs(R.string.configbuilder_nightscoutversion_label) + " " + ConfigBuilderPlugin.nightscoutVersionName;
+ message += MainApp.gs(R.string.configbuilder_nightscoutversion_label) + " " + NSSettingsStatus.getInstance().nightscoutVersionName;
if (MainApp.engineeringMode)
message += "\n" + MainApp.gs(R.string.engineering_mode_enabled);
message += MainApp.gs(R.string.about_link_urls);
diff --git a/app/src/main/java/info/nightscout/androidaps/MainApp.java b/app/src/main/java/info/nightscout/androidaps/MainApp.java
index 683658918e..114a75440a 100644
--- a/app/src/main/java/info/nightscout/androidaps/MainApp.java
+++ b/app/src/main/java/info/nightscout/androidaps/MainApp.java
@@ -15,7 +15,6 @@ import android.util.Log;
import com.crashlytics.android.Crashlytics;
import com.crashlytics.android.answers.Answers;
-import com.crashlytics.android.answers.CustomEvent;
import com.j256.ormlite.android.apptools.OpenHelperManager;
import com.squareup.otto.Bus;
import com.squareup.otto.LoggingBus;
@@ -29,13 +28,12 @@ import org.slf4j.LoggerFactory;
import java.io.File;
import java.util.ArrayList;
-import ch.qos.logback.classic.LoggerContext;
-import info.nightscout.androidaps.Services.Intents;
import info.nightscout.androidaps.data.ConstraintChecker;
import info.nightscout.androidaps.db.DatabaseHelper;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.interfaces.PumpInterface;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Actions.ActionsFragment;
import info.nightscout.androidaps.plugins.Careportal.CareportalPlugin;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
@@ -46,9 +44,12 @@ import info.nightscout.androidaps.plugins.Insulin.InsulinOrefFreePeakPlugin;
import info.nightscout.androidaps.plugins.Insulin.InsulinOrefRapidActingPlugin;
import info.nightscout.androidaps.plugins.Insulin.InsulinOrefUltraRapidActingPlugin;
import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
+import info.nightscout.androidaps.plugins.Maintenance.MaintenancePlugin;
import info.nightscout.androidaps.plugins.Loop.LoopPlugin;
import info.nightscout.androidaps.plugins.NSClientInternal.NSClientPlugin;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.androidaps.plugins.NSClientInternal.receivers.AckAlarmReceiver;
+import info.nightscout.androidaps.plugins.NSClientInternal.receivers.DBAccessReceiver;
import info.nightscout.androidaps.plugins.OpenAPSAMA.OpenAPSAMAPlugin;
import info.nightscout.androidaps.plugins.OpenAPSMA.OpenAPSMAPlugin;
import info.nightscout.androidaps.plugins.OpenAPSSMB.OpenAPSSMBPlugin;
@@ -85,13 +86,14 @@ import info.nightscout.androidaps.plugins.XDripStatusline.StatuslinePlugin;
import info.nightscout.androidaps.receivers.DataReceiver;
import info.nightscout.androidaps.receivers.KeepAliveReceiver;
import info.nightscout.androidaps.receivers.NSAlarmReceiver;
+import info.nightscout.androidaps.services.Intents;
import info.nightscout.utils.FabricPrivacy;
-import info.nightscout.utils.NSUpload;
+import info.nightscout.androidaps.plugins.Maintenance.LoggerUtils;
import io.fabric.sdk.android.Fabric;
public class MainApp extends Application {
- private static Logger log = LoggerFactory.getLogger(MainApp.class);
+ private static Logger log = LoggerFactory.getLogger(L.CORE);
private static KeepAliveReceiver keepAliveReceiver;
private static Bus sBus;
@@ -107,6 +109,7 @@ public class MainApp extends Application {
private static DataReceiver dataReceiver = new DataReceiver();
private static NSAlarmReceiver alarmReciever = new NSAlarmReceiver();
private static AckAlarmReceiver ackAlarmReciever = new AckAlarmReceiver();
+ private static DBAccessReceiver dbAccessReciever = new DBAccessReceiver();
private LocalBroadcastManager lbm;
private BroadcastReceiver btReceiver; // used for RileyLink (Medtronic and Omnipod)
@@ -116,6 +119,7 @@ public class MainApp extends Application {
@Override
public void onCreate() {
super.onCreate();
+ log.debug("onCreate");
sInstance = this;
sResources = getResources();
sConstraintsChecker = new ConstraintChecker(this);
@@ -128,7 +132,7 @@ public class MainApp extends Application {
Crashlytics.setString("BUILDVERSION", BuildConfig.BUILDVERSION);
}
} catch (Exception e) {
- android.util.Log.e("ANDROIDAPS", "Error with Fabric init! " + e);
+ log.error("Error with Fabric init! " + e);
}
JodaTimeAndroid.init(this);
@@ -136,13 +140,13 @@ public class MainApp extends Application {
log.info("Version: " + BuildConfig.VERSION_NAME);
log.info("BuildVersion: " + BuildConfig.BUILDVERSION);
- String extFilesDir = this.getLogDirectory();
+ String extFilesDir = LoggerUtils.getLogDirectory();
File engineeringModeSemaphore = new File(extFilesDir, "engineering_mode");
engineeringMode = engineeringModeSemaphore.exists() && engineeringModeSemaphore.isFile();
devBranch = BuildConfig.VERSION.contains("dev");
- sBus = Config.logEvents ? new LoggingBus(ThreadEnforcer.ANY) : new Bus(ThreadEnforcer.ANY);
+ sBus = L.isEnabled(L.EVENTS) && devBranch ? new LoggingBus(ThreadEnforcer.ANY) : new Bus(ThreadEnforcer.ANY);
registerLocalBroadcastReceiver();
@@ -161,15 +165,16 @@ public class MainApp extends Application {
pluginsList.add(SensitivityAAPSPlugin.getPlugin());
pluginsList.add(SensitivityWeightedAveragePlugin.getPlugin());
pluginsList.add(SensitivityOref1Plugin.getPlugin());
- if (Config.HWPUMPS) pluginsList.add(DanaRPlugin.getPlugin());
- if (Config.HWPUMPS) pluginsList.add(DanaRKoreanPlugin.getPlugin());
- if (Config.HWPUMPS) pluginsList.add(DanaRv2Plugin.getPlugin());
- if (Config.HWPUMPS) pluginsList.add(DanaRSPlugin.getPlugin());
+ if (Config.PUMPDRIVERS) pluginsList.add(DanaRPlugin.getPlugin());
+ if (Config.PUMPDRIVERS) pluginsList.add(DanaRKoreanPlugin.getPlugin());
+ if (Config.PUMPDRIVERS) pluginsList.add(DanaRv2Plugin.getPlugin());
+ if (Config.PUMPDRIVERS) pluginsList.add(DanaRSPlugin.getPlugin());
pluginsList.add(CareportalPlugin.getPlugin());
- if (Config.HWPUMPS) pluginsList.add(MedtronicPumpPlugin.getPlugin());
- if (Config.HWPUMPS && engineeringMode)
+ if (Config.PUMPDRIVERS && engineeringMode)
pluginsList.add(InsightPlugin.getPlugin()); // <-- Enable Insight plugin here
- if (Config.HWPUMPS) pluginsList.add(ComboPlugin.getPlugin());
+ if (Config.PUMPDRIVERS) pluginsList.add(ComboPlugin.getPlugin());
+ if (Config.PUMPDRIVERS && engineeringMode)
+ pluginsList.add(MedtronicPumpPlugin.getPlugin());
if (Config.MDI) pluginsList.add(MDIPlugin.getPlugin());
pluginsList.add(VirtualPumpPlugin.getPlugin());
if (Config.APS) pluginsList.add(LoopPlugin.getPlugin());
@@ -182,18 +187,12 @@ public class MainApp extends Application {
pluginsList.add(TreatmentsPlugin.getPlugin());
if (Config.SAFETY) pluginsList.add(SafetyPlugin.getPlugin());
if (Config.APS) pluginsList.add(ObjectivesPlugin.getPlugin());
- if (!Config.NSCLIENT && !Config.G5UPLOADER)
- pluginsList.add(SourceXdripPlugin.getPlugin());
- if (!Config.G5UPLOADER)
- pluginsList.add(SourceNSClientPlugin.getPlugin());
- if (!Config.NSCLIENT && !Config.G5UPLOADER)
- pluginsList.add(SourceMM640gPlugin.getPlugin());
- if (!Config.NSCLIENT && !Config.G5UPLOADER)
- pluginsList.add(SourceGlimpPlugin.getPlugin());
- if (!Config.NSCLIENT)
- pluginsList.add(SourceDexcomG5Plugin.getPlugin());
- if (!Config.NSCLIENT)
- pluginsList.add(SourcePoctechPlugin.getPlugin());
+ pluginsList.add(SourceXdripPlugin.getPlugin());
+ pluginsList.add(SourceNSClientPlugin.getPlugin());
+ pluginsList.add(SourceMM640gPlugin.getPlugin());
+ pluginsList.add(SourceGlimpPlugin.getPlugin());
+ pluginsList.add(SourceDexcomG5Plugin.getPlugin());
+ pluginsList.add(SourcePoctechPlugin.getPlugin());
if (Config.SMSCOMMUNICATORENABLED) pluginsList.add(SmsCommunicatorPlugin.getPlugin());
pluginsList.add(FoodPlugin.getPlugin());
@@ -201,6 +200,7 @@ public class MainApp extends Application {
pluginsList.add(StatuslinePlugin.initPlugin(this));
pluginsList.add(PersistentNotificationPlugin.getPlugin());
pluginsList.add(NSClientPlugin.getPlugin());
+ pluginsList.add(MaintenancePlugin.initPlugin(this));
pluginsList.add(sConfigBuilder = ConfigBuilderPlugin.getPlugin());
@@ -242,6 +242,9 @@ public class MainApp extends Application {
//register ack alarm
lbm.registerReceiver(ackAlarmReciever, new IntentFilter(Intents.ACTION_ACK_ALARM));
+
+ //register dbaccess
+ lbm.registerReceiver(dbAccessReciever, new IntentFilter(Intents.ACTION_DATABASE));
}
private void setBTReceiver() {
@@ -275,6 +278,7 @@ public class MainApp extends Application {
}
+
private void startKeepAliveService() {
if (keepAliveReceiver == null) {
keepAliveReceiver = new KeepAliveReceiver();
@@ -422,7 +426,7 @@ public class MainApp extends Application {
}
public static boolean isEngineeringModeOrRelease() {
- if (!BuildConfig.APS)
+ if (!Config.APS)
return true;
return engineeringMode || !devBranch;
}
@@ -431,13 +435,10 @@ public class MainApp extends Application {
return devBranch;
}
- public String getLogDirectory() {
- LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
- return lc.getProperty("EXT_FILES_DIR");
- }
-
@Override
public void onTerminate() {
+ if (L.isEnabled(L.CORE))
+ log.debug("onTerminate");
super.onTerminate();
if (sDatabaseHelper != null) {
sDatabaseHelper.close();
@@ -448,5 +449,4 @@ public class MainApp extends Application {
unregisterReceiver(btReceiver);
}
}
-
}
diff --git a/app/src/main/java/info/nightscout/androidaps/Services/DataService.java b/app/src/main/java/info/nightscout/androidaps/Services/DataService.java
deleted file mode 100644
index ca7d760cc4..0000000000
--- a/app/src/main/java/info/nightscout/androidaps/Services/DataService.java
+++ /dev/null
@@ -1,616 +0,0 @@
-package info.nightscout.androidaps.Services;
-
-import android.app.IntentService;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.os.Bundle;
-import android.provider.Telephony;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import info.nightscout.androidaps.Config;
-import info.nightscout.androidaps.Constants;
-import info.nightscout.androidaps.MainApp;
-import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.data.ProfileStore;
-import info.nightscout.androidaps.db.BgReading;
-import info.nightscout.androidaps.db.CareportalEvent;
-import info.nightscout.androidaps.events.EventNsFood;
-import info.nightscout.androidaps.events.EventNsTreatment;
-import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
-import info.nightscout.androidaps.plugins.ConstraintsObjectives.ObjectivesPlugin;
-import info.nightscout.androidaps.plugins.NSClientInternal.data.NSDeviceStatus;
-import info.nightscout.androidaps.plugins.NSClientInternal.data.NSMbg;
-import info.nightscout.androidaps.plugins.NSClientInternal.data.NSSettingsStatus;
-import info.nightscout.androidaps.plugins.NSClientInternal.data.NSSgv;
-import info.nightscout.androidaps.plugins.Overview.OverviewPlugin;
-import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification;
-import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
-import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
-import info.nightscout.androidaps.plugins.ProfileNS.NSProfilePlugin;
-import info.nightscout.androidaps.plugins.ProfileNS.events.EventNSProfileUpdateGUI;
-import info.nightscout.androidaps.plugins.PumpDanaR.activities.DanaRNSHistorySync;
-import info.nightscout.androidaps.plugins.SmsCommunicator.events.EventNewSMS;
-import info.nightscout.androidaps.plugins.Source.SourceDexcomG5Plugin;
-import info.nightscout.androidaps.plugins.Source.SourceGlimpPlugin;
-import info.nightscout.androidaps.plugins.Source.SourceMM640gPlugin;
-import info.nightscout.androidaps.plugins.Source.SourceNSClientPlugin;
-import info.nightscout.androidaps.plugins.Source.SourcePoctechPlugin;
-import info.nightscout.androidaps.plugins.Source.SourceXdripPlugin;
-import info.nightscout.androidaps.receivers.DataReceiver;
-import info.nightscout.utils.BundleLogger;
-import info.nightscout.utils.JsonHelper;
-import info.nightscout.utils.NSUpload;
-import info.nightscout.utils.SP;
-
-
-public class DataService extends IntentService {
- private static Logger log = LoggerFactory.getLogger(DataService.class);
-
- boolean xDripEnabled = false;
- boolean nsClientEnabled = true;
- boolean mm640gEnabled = false;
- boolean glimpEnabled = false;
- boolean dexcomG5Enabled = false;
- boolean poctechEnabled = false;
-
- public DataService() {
- super("DataService");
- registerBus();
- }
-
- @Override
- protected void onHandleIntent(final Intent intent) {
- if (Config.logFunctionCalls)
- log.debug("onHandleIntent " + BundleLogger.log(intent.getExtras()));
- if (ConfigBuilderPlugin.getPlugin().getActiveBgSource() == null) {
- xDripEnabled = true;
- nsClientEnabled = false;
- mm640gEnabled = false;
- glimpEnabled = false;
- dexcomG5Enabled = false;
- poctechEnabled = false;
- } else if (ConfigBuilderPlugin.getPlugin().getActiveBgSource().getClass().equals(SourceXdripPlugin.class)) {
- xDripEnabled = true;
- nsClientEnabled = false;
- mm640gEnabled = false;
- glimpEnabled = false;
- dexcomG5Enabled = false;
- poctechEnabled = false;
- } else if (ConfigBuilderPlugin.getPlugin().getActiveBgSource().getClass().equals(SourceNSClientPlugin.class)) {
- xDripEnabled = false;
- nsClientEnabled = true;
- mm640gEnabled = false;
- glimpEnabled = false;
- dexcomG5Enabled = false;
- poctechEnabled = false;
- } else if (ConfigBuilderPlugin.getPlugin().getActiveBgSource().getClass().equals(SourceMM640gPlugin.class)) {
- xDripEnabled = false;
- nsClientEnabled = false;
- mm640gEnabled = true;
- glimpEnabled = false;
- dexcomG5Enabled = false;
- poctechEnabled = false;
- } else if (ConfigBuilderPlugin.getPlugin().getActiveBgSource().getClass().equals(SourceGlimpPlugin.class)) {
- xDripEnabled = false;
- nsClientEnabled = false;
- mm640gEnabled = false;
- glimpEnabled = true;
- dexcomG5Enabled = false;
- poctechEnabled = false;
- } else if (ConfigBuilderPlugin.getPlugin().getActiveBgSource().getClass().equals(SourceDexcomG5Plugin.class)) {
- xDripEnabled = false;
- nsClientEnabled = false;
- mm640gEnabled = false;
- glimpEnabled = false;
- dexcomG5Enabled = true;
- poctechEnabled = false;
- } else if (ConfigBuilderPlugin.getPlugin().getActiveBgSource().getClass().equals(SourcePoctechPlugin.class)) {
- xDripEnabled = false;
- nsClientEnabled = false;
- mm640gEnabled = false;
- glimpEnabled = false;
- dexcomG5Enabled = false;
- poctechEnabled = true;
- }
-
- boolean isNSProfile = MainApp.getConfigBuilder().getActiveProfileInterface() != null && MainApp.getConfigBuilder().getActiveProfileInterface().getClass().equals(NSProfilePlugin.class);
-
- boolean acceptNSData = !SP.getBoolean(R.string.key_ns_upload_only, false);
- Bundle bundles = intent.getExtras();
- if (bundles != null && bundles.containsKey("islocal")) {
- acceptNSData = acceptNSData || bundles.getBoolean("islocal");
- }
-
-
- if (intent != null) {
- final String action = intent.getAction();
- if (Intents.ACTION_NEW_BG_ESTIMATE.equals(action)) {
- if (xDripEnabled) {
- handleNewDataFromXDrip(intent);
- }
- } else if (Intents.NS_EMULATOR.equals(action)) {
- if (mm640gEnabled) {
- handleNewDataFromMM640g(intent);
- }
- } else if (Intents.GLIMP_BG.equals(action)) {
- if (glimpEnabled) {
- handleNewDataFromGlimp(intent);
- }
- } else if (Intents.DEXCOMG5_BG.equals(action)) {
- if (dexcomG5Enabled) {
- handleNewDataFromDexcomG5(intent);
- }
- } else if (Intents.POCTECH_BG.equals(action)) {
- if (poctechEnabled) {
- handleNewDataFromPoctech(intent);
- }
- } else if (Intents.ACTION_NEW_SGV.equals(action)) {
- if (nsClientEnabled || SP.getBoolean(R.string.key_ns_autobackfill, true))
- handleNewDataFromNSClient(intent);
- // Objectives 0
- ObjectivesPlugin.bgIsAvailableInNS = true;
- ObjectivesPlugin.saveProgress();
- } else if (isNSProfile && Intents.ACTION_NEW_PROFILE.equals(action) || Intents.ACTION_NEW_DEVICESTATUS.equals(action)) {
- // always handle Profile if NSProfile is enabled without looking at nsUploadOnly
- handleNewDataFromNSClient(intent);
- } else if (acceptNSData &&
- (Intents.ACTION_NEW_TREATMENT.equals(action) ||
- Intents.ACTION_CHANGED_TREATMENT.equals(action) ||
- Intents.ACTION_REMOVED_TREATMENT.equals(action) ||
- Intents.ACTION_NEW_STATUS.equals(action) ||
- Intents.ACTION_NEW_DEVICESTATUS.equals(action) ||
- Intents.ACTION_NEW_FOOD.equals(action) ||
- Intents.ACTION_CHANGED_FOOD.equals(action) ||
- Intents.ACTION_REMOVED_FOOD.equals(action) ||
- Intents.ACTION_NEW_CAL.equals(action) ||
- Intents.ACTION_NEW_MBG.equals(action))
- ) {
- handleNewDataFromNSClient(intent);
- } else if (Telephony.Sms.Intents.SMS_RECEIVED_ACTION.equals(action)) {
- handleNewSMS(intent);
- }
- }
- if (Config.logFunctionCalls)
- log.debug("onHandleIntent exit " + intent);
- DataReceiver.completeWakefulIntent(intent);
- }
-
-/*
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- super.onStartCommand(intent, flags, startId);
-
- if (Config.logFunctionCalls)
- log.debug("onStartCommand");
-
- return START_STICKY;
- }
-*/
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- MainApp.bus().unregister(this);
- }
-
- private void registerBus() {
- try {
- MainApp.bus().unregister(this);
- } catch (RuntimeException x) {
- // Ignore
- }
- MainApp.bus().register(this);
- }
-
- private void handleNewDataFromXDrip(Intent intent) {
- Bundle bundle = intent.getExtras();
- if (bundle == null) return;
-
- BgReading bgReading = new BgReading();
-
- bgReading.value = bundle.getDouble(Intents.EXTRA_BG_ESTIMATE);
- bgReading.direction = bundle.getString(Intents.EXTRA_BG_SLOPE_NAME);
- bgReading.date = bundle.getLong(Intents.EXTRA_TIMESTAMP);
- bgReading.raw = bundle.getDouble(Intents.EXTRA_RAW);
- String source = bundle.getString(Intents.XDRIP_DATA_SOURCE_DESCRIPTION, "no Source specified");
- SourceXdripPlugin.getPlugin().setSource(source);
- MainApp.getDbHelper().createIfNotExists(bgReading, "XDRIP");
- }
-
- private void handleNewDataFromGlimp(Intent intent) {
- Bundle bundle = intent.getExtras();
- if (bundle == null) return;
-
- BgReading bgReading = new BgReading();
-
- bgReading.value = bundle.getDouble("mySGV");
- bgReading.direction = bundle.getString("myTrend");
- bgReading.date = bundle.getLong("myTimestamp");
- bgReading.raw = 0;
-
- MainApp.getDbHelper().createIfNotExists(bgReading, "GLIMP");
- }
-
- private void handleNewDataFromDexcomG5(Intent intent) {
- // onHandleIntent Bundle{ data => [{"m_time":1511939180,"m_trend":"NotComputable","m_value":335}]; android.support.content.wakelockid => 95; }Bundle
-
- Bundle bundle = intent.getExtras();
- if (bundle == null) return;
-
- BgReading bgReading = new BgReading();
-
- String data = bundle.getString("data");
- log.debug("Received Dexcom Data", data);
-
- try {
- JSONArray jsonArray = new JSONArray(data);
- log.debug("Received Dexcom Data size:" + jsonArray.length());
- for (int i = 0; i < jsonArray.length(); i++) {
- JSONObject json = jsonArray.getJSONObject(i);
- bgReading.value = json.getInt("m_value");
- bgReading.direction = json.getString("m_trend");
- bgReading.date = json.getLong("m_time") * 1000L;
- bgReading.raw = 0;
- boolean isNew = MainApp.getDbHelper().createIfNotExists(bgReading, "DexcomG5");
- if (isNew && SP.getBoolean(R.string.key_dexcomg5_nsupload, false)) {
- NSUpload.uploadBg(bgReading);
- }
- if (isNew && SP.getBoolean(R.string.key_dexcomg5_xdripupload, false)) {
- NSUpload.sendToXdrip(bgReading);
- }
- }
-
- } catch (JSONException e) {
- e.printStackTrace();
- }
- }
-
- private void handleNewDataFromPoctech(Intent intent) {
-
- Bundle bundle = intent.getExtras();
- if (bundle == null) return;
-
- BgReading bgReading = new BgReading();
-
- String data = bundle.getString("data");
- log.debug("Received Poctech Data", data);
-
- try {
- JSONArray jsonArray = new JSONArray(data);
- log.debug("Received Poctech Data size:" + jsonArray.length());
- for (int i = 0; i < jsonArray.length(); i++) {
- JSONObject json = jsonArray.getJSONObject(i);
- bgReading.value = json.getDouble("current");
- bgReading.direction = json.getString("direction");
- bgReading.date = json.getLong("date");
- bgReading.raw = json.getDouble("raw");
- if (JsonHelper.safeGetString(json, "units", Constants.MGDL).equals("mmol/L"))
- bgReading.value = bgReading.value * Constants.MMOLL_TO_MGDL;
- boolean isNew = MainApp.getDbHelper().createIfNotExists(bgReading, "Poctech");
- if (isNew && SP.getBoolean(R.string.key_dexcomg5_nsupload, false)) {
- NSUpload.uploadBg(bgReading);
- }
- if (isNew && SP.getBoolean(R.string.key_dexcomg5_xdripupload, false)) {
- NSUpload.sendToXdrip(bgReading);
- }
- }
-
- } catch (JSONException e) {
- e.printStackTrace();
- }
- }
-
- private void handleNewDataFromMM640g(Intent intent) {
- Bundle bundle = intent.getExtras();
- if (bundle == null) return;
-
- final String collection = bundle.getString("collection");
- if (collection == null) return;
-
- if (collection.equals("entries")) {
- final String data = bundle.getString("data");
-
- if ((data != null) && (data.length() > 0)) {
- try {
- final JSONArray json_array = new JSONArray(data);
- for (int i = 0; i < json_array.length(); i++) {
- final JSONObject json_object = json_array.getJSONObject(i);
- final String type = json_object.getString("type");
- switch (type) {
- case "sgv":
- BgReading bgReading = new BgReading();
-
- bgReading.value = json_object.getDouble("sgv");
- bgReading.direction = json_object.getString("direction");
- bgReading.date = json_object.getLong("date");
- bgReading.raw = json_object.getDouble("sgv");
-
- MainApp.getDbHelper().createIfNotExists(bgReading, "MM640g");
- break;
- default:
- log.debug("Unknown entries type: " + type);
- }
- }
- } catch (JSONException e) {
- log.error("Got JSON exception: " + e);
- }
- }
- }
- }
-
- private void handleNewDataFromNSClient(Intent intent) {
- Bundle bundles = intent.getExtras();
- if (bundles == null) return;
- if (Config.logIncommingData)
- log.debug("Got intent: " + intent.getAction());
-
-
- if (intent.getAction().equals(Intents.ACTION_NEW_STATUS)) {
- if (bundles.containsKey("nsclientversioncode")) {
- ConfigBuilderPlugin.nightscoutVersionCode = bundles.getInt("nightscoutversioncode"); // for ver 1.2.3 contains 10203
- ConfigBuilderPlugin.nightscoutVersionName = bundles.getString("nightscoutversionname");
- ConfigBuilderPlugin.nsClientVersionCode = bundles.getInt("nsclientversioncode"); // for ver 1.17 contains 117
- ConfigBuilderPlugin.nsClientVersionName = bundles.getString("nsclientversionname");
- log.debug("Got versions: NSClient: " + ConfigBuilderPlugin.nsClientVersionName + " Nightscout: " + ConfigBuilderPlugin.nightscoutVersionName);
- try {
- if (ConfigBuilderPlugin.nsClientVersionCode < MainApp.instance().getPackageManager().getPackageInfo(MainApp.instance().getPackageName(), 0).versionCode) {
- Notification notification = new Notification(Notification.OLD_NSCLIENT, MainApp.gs(R.string.unsupportedclientver), Notification.URGENT);
- MainApp.bus().post(new EventNewNotification(notification));
- } else {
- MainApp.bus().post(new EventDismissNotification(Notification.OLD_NSCLIENT));
- }
- } catch (PackageManager.NameNotFoundException e) {
- log.error("Unhandled exception", e);
- }
- if (ConfigBuilderPlugin.nightscoutVersionCode < Config.SUPPORTEDNSVERSION) {
- Notification notification = new Notification(Notification.OLD_NS, MainApp.gs(R.string.unsupportednsversion), Notification.NORMAL);
- MainApp.bus().post(new EventNewNotification(notification));
- } else {
- MainApp.bus().post(new EventDismissNotification(Notification.OLD_NS));
- }
- } else {
- Notification notification = new Notification(Notification.OLD_NSCLIENT, MainApp.gs(R.string.unsupportedclientver), Notification.URGENT);
- MainApp.bus().post(new EventNewNotification(notification));
- }
- if (bundles.containsKey("status")) {
- try {
- JSONObject statusJson = new JSONObject(bundles.getString("status"));
- NSSettingsStatus.getInstance().setData(statusJson);
- if (Config.logIncommingData)
- log.debug("Received status: " + statusJson.toString());
- Double targetHigh = NSSettingsStatus.getInstance().getThreshold("bgTargetTop");
- Double targetlow = NSSettingsStatus.getInstance().getThreshold("bgTargetBottom");
- if (targetHigh != null)
- OverviewPlugin.bgTargetHigh = targetHigh;
- if (targetlow != null)
- OverviewPlugin.bgTargetLow = targetlow;
- } catch (JSONException e) {
- log.error("Unhandled exception", e);
- }
- }
- }
- if (intent.getAction().equals(Intents.ACTION_NEW_DEVICESTATUS)) {
- try {
- if (bundles.containsKey("devicestatus")) {
- JSONObject devicestatusJson = new JSONObject(bundles.getString("devicestatus"));
- NSDeviceStatus.getInstance().setData(devicestatusJson);
- if (devicestatusJson.has("pump")) {
- // Objectives 0
- ObjectivesPlugin.pumpStatusIsAvailableInNS = true;
- ObjectivesPlugin.saveProgress();
- }
- }
- if (bundles.containsKey("devicestatuses")) {
- String devicestatusesstring = bundles.getString("devicestatuses");
- JSONArray jsonArray = new JSONArray(devicestatusesstring);
- for (int i = 0; i < jsonArray.length(); i++) {
- JSONObject devicestatusJson = jsonArray.getJSONObject(i);
- NSDeviceStatus.getInstance().setData(devicestatusJson);
- if (devicestatusJson.has("pump")) {
- // Objectives 0
- ObjectivesPlugin.pumpStatusIsAvailableInNS = true;
- ObjectivesPlugin.saveProgress();
- }
- }
- }
- } catch (Exception e) {
- log.error("Unhandled exception", e);
- }
- }
- // Handle profile
- if (intent.getAction().equals(Intents.ACTION_NEW_PROFILE)) {
- try {
- String activeProfile = bundles.getString("activeprofile");
- String profile = bundles.getString("profile");
- ProfileStore profileStore = new ProfileStore(new JSONObject(profile));
- NSProfilePlugin.getPlugin().storeNewProfile(profileStore);
- MainApp.bus().post(new EventNSProfileUpdateGUI());
- if (Config.logIncommingData)
- log.debug("Received profileStore: " + activeProfile + " " + profile);
- } catch (JSONException e) {
- log.error("Unhandled exception", e);
- }
- }
-
- if (intent.getAction().equals(Intents.ACTION_NEW_TREATMENT) || intent.getAction().equals(Intents.ACTION_CHANGED_TREATMENT)) {
- try {
- if (bundles.containsKey("treatment")) {
- JSONObject json = new JSONObject(bundles.getString("treatment"));
- handleTreatmentFromNS(json, intent);
- }
- if (bundles.containsKey("treatments")) {
- String trstring = bundles.getString("treatments");
- JSONArray jsonArray = new JSONArray(trstring);
- for (int i = 0; i < jsonArray.length(); i++) {
- JSONObject json = jsonArray.getJSONObject(i);
- handleTreatmentFromNS(json, intent);
- }
- }
- } catch (JSONException e) {
- log.error("Unhandled exception", e);
- }
- }
-
- if (intent.getAction().equals(Intents.ACTION_REMOVED_TREATMENT)) {
- try {
- if (bundles.containsKey("treatment")) {
- String trstring = bundles.getString("treatment");
- JSONObject json = new JSONObject(trstring);
- handleTreatmentFromNS(json);
- }
-
- if (bundles.containsKey("treatments")) {
- String trstring = bundles.getString("treatments");
- JSONArray jsonArray = new JSONArray(trstring);
- for (int i = 0; i < jsonArray.length(); i++) {
- JSONObject json = jsonArray.getJSONObject(i);
- handleTreatmentFromNS(json);
- }
- }
- } catch (JSONException e) {
- log.error("Unhandled exception", e);
- }
- }
-
- if (intent.getAction().equals(Intents.ACTION_NEW_SGV)) {
- try {
- if (bundles.containsKey("sgv")) {
- String sgvstring = bundles.getString("sgv");
- JSONObject sgvJson = new JSONObject(sgvstring);
- storeSgv(sgvJson);
- }
-
- if (bundles.containsKey("sgvs")) {
- String sgvstring = bundles.getString("sgvs");
- JSONArray jsonArray = new JSONArray(sgvstring);
- for (int i = 0; i < jsonArray.length(); i++) {
- JSONObject sgvJson = jsonArray.getJSONObject(i);
- storeSgv(sgvJson);
- }
- }
- } catch (Exception e) {
- log.error("Unhandled exception", e);
- }
- }
-
- if (intent.getAction().equals(Intents.ACTION_NEW_MBG)) {
- try {
- if (bundles.containsKey("mbg")) {
- String mbgstring = bundles.getString("mbg");
- JSONObject mbgJson = new JSONObject(mbgstring);
- storeMbg(mbgJson);
- }
-
- if (bundles.containsKey("mbgs")) {
- String sgvstring = bundles.getString("mbgs");
- JSONArray jsonArray = new JSONArray(sgvstring);
- for (int i = 0; i < jsonArray.length(); i++) {
- JSONObject mbgJson = jsonArray.getJSONObject(i);
- storeMbg(mbgJson);
- }
- }
- } catch (Exception e) {
- log.error("Unhandled exception", e);
- }
- }
-
- if (intent.getAction().equals(Intents.ACTION_NEW_FOOD)
- || intent.getAction().equals(Intents.ACTION_CHANGED_FOOD)) {
- int mode = Intents.ACTION_NEW_FOOD.equals(intent.getAction()) ? EventNsFood.ADD : EventNsFood.UPDATE;
- EventNsFood evt = new EventNsFood(mode, bundles);
- MainApp.bus().post(evt);
- }
-
- if (intent.getAction().equals(Intents.ACTION_REMOVED_FOOD)) {
- EventNsFood evt = new EventNsFood(EventNsFood.REMOVE, bundles);
- MainApp.bus().post(evt);
- }
- }
-
- private void handleTreatmentFromNS(JSONObject json) {
- // new DB model
- EventNsTreatment evtTreatment = new EventNsTreatment(EventNsTreatment.REMOVE, json);
- MainApp.bus().post(evtTreatment);
- // old DB model
- String _id = JsonHelper.safeGetString(json, "_id");
- MainApp.getDbHelper().deleteTempTargetById(_id);
- MainApp.getDbHelper().deleteTempBasalById(_id);
- MainApp.getDbHelper().deleteExtendedBolusById(_id);
- MainApp.getDbHelper().deleteCareportalEventById(_id);
- MainApp.getDbHelper().deleteProfileSwitchById(_id);
- }
-
- private void handleTreatmentFromNS(JSONObject json, Intent intent) throws JSONException {
- // new DB model
- int mode = Intents.ACTION_NEW_TREATMENT.equals(intent.getAction()) ? EventNsTreatment.ADD : EventNsTreatment.UPDATE;
- double insulin = JsonHelper.safeGetDouble(json, "insulin");
- double carbs = JsonHelper.safeGetDouble(json, "carbs");
- String eventType = JsonHelper.safeGetString(json, "eventType");
- if (insulin > 0 || carbs > 0) {
- EventNsTreatment evtTreatment = new EventNsTreatment(mode, json);
- MainApp.bus().post(evtTreatment);
- } else if (json.has(DanaRNSHistorySync.DANARSIGNATURE)) {
- // old DB model
- MainApp.getDbHelper().updateDanaRHistoryRecordId(json);
- } else if (eventType.equals(CareportalEvent.TEMPORARYTARGET)) {
- MainApp.getDbHelper().createTemptargetFromJsonIfNotExists(json);
- } else if (eventType.equals(CareportalEvent.TEMPBASAL)) {
- MainApp.getDbHelper().createTempBasalFromJsonIfNotExists(json);
- } else if (eventType.equals(CareportalEvent.COMBOBOLUS)) {
- MainApp.getDbHelper().createExtendedBolusFromJsonIfNotExists(json);
- } else if (eventType.equals(CareportalEvent.PROFILESWITCH)) {
- MainApp.getDbHelper().createProfileSwitchFromJsonIfNotExists(json);
- } else if (eventType.equals(CareportalEvent.SITECHANGE) ||
- eventType.equals(CareportalEvent.INSULINCHANGE) ||
- eventType.equals(CareportalEvent.SENSORCHANGE) ||
- eventType.equals(CareportalEvent.BGCHECK) ||
- eventType.equals(CareportalEvent.NOTE) ||
- eventType.equals(CareportalEvent.NONE) ||
- eventType.equals(CareportalEvent.ANNOUNCEMENT) ||
- eventType.equals(CareportalEvent.QUESTION) ||
- eventType.equals(CareportalEvent.EXERCISE) ||
- eventType.equals(CareportalEvent.OPENAPSOFFLINE) ||
- eventType.equals(CareportalEvent.PUMPBATTERYCHANGE)) {
- MainApp.getDbHelper().createCareportalEventFromJsonIfNotExists(json);
- }
-
- if (eventType.equals(CareportalEvent.ANNOUNCEMENT)) {
- long date = JsonHelper.safeGetLong(json,"mills");
- long now = System.currentTimeMillis();
- String enteredBy = JsonHelper.safeGetString(json, "enteredBy", "");
- String notes = JsonHelper.safeGetString(json, "notes", "");
- if (date > now - 15 * 60 * 1000L && !notes.isEmpty()
- && !enteredBy.equals(SP.getString("careportal_enteredby", "AndroidAPS"))) {
- Notification announcement = new Notification(Notification.NSANNOUNCEMENT, notes, Notification.ANNOUNCEMENT, 60);
- MainApp.bus().post(new EventNewNotification(announcement));
- }
- }
- }
-
- private void storeMbg(JSONObject mbgJson) {
- NSMbg nsMbg = new NSMbg(mbgJson);
- CareportalEvent careportalEvent = new CareportalEvent(nsMbg);
- MainApp.getDbHelper().createOrUpdate(careportalEvent);
- if (Config.logIncommingData)
- log.debug("Adding/Updating new MBG: " + careportalEvent.log());
- }
-
- private void storeSgv(JSONObject sgvJson) {
- NSSgv nsSgv = new NSSgv(sgvJson);
- BgReading bgReading = new BgReading(nsSgv);
- MainApp.getDbHelper().createIfNotExists(bgReading, "NS");
- SourceNSClientPlugin.getPlugin().detectSource(JsonHelper.safeGetString(sgvJson, "device"), JsonHelper.safeGetLong(sgvJson, "mills"));
- }
-
- private void handleNewSMS(Intent intent) {
- Bundle bundle = intent.getExtras();
- if (bundle == null) return;
- MainApp.bus().post(new EventNewSMS(bundle));
- }
-
-}
diff --git a/app/src/main/java/info/nightscout/androidaps/AgreementActivity.java b/app/src/main/java/info/nightscout/androidaps/activities/AgreementActivity.java
similarity index 91%
rename from app/src/main/java/info/nightscout/androidaps/AgreementActivity.java
rename to app/src/main/java/info/nightscout/androidaps/activities/AgreementActivity.java
index 3a30659884..582b10d57d 100644
--- a/app/src/main/java/info/nightscout/androidaps/AgreementActivity.java
+++ b/app/src/main/java/info/nightscout/androidaps/activities/AgreementActivity.java
@@ -1,4 +1,4 @@
-package info.nightscout.androidaps;
+package info.nightscout.androidaps.activities;
import android.app.Activity;
import android.content.Intent;
@@ -9,6 +9,8 @@ import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
+import info.nightscout.androidaps.MainActivity;
+import info.nightscout.androidaps.R;
import info.nightscout.utils.SP;
public class AgreementActivity extends Activity {
diff --git a/app/src/main/java/info/nightscout/androidaps/activities/HistoryBrowseActivity.java b/app/src/main/java/info/nightscout/androidaps/activities/HistoryBrowseActivity.java
new file mode 100644
index 0000000000..0e4535a778
--- /dev/null
+++ b/app/src/main/java/info/nightscout/androidaps/activities/HistoryBrowseActivity.java
@@ -0,0 +1,435 @@
+package info.nightscout.androidaps.activities;
+
+import android.os.Bundle;
+import android.os.SystemClock;
+import android.support.v4.content.res.ResourcesCompat;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.PopupMenu;
+import android.text.SpannableString;
+import android.text.style.ForegroundColorSpan;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.Button;
+import android.widget.ImageButton;
+import android.widget.SeekBar;
+import android.widget.TextView;
+
+import com.jjoe64.graphview.GraphView;
+import com.squareup.otto.Subscribe;
+import com.wdullaer.materialdatetimepicker.date.DatePickerDialog;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Calendar;
+import java.util.Date;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import butterknife.OnClick;
+import butterknife.OnLongClick;
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.data.Profile;
+import info.nightscout.androidaps.events.EventCustomCalculationFinished;
+import info.nightscout.androidaps.interfaces.PumpInterface;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
+import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
+import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventAutosensCalculationFinished;
+import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventIobCalculationProgress;
+import info.nightscout.androidaps.plugins.Overview.OverviewFragment;
+import info.nightscout.androidaps.plugins.Overview.OverviewPlugin;
+import info.nightscout.androidaps.plugins.Overview.graphData.GraphData;
+import info.nightscout.utils.DateUtil;
+import info.nightscout.utils.T;
+
+public class HistoryBrowseActivity extends AppCompatActivity {
+ private static Logger log = LoggerFactory.getLogger(HistoryBrowseActivity.class);
+
+
+ ImageButton chartButton;
+
+ boolean showBasal = true;
+ boolean showIob, showCob, showDev, showRat, showDevslope;
+
+
+ @BindView(R.id.historybrowse_date)
+ Button buttonDate;
+ @BindView(R.id.historybrowse_zoom)
+ Button buttonZoom;
+ @BindView(R.id.historyybrowse_bggraph)
+ GraphView bgGraph;
+ @BindView(R.id.historybrowse_iobgraph)
+ GraphView iobGraph;
+ @BindView(R.id.historybrowse_seekBar)
+ SeekBar seekBar;
+ @BindView(R.id.historybrowse_noprofile)
+ TextView noProfile;
+ @BindView(R.id.overview_iobcalculationprogess)
+ TextView iobCalculationProgressView;
+
+ private int rangeToDisplay = 24; // for graph
+ private long start = 0;
+
+ IobCobCalculatorPlugin iobCobCalculatorPlugin;
+
+ EventCustomCalculationFinished eventCustomCalculationFinished = new EventCustomCalculationFinished();
+
+ public HistoryBrowseActivity() {
+ iobCobCalculatorPlugin = new IobCobCalculatorPlugin();
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_historybrowse);
+
+ ButterKnife.bind(this);
+
+ bgGraph.getGridLabelRenderer().setGridColor(MainApp.gc(R.color.graphgrid));
+ bgGraph.getGridLabelRenderer().reloadStyles();
+ iobGraph.getGridLabelRenderer().setGridColor(MainApp.gc(R.color.graphgrid));
+ iobGraph.getGridLabelRenderer().reloadStyles();
+ iobGraph.getGridLabelRenderer().setHorizontalLabelsVisible(false);
+ bgGraph.getGridLabelRenderer().setLabelVerticalWidth(50);
+ iobGraph.getGridLabelRenderer().setLabelVerticalWidth(50);
+ iobGraph.getGridLabelRenderer().setNumVerticalLabels(5);
+
+ setupChartMenu();
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ MainApp.bus().unregister(this);
+ iobCobCalculatorPlugin.stopCalculation("onPause");
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ MainApp.bus().register(this);
+ // set start of current day
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTimeInMillis(System.currentTimeMillis());
+ calendar.set(Calendar.MILLISECOND, 0);
+ calendar.set(Calendar.SECOND, 0);
+ calendar.set(Calendar.MINUTE, 0);
+ calendar.set(Calendar.HOUR_OF_DAY, 0);
+ start = calendar.getTimeInMillis();
+ runCalculation("onResume");
+ SystemClock.sleep(1000);
+ updateGUI("onResume");
+ }
+
+ @OnClick(R.id.historybrowse_left)
+ void onClickLeft() {
+ start -= T.hours(rangeToDisplay).msecs();
+ updateGUI("onClickLeft");
+ runCalculation("onClickLeft");
+ }
+
+ @OnClick(R.id.historybrowse_right)
+ void onClickRight() {
+ start += T.hours(rangeToDisplay).msecs();
+ updateGUI("onClickRight");
+ runCalculation("onClickRight");
+ }
+
+ @OnClick(R.id.historybrowse_end)
+ void onClickEnd() {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTimeInMillis(System.currentTimeMillis());
+ calendar.set(Calendar.MILLISECOND, 0);
+ calendar.set(Calendar.SECOND, 0);
+ calendar.set(Calendar.MINUTE, 0);
+ calendar.set(Calendar.HOUR_OF_DAY, 0);
+ start = calendar.getTimeInMillis();
+ updateGUI("onClickEnd");
+ runCalculation("onClickEnd");
+ }
+
+ @OnClick(R.id.historybrowse_zoom)
+ void onClickZoom() {
+ rangeToDisplay += 6;
+ rangeToDisplay = rangeToDisplay > 24 ? 6 : rangeToDisplay;
+ updateGUI("rangeChange");
+ }
+
+ @OnLongClick(R.id.historybrowse_zoom)
+ boolean onLongClickZoom() {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTimeInMillis(start);
+ calendar.set(Calendar.MILLISECOND, 0);
+ calendar.set(Calendar.SECOND, 0);
+ calendar.set(Calendar.MINUTE, 0);
+ calendar.set(Calendar.HOUR_OF_DAY, 0);
+ start = calendar.getTimeInMillis();
+ updateGUI("resetToMidnight");
+ runCalculation("onLongClickZoom");
+ return true;
+ }
+
+ @OnClick(R.id.historybrowse_date)
+ void onClickDate() {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(new Date(start));
+ DatePickerDialog dpd = DatePickerDialog.newInstance(
+ (view, year, monthOfYear, dayOfMonth) -> {
+ Date date = new Date(0);
+ date.setYear(year - 1900);
+ date.setMonth(monthOfYear);
+ date.setDate(dayOfMonth);
+ date.setHours(0);
+ start = date.getTime();
+ updateGUI("onClickDate");
+ runCalculation("onClickDate");
+ },
+ calendar.get(Calendar.YEAR),
+ calendar.get(Calendar.MONTH),
+ calendar.get(Calendar.DAY_OF_MONTH)
+ );
+ dpd.setThemeDark(true);
+ dpd.dismissOnPause(true);
+ dpd.show(getFragmentManager(), "Datepickerdialog");
+ }
+
+ private void runCalculation(String from) {
+ long end = start + T.hours(rangeToDisplay).msecs();
+ iobCobCalculatorPlugin.stopCalculation(from);
+ iobCobCalculatorPlugin.clearCache();
+ iobCobCalculatorPlugin.runCalculation(from, end, true, false, eventCustomCalculationFinished);
+ }
+
+ @Subscribe
+ public void onStatusEvent(final EventAutosensCalculationFinished e) {
+ if (e.cause == eventCustomCalculationFinished) {
+ log.debug("EventAutosensCalculationFinished");
+ runOnUiThread(() -> {
+ synchronized (HistoryBrowseActivity.this) {
+ updateGUI("EventAutosensCalculationFinished");
+ }
+ });
+ }
+ }
+
+ @Subscribe
+ public void onStatusEvent(final EventIobCalculationProgress e) {
+ runOnUiThread(() -> {
+ if (iobCalculationProgressView != null)
+ iobCalculationProgressView.setText(e.progress);
+ });
+ }
+
+ void updateGUI(String from) {
+ log.debug("updateGUI from: " + from);
+
+ if (noProfile == null || buttonDate == null || buttonZoom == null || bgGraph == null || iobGraph == null || seekBar == null)
+ return;
+
+ final PumpInterface pump = ConfigBuilderPlugin.getActivePump();
+ final Profile profile = ProfileFunctions.getInstance().getProfile();
+
+ if (profile == null) {
+ noProfile.setVisibility(View.VISIBLE);
+ return;
+ } else {
+ noProfile.setVisibility(View.GONE);
+ }
+
+ final String units = profile.getUnits();
+ final double lowLine = OverviewPlugin.getPlugin().determineLowLine(units);
+ final double highLine = OverviewPlugin.getPlugin().determineHighLine(units);
+
+ buttonDate.setText(DateUtil.dateAndTimeString(start));
+ buttonZoom.setText(String.valueOf(rangeToDisplay));
+
+ final boolean showPrediction = false;
+
+ int hoursToFetch;
+ final long toTime;
+ final long fromTime;
+ //if (showPrediction) {
+ //int predHours = (int) (Math.ceil(((DetermineBasalResultAMA) 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 {
+ fromTime = start + T.secs(100).msecs();
+ toTime = start + T.hours(rangeToDisplay).msecs();
+ //}
+
+ log.debug("Period: " + DateUtil.dateAndTimeString(fromTime) + " - " + DateUtil.dateAndTimeString(toTime));
+
+ final long pointer = System.currentTimeMillis();
+
+ // ------------------ 1st graph
+
+ final GraphData graphData = new GraphData(bgGraph, iobCobCalculatorPlugin);
+
+ // **** In range Area ****
+ graphData.addInRangeArea(fromTime, toTime, lowLine, highLine);
+
+ // **** BG ****
+ if (showPrediction)
+//graphData.addBgReadings(fromTime, toTime, lowLine, highLine, (DetermineBasalResultAMA) finalLastRun.constraintsProcessed);
+ ;
+ else
+ graphData.addBgReadings(fromTime, toTime, lowLine, highLine, null);
+
+ // set manual x bounds to have nice steps
+ graphData.formatAxis(fromTime, toTime);
+
+ // Treatments
+ graphData.addTreatments(fromTime, toTime);
+
+ // add basal data
+ if (pump.getPumpDescription().isTempBasalCapable && showBasal) {
+ graphData.addBasals(fromTime, toTime, lowLine / graphData.maxY / 1.2d);
+ }
+
+ // **** NOW line ****
+ graphData.addNowLine(pointer);
+
+ // ------------------ 2nd graph
+
+ new Thread(() -> {
+ final GraphData secondGraphData = new GraphData(iobGraph, iobCobCalculatorPlugin);
+
+ boolean useIobForScale = false;
+ boolean useCobForScale = false;
+ boolean useDevForScale = false;
+ boolean useRatioForScale = false;
+ boolean useDSForScale = false;
+
+ if (showIob) {
+ useIobForScale = true;
+ } else if (showCob) {
+ useCobForScale = true;
+ } else if (showDev) {
+ useDevForScale = true;
+ } else if (showRat) {
+ useRatioForScale = true;
+ } else if (showDevslope) {
+ useDSForScale = true;
+ }
+
+ if (showIob)
+ secondGraphData.addIob(fromTime, toTime, useIobForScale, 1d);
+ if (showCob)
+ secondGraphData.addCob(fromTime, toTime, useCobForScale, useCobForScale ? 1d : 0.5d);
+ if (showDev)
+ secondGraphData.addDeviations(fromTime, toTime, useDevForScale, 1d);
+ if (showRat)
+ secondGraphData.addRatio(fromTime, toTime, useRatioForScale, 1d);
+ if (showDevslope)
+ secondGraphData.addDeviationSlope(fromTime, toTime, useDSForScale, 1d);
+
+ // **** NOW line ****
+ // set manual x bounds to have nice steps
+ secondGraphData.formatAxis(fromTime, toTime);
+ secondGraphData.addNowLine(pointer);
+
+ // do GUI update
+ runOnUiThread(() -> {
+ if (showIob || showCob || showDev || showRat || showDevslope) {
+ iobGraph.setVisibility(View.VISIBLE);
+ } else {
+ iobGraph.setVisibility(View.GONE);
+ }
+ // finally enforce drawing of graphs
+ graphData.performUpdate();
+ if (showIob || showCob || showDev || showRat || showDevslope)
+ secondGraphData.performUpdate();
+ });
+ }).start();
+ }
+
+ private void setupChartMenu() {
+ chartButton = (ImageButton) findViewById(R.id.overview_chartMenuButton);
+ chartButton.setOnClickListener(v -> {
+ MenuItem item;
+ CharSequence title;
+ SpannableString s;
+ PopupMenu popup = new PopupMenu(v.getContext(), v);
+
+
+ item = popup.getMenu().add(Menu.NONE, OverviewFragment.CHARTTYPE.BAS.ordinal(), Menu.NONE, MainApp.gs(R.string.overview_show_basals));
+ title = item.getTitle();
+ s = new SpannableString(title);
+ s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.basal, null)), 0, s.length(), 0);
+ item.setTitle(s);
+ item.setCheckable(true);
+ item.setChecked(showBasal);
+
+ item = popup.getMenu().add(Menu.NONE, OverviewFragment.CHARTTYPE.IOB.ordinal(), Menu.NONE, MainApp.gs(R.string.overview_show_iob));
+ title = item.getTitle();
+ s = new SpannableString(title);
+ s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.iob, null)), 0, s.length(), 0);
+ item.setTitle(s);
+ item.setCheckable(true);
+ item.setChecked(showIob);
+
+ item = popup.getMenu().add(Menu.NONE, OverviewFragment.CHARTTYPE.COB.ordinal(), Menu.NONE, MainApp.gs(R.string.overview_show_cob));
+ title = item.getTitle();
+ s = new SpannableString(title);
+ s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.cob, null)), 0, s.length(), 0);
+ item.setTitle(s);
+ item.setCheckable(true);
+ item.setChecked(showCob);
+
+ item = popup.getMenu().add(Menu.NONE, OverviewFragment.CHARTTYPE.DEV.ordinal(), Menu.NONE, MainApp.gs(R.string.overview_show_deviations));
+ title = item.getTitle();
+ s = new SpannableString(title);
+ s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.deviations, null)), 0, s.length(), 0);
+ item.setTitle(s);
+ item.setCheckable(true);
+ item.setChecked(showDev);
+
+ item = popup.getMenu().add(Menu.NONE, OverviewFragment.CHARTTYPE.SEN.ordinal(), Menu.NONE, MainApp.gs(R.string.overview_show_sensitivity));
+ title = item.getTitle();
+ s = new SpannableString(title);
+ s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.ratio, null)), 0, s.length(), 0);
+ item.setTitle(s);
+ item.setCheckable(true);
+ item.setChecked(showRat);
+
+ if (MainApp.devBranch) {
+ item = popup.getMenu().add(Menu.NONE, OverviewFragment.CHARTTYPE.DEVSLOPE.ordinal(), Menu.NONE, "Deviation slope");
+ title = item.getTitle();
+ s = new SpannableString(title);
+ s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.devslopepos, null)), 0, s.length(), 0);
+ item.setTitle(s);
+ item.setCheckable(true);
+ item.setChecked(showDevslope);
+ }
+
+ popup.setOnMenuItemClickListener(item1 -> {
+ if (item1.getItemId() == OverviewFragment.CHARTTYPE.BAS.ordinal()) {
+ showBasal = !item1.isChecked();
+ } else if (item1.getItemId() == OverviewFragment.CHARTTYPE.IOB.ordinal()) {
+ showIob = !item1.isChecked();
+ } else if (item1.getItemId() == OverviewFragment.CHARTTYPE.COB.ordinal()) {
+ showCob = !item1.isChecked();
+ } else if (item1.getItemId() == OverviewFragment.CHARTTYPE.DEV.ordinal()) {
+ showDev = !item1.isChecked();
+ } else if (item1.getItemId() == OverviewFragment.CHARTTYPE.SEN.ordinal()) {
+ showRat = !item1.isChecked();
+ } else if (item1.getItemId() == OverviewFragment.CHARTTYPE.DEVSLOPE.ordinal()) {
+ showDevslope = !item1.isChecked();
+ }
+ updateGUI("onGraphCheckboxesCheckedChanged");
+ return true;
+ });
+ chartButton.setImageResource(R.drawable.ic_arrow_drop_up_white_24dp);
+ popup.setOnDismissListener(menu -> chartButton.setImageResource(R.drawable.ic_arrow_drop_down_white_24dp));
+ popup.show();
+ });
+ }
+
+}
diff --git a/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java b/app/src/main/java/info/nightscout/androidaps/activities/PreferencesActivity.java
similarity index 95%
rename from app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java
rename to app/src/main/java/info/nightscout/androidaps/activities/PreferencesActivity.java
index b84f407b33..c17146f5d6 100644
--- a/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java
+++ b/app/src/main/java/info/nightscout/androidaps/activities/PreferencesActivity.java
@@ -1,4 +1,4 @@
-package info.nightscout.androidaps;
+package info.nightscout.androidaps.activities;
import android.content.SharedPreferences;
import android.os.Bundle;
@@ -11,6 +11,9 @@ import android.preference.PreferenceGroup;
import android.preference.PreferenceManager;
import android.text.TextUtils;
+import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.R;
import info.nightscout.androidaps.events.EventPreferenceChange;
import info.nightscout.androidaps.events.EventRefreshGui;
import info.nightscout.androidaps.interfaces.PluginBase;
@@ -88,7 +91,7 @@ public class PreferencesActivity extends PreferenceActivity implements SharedPre
pref.setSummary("******");
} else if (pref.getKey().equals(MainApp.gs(R.string.key_danars_name))) {
pref.setSummary(SP.getString(R.string.key_danars_name, ""));
- } else if (editTextPref.getText() != null && !editTextPref.getText().equals("")) {
+ } else if (editTextPref.getText() != null) {
((EditTextPreference) pref).setDialogMessage(editTextPref.getDialogMessage());
pref.setSummary(editTextPref.getText());
} else if (pref.getKey().contains("smscommunicator_allowednumbers") && TextUtils.isEmpty(editTextPref.getText().trim())) {
@@ -134,7 +137,7 @@ public class PreferencesActivity extends PreferenceActivity implements SharedPre
addPreferencesFromResource(id);
} else {
- if (!Config.NSCLIENT && !Config.G5UPLOADER) {
+ if (!Config.NSCLIENT) {
addPreferencesFromResource(R.xml.pref_password);
}
addPreferencesFromResource(R.xml.pref_age);
@@ -157,7 +160,7 @@ public class PreferencesActivity extends PreferenceActivity implements SharedPre
addPreferencesFromResourceIfEnabled(SensitivityOref0Plugin.getPlugin(), PluginType.SENSITIVITY);
addPreferencesFromResourceIfEnabled(SensitivityOref1Plugin.getPlugin(), PluginType.SENSITIVITY);
- if (Config.HWPUMPS) {
+ if (Config.PUMPDRIVERS) {
addPreferencesFromResourceIfEnabled(DanaRPlugin.getPlugin(), PluginType.PUMP);
addPreferencesFromResourceIfEnabled(DanaRKoreanPlugin.getPlugin(), PluginType.PUMP);
addPreferencesFromResourceIfEnabled(DanaRv2Plugin.getPlugin(), PluginType.PUMP);
@@ -174,7 +177,7 @@ public class PreferencesActivity extends PreferenceActivity implements SharedPre
}
}
- if (!Config.NSCLIENT && !Config.G5UPLOADER) {
+ if (!Config.NSCLIENT) {
addPreferencesFromResourceIfEnabled(VirtualPumpPlugin.getPlugin(), PluginType.PUMP);
}
@@ -185,9 +188,7 @@ public class PreferencesActivity extends PreferenceActivity implements SharedPre
addPreferencesFromResourceIfEnabled(NSClientPlugin.getPlugin(), PluginType.GENERAL);
addPreferencesFromResourceIfEnabled(SmsCommunicatorPlugin.getPlugin(), PluginType.GENERAL);
- if (!Config.NSCLIENT && !Config.G5UPLOADER) {
- addPreferencesFromResource(R.xml.pref_others);
- }
+ addPreferencesFromResource(R.xml.pref_others);
addPreferencesFromResource(R.xml.pref_datachoices);
addPreferencesFromResourceIfEnabled(WearPlugin.getPlugin(), PluginType.GENERAL);
diff --git a/app/src/main/java/info/nightscout/androidaps/SingleFragmentActivity.java b/app/src/main/java/info/nightscout/androidaps/activities/SingleFragmentActivity.java
similarity index 91%
rename from app/src/main/java/info/nightscout/androidaps/SingleFragmentActivity.java
rename to app/src/main/java/info/nightscout/androidaps/activities/SingleFragmentActivity.java
index 567799fe5e..04fd7a6be7 100644
--- a/app/src/main/java/info/nightscout/androidaps/SingleFragmentActivity.java
+++ b/app/src/main/java/info/nightscout/androidaps/activities/SingleFragmentActivity.java
@@ -1,16 +1,17 @@
-package info.nightscout.androidaps;
+package info.nightscout.androidaps.activities;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
-import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.activities.PreferencesActivity;
import info.nightscout.androidaps.interfaces.PluginBase;
-import info.nightscout.androidaps.tabs.TabPageAdapter;
import info.nightscout.utils.PasswordProtection;
public class SingleFragmentActivity extends AppCompatActivity {
diff --git a/app/src/main/java/info/nightscout/androidaps/TDDStatsActivity.java b/app/src/main/java/info/nightscout/androidaps/activities/TDDStatsActivity.java
similarity index 98%
rename from app/src/main/java/info/nightscout/androidaps/TDDStatsActivity.java
rename to app/src/main/java/info/nightscout/androidaps/activities/TDDStatsActivity.java
index 7bc3ee31c5..e18e2552eb 100644
--- a/app/src/main/java/info/nightscout/androidaps/TDDStatsActivity.java
+++ b/app/src/main/java/info/nightscout/androidaps/activities/TDDStatsActivity.java
@@ -1,4 +1,4 @@
-package info.nightscout.androidaps;
+package info.nightscout.androidaps.activities;
import android.app.Activity;
import android.graphics.Color;
@@ -33,14 +33,15 @@ import java.util.Date;
import java.util.LinkedList;
import java.util.List;
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.Profile;
-import info.nightscout.androidaps.db.DanaRHistoryRecord;
import info.nightscout.androidaps.db.TDD;
import info.nightscout.androidaps.events.EventPumpStatusChanged;
import info.nightscout.androidaps.interfaces.PumpInterface;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin;
-import info.nightscout.androidaps.plugins.PumpDanaR.comm.RecordTypes;
import info.nightscout.androidaps.plugins.PumpDanaR.events.EventDanaRSyncStatus;
import info.nightscout.androidaps.plugins.PumpDanaRKorean.DanaRKoreanPlugin;
import info.nightscout.androidaps.plugins.PumpDanaRS.DanaRSPlugin;
@@ -121,7 +122,7 @@ public class TDDStatsActivity extends Activity {
TBB = SP.getString("TBB", "10.00");
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
if (profile != null) {
double cppTBB = profile.baseBasalSum();
TBB = decimalFormat.format(cppTBB);
diff --git a/app/src/main/java/info/nightscout/androidaps/data/ConstraintChecker.java b/app/src/main/java/info/nightscout/androidaps/data/ConstraintChecker.java
index bfbbfedbd1..fc37f5f2a5 100644
--- a/app/src/main/java/info/nightscout/androidaps/data/ConstraintChecker.java
+++ b/app/src/main/java/info/nightscout/androidaps/data/ConstraintChecker.java
@@ -58,6 +58,10 @@ public class ConstraintChecker implements ConstraintsInterface {
return applyBolusConstraints(new Constraint<>(Constants.REALLYHIGHBOLUS));
}
+ public Constraint getMaxExtendedBolusAllowed() {
+ return applyExtendedBolusConstraints(new Constraint<>(Constants.REALLYHIGHBOLUS));
+ }
+
public Constraint getMaxCarbsAllowed() {
return applyCarbsConstraints(new Constraint<>(Constants.REALLYHIGHCARBS));
}
@@ -170,6 +174,17 @@ public class ConstraintChecker implements ConstraintsInterface {
return insulin;
}
+ @Override
+ public Constraint applyExtendedBolusConstraints(Constraint insulin) {
+ ArrayList constraintsPlugins = mainApp.getSpecificPluginsListByInterface(ConstraintsInterface.class);
+ for (PluginBase p : constraintsPlugins) {
+ ConstraintsInterface constrain = (ConstraintsInterface) p;
+ if (!p.isEnabled(PluginType.CONSTRAINTS)) continue;
+ constrain.applyExtendedBolusConstraints(insulin);
+ }
+ return insulin;
+ }
+
@Override
public Constraint applyCarbsConstraints(Constraint carbs) {
ArrayList constraintsPlugins = mainApp.getSpecificPluginsListByInterface(ConstraintsInterface.class);
diff --git a/app/src/main/java/info/nightscout/androidaps/data/DetailedBolusInfo.java b/app/src/main/java/info/nightscout/androidaps/data/DetailedBolusInfo.java
index 6e65e6d6d3..51a1e18685 100644
--- a/app/src/main/java/info/nightscout/androidaps/data/DetailedBolusInfo.java
+++ b/app/src/main/java/info/nightscout/androidaps/data/DetailedBolusInfo.java
@@ -57,6 +57,7 @@ public class DetailedBolusInfo {
@Override
public String toString() {
return new Date(date).toLocaleString() +
+ " date: " + date +
" insulin: " + insulin +
" carbs: " + carbs +
" isValid: " + isValid +
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 7412f8ce4c..748710f17a 100644
--- a/app/src/main/java/info/nightscout/androidaps/data/Profile.java
+++ b/app/src/main/java/info/nightscout/androidaps/data/Profile.java
@@ -52,6 +52,14 @@ public class Profile {
protected Profile() {
}
+ @Override
+ public String toString() {
+ if (json != null)
+ return json.toString();
+ else
+ return "Profile has no JSON";
+ }
+
// Constructor from profileStore JSON
public Profile(JSONObject json, String units) {
init(json, 100, 0);
@@ -295,8 +303,6 @@ public class Profile {
Integer getShitfTimeSecs(Integer originalTime) {
Integer shiftedTime = originalTime + timeshift * 60 * 60;
shiftedTime = (shiftedTime + 24 * 60 * 60) % (24 * 60 * 60);
- if (timeshift != 0 && Config.logProfile)
- log.debug("(Sec) Original time: " + originalTime + " ShiftedTime: " + shiftedTime);
return shiftedTime;
}
diff --git a/app/src/main/java/info/nightscout/androidaps/data/PumpEnactResult.java b/app/src/main/java/info/nightscout/androidaps/data/PumpEnactResult.java
index eebd42f5d2..404833b77c 100644
--- a/app/src/main/java/info/nightscout/androidaps/data/PumpEnactResult.java
+++ b/app/src/main/java/info/nightscout/androidaps/data/PumpEnactResult.java
@@ -10,11 +10,12 @@ import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.utils.DecimalFormatter;
import info.nightscout.utils.Round;
public class PumpEnactResult {
- private static Logger log = LoggerFactory.getLogger(PumpEnactResult.class);
+ private static Logger log = LoggerFactory.getLogger(L.APS);
public boolean success = false; // request was processed successfully (but possible no change was needed)
public boolean enacted = false; // request was processed successfully and change has been made
@@ -107,7 +108,7 @@ public class PumpEnactResult {
if (bolusDelivered > 0) {
ret += "\n" + MainApp.gs(R.string.enacted) + ": " + enacted;
ret += "\n" + MainApp.gs(R.string.comment) + ": " + comment;
- ret += "\n" + MainApp.gs(R.string.smb_shortname)
+ ret += "\n" + MainApp.gs(R.string.configbuilder_insulin)
+ ": " + bolusDelivered + " " + MainApp.gs(R.string.insulin_unit_shortname);
} else if (isTempCancel) {
ret += "\n" + MainApp.gs(R.string.enacted) + ": " + enacted;
diff --git a/app/src/main/java/info/nightscout/androidaps/db/BgReading.java b/app/src/main/java/info/nightscout/androidaps/db/BgReading.java
index 5ddb7a80b2..a2e06d0bb1 100644
--- a/app/src/main/java/info/nightscout/androidaps/db/BgReading.java
+++ b/app/src/main/java/info/nightscout/androidaps/db/BgReading.java
@@ -15,6 +15,8 @@ import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.Profile;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSSgv;
import info.nightscout.androidaps.plugins.Overview.OverviewPlugin;
import info.nightscout.androidaps.plugins.Overview.graphExtensions.DataPointWithLabelInterface;
@@ -24,7 +26,7 @@ import info.nightscout.utils.SP;
@DatabaseTable(tableName = DatabaseHelper.DATABASE_BGREADINGS)
public class BgReading implements DataPointWithLabelInterface {
- private static Logger log = LoggerFactory.getLogger(BgReading.class);
+ private static Logger log = LoggerFactory.getLogger(L.DATABASE);
@DatabaseField(id = true)
public long date;
@@ -142,7 +144,7 @@ public class BgReading implements DataPointWithLabelInterface {
return false;
if (raw != other.raw)
return false;
- if (!direction.equals(other.direction))
+ if (!Objects.equals(direction, other.direction))
return false;
if (!Objects.equals(_id, other._id))
return false;
@@ -160,6 +162,21 @@ public class BgReading implements DataPointWithLabelInterface {
_id = other._id;
}
+ public BgReading date(long date) {
+ this.date = date;
+ return this;
+ }
+
+ public BgReading date(Date date) {
+ this.date = date.getTime();
+ return this;
+ }
+
+ public BgReading value(double value) {
+ this.value = value;
+ return this;
+ }
+
// ------------------ DataPointWithLabelInterface ------------------
@Override
public double getX() {
@@ -168,7 +185,7 @@ public class BgReading implements DataPointWithLabelInterface {
@Override
public double getY() {
- String units = MainApp.getConfigBuilder().getProfileUnits();
+ String units = ProfileFunctions.getInstance().getProfileUnits();
return valueToUnits(units);
}
@@ -202,7 +219,7 @@ public class BgReading implements DataPointWithLabelInterface {
@Override
public int getColor() {
- String units = MainApp.getConfigBuilder().getProfileUnits();
+ String units = ProfileFunctions.getInstance().getProfileUnits();
Double lowLine = SP.getDouble("low_mark", 0d);
Double highLine = SP.getDouble("high_mark", 0d);
if (lowLine < 1) {
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 6cda2ab4ce..60c7553cc3 100644
--- a/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java
+++ b/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java
@@ -25,6 +25,8 @@ import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.interfaces.Interval;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSMbg;
import info.nightscout.androidaps.plugins.Overview.OverviewFragment;
import info.nightscout.androidaps.plugins.Overview.graphExtensions.DataPointWithLabelInterface;
@@ -35,7 +37,7 @@ import info.nightscout.utils.Translator;
@DatabaseTable(tableName = DatabaseHelper.DATABASE_CAREPORTALEVENTS)
public class CareportalEvent implements DataPointWithLabelInterface, Interval {
- private static Logger log = LoggerFactory.getLogger(CareportalEvent.class);
+ private static Logger log = LoggerFactory.getLogger(L.DATABASE);
@DatabaseField(id = true)
public long date;
@@ -95,14 +97,17 @@ public class CareportalEvent implements DataPointWithLabelInterface, Interval {
public String age() {
Map diff = computeDiff(date, System.currentTimeMillis());
if (OverviewFragment.shorttextmode)
- return diff.get(TimeUnit.DAYS) +"d" + diff.get(TimeUnit.HOURS) + "h";
+ return diff.get(TimeUnit.DAYS) + "d" + diff.get(TimeUnit.HOURS) + "h";
else
return diff.get(TimeUnit.DAYS) + " " + MainApp.gs(R.string.days) + " " + diff.get(TimeUnit.HOURS) + " " + MainApp.gs(R.string.hours);
}
- public boolean isOlderThan(double hours) { return getHoursFromStart() > hours; }
+ public boolean isOlderThan(double hours) {
+ return getHoursFromStart() > hours;
+ }
- public String log() {
+ @Override
+ public String toString() {
return "CareportalEvent{" +
"date= " + date +
", date= " + DateUtil.dateAndTimeString(date) +
@@ -134,11 +139,11 @@ public class CareportalEvent implements DataPointWithLabelInterface, Interval {
for (int i = 0; i < list.size(); i++) {
CareportalEvent event = list.get(i);
if (event.date <= time && event.date > (time - T.mins(5).msecs())) {
- //log.debug("Found event for time: " + DateUtil.dateAndTimeString(time) + " " + event.toString());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("Found event for time: " + DateUtil.dateAndTimeFullString(time) + " " + event.toString());
return true;
}
}
- //log.debug("WWWWWW No found event for time: " + DateUtil.dateAndTimeString(time));
return false;
}
@@ -153,7 +158,7 @@ public class CareportalEvent implements DataPointWithLabelInterface, Interval {
@Override
public double getY() {
- String units = MainApp.getConfigBuilder().getProfileUnits();
+ String units = ProfileFunctions.getInstance().getProfileUnits();
if (eventType.equals(MBG)) {
double mbg = 0d;
try {
diff --git a/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java b/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java
index f869ca36c5..e640d0eebe 100644
--- a/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java
+++ b/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java
@@ -27,8 +27,6 @@ import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
-import info.nightscout.androidaps.Config;
-import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.data.OverlappingIntervals;
import info.nightscout.androidaps.data.Profile;
@@ -43,12 +41,15 @@ import info.nightscout.androidaps.events.EventReloadTempBasalData;
import info.nightscout.androidaps.events.EventReloadTreatmentData;
import info.nightscout.androidaps.events.EventTempBasalChange;
import info.nightscout.androidaps.events.EventTempTargetChange;
+import info.nightscout.androidaps.interfaces.ProfileInterface;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventNewHistoryData;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.androidaps.plugins.PumpDanaR.activities.DanaRNSHistorySync;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.RecordTypes;
import info.nightscout.androidaps.plugins.PumpVirtual.VirtualPumpPlugin;
import info.nightscout.utils.JsonHelper;
-import info.nightscout.utils.NSUpload;
import info.nightscout.utils.PercentageSplitter;
import info.nightscout.utils.ToastUtils;
@@ -61,7 +62,7 @@ import info.nightscout.utils.ToastUtils;
* direct calls to the corresponding methods (eg. resetDatabases) should be done by a central service.
*/
public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
- private static Logger log = LoggerFactory.getLogger(DatabaseHelper.class);
+ private static Logger log = LoggerFactory.getLogger(L.DATABASE);
public static final String DATABASE_NAME = "AndroidAPSDb";
public static final String DATABASE_BGREADINGS = "BgReadings";
@@ -74,7 +75,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
public static final String DATABASE_PROFILESWITCHES = "ProfileSwitches";
public static final String DATABASE_TDDS = "TDDs";
- private static final int DATABASE_VERSION = 8;
+ private static final int DATABASE_VERSION = 9;
public static Long earliestDataChange = null;
@@ -108,7 +109,8 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
@Override
public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
try {
- log.info("onCreate");
+ if (L.isEnabled(L.DATABASE))
+ log.info("onCreate");
TableUtils.createTableIfNotExists(connectionSource, TempTarget.class);
TableUtils.createTableIfNotExists(connectionSource, BgReading.class);
TableUtils.createTableIfNotExists(connectionSource, DanaRHistoryRecord.class);
@@ -132,6 +134,8 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
if (oldVersion == 7 && newVersion == 8) {
log.debug("Upgrading database from v7 to v8");
+ } else if (oldVersion == 8 && newVersion == 9) {
+ log.debug("Upgrading database from v8 to v9");
} else {
log.info(DatabaseHelper.class.getName(), "onUpgrade");
TableUtils.dropTable(connectionSource, TempTarget.class, true);
@@ -197,7 +201,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
} catch (SQLException e) {
log.error("Unhandled exception", e);
}
- VirtualPumpPlugin.setFakingStatus(true);
+ VirtualPumpPlugin.getPlugin().setFakingStatus(true);
scheduleBgChange(null); // trigger refresh
scheduleTemporaryBasalChange();
scheduleExtendedBolusChange();
@@ -233,7 +237,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
} catch (SQLException e) {
log.error("Unhandled exception", e);
}
- VirtualPumpPlugin.setFakingStatus(false);
+ VirtualPumpPlugin.getPlugin().setFakingStatus(false);
scheduleTemporaryBasalChange();
}
@@ -316,7 +320,11 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
}
public static long roundDateToSec(long date) {
- return date - date % 1000;
+ long rounded = date - date % 1000;
+ if (rounded != date)
+ if (L.isEnabled(L.DATABASE))
+ log.debug("Rounding " + date + " to " + rounded);
+ return rounded;
}
// ------------------- BgReading handling -----------------------
@@ -326,15 +334,18 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
BgReading old = getDaoBgReadings().queryForId(bgReading.date);
if (old == null) {
getDaoBgReadings().create(bgReading);
- log.debug("BG: New record from: " + from + " " + bgReading.toString());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("BG: New record from: " + from + " " + bgReading.toString());
scheduleBgChange(bgReading);
return true;
}
if (!old.isEqual(bgReading)) {
- log.debug("BG: Similiar found: " + old.toString());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("BG: Similiar found: " + old.toString());
old.copyFrom(bgReading);
getDaoBgReadings().update(old);
- log.debug("BG: Updating record from: " + from + " New data: " + old.toString());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("BG: Updating record from: " + from + " New data: " + old.toString());
scheduleBgChange(bgReading);
return false;
}
@@ -356,7 +367,8 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
private static void scheduleBgChange(@Nullable final BgReading bgReading) {
class PostRunnable implements Runnable {
public void run() {
- log.debug("Firing EventNewBg");
+ if (L.isEnabled(L.DATABASE))
+ log.debug("Firing EventNewBg");
MainApp.bus().post(new EventNewBG(bgReading));
scheduledBgPost = null;
}
@@ -388,7 +400,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
bgList = daoBgReadings.query(preparedQuery);
} catch (SQLException e) {
- log.debug(e.getMessage(), e);
+ log.error("Unhandled exception", e);
}
if (bgList != null && bgList.size() > 0)
return bgList.get(0);
@@ -431,6 +443,23 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
return new ArrayList();
}
+ public List getBgreadingsDataFromTime(long start, long end, boolean ascending) {
+ try {
+ Dao daoBgreadings = getDaoBgReadings();
+ List bgReadings;
+ QueryBuilder queryBuilder = daoBgreadings.queryBuilder();
+ queryBuilder.orderBy("date", ascending);
+ Where where = queryBuilder.where();
+ where.between("date", start, end).and().gt("value", 38).and().eq("isValid", true);
+ PreparedQuery preparedQuery = queryBuilder.prepare();
+ bgReadings = daoBgreadings.query(preparedQuery);
+ return bgReadings;
+ } catch (SQLException e) {
+ log.error("Unhandled exception", e);
+ }
+ return new ArrayList();
+ }
+
public List getAllBgreadingsDataFromTime(long mills, boolean ascending) {
try {
Dao daoBgreadings = getDaoBgReadings();
@@ -579,7 +608,8 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
getDaoTempTargets().delete(old); // need to delete/create because date may change too
old.copyFrom(tempTarget);
getDaoTempTargets().create(old);
- log.debug("TEMPTARGET: Updating record by date from: " + Source.getString(tempTarget.source) + " " + old.toString());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("TEMPTARGET: Updating record by date from: " + Source.getString(tempTarget.source) + " " + old.toString());
scheduleTemporaryTargetChange();
return true;
}
@@ -598,20 +628,23 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
getDaoTempTargets().delete(old); // need to delete/create because date may change too
old.copyFrom(tempTarget);
getDaoTempTargets().create(old);
- log.debug("TEMPTARGET: Updating record by _id from: " + Source.getString(tempTarget.source) + " " + old.toString());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("TEMPTARGET: Updating record by _id from: " + Source.getString(tempTarget.source) + " " + old.toString());
scheduleTemporaryTargetChange();
return true;
}
}
}
getDaoTempTargets().create(tempTarget);
- log.debug("TEMPTARGET: New record from: " + Source.getString(tempTarget.source) + " " + tempTarget.toString());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("TEMPTARGET: New record from: " + Source.getString(tempTarget.source) + " " + tempTarget.toString());
scheduleTemporaryTargetChange();
return true;
}
if (tempTarget.source == Source.USER) {
getDaoTempTargets().create(tempTarget);
- log.debug("TEMPTARGET: New record from: " + Source.getString(tempTarget.source) + " " + tempTarget.toString());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("TEMPTARGET: New record from: " + Source.getString(tempTarget.source) + " " + tempTarget.toString());
scheduleTemporaryTargetChange();
return true;
}
@@ -633,7 +666,8 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
private static void scheduleTemporaryTargetChange() {
class PostRunnable implements Runnable {
public void run() {
- log.debug("Firing EventTempTargetChange");
+ if (L.isEnabled(L.DATABASE))
+ log.debug("Firing EventTempTargetChange");
MainApp.bus().post(new EventTempTargetChange());
scheduledTemTargetPost = null;
}
@@ -665,13 +699,13 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
public void createTemptargetFromJsonIfNotExists(JSONObject trJson) {
try {
- String units = JsonHelper.safeGetString(trJson, "units", MainApp.getConfigBuilder().getProfileUnits());
+ String units = JsonHelper.safeGetString(trJson, "units", ProfileFunctions.getInstance().getProfileUnits());
TempTarget tempTarget = new TempTarget()
.date(trJson.getLong("mills"))
.duration(trJson.getInt("duration"))
.low(Profile.toMgdl(trJson.getDouble("targetBottom"), units))
.high(Profile.toMgdl(trJson.getDouble("targetTop"), units))
- .reason(trJson.getString("reason"))
+ .reason(JsonHelper.safeGetString(trJson, "reason", ""))
._id(trJson.getString("_id"))
.source(Source.NIGHTSCOUT);
createOrUpdate(tempTarget);
@@ -753,7 +787,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
} else if (list.size() == 1) {
DanaRHistoryRecord record = list.get(0);
if (record._id == null || !record._id.equals(trJson.getString("_id"))) {
- if (Config.logIncommingData)
+ if (L.isEnabled(L.DATABASE))
log.debug("Updating _id in DanaR history database: " + trJson.getString("_id"));
record._id = trJson.getString("_id");
getDaoDanaRHistory().update(record);
@@ -783,11 +817,13 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
List trList = getDaoTemporaryBasal().query(preparedQuery);
if (trList.size() > 0) {
// do nothing, pump history record cannot be changed
- log.debug("TEMPBASAL: Already exists from: " + Source.getString(tempBasal.source) + " " + tempBasal.toString());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("TEMPBASAL: Already exists from: " + Source.getString(tempBasal.source) + " " + tempBasal.toString());
return false;
}
getDaoTemporaryBasal().create(tempBasal);
- log.debug("TEMPBASAL: New record from: " + Source.getString(tempBasal.source) + " " + tempBasal.toString());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("TEMPBASAL: New record from: " + Source.getString(tempBasal.source) + " " + tempBasal.toString());
updateEarliestDataChange(tempBasal.date);
scheduleTemporaryBasalChange();
return true;
@@ -804,7 +840,8 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
getDaoTemporaryBasal().delete(old); // need to delete/create because date may change too
old.copyFrom(tempBasal);
getDaoTemporaryBasal().create(old);
- log.debug("TEMPBASAL: Updating record by date from: " + Source.getString(tempBasal.source) + " " + old.toString());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("TEMPBASAL: Updating record by date from: " + Source.getString(tempBasal.source) + " " + old.toString());
updateEarliestDataChange(oldDate);
updateEarliestDataChange(old.date);
scheduleTemporaryBasalChange();
@@ -826,7 +863,8 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
getDaoTemporaryBasal().delete(old); // need to delete/create because date may change too
old.copyFrom(tempBasal);
getDaoTemporaryBasal().create(old);
- log.debug("TEMPBASAL: Updating record by _id from: " + Source.getString(tempBasal.source) + " " + old.toString());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("TEMPBASAL: Updating record by _id from: " + Source.getString(tempBasal.source) + " " + old.toString());
updateEarliestDataChange(oldDate);
updateEarliestDataChange(old.date);
scheduleTemporaryBasalChange();
@@ -835,14 +873,16 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
}
}
getDaoTemporaryBasal().create(tempBasal);
- log.debug("TEMPBASAL: New record from: " + Source.getString(tempBasal.source) + " " + tempBasal.toString());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("TEMPBASAL: New record from: " + Source.getString(tempBasal.source) + " " + tempBasal.toString());
updateEarliestDataChange(tempBasal.date);
scheduleTemporaryBasalChange();
return true;
}
if (tempBasal.source == Source.USER) {
getDaoTemporaryBasal().create(tempBasal);
- log.debug("TEMPBASAL: New record from: " + Source.getString(tempBasal.source) + " " + tempBasal.toString());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("TEMPBASAL: New record from: " + Source.getString(tempBasal.source) + " " + tempBasal.toString());
updateEarliestDataChange(tempBasal.date);
scheduleTemporaryBasalChange();
return true;
@@ -882,7 +922,8 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
private static void scheduleTemporaryBasalChange() {
class PostRunnable implements Runnable {
public void run() {
- log.debug("Firing EventTempBasalChange");
+ if (L.isEnabled(L.DATABASE))
+ log.debug("Firing EventTempBasalChange");
MainApp.bus().post(new EventReloadTempBasalData());
MainApp.bus().post(new EventTempBasalChange());
if (earliestDataChange != null)
@@ -920,15 +961,16 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
public void createTempBasalFromJsonIfNotExists(JSONObject trJson) {
try {
if (trJson.has("originalExtendedAmount")) { // extended bolus uploaded as temp basal
- ExtendedBolus extendedBolus = new ExtendedBolus();
- extendedBolus.source = Source.NIGHTSCOUT;
- extendedBolus.date = trJson.getLong("mills");
- extendedBolus.pumpId = trJson.has("pumpId") ? trJson.getLong("pumpId") : 0;
- extendedBolus.durationInMinutes = trJson.getInt("duration");
- extendedBolus.insulin = trJson.getDouble("originalExtendedAmount");
- extendedBolus._id = trJson.getString("_id");
- if (!VirtualPumpPlugin.getFakingStatus()) {
- VirtualPumpPlugin.setFakingStatus(true);
+ ExtendedBolus extendedBolus = new ExtendedBolus()
+ .source(Source.NIGHTSCOUT)
+ .date(trJson.getLong("mills"))
+ .pumpId(trJson.has("pumpId") ? trJson.getLong("pumpId") : 0)
+ .durationInMinutes(trJson.getInt("duration"))
+ .insulin(trJson.getDouble("originalExtendedAmount"))
+ ._id(trJson.getString("_id"));
+ // if faking found in NS, adapt AAPS to use it too
+ if (!VirtualPumpPlugin.getPlugin().getFakingStatus()) {
+ VirtualPumpPlugin.getPlugin().setFakingStatus(true);
updateEarliestDataChange(0);
scheduleTemporaryBasalChange();
}
@@ -941,8 +983,9 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
extendedBolus.durationInMinutes = 0;
extendedBolus.insulin = 0;
extendedBolus._id = trJson.getString("_id");
- if (!VirtualPumpPlugin.getFakingStatus()) {
- VirtualPumpPlugin.setFakingStatus(true);
+ // if faking found in NS, adapt AAPS to use it too
+ if (!VirtualPumpPlugin.getPlugin().getFakingStatus()) {
+ VirtualPumpPlugin.getPlugin().setFakingStatus(true);
updateEarliestDataChange(0);
scheduleTemporaryBasalChange();
}
@@ -974,7 +1017,8 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
public void deleteTempBasalById(String _id) {
TemporaryBasal stored = findTempBasalById(_id);
if (stored != null) {
- log.debug("TEMPBASAL: Removing TempBasal record from database: " + stored.toString());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("TEMPBASAL: Removing TempBasal record from database: " + stored.toString());
delete(stored);
updateEarliestDataChange(stored.date);
scheduleTemporaryBasalChange();
@@ -1005,22 +1049,33 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
public boolean createOrUpdate(ExtendedBolus extendedBolus) {
try {
+ if (L.isEnabled(L.DATABASE))
+ log.debug("EXTENDEDBOLUS: createOrUpdate: " + Source.getString(extendedBolus.source) + " " + extendedBolus.log());
+
ExtendedBolus old;
extendedBolus.date = roundDateToSec(extendedBolus.date);
if (extendedBolus.source == Source.PUMP) {
- // check for changed from pump change in NS
- QueryBuilder queryBuilder = getDaoExtendedBolus().queryBuilder();
- Where where = queryBuilder.where();
- where.eq("pumpId", extendedBolus.pumpId);
- PreparedQuery preparedQuery = queryBuilder.prepare();
- List trList = getDaoExtendedBolus().query(preparedQuery);
- if (trList.size() > 0) {
- // do nothing, pump history record cannot be changed
- return false;
+ // if pumpId == 0 do not check for existing pumpId
+ // used with pumps without history
+ // and insight where record as added first without pumpId
+ // and then is record updated with pumpId
+ if (extendedBolus.pumpId == 0) {
+ getDaoExtendedBolus().createOrUpdate(extendedBolus);
+ } else {
+ QueryBuilder queryBuilder = getDaoExtendedBolus().queryBuilder();
+ Where where = queryBuilder.where();
+ where.eq("pumpId", extendedBolus.pumpId);
+ PreparedQuery preparedQuery = queryBuilder.prepare();
+ List trList = getDaoExtendedBolus().query(preparedQuery);
+ if (trList.size() > 1) {
+ log.error("EXTENDEDBOLUS: Multiple records found for pumpId: " + extendedBolus.pumpId);
+ return false;
+ }
+ getDaoExtendedBolus().createOrUpdate(extendedBolus);
}
- getDaoExtendedBolus().create(extendedBolus);
- log.debug("EXTENDEDBOLUS: New record from: " + Source.getString(extendedBolus.source) + " " + extendedBolus.toString());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("EXTENDEDBOLUS: New record from: " + Source.getString(extendedBolus.source) + " " + extendedBolus.log());
updateEarliestDataChange(extendedBolus.date);
scheduleExtendedBolusChange();
return true;
@@ -1033,7 +1088,8 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
getDaoExtendedBolus().delete(old); // need to delete/create because date may change too
old.copyFrom(extendedBolus);
getDaoExtendedBolus().create(old);
- log.debug("EXTENDEDBOLUS: Updating record by date from: " + Source.getString(extendedBolus.source) + " " + old.toString());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("EXTENDEDBOLUS: Updating record by date from: " + Source.getString(extendedBolus.source) + " " + old.log());
updateEarliestDataChange(oldDate);
updateEarliestDataChange(old.date);
scheduleExtendedBolusChange();
@@ -1055,7 +1111,8 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
getDaoExtendedBolus().delete(old); // need to delete/create because date may change too
old.copyFrom(extendedBolus);
getDaoExtendedBolus().create(old);
- log.debug("EXTENDEDBOLUS: Updating record by _id from: " + Source.getString(extendedBolus.source) + " " + old.toString());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("EXTENDEDBOLUS: Updating record by _id from: " + Source.getString(extendedBolus.source) + " " + old.log());
updateEarliestDataChange(oldDate);
updateEarliestDataChange(old.date);
scheduleExtendedBolusChange();
@@ -1064,14 +1121,16 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
}
}
getDaoExtendedBolus().create(extendedBolus);
- log.debug("EXTENDEDBOLUS: New record from: " + Source.getString(extendedBolus.source) + " " + extendedBolus.toString());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("EXTENDEDBOLUS: New record from: " + Source.getString(extendedBolus.source) + " " + extendedBolus.log());
updateEarliestDataChange(extendedBolus.date);
scheduleExtendedBolusChange();
return true;
}
if (extendedBolus.source == Source.USER) {
getDaoExtendedBolus().create(extendedBolus);
- log.debug("EXTENDEDBOLUS: New record from: " + Source.getString(extendedBolus.source) + " " + extendedBolus.toString());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("EXTENDEDBOLUS: New record from: " + Source.getString(extendedBolus.source) + " " + extendedBolus.log());
updateEarliestDataChange(extendedBolus.date);
scheduleExtendedBolusChange();
return true;
@@ -1111,7 +1170,8 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
public void deleteExtendedBolusById(String _id) {
ExtendedBolus stored = findExtendedBolusById(_id);
if (stored != null) {
- log.debug("EXTENDEDBOLUS: Removing ExtendedBolus record from database: " + stored.toString());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("EXTENDEDBOLUS: Removing ExtendedBolus record from database: " + stored.toString());
delete(stored);
updateEarliestDataChange(stored.date);
scheduleExtendedBolusChange();
@@ -1164,7 +1224,8 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
private static void scheduleExtendedBolusChange() {
class PostRunnable implements Runnable {
public void run() {
- log.debug("Firing EventExtendedBolusChange");
+ if (L.isEnabled(L.DATABASE))
+ log.debug("Firing EventExtendedBolusChange");
MainApp.bus().post(new EventReloadTreatmentData(new EventExtendedBolusChange()));
if (earliestDataChange != null)
MainApp.bus().post(new EventNewHistoryData(earliestDataChange));
@@ -1304,11 +1365,11 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
if (list.size() == 1) {
CareportalEvent record = list.get(0);
- if (Config.logIncommingData)
- log.debug("Removing CareportalEvent record from database: " + record.log());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("Removing CareportalEvent record from database: " + record.toString());
delete(record);
} else {
- if (Config.logIncommingData)
+ if (L.isEnabled(L.DATABASE))
log.debug("CareportalEvent not found database: " + _id);
}
} catch (SQLException e) {
@@ -1328,12 +1389,12 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
if (list.size() == 0) {
careportalEvent = new CareportalEvent();
careportalEvent.source = Source.NIGHTSCOUT;
- if (Config.logIncommingData)
+ if (L.isEnabled(L.DATABASE))
log.debug("Adding CareportalEvent record to database: " + trJson.toString());
// Record does not exists. add
} else if (list.size() == 1) {
careportalEvent = list.get(0);
- if (Config.logIncommingData)
+ if (L.isEnabled(L.DATABASE))
log.debug("Updating CareportalEvent record in database: " + trJson.toString());
} else {
log.error("Something went wrong");
@@ -1352,7 +1413,8 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
private static void scheduleCareportalEventChange() {
class PostRunnable implements Runnable {
public void run() {
- log.debug("Firing scheduleCareportalEventChange");
+ if (L.isEnabled(L.DATABASE))
+ log.debug("Firing scheduleCareportalEventChange");
MainApp.bus().post(new EventCareportalEventChange());
scheduledCareportalEventPost = null;
}
@@ -1385,6 +1447,24 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
return new ArrayList<>();
}
+ public List getProfileSwitchEventsFromTime(long mills, boolean ascending) {
+ try {
+ Dao daoProfileSwitch = getDaoProfileSwitch();
+ List profileSwitches;
+ QueryBuilder queryBuilder = daoProfileSwitch.queryBuilder();
+ queryBuilder.orderBy("date", ascending);
+ queryBuilder.limit(100L);
+ Where where = queryBuilder.where();
+ where.ge("date", mills);
+ PreparedQuery preparedQuery = queryBuilder.prepare();
+ profileSwitches = daoProfileSwitch.query(preparedQuery);
+ return profileSwitches;
+ } catch (SQLException e) {
+ log.error("Unhandled exception", e);
+ }
+ return new ArrayList<>();
+ }
+
public boolean createOrUpdate(ProfileSwitch profileSwitch) {
try {
ProfileSwitch old;
@@ -1398,7 +1478,8 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
profileSwitch.profileName = old.profileName; // preserver profileName to prevent multiple CPP extension
getDaoProfileSwitch().delete(old); // need to delete/create because date may change too
getDaoProfileSwitch().create(profileSwitch);
- log.debug("PROFILESWITCH: Updating record by date from: " + Source.getString(profileSwitch.source) + " " + old.toString());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("PROFILESWITCH: Updating record by date from: " + Source.getString(profileSwitch.source) + " " + old.toString());
scheduleProfileSwitchChange();
return true;
}
@@ -1417,7 +1498,8 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
getDaoProfileSwitch().delete(old); // need to delete/create because date may change too
old.copyFrom(profileSwitch);
getDaoProfileSwitch().create(old);
- log.debug("PROFILESWITCH: Updating record by _id from: " + Source.getString(profileSwitch.source) + " " + old.toString());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("PROFILESWITCH: Updating record by _id from: " + Source.getString(profileSwitch.source) + " " + old.toString());
scheduleProfileSwitchChange();
return true;
}
@@ -1426,13 +1508,15 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
// look for already added percentage from NS
profileSwitch.profileName = PercentageSplitter.pureName(profileSwitch.profileName);
getDaoProfileSwitch().create(profileSwitch);
- log.debug("PROFILESWITCH: New record from: " + Source.getString(profileSwitch.source) + " " + profileSwitch.toString());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("PROFILESWITCH: New record from: " + Source.getString(profileSwitch.source) + " " + profileSwitch.toString());
scheduleProfileSwitchChange();
return true;
}
if (profileSwitch.source == Source.USER) {
getDaoProfileSwitch().create(profileSwitch);
- log.debug("PROFILESWITCH: New record from: " + Source.getString(profileSwitch.source) + " " + profileSwitch.toString());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("PROFILESWITCH: New record from: " + Source.getString(profileSwitch.source) + " " + profileSwitch.toString());
scheduleProfileSwitchChange();
return true;
}
@@ -1454,7 +1538,8 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
private static void scheduleProfileSwitchChange() {
class PostRunnable implements Runnable {
public void run() {
- log.debug("Firing EventProfileSwitchChange");
+ if (L.isEnabled(L.DATABASE))
+ log.debug("Firing EventProfileSwitchChange");
MainApp.bus().post(new EventReloadProfileSwitchData());
MainApp.bus().post(new EventProfileSwitchChange());
scheduledProfileSwitchEventPost = null;
@@ -1499,20 +1584,30 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
if (trJson.has("profileJson"))
profileSwitch.profileJson = trJson.getString("profileJson");
else {
- ProfileStore store = MainApp.getConfigBuilder().getActiveProfileInterface().getProfile();
- if (store != null) {
- Profile profile = store.getSpecificProfile(profileSwitch.profileName);
- if (profile != null) {
- profileSwitch.profileJson = profile.getData().toString();
- log.debug("Profile switch prefilled with JSON from local store");
- // Update data in NS
- NSUpload.updateProfileSwitch(profileSwitch);
+ ProfileInterface profileInterface = MainApp.getConfigBuilder().getActiveProfileInterface();
+ if (profileInterface != null) {
+ ProfileStore store = profileInterface.getProfile();
+ if (store != null) {
+ Profile profile = store.getSpecificProfile(profileSwitch.profileName);
+ if (profile != null) {
+ profileSwitch.profileJson = profile.getData().toString();
+ if (L.isEnabled(L.DATABASE))
+ log.debug("Profile switch prefilled with JSON from local store");
+ // Update data in NS
+ NSUpload.updateProfileSwitch(profileSwitch);
+ } else {
+ if (L.isEnabled(L.DATABASE))
+ log.debug("JSON for profile switch doesn't exist. Ignoring: " + trJson.toString());
+ return;
+ }
} else {
- log.debug("JSON for profile switch doesn't exist. Ignoring: " + trJson.toString());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("Store for profile switch doesn't exist. Ignoring: " + trJson.toString());
return;
}
} else {
- log.debug("Store for profile switch doesn't exist. Ignoring: " + trJson.toString());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("No active profile interface. Ignoring: " + trJson.toString());
return;
}
}
@@ -1527,7 +1622,8 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
public void deleteProfileSwitchById(String _id) {
ProfileSwitch stored = findProfileSwitchById(_id);
if (stored != null) {
- log.debug("PROFILESWITCH: Removing ProfileSwitch record from database: " + stored.toString());
+ if (L.isEnabled(L.DATABASE))
+ log.debug("PROFILESWITCH: Removing ProfileSwitch record from database: " + stored.toString());
delete(stored);
scheduleTemporaryTargetChange();
}
diff --git a/app/src/main/java/info/nightscout/androidaps/db/DbRequest.java b/app/src/main/java/info/nightscout/androidaps/db/DbRequest.java
index fcda5c9c04..f287e169ce 100644
--- a/app/src/main/java/info/nightscout/androidaps/db/DbRequest.java
+++ b/app/src/main/java/info/nightscout/androidaps/db/DbRequest.java
@@ -10,6 +10,8 @@ import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import info.nightscout.androidaps.logging.L;
+
/**
* Created by mike on 27.02.2016.
*
@@ -17,7 +19,7 @@ import org.slf4j.LoggerFactory;
*/
@DatabaseTable(tableName = DatabaseHelper.DATABASE_DBREQUESTS)
public class DbRequest {
- private static Logger log = LoggerFactory.getLogger(DbRequest.class);
+ private static Logger log = LoggerFactory.getLogger(L.DATABASE);
@DatabaseField(id = true)
public String nsClientID = null;
diff --git a/app/src/main/java/info/nightscout/androidaps/db/ExtendedBolus.java b/app/src/main/java/info/nightscout/androidaps/db/ExtendedBolus.java
index ea97f4ddca..e2e50e2dec 100644
--- a/app/src/main/java/info/nightscout/androidaps/db/ExtendedBolus.java
+++ b/app/src/main/java/info/nightscout/androidaps/db/ExtendedBolus.java
@@ -21,6 +21,7 @@ import info.nightscout.androidaps.data.Iob;
import info.nightscout.androidaps.data.IobTotal;
import info.nightscout.androidaps.interfaces.InsulinInterface;
import info.nightscout.androidaps.interfaces.Interval;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.Overview.graphExtensions.DataPointWithLabelInterface;
import info.nightscout.androidaps.plugins.Overview.graphExtensions.PointsWithLabelGraphSeries;
@@ -36,7 +37,7 @@ import info.nightscout.utils.Round;
@DatabaseTable(tableName = DatabaseHelper.DATABASE_EXTENDEDBOLUSES)
public class ExtendedBolus implements Interval, DataPointWithLabelInterface {
- private static Logger log = LoggerFactory.getLogger(ExtendedBolus.class);
+ private static Logger log = LoggerFactory.getLogger(L.DATABASE);
@DatabaseField(id = true)
public long date;
@@ -69,6 +70,36 @@ public class ExtendedBolus implements Interval, DataPointWithLabelInterface {
this.date = date;
}
+ public ExtendedBolus date(long date) {
+ this.date = date;
+ return this;
+ }
+
+ public ExtendedBolus insulin(double insulin) {
+ this.insulin = insulin;
+ return this;
+ }
+
+ public ExtendedBolus pumpId(long pumpId) {
+ this.pumpId = pumpId;
+ return this;
+ }
+
+ public ExtendedBolus source(int source) {
+ this.source = source;
+ return this;
+ }
+
+ public ExtendedBolus durationInMinutes(int durationInMinutes) {
+ this.durationInMinutes = durationInMinutes;
+ return this;
+ }
+
+ public ExtendedBolus _id(String _id) {
+ this._id = _id;
+ return this;
+ }
+
public boolean isEqual(ExtendedBolus other) {
if (date != other.date) {
return false;
@@ -93,13 +124,13 @@ public class ExtendedBolus implements Interval, DataPointWithLabelInterface {
}
public static ExtendedBolus createFromJson(JSONObject json) {
- ExtendedBolus extendedBolus = new ExtendedBolus();
- extendedBolus.source = Source.NIGHTSCOUT;
- extendedBolus.date = JsonHelper.safeGetLong(json, "mills");
- extendedBolus.durationInMinutes = JsonHelper.safeGetInt(json, "duration");
- extendedBolus.insulin = JsonHelper.safeGetDouble(json, "relative") / 60 * extendedBolus.durationInMinutes;
- extendedBolus._id = JsonHelper.safeGetString(json, "_id");
- extendedBolus.pumpId = JsonHelper.safeGetLong(json, "pumpId");
+ ExtendedBolus extendedBolus = new ExtendedBolus()
+ .source(Source.NIGHTSCOUT)
+ .date(JsonHelper.safeGetLong(json, "mills"))
+ .durationInMinutes(JsonHelper.safeGetInt(json, "duration"))
+ .insulin(JsonHelper.safeGetDouble(json, "relative") / 60 * JsonHelper.safeGetInt(json, "duration"))
+ ._id(JsonHelper.safeGetString(json, "_id"))
+ .pumpId(JsonHelper.safeGetLong(json, "pumpId"));
return extendedBolus;
}
// -------- Interval interface ---------
@@ -166,7 +197,7 @@ public class ExtendedBolus implements Interval, DataPointWithLabelInterface {
// -------- Interval interface end ---------
public String log() {
- return "Bolus{" +
+ return "ExtendedBolus{" +
"date= " + date +
", date= " + DateUtil.dateAndTimeString(date) +
", isValid=" + isValid +
diff --git a/app/src/main/java/info/nightscout/androidaps/db/ProfileSwitch.java b/app/src/main/java/info/nightscout/androidaps/db/ProfileSwitch.java
index 40c8e50c6d..0527864fd2 100644
--- a/app/src/main/java/info/nightscout/androidaps/db/ProfileSwitch.java
+++ b/app/src/main/java/info/nightscout/androidaps/db/ProfileSwitch.java
@@ -11,12 +11,14 @@ import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.util.List;
import java.util.Objects;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.interfaces.Interval;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.Overview.graphExtensions.DataPointWithLabelInterface;
import info.nightscout.androidaps.plugins.Overview.graphExtensions.PointsWithLabelGraphSeries;
@@ -24,10 +26,11 @@ import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
import info.nightscout.androidaps.plugins.ProfileLocal.LocalProfilePlugin;
import info.nightscout.utils.DateUtil;
import info.nightscout.utils.DecimalFormatter;
+import info.nightscout.utils.T;
@DatabaseTable(tableName = DatabaseHelper.DATABASE_PROFILESWITCHES)
public class ProfileSwitch implements Interval, DataPointWithLabelInterface {
- private static Logger log = LoggerFactory.getLogger(ProfileSwitch.class);
+ private static Logger log = LoggerFactory.getLogger(L.DATABASE);
@DatabaseField(id = true)
public long date;
@@ -217,6 +220,26 @@ public class ProfileSwitch implements Interval, DataPointWithLabelInterface {
MainApp.bus().post(new EventNewNotification(notification));
}
+ public static boolean isEvent5minBack(List list, long time, boolean zeroDurationOnly) {
+ for (int i = 0; i < list.size(); i++) {
+ ProfileSwitch event = list.get(i);
+ if (event.date <= time && event.date > (time - T.mins(5).msecs())) {
+ if (zeroDurationOnly) {
+ if (event.durationInMinutes == 0) {
+ if (L.isEnabled(L.DATABASE))
+ log.debug("Found ProfileSwitch event for time: " + DateUtil.dateAndTimeFullString(time) + " " + event.toString());
+ return true;
+ }
+ } else {
+ if (L.isEnabled(L.DATABASE))
+ log.debug("Found ProfileSwitch event for time: " + DateUtil.dateAndTimeFullString(time) + " " + event.toString());
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
// -------- Interval interface end ---------
// ----------------- DataPointInterface --------------------
diff --git a/app/src/main/java/info/nightscout/androidaps/db/TDD.java b/app/src/main/java/info/nightscout/androidaps/db/TDD.java
index f34c79ff1a..9ca849b7b6 100644
--- a/app/src/main/java/info/nightscout/androidaps/db/TDD.java
+++ b/app/src/main/java/info/nightscout/androidaps/db/TDD.java
@@ -8,6 +8,8 @@ import org.slf4j.LoggerFactory;
import java.util.Objects;
+import info.nightscout.androidaps.logging.L;
+
/**
* Created by mike on 20.09.2017.
*/
@@ -15,7 +17,7 @@ import java.util.Objects;
@DatabaseTable(tableName = DatabaseHelper.DATABASE_TDDS)
public class TDD {
- private static Logger log = LoggerFactory.getLogger(TDD.class);
+ private static Logger log = LoggerFactory.getLogger(L.DATABASE);
@DatabaseField(id = true)
public long date;
diff --git a/app/src/main/java/info/nightscout/androidaps/db/TempTarget.java b/app/src/main/java/info/nightscout/androidaps/db/TempTarget.java
index ae016a0f29..15692cbdfe 100644
--- a/app/src/main/java/info/nightscout/androidaps/db/TempTarget.java
+++ b/app/src/main/java/info/nightscout/androidaps/db/TempTarget.java
@@ -11,12 +11,13 @@ import java.util.Objects;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.interfaces.Interval;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.utils.DateUtil;
import info.nightscout.utils.DecimalFormatter;
@DatabaseTable(tableName = DatabaseHelper.DATABASE_TEMPTARGETS)
public class TempTarget implements Interval {
- private static Logger log = LoggerFactory.getLogger(TempTarget.class);
+ private static Logger log = LoggerFactory.getLogger(L.DATABASE);
@DatabaseField(id = true)
public long date;
diff --git a/app/src/main/java/info/nightscout/androidaps/db/TemporaryBasal.java b/app/src/main/java/info/nightscout/androidaps/db/TemporaryBasal.java
index 733027b188..f36e9ae6c4 100644
--- a/app/src/main/java/info/nightscout/androidaps/db/TemporaryBasal.java
+++ b/app/src/main/java/info/nightscout/androidaps/db/TemporaryBasal.java
@@ -15,7 +15,9 @@ import info.nightscout.androidaps.data.IobTotal;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.interfaces.InsulinInterface;
import info.nightscout.androidaps.interfaces.Interval;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.Treatments.Treatment;
import info.nightscout.utils.DateUtil;
import info.nightscout.utils.DecimalFormatter;
@@ -27,7 +29,7 @@ import info.nightscout.utils.SP;
@DatabaseTable(tableName = DatabaseHelper.DATABASE_TEMPORARYBASALS)
public class TemporaryBasal implements Interval {
- private static Logger log = LoggerFactory.getLogger(TemporaryBasal.class);
+ private static Logger log = LoggerFactory.getLogger(L.DATABASE);
@DatabaseField(id = true)
public long date;
@@ -93,7 +95,7 @@ public class TemporaryBasal implements Interval {
}
public TemporaryBasal(ExtendedBolus extendedBolus) {
- double basal = MainApp.getConfigBuilder().getProfile(extendedBolus.date).getBasal(extendedBolus.date);
+ double basal = ProfileFunctions.getInstance().getProfile(extendedBolus.date).getBasal(extendedBolus.date);
this.date = extendedBolus.date;
this.isValid = extendedBolus.isValid;
this.source = extendedBolus.source;
@@ -103,6 +105,7 @@ public class TemporaryBasal implements Interval {
this.isFakeExtended = true;
this.netExtendedRate = extendedBolus.absoluteRate();
this.absoluteRate = basal + extendedBolus.absoluteRate();
+ this.pumpId = extendedBolus.pumpId;
}
public TemporaryBasal clone() {
@@ -219,7 +222,7 @@ public class TemporaryBasal implements Interval {
public IobTotal iobCalc(long time, Profile profile) {
- if(isFakeExtended){
+ if (isFakeExtended) {
log.error("iobCalc should only be called on Extended boluses separately");
return new IobTotal(time);
}
@@ -227,7 +230,7 @@ public class TemporaryBasal implements Interval {
IobTotal result = new IobTotal(time);
InsulinInterface insulinInterface = ConfigBuilderPlugin.getActiveInsulin();
- int realDuration = getDurationToTime(time);
+ int realDuration = getDurationToTime(time);
double netBasalAmount = 0d;
if (realDuration > 0) {
@@ -290,12 +293,22 @@ public class TemporaryBasal implements Interval {
}
public double tempBasalConvertedToAbsolute(long time, Profile profile) {
- if(isFakeExtended){
+ if (isFakeExtended) {
return profile.getBasal(time) + netExtendedRate;
} else if (isAbsolute) {
return absoluteRate;
} else {
- return profile.getBasal(time) * percentRate / 100;
+ return profile.getBasal(time) * percentRate / 100;
+ }
+ }
+
+ public int tempBasalConvertedToPercent(long time, Profile profile) {
+ if (isFakeExtended) {
+ return (int) ((profile.getBasal(time) + netExtendedRate) / profile.getBasal(time)) * 100;
+ } else if (isAbsolute) {
+ return (int) (absoluteRate / profile.getBasal(time)) * 100;
+ } else {
+ return percentRate;
}
}
@@ -316,12 +329,12 @@ public class TemporaryBasal implements Interval {
}
public String toStringFull() {
- if(isFakeExtended){
+ if (isFakeExtended) {
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
Double currentBasalRate = profile.getBasal();
- double rate = (currentBasalRate == null)?0d:(currentBasalRate+netExtendedRate);
- return getCalcuatedPercentageIfNeeded() + DecimalFormatter.to2Decimal(rate) + "U/h ("+DecimalFormatter.to2Decimal(netExtendedRate)+"E) @" +
+ double rate = (currentBasalRate == null) ? 0d : (currentBasalRate + netExtendedRate);
+ return getCalcuatedPercentageIfNeeded() + DecimalFormatter.to2Decimal(rate) + "U/h (" + DecimalFormatter.to2Decimal(netExtendedRate) + "E) @" +
DateUtil.timeString(date) +
" " + getRealDuration() + "/" + durationInMinutes + "'";
} else if (isAbsolute) {
@@ -338,21 +351,21 @@ public class TemporaryBasal implements Interval {
public String toStringShort() {
if (isAbsolute || isFakeExtended) {
- double rate = 0d;
+ double rate = 0d;
if (isFakeExtended) {
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
Double currentBasalRate = profile.getBasal();
- rate = (currentBasalRate == null)?0d:(currentBasalRate+netExtendedRate);
- } else if (isAbsolute){
+ rate = (currentBasalRate == null) ? 0d : (currentBasalRate + netExtendedRate);
+ } else if (isAbsolute) {
rate = absoluteRate;
}
- if(SP.getBoolean(R.string.key_danar_visualizeextendedaspercentage, false) && SP.getBoolean(R.string.key_danar_useextended, false)){
- Profile profile = MainApp.getConfigBuilder().getProfile();
- if(profile != null) {
+ if (SP.getBoolean(R.string.key_danar_visualizeextendedaspercentage, false) && SP.getBoolean(R.string.key_danar_useextended, false)) {
+ Profile profile = ProfileFunctions.getInstance().getProfile();
+ if (profile != null) {
double basal = profile.getBasal();
- if(basal != 0){
- return Math.round(rate*100d/basal) + "%";
+ if (basal != 0) {
+ return Math.round(rate * 100d / basal) + "%";
}
}
}
@@ -362,24 +375,24 @@ public class TemporaryBasal implements Interval {
}
}
- private String getCalcuatedPercentageIfNeeded(){
+ private String getCalcuatedPercentageIfNeeded() {
if (isAbsolute || isFakeExtended) {
- double rate = 0d;
+ double rate = 0d;
if (isFakeExtended) {
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
Double currentBasalRate = profile.getBasal();
- rate = (currentBasalRate == null)?0d:(currentBasalRate+netExtendedRate);
- } else if (isAbsolute){
+ rate = (currentBasalRate == null) ? 0d : (currentBasalRate + netExtendedRate);
+ } else if (isAbsolute) {
rate = absoluteRate;
}
- if(SP.getBoolean(R.string.key_danar_visualizeextendedaspercentage, false) && SP.getBoolean(R.string.key_danar_useextended, false)){
- Profile profile = MainApp.getConfigBuilder().getProfile();
- if(profile != null) {
+ if (SP.getBoolean(R.string.key_danar_visualizeextendedaspercentage, false) && SP.getBoolean(R.string.key_danar_useextended, false)) {
+ Profile profile = ProfileFunctions.getInstance().getProfile();
+ if (profile != null) {
double basal = profile.getBasal();
- if(basal != 0){
- return Math.round(rate*100d/basal) + "% ";
+ if (basal != 0) {
+ return Math.round(rate * 100d / basal) + "% ";
}
}
}
@@ -390,12 +403,12 @@ public class TemporaryBasal implements Interval {
public String toStringVeryShort() {
if (isAbsolute || isFakeExtended) {
- double rate = 0d;
+ double rate = 0d;
if (isFakeExtended) {
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
Double currentBasalRate = profile.getBasal();
- rate = (currentBasalRate == null)?0d:(currentBasalRate+netExtendedRate);
- } else if (isAbsolute){
+ rate = (currentBasalRate == null) ? 0d : (currentBasalRate + netExtendedRate);
+ } else if (isAbsolute) {
rate = absoluteRate;
}
return DecimalFormatter.to2Decimal(rate) + "U/h ";
diff --git a/app/src/main/java/info/nightscout/androidaps/events/EventAcceptOpenLoopChange.java b/app/src/main/java/info/nightscout/androidaps/events/EventAcceptOpenLoopChange.java
new file mode 100644
index 0000000000..2dfbf9ae35
--- /dev/null
+++ b/app/src/main/java/info/nightscout/androidaps/events/EventAcceptOpenLoopChange.java
@@ -0,0 +1,5 @@
+package info.nightscout.androidaps.events;
+
+/** Base class for events to update the UI, mostly a specific tab. */
+public class EventAcceptOpenLoopChange extends Event {
+}
diff --git a/app/src/main/java/info/nightscout/androidaps/events/EventPumpStatusChanged.java b/app/src/main/java/info/nightscout/androidaps/events/EventPumpStatusChanged.java
index 7d810702b9..6729a4e703 100644
--- a/app/src/main/java/info/nightscout/androidaps/events/EventPumpStatusChanged.java
+++ b/app/src/main/java/info/nightscout/androidaps/events/EventPumpStatusChanged.java
@@ -10,9 +10,10 @@ import info.nightscout.androidaps.R;
public class EventPumpStatusChanged extends Event {
public static final int CONNECTING = 0;
public static final int CONNECTED = 1;
- public static final int PERFORMING = 2;
- public static final int DISCONNECTING = 3;
- public static final int DISCONNECTED = 4;
+ public static final int HANDSHAKING = 2;
+ public static final int PERFORMING = 3;
+ public static final int DISCONNECTING = 4;
+ public static final int DISCONNECTED = 5;
public int sStatus = DISCONNECTED;
public int sSecondsElapsed = 0;
@@ -47,6 +48,8 @@ public class EventPumpStatusChanged extends Event {
public String textStatus() {
if (sStatus == CONNECTING)
return String.format(MainApp.gs(R.string.danar_history_connectingfor), sSecondsElapsed);
+ else if (sStatus == HANDSHAKING)
+ return MainApp.gs(R.string.handshaking);
else if (sStatus == CONNECTED)
return MainApp.gs(R.string.connected);
else if (sStatus == PERFORMING)
diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/APSInterface.java b/app/src/main/java/info/nightscout/androidaps/interfaces/APSInterface.java
index 0b965d48af..2f37c47391 100644
--- a/app/src/main/java/info/nightscout/androidaps/interfaces/APSInterface.java
+++ b/app/src/main/java/info/nightscout/androidaps/interfaces/APSInterface.java
@@ -1,7 +1,5 @@
package info.nightscout.androidaps.interfaces;
-import java.util.Date;
-
import info.nightscout.androidaps.plugins.Loop.APSResult;
/**
@@ -9,7 +7,7 @@ import info.nightscout.androidaps.plugins.Loop.APSResult;
*/
public interface APSInterface {
public APSResult getLastAPSResult();
- public Date getLastAPSRun();
+ public long getLastAPSRun();
public void invoke(String initiator, boolean tempBasalFallback);
}
diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/BgSourceInterface.java b/app/src/main/java/info/nightscout/androidaps/interfaces/BgSourceInterface.java
index a45ab083e7..d42ead7950 100644
--- a/app/src/main/java/info/nightscout/androidaps/interfaces/BgSourceInterface.java
+++ b/app/src/main/java/info/nightscout/androidaps/interfaces/BgSourceInterface.java
@@ -1,8 +1,12 @@
package info.nightscout.androidaps.interfaces;
+import android.content.Intent;
+
/**
* Created by mike on 20.06.2016.
*/
public interface BgSourceInterface {
boolean advancedFilteringSupported();
+
+ void handleNewData(Intent intent);
}
diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/Constraint.java b/app/src/main/java/info/nightscout/androidaps/interfaces/Constraint.java
index 58e6045bd1..417f02199d 100644
--- a/app/src/main/java/info/nightscout/androidaps/interfaces/Constraint.java
+++ b/app/src/main/java/info/nightscout/androidaps/interfaces/Constraint.java
@@ -6,12 +6,14 @@ import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
+import info.nightscout.androidaps.logging.L;
+
/**
* Created by mike on 19.03.2018.
*/
public class Constraint {
- private static Logger log = LoggerFactory.getLogger(Constraint.class);
+ private static Logger log = LoggerFactory.getLogger(L.CONSTRAINTS);
T value;
T originalValue;
@@ -35,18 +37,35 @@ public class Constraint {
public Constraint set(T value) {
this.value = value;
this.originalValue = value;
+ if (L.isEnabled(L.CONSTRAINTS))
+ log.debug("Setting value " + value);
return this;
}
public Constraint set(T value, String reason, Object from) {
+ if (L.isEnabled(L.CONSTRAINTS))
+ log.debug("Setting value " + this.value + " -> " + value + " (" + reason + ")[" + translateFrom(from) + "]");
this.value = value;
addReason(reason, from);
addMostLimingReason(reason, from);
return this;
}
+ public Constraint setIfDifferent(T value, String reason, Object from) {
+ if (!this.value.equals(value)) {
+ if (L.isEnabled(L.CONSTRAINTS))
+ log.debug("Setting because of different value " + this.value + " -> " + value + " (" + reason + ")[" + translateFrom(from) + "]");
+ this.value = value;
+ addReason(reason, from);
+ addMostLimingReason(reason, from);
+ }
+ return this;
+ }
+
public Constraint setIfSmaller(T value, String reason, Object from) {
if (value.compareTo(this.value) < 0) {
+ if (L.isEnabled(L.CONSTRAINTS))
+ log.debug("Setting because of smaller value " + this.value + " -> " + value + " (" + reason + ")[" + translateFrom(from) + "]");
this.value = value;
mostLimiting.clear();
addMostLimingReason(reason, from);
@@ -57,8 +76,10 @@ public class Constraint {
return this;
}
- public Constraint setIfGreater(T value, String reason, Object from) {
+ public Constraint setIfGreater(T value, String reason, Object from) {
if (value.compareTo(this.value) > 0) {
+ if (L.isEnabled(L.CONSTRAINTS))
+ log.debug("Setting because of greater value " + this.value + " -> " + value + " (" + reason + ")[" + translateFrom(from) + "]");
this.value = value;
mostLimiting.clear();
addMostLimingReason(reason, from);
@@ -69,13 +90,17 @@ public class Constraint {
return this;
}
+ private String translateFrom(Object from) {
+ return from.getClass().getSimpleName().replace("Plugin", "");
+ }
+
public Constraint addReason(String reason, Object from) {
- reasons.add(from.getClass().getSimpleName().replace("Plugin", "") + ": " + reason);
+ reasons.add(translateFrom(from) + ": " + reason);
return this;
}
- public Constraint addMostLimingReason(String reason, Object from) {
- mostLimiting.add(from.getClass().getSimpleName().replace("Plugin", "") + ": " + reason);
+ public Constraint addMostLimingReason(String reason, Object from) {
+ mostLimiting.add(translateFrom(from) + ": " + reason);
return this;
}
@@ -86,7 +111,8 @@ public class Constraint {
if (count++ != 0) sb.append("\n");
sb.append(r);
}
- log.debug("Limiting origial value: " + originalValue + " to " + value + ". Reason: " + sb.toString());
+ if (L.isEnabled(L.CONSTRAINTS))
+ log.debug("Limiting origial value: " + originalValue + " to " + value + ". Reason: " + sb.toString());
return sb.toString();
}
@@ -101,7 +127,8 @@ public class Constraint {
if (count++ != 0) sb.append("\n");
sb.append(r);
}
- log.debug("Limiting origial value: " + originalValue + " to " + value + ". Reason: " + sb.toString());
+ if (L.isEnabled(L.CONSTRAINTS))
+ log.debug("Limiting origial value: " + originalValue + " to " + value + ". Reason: " + sb.toString());
return sb.toString();
}
@@ -110,7 +137,7 @@ public class Constraint {
}
public void copyReasons(Constraint> another) {
- for (String s: another.getReasonList()) {
+ for (String s : another.getReasonList()) {
reasons.add(s);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/ConstraintsInterface.java b/app/src/main/java/info/nightscout/androidaps/interfaces/ConstraintsInterface.java
index 820170dc0f..310c94ac20 100644
--- a/app/src/main/java/info/nightscout/androidaps/interfaces/ConstraintsInterface.java
+++ b/app/src/main/java/info/nightscout/androidaps/interfaces/ConstraintsInterface.java
@@ -43,6 +43,10 @@ public interface ConstraintsInterface {
return insulin;
}
+ default Constraint applyExtendedBolusConstraints(Constraint insulin) {
+ return insulin;
+ }
+
default Constraint applyCarbsConstraints(Constraint carbs) {
return carbs;
}
diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/PluginBase.java b/app/src/main/java/info/nightscout/androidaps/interfaces/PluginBase.java
index 9f3e4fe5c0..3d7895a62a 100644
--- a/app/src/main/java/info/nightscout/androidaps/interfaces/PluginBase.java
+++ b/app/src/main/java/info/nightscout/androidaps/interfaces/PluginBase.java
@@ -7,14 +7,16 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.queue.CommandQueue;
/**
* Created by mike on 09.06.2016.
*/
public abstract class PluginBase {
- private static Logger log = LoggerFactory.getLogger(PluginBase.class);
+ private static Logger log = LoggerFactory.getLogger(L.CORE);
public enum State {
NOT_INITIALIZED,
@@ -113,15 +115,17 @@ public abstract class PluginBase {
if (state != State.ENABLED) {
onStateChange(type, state, State.ENABLED);
state = State.ENABLED;
- log.debug("Starting: " + getName());
+ if (L.isEnabled(L.CORE))
+ log.debug("Starting: " + getName());
onStart();
}
} else { // disabling plugin
if (state == State.ENABLED) {
- onStateChange(type, state, State.ENABLED);
+ onStateChange(type, state, State.DISABLED);
state = State.DISABLED;
onStop();
- log.debug("Stopping: " + getName());
+ if (L.isEnabled(L.CORE))
+ log.debug("Stopping: " + getName());
}
}
} else if (type == PluginType.PROFILE) {
@@ -165,7 +169,9 @@ public abstract class PluginBase {
if (getType() == PluginType.PUMP) {
new Thread(() -> {
SystemClock.sleep(3000);
- ConfigBuilderPlugin.getCommandQueue().readStatus("Pump driver changed.", null);
+ CommandQueue commandQueue = ConfigBuilderPlugin.getCommandQueue();
+ if (commandQueue != null)
+ commandQueue.readStatus("Pump driver changed.", null);
}).start();
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/PumpDescription.java b/app/src/main/java/info/nightscout/androidaps/interfaces/PumpDescription.java
index ac2e5076a2..34221b203f 100644
--- a/app/src/main/java/info/nightscout/androidaps/interfaces/PumpDescription.java
+++ b/app/src/main/java/info/nightscout/androidaps/interfaces/PumpDescription.java
@@ -1,54 +1,62 @@
package info.nightscout.androidaps.interfaces;
+import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpCapability;
+import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpTempBasalType;
+import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpType;
+
/**
* Created by mike on 08.12.2016.
*/
public class PumpDescription {
+ public PumpType pumpType = PumpType.GenericAAPS;
+
+ public PumpDescription () {
+ resetSettings();
+ }
+
public static final int NONE = 0;
public static final int PERCENT = 0x01;
public static final int ABSOLUTE = 0x02;
- public boolean isBolusCapable = true;
- public double bolusStep = 0.1d;
+ public boolean isBolusCapable;
+ public double bolusStep;
- public boolean isExtendedBolusCapable = true;
- public double extendedBolusStep = 0.1d;
- public double extendedBolusDurationStep = 30;
- public double extendedBolusMaxDuration = 12 * 60;
+ public boolean isExtendedBolusCapable;
+ public double extendedBolusStep;
+ public double extendedBolusDurationStep;
+ public double extendedBolusMaxDuration;
- public boolean isTempBasalCapable = true;
- public int tempBasalStyle = PERCENT;
+ public boolean isTempBasalCapable;
+ public int tempBasalStyle;
- public int maxTempPercent = 200;
- public int tempPercentStep = 10;
+ public int maxTempPercent;
+ public int tempPercentStep;
- public double maxTempAbsolute = 10;
- public double tempAbsoluteStep = 0.05d;
+ public double maxTempAbsolute;
+ public double tempAbsoluteStep;
- public int tempDurationStep = 60;
- public boolean tempDurationStep15mAllowed = false;
- public boolean tempDurationStep30mAllowed = false;
- public int tempMaxDuration = 12 * 60;
+ public int tempDurationStep;
+ public boolean tempDurationStep15mAllowed;
+ public boolean tempDurationStep30mAllowed;
+ public int tempMaxDuration;
+
+ public boolean isSetBasalProfileCapable;
+ public double basalStep;
+ public double basalMinimumRate;
+ public double basalMaximumRate;
+
+ public boolean isRefillingCapable;
+
+ public boolean storesCarbInfo;
+
+ public boolean is30minBasalRatesCapable;
+
+ public boolean supportsTDDs;
+ public boolean needsManualTDDLoad;
- public boolean isSetBasalProfileCapable = true;
- public double basalStep = 0.01d;
- public double basalMinimumRate = 0.04d;
- public double basalMaximumRate = 25d;
-
- public boolean isRefillingCapable = false;
-
- public boolean storesCarbInfo = true;
-
- public boolean is30minBasalRatesCapable = false;
-
- public boolean supportsTDDs = false;
- public boolean needsManualTDDLoad = true;
-
-
- public void resetSettings()
- {
+ public void resetSettings() {
isBolusCapable = true;
bolusStep = 0.1d;
@@ -59,26 +67,73 @@ public class PumpDescription {
isTempBasalCapable = true;
tempBasalStyle = PERCENT;
-
maxTempPercent = 200;
tempPercentStep = 10;
-
maxTempAbsolute = 10;
tempAbsoluteStep = 0.05d;
-
tempDurationStep = 60;
tempMaxDuration = 12 * 60;
-
+ tempDurationStep15mAllowed = false;
+ tempDurationStep30mAllowed = false;
isSetBasalProfileCapable = true;
basalStep = 0.01d;
basalMinimumRate = 0.04d;
+ basalMaximumRate = 25d;
+ is30minBasalRatesCapable = false;
isRefillingCapable = false;
-
storesCarbInfo = true;
+ supportsTDDs = false;
+ needsManualTDDLoad = true;
}
+ public void setPumpDescription(PumpType pumpType) {
+ resetSettings();
+ this.pumpType = pumpType;
+
+ PumpCapability pumpCapability = pumpType.getPumpCapability();
+
+ isBolusCapable = pumpCapability.hasCapability(PumpCapability.Bolus);
+ bolusStep = pumpType.getBolusSize();
+
+ isExtendedBolusCapable = pumpCapability.hasCapability(PumpCapability.ExtendedBolus);
+ extendedBolusStep = pumpType.getExtendedBolusSettings().getStep();
+ extendedBolusDurationStep = pumpType.getExtendedBolusSettings().getDurationStep();
+ extendedBolusMaxDuration = pumpType.getExtendedBolusSettings().getMaxDuration();
+
+ isTempBasalCapable = pumpCapability.hasCapability(PumpCapability.TempBasal);
+
+ if (pumpType.getPumpTempBasalType() == PumpTempBasalType.Percent) {
+ tempBasalStyle = PERCENT;
+ maxTempPercent = pumpType.getTbrSettings().getMaxDose().intValue();
+ tempPercentStep = (int) pumpType.getTbrSettings().getStep();
+ } else {
+ tempBasalStyle = ABSOLUTE;
+ maxTempAbsolute = pumpType.getTbrSettings().getMaxDose();
+ tempAbsoluteStep = pumpType.getTbrSettings().getStep();
+ }
+
+ tempDurationStep = pumpType.getTbrSettings().getDurationStep();
+ tempMaxDuration = pumpType.getTbrSettings().getMaxDuration();
+
+ tempDurationStep15mAllowed = pumpType.getSpecialBasalDurations()
+ .hasCapability(PumpCapability.BasalRate_Duration15minAllowed);
+ tempDurationStep30mAllowed = pumpType.getSpecialBasalDurations()
+ .hasCapability(PumpCapability.BasalRate_Duration30minAllowed);
+
+ isSetBasalProfileCapable = pumpCapability.hasCapability(PumpCapability.BasalProfileSet);
+ basalStep = pumpType.getBaseBasalStep();
+ basalMinimumRate = pumpType.getBaseBasalMinValue();
+
+ isRefillingCapable = pumpCapability.hasCapability(PumpCapability.Refill);
+ storesCarbInfo = pumpCapability.hasCapability(PumpCapability.StoreCarbInfo);
+
+ supportsTDDs = pumpCapability.hasCapability(PumpCapability.TDD);
+ needsManualTDDLoad = pumpCapability.hasCapability(PumpCapability.ManualTDDLoad);
+
+ is30minBasalRatesCapable = pumpCapability.hasCapability(PumpCapability.BasalRate30min);
+ }
}
diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java b/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java
index 65911f82c6..614c6033d3 100644
--- a/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java
+++ b/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java
@@ -2,8 +2,6 @@ package info.nightscout.androidaps.interfaces;
import org.json.JSONObject;
-import java.util.Date;
-
import info.nightscout.androidaps.data.DetailedBolusInfo;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.data.PumpEnactResult;
@@ -13,11 +11,13 @@ import info.nightscout.androidaps.data.PumpEnactResult;
*/
public interface PumpInterface {
- boolean isInitialized();
- boolean isSuspended();
- boolean isBusy();
- boolean isConnected();
- boolean isConnecting();
+ boolean isInitialized(); // true if pump status has been read and is ready to accept commands
+ boolean isSuspended(); // true if suspended (not delivering insulin)
+ boolean isBusy(); // if true pump is not ready to accept commands right now
+ boolean isConnected(); // true if BT connection is established
+ boolean isConnecting(); // true if BT connection is in progress
+ boolean isHandshakeInProgress(); // true if BT is connected but initial handshake is still in progress
+ void finishHandshaking(); // set initial handshake completed
void connect(String reason);
void disconnect(String reason);
@@ -29,7 +29,7 @@ public interface PumpInterface {
PumpEnactResult setNewBasalProfile(Profile profile);
boolean isThisProfileSet(Profile profile);
- Date lastDataTime();
+ long lastDataTime();
double getBaseBasalRate(); // base basal rate, not temp basal
diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/SensitivityInterface.java b/app/src/main/java/info/nightscout/androidaps/interfaces/SensitivityInterface.java
index 81af28eaa4..f4514ad572 100644
--- a/app/src/main/java/info/nightscout/androidaps/interfaces/SensitivityInterface.java
+++ b/app/src/main/java/info/nightscout/androidaps/interfaces/SensitivityInterface.java
@@ -1,6 +1,7 @@
package info.nightscout.androidaps.interfaces;
import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensResult;
+import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
/**
* Created by mike on 24.06.2017.
@@ -11,6 +12,6 @@ public interface SensitivityInterface {
double MIN_HOURS = 1;
double MIN_HOURS_FULL_AUTOSENS = 4;
- AutosensResult detectSensitivity(long fromTime, long toTime);
+ AutosensResult detectSensitivity(IobCobCalculatorPlugin plugin, long fromTime, long toTime);
}
diff --git a/app/src/main/java/info/nightscout/utils/BundleLogger.java b/app/src/main/java/info/nightscout/androidaps/logging/BundleLogger.java
similarity index 90%
rename from app/src/main/java/info/nightscout/utils/BundleLogger.java
rename to app/src/main/java/info/nightscout/androidaps/logging/BundleLogger.java
index ba6ffff869..b559c7af7e 100644
--- a/app/src/main/java/info/nightscout/utils/BundleLogger.java
+++ b/app/src/main/java/info/nightscout/androidaps/logging/BundleLogger.java
@@ -1,4 +1,4 @@
-package info.nightscout.utils;
+package info.nightscout.androidaps.logging;
import android.os.Bundle;
diff --git a/app/src/main/java/info/nightscout/androidaps/logging/L.java b/app/src/main/java/info/nightscout/androidaps/logging/L.java
new file mode 100644
index 0000000000..c44d2516c2
--- /dev/null
+++ b/app/src/main/java/info/nightscout/androidaps/logging/L.java
@@ -0,0 +1,123 @@
+package info.nightscout.androidaps.logging;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import info.nightscout.utils.SP;
+
+public class L {
+
+ public static class LogElement {
+ public String name;
+ boolean defaultValue;
+ public boolean enabled;
+ boolean requiresRestart = false;
+
+ LogElement(String name, boolean defaultValue) {
+ this.name = name;
+ this.defaultValue = defaultValue;
+ enabled = SP.getBoolean(getSPName(), defaultValue);
+ }
+
+ LogElement(String name, boolean defaultValue, boolean requiresRestart) {
+ this.name = name;
+ this.defaultValue = defaultValue;
+ this.requiresRestart = requiresRestart;
+ enabled = SP.getBoolean(getSPName(), defaultValue);
+ }
+
+ LogElement(boolean defaultValue) {
+ this.name = "NONEXISTING";
+ this.defaultValue = defaultValue;
+ enabled = defaultValue;
+ }
+
+ private String getSPName() {
+ return "log_" + name;
+ }
+
+ public void setEnabled(boolean enabled) {
+ this.enabled = enabled;
+ SP.putBoolean(getSPName(), enabled);
+ }
+
+ void resetToDefault() {
+ setEnabled(defaultValue);
+ }
+ }
+
+ private static List logElements;
+
+ static {
+ initialize();
+ }
+
+ private static LogElement findByName(String name) {
+ for (LogElement element : logElements) {
+ if (element.name.equals(name))
+ return element;
+ }
+ return new LogElement(false);
+ }
+
+ public static boolean isEnabled(String name) {
+ return findByName(name).enabled;
+ }
+
+ public static List getLogElements() {
+ return logElements;
+ }
+
+ public static void resetToDefaults() {
+ for (LogElement element : logElements) {
+ element.resetToDefault();
+ }
+ }
+
+
+ public static final String CORE = "CORE";
+ public static final String AUTOSENS = "AUTOSENS";
+ public static final String EVENTS = "EVENTS";
+ public static final String BGSOURCE = "BGSOURCE";
+ public static final String OVERVIEW = "OVERVIEW";
+ public static final String NOTIFICATION = "NOTIFICATION";
+ public static final String DATASERVICE = "DATASERVICE";
+ public static final String DATABASE = "DATABASE";
+ public static final String DATAFOOD = "DATAFOOD";
+ public static final String DATATREATMENTS = "DATATREATMENTS";
+ public static final String NSCLIENT = "NSCLIENT";
+ public static final String CONSTRAINTS = "CONSTRAINTS";
+ public static final String PUMP = "PUMP";
+ public static final String PUMPQUEUE = "PUMPQUEUE";
+ public static final String PUMPCOMM = "PUMPCOMM";
+ public static final String PUMPBTCOMM = "PUMPBTCOMM";
+ public static final String APS = "APS";
+ public static final String PROFILE = "PROFILE";
+ public static final String CONFIGBUILDER = "CONFIGBUILDER";
+ public static final String UI = "UI";
+
+ private static void initialize() {
+ logElements = new ArrayList<>();
+ logElements.add(new LogElement(APS, true));
+ logElements.add(new LogElement(AUTOSENS, true));
+ logElements.add(new LogElement(BGSOURCE, true));
+ logElements.add(new LogElement(CONFIGBUILDER, true));
+ logElements.add(new LogElement(CONSTRAINTS, true));
+ logElements.add(new LogElement(CORE, true));
+ logElements.add(new LogElement(DATABASE, true));
+ logElements.add(new LogElement(DATAFOOD, true));
+ logElements.add(new LogElement(DATASERVICE, true));
+ logElements.add(new LogElement(DATATREATMENTS, true));
+ logElements.add(new LogElement(EVENTS, false, true));
+ logElements.add(new LogElement(NOTIFICATION, true));
+ logElements.add(new LogElement(NSCLIENT, true));
+ logElements.add(new LogElement(OVERVIEW, true));
+ logElements.add(new LogElement(PROFILE, true));
+ logElements.add(new LogElement(PUMP, true));
+ logElements.add(new LogElement(PUMPBTCOMM, false));
+ logElements.add(new LogElement(PUMPCOMM, true));
+ logElements.add(new LogElement(PUMPQUEUE, true));
+ logElements.add(new LogElement(UI, true));
+ }
+
+}
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 d45fb10b4e..ea17a30218 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
@@ -14,10 +14,10 @@ import com.crashlytics.android.answers.CustomEvent;
import com.squareup.otto.Subscribe;
import info.nightscout.androidaps.Config;
-import info.nightscout.androidaps.HistoryBrowseActivity;
+import info.nightscout.androidaps.activities.HistoryBrowseActivity;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.TDDStatsActivity;
+import info.nightscout.androidaps.activities.TDDStatsActivity;
import info.nightscout.androidaps.db.ExtendedBolus;
import info.nightscout.androidaps.db.TemporaryBasal;
import info.nightscout.androidaps.events.EventExtendedBolusChange;
@@ -33,6 +33,7 @@ import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialo
import info.nightscout.androidaps.plugins.Careportal.OptionsToShow;
import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.SingleClickButton;
@@ -87,7 +88,6 @@ public class ActionsFragment extends SubscriberFragment implements View.OnClickL
tempBasalCancel.setOnClickListener(this);
fill.setOnClickListener(this);
history.setOnClickListener(this);
- history.setVisibility(MainApp.devBranch ? View.VISIBLE : View.GONE);
tddStats.setOnClickListener(this);
updateGUI();
@@ -132,7 +132,7 @@ public class ActionsFragment extends SubscriberFragment implements View.OnClickL
profileSwitch.setVisibility(View.GONE);
}
- if (MainApp.getConfigBuilder().getProfile() == null) {
+ if (ProfileFunctions.getInstance().getProfile() == null) {
tempTarget.setVisibility(View.GONE);
extendedBolus.setVisibility(View.GONE);
extendedBolusCancel.setVisibility(View.GONE);
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 558a7c381c..4f83465e7d 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
@@ -39,7 +39,7 @@ import info.nightscout.androidaps.plugins.Overview.Dialogs.ErrorHelperActivity;
import info.nightscout.androidaps.queue.Callback;
import info.nightscout.utils.DecimalFormatter;
import info.nightscout.utils.FabricPrivacy;
-import info.nightscout.utils.NSUpload;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.utils.NumberPicker;
import info.nightscout.utils.SP;
import info.nightscout.utils.SafeParse;
@@ -91,7 +91,7 @@ public class FillDialog extends DialogFragment implements OnClickListener {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.actions_fill_dialog, null, false);
+ View view = inflater.inflate(R.layout.actions_fill_dialog, container, false);
view.findViewById(R.id.ok).setOnClickListener(this);
view.findViewById(R.id.cancel).setOnClickListener(this);
@@ -184,7 +184,7 @@ public class FillDialog extends DialogFragment implements OnClickListener {
if (insulinAfterConstraints > 0) {
confirmMessage.add(MainApp.gs(R.string.fillwarning));
confirmMessage.add("");
- confirmMessage.add(MainApp.gs(R.string.bolus) + ": " + "" + insulinAfterConstraints + "U" + "");
+ confirmMessage.add(MainApp.gs(R.string.bolus) + ": " + "" + DecimalFormatter.toPumpSupportedBolus(insulinAfterConstraints) + "U" + "");
if (!insulinAfterConstraints.equals(insulin))
confirmMessage.add("" + MainApp.gs(R.string.bolusconstraintapplied) + "");
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java
index 45b6460392..80939e639c 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java
@@ -44,7 +44,7 @@ public class NewExtendedBolusDialog extends DialogFragment implements View.OnCli
View view = inflater.inflate(R.layout.overview_newextendedbolus_dialog, container, false);
- Double maxInsulin = MainApp.getConstraintChecker().getMaxBolusAllowed().value();
+ Double maxInsulin = MainApp.getConstraintChecker().getMaxExtendedBolusAllowed().value();
editInsulin = (NumberPicker) view.findViewById(R.id.overview_newextendedbolus_insulin);
editInsulin.setParams(0d, 0d, maxInsulin, 0.1d, new DecimalFormat("0.00"), false);
@@ -71,10 +71,10 @@ public class NewExtendedBolusDialog extends DialogFragment implements View.OnCli
String confirmMessage = MainApp.gs(R.string.setextendedbolusquestion);
- Double insulinAfterConstraint = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(insulin)).value();
+ Double insulinAfterConstraint = MainApp.getConstraintChecker().applyExtendedBolusConstraints(new Constraint<>(insulin)).value();
confirmMessage += " " + insulinAfterConstraint + " U ";
confirmMessage += MainApp.gs(R.string.duration) + " " + durationInMinutes + "min ?";
- if (insulinAfterConstraint - insulin != 0d)
+ if (Math.abs(insulinAfterConstraint - insulin) > 0.01d)
confirmMessage += "\n" + MainApp.gs(R.string.constraintapllied);
insulin = insulinAfterConstraint;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java
index 7a03887cf6..359e0e4877 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java
@@ -25,6 +25,7 @@ import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.interfaces.Constraint;
import info.nightscout.androidaps.interfaces.PumpDescription;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.Overview.Dialogs.ErrorHelperActivity;
import info.nightscout.androidaps.queue.Callback;
import info.nightscout.utils.FabricPrivacy;
@@ -70,7 +71,7 @@ public class NewTempBasalDialog extends DialogFragment implements View.OnClickLi
double tempPercentStep = pumpDescription.tempPercentStep;
basalPercent.setParams(100d, 0d, maxTempPercent, tempPercentStep, new DecimalFormat("0"), true);
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
Double currentBasal = profile != null ? profile.getBasal() : 0d;
basalAbsolute = (NumberPicker) view.findViewById(R.id.overview_newtempbasal_basalabsoluteinput);
basalAbsolute.setParams(currentBasal, 0d, pumpDescription.maxTempAbsolute, pumpDescription.tempAbsoluteStep, new DecimalFormat("0.00"), true);
@@ -118,7 +119,7 @@ public class NewTempBasalDialog extends DialogFragment implements View.OnClickLi
final boolean setAsPercent = percentRadio.isChecked();
int durationInMinutes = SafeParse.stringToInt(duration.getText());
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
if (profile == null)
return;
@@ -135,7 +136,7 @@ public class NewTempBasalDialog extends DialogFragment implements View.OnClickLi
absolute = MainApp.getConstraintChecker().applyBasalConstraints(new Constraint<>(basalAbsoluteInput), profile).value();
confirmMessage += "\n" + absolute + " U/h ";
confirmMessage += "\n" + MainApp.gs(R.string.duration) + " " + durationInMinutes + "min ?";
- if (absolute - basalAbsoluteInput != 0d)
+ if (Math.abs(absolute - basalAbsoluteInput) > 0.01d)
confirmMessage += "\n" + MainApp.gs(R.string.constraintapllied);
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java
index 264488f684..7b6eba1777 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java
@@ -100,7 +100,7 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli
noProfileView = view.findViewById(R.id.profileview_noprofile);
butonsLayout = (LinearLayout) view.findViewById(R.id.careportal_buttons);
- ProfileStore profileStore = MainApp.getConfigBuilder().getActiveProfileInterface().getProfile();
+ ProfileStore profileStore = MainApp.getConfigBuilder().getActiveProfileInterface() != null ? MainApp.getConfigBuilder().getActiveProfileInterface().getProfile() : null;
if (profileStore == null) {
noProfileView.setVisibility(View.VISIBLE);
butonsLayout.setVisibility(View.GONE);
@@ -109,7 +109,7 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli
butonsLayout.setVisibility(View.VISIBLE);
}
- if (Config.NSCLIENT || Config.G5UPLOADER)
+ if (Config.NSCLIENT)
statsLayout.setVisibility(View.GONE); // visible on overview
updateGUI();
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 46c1e3666d..02bbb39067 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
@@ -49,13 +49,14 @@ import info.nightscout.androidaps.db.ProfileSwitch;
import info.nightscout.androidaps.db.Source;
import info.nightscout.androidaps.db.TempTarget;
import info.nightscout.androidaps.plugins.Careportal.OptionsToShow;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.utils.DateUtil;
import info.nightscout.utils.DefaultValueHelper;
import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.HardLimits;
import info.nightscout.utils.JsonHelper;
-import info.nightscout.utils.NSUpload;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.utils.NumberPicker;
import info.nightscout.utils.SP;
import info.nightscout.utils.SafeParse;
@@ -171,7 +172,7 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
view.findViewById(R.id.cancel).setOnClickListener(this);
// profile
- profile = MainApp.getConfigBuilder().getProfile();
+ profile = ProfileFunctions.getInstance().getProfile();
profileStore = MainApp.getConfigBuilder().getActiveProfileInterface().getProfile();
if (profileStore == null) {
if (options.eventType == R.id.careportal_profileswitch) {
@@ -186,7 +187,7 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
profileSpinner.setAdapter(adapter);
// set selected to actual profile
for (int p = 0; p < profileList.size(); p++) {
- if (profileList.get(p).equals(MainApp.getConfigBuilder().getProfileName(false)))
+ if (profileList.get(p).equals(ProfileFunctions.getInstance().getProfileName(false)))
profileSpinner.setSelection(p);
}
}
@@ -206,12 +207,15 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
public void onItemSelected(AdapterView> parent, View view, int position, long id) {
double defaultDuration;
double defaultTarget = 0;
- if (profile != null) {
+ if (profile != null && editTemptarget.getValue() == bg) {
defaultTarget = bg;
+ } else {
+ //prevent changes on screen rotate
+ defaultTarget = editTemptarget.getValue();
}
boolean erase = false;
- String units = MainApp.getConfigBuilder().getProfileUnits();
+ String units = ProfileFunctions.getInstance().getProfileUnits();
DefaultValueHelper helper = new DefaultValueHelper();
if (MainApp.gs(R.string.eatingsoon).equals(reasonList.get(position))) {
defaultDuration = helper.determineEatingSoonTTDuration();
@@ -222,6 +226,8 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
} else if (MainApp.gs(R.string.hypo).equals(reasonList.get(position))) {
defaultDuration = helper.determineHypoTTDuration();
defaultTarget = helper.determineHypoTT(units);
+ } else if (editDuration.getValue() != 0) {
+ defaultDuration = editDuration.getValue();
} else {
defaultDuration = 0;
erase = true;
@@ -258,7 +264,6 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
if (sensorRadioButton.isChecked()) meterRadioButton.setChecked(true);
}
};
-
editBg = (NumberPicker) view.findViewById(R.id.careportal_newnstreatment_bginput);
editTemptarget = (NumberPicker) view.findViewById(R.id.careportal_newnstreatment_temptarget);
if (profile == null) {
@@ -271,9 +276,14 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
editBg.setParams(bg, 0d, 500d, 1d, new DecimalFormat("0"), false, bgTextWatcher);
editTemptarget.setParams(bg, 0d, 500d, 1d, new DecimalFormat("0"), false);
}
+
sensorRadioButton.setOnCheckedChangeListener((buttonView, isChecked) -> {
Double bg1 = Profile.fromMgdlToUnits(GlucoseStatus.getGlucoseStatusData() != null ? GlucoseStatus.getGlucoseStatusData().glucose : 0d, profile.getUnits());
- editBg.setValue(bg1);
+ if (savedInstanceState != null && savedInstanceState.getDouble("editBg") != bg1) {
+ editBg.setValue(savedInstanceState.getDouble("editBg"));
+ } else {
+ editBg.setValue(bg1);
+ }
});
Integer maxCarbs = MainApp.getConstraintChecker().getMaxCarbsAllowed().value();
@@ -311,7 +321,7 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
if (profile != null)
maxPercent = MainApp.getConstraintChecker().getMaxBasalPercentAllowed(profile).value();
editPercent = (NumberPicker) view.findViewById(R.id.careportal_newnstreatment_percentinput);
- editPercent.setParams(0d, 0d, (double) maxPercent, 5d, new DecimalFormat("0"), true, percentTextWatcher);
+ editPercent.setParams(0d, -100d, (double) maxPercent, 5d, new DecimalFormat("0"), true, percentTextWatcher);
TextWatcher absoluteTextWatcher = new TextWatcher() {
@Override
@@ -378,6 +388,25 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
setCancelable(true);
getDialog().setCanceledOnTouchOutside(false);
+ //recovering state if there is something
+ // only numberPickers and editTexts
+ if (savedInstanceState != null) {
+ editBg.setValue(savedInstanceState.getDouble("editBg"));
+ editTemptarget.setValue(savedInstanceState.getDouble("editTemptarget"));
+ notesEdit.setText(savedInstanceState.getString("notesEdit"));
+ editCarbs.setValue(savedInstanceState.getDouble("editCarbs"));
+ editCarbs.setValue(savedInstanceState.getDouble("editCarbs"));
+ editInsulin.setValue(savedInstanceState.getDouble("editInsulin"));
+ editDuration.setValue(savedInstanceState.getDouble("editDuration"));
+ editPercent.setValue(savedInstanceState.getDouble("editPercent"));
+ editAbsolute.setValue(savedInstanceState.getDouble("editAbsolute"));
+ editCarbTime.setValue(savedInstanceState.getDouble("editCarbTime"));
+ editPercentage.setValue(savedInstanceState.getDouble("editPercentage"));
+ editTimeshift.setValue(savedInstanceState.getDouble("editTimeshift"));
+ // time and date
+ dateButton.setText(savedInstanceState.getString("dateButton"));
+ timeButton.setText(savedInstanceState.getString("timeButton"));
+ }
return view;
}
@@ -758,8 +787,8 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
profileSwitch = new ProfileSwitch();
profileSwitch.date = System.currentTimeMillis();
profileSwitch.source = Source.USER;
- profileSwitch.profileName = MainApp.getConfigBuilder().getProfileName(System.currentTimeMillis(), false);
- profileSwitch.profileJson = MainApp.getConfigBuilder().getProfile().getData().toString();
+ profileSwitch.profileName = ProfileFunctions.getInstance().getProfileName(System.currentTimeMillis(), false);
+ profileSwitch.profileJson = ProfileFunctions.getInstance().getProfile().getData().toString();
profileSwitch.profilePlugin = MainApp.getConfigBuilder().getActiveProfileInterface().getClass().getName();
profileSwitch.durationInMinutes = duration;
profileSwitch.isCPP = percentage != 100 || timeshift != 0;
@@ -772,4 +801,22 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick
}
}
+ @Override
+ public void onSaveInstanceState(Bundle savedInstanceState) {
+ savedInstanceState.putString("notesEdit", notesEdit.getText().toString());
+ savedInstanceState.putString("dateButton", dateButton.getText().toString());
+ savedInstanceState.putString("timeButton", timeButton.getText().toString());
+ savedInstanceState.putDouble("editBg", editBg.getValue());
+ savedInstanceState.putDouble("editCarbs", editCarbs.getValue());
+ savedInstanceState.putDouble("editInsulin", editInsulin.getValue());
+ savedInstanceState.putDouble("editDuration", editDuration.getValue());
+ savedInstanceState.putDouble("editPercent", editPercent.getValue());
+ savedInstanceState.putDouble("editAbsolute", editAbsolute.getValue());
+ savedInstanceState.putDouble("editCarbTime", editCarbTime.getValue());
+ savedInstanceState.putDouble("editTemptarget", editTemptarget.getValue());
+ savedInstanceState.putDouble("editPercentage", editPercentage.getValue());
+ savedInstanceState.putDouble("editTimeshift", editTimeshift.getValue());
+ super.onSaveInstanceState(savedInstanceState);
+ }
+
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderFragment.java
index 3e60ca2b77..3df78c9a28 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderFragment.java
@@ -26,7 +26,7 @@ import butterknife.ButterKnife;
import butterknife.OnClick;
import butterknife.Unbinder;
import info.nightscout.androidaps.MainApp;
-import info.nightscout.androidaps.PreferencesActivity;
+import info.nightscout.androidaps.activities.PreferencesActivity;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.events.EventConfigBuilderChange;
import info.nightscout.androidaps.events.EventRefreshGui;
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 886eeb3db7..b4c2abf3da 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
@@ -1,35 +1,17 @@
package info.nightscout.androidaps.plugins.ConfigBuilder;
-import android.content.Intent;
import android.support.annotation.Nullable;
-import com.crashlytics.android.answers.CustomEvent;
-import com.squareup.otto.Subscribe;
-
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
-import info.nightscout.androidaps.BuildConfig;
-import info.nightscout.androidaps.Config;
-import info.nightscout.androidaps.Constants;
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.ProfileStore;
-import info.nightscout.androidaps.data.PumpEnactResult;
-import info.nightscout.androidaps.db.CareportalEvent;
-import info.nightscout.androidaps.db.ProfileSwitch;
-import info.nightscout.androidaps.db.Source;
-import info.nightscout.androidaps.db.TemporaryBasal;
import info.nightscout.androidaps.events.EventAppInitialized;
-import info.nightscout.androidaps.events.EventNewBasalProfile;
-import info.nightscout.androidaps.events.EventProfileSwitchChange;
import info.nightscout.androidaps.interfaces.APSInterface;
import info.nightscout.androidaps.interfaces.BgSourceInterface;
-import info.nightscout.androidaps.interfaces.Constraint;
import info.nightscout.androidaps.interfaces.InsulinInterface;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
@@ -38,24 +20,18 @@ import info.nightscout.androidaps.interfaces.ProfileInterface;
import info.nightscout.androidaps.interfaces.PumpInterface;
import info.nightscout.androidaps.interfaces.SensitivityInterface;
import info.nightscout.androidaps.interfaces.TreatmentsInterface;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Insulin.InsulinOrefRapidActingPlugin;
-import info.nightscout.androidaps.plugins.Loop.APSResult;
-import info.nightscout.androidaps.plugins.Loop.LoopPlugin;
-import info.nightscout.androidaps.plugins.Overview.Dialogs.ErrorHelperActivity;
import info.nightscout.androidaps.plugins.PumpVirtual.VirtualPumpPlugin;
import info.nightscout.androidaps.plugins.Sensitivity.SensitivityOref0Plugin;
-import info.nightscout.androidaps.queue.Callback;
import info.nightscout.androidaps.queue.CommandQueue;
-import info.nightscout.utils.FabricPrivacy;
-import info.nightscout.utils.NSUpload;
import info.nightscout.utils.SP;
-import info.nightscout.utils.ToastUtils;
/**
* Created by mike on 05.08.2016.
*/
public class ConfigBuilderPlugin extends PluginBase {
- private static Logger log = LoggerFactory.getLogger(ConfigBuilderPlugin.class);
+ private Logger log = LoggerFactory.getLogger(L.CONFIGBUILDER);
private static ConfigBuilderPlugin configBuilderPlugin;
@@ -70,15 +46,9 @@ public class ConfigBuilderPlugin extends PluginBase {
private static ProfileInterface activeProfile;
private static TreatmentsInterface activeTreatments;
private static APSInterface activeAPS;
- private static LoopPlugin activeLoop;
private static InsulinInterface activeInsulin;
private static SensitivityInterface activeSensitivity;
- static public String nightscoutVersionName = "";
- static public Integer nightscoutVersionCode = 0;
- static public String nsClientVersionName = "";
- static public Integer nsClientVersionCode = 0;
-
private static ArrayList pluginList;
private static CommandQueue commandQueue = new CommandQueue();
@@ -119,16 +89,19 @@ public class ConfigBuilderPlugin extends PluginBase {
private void setAlwaysEnabledPluginsEnabled() {
for (PluginBase plugin : pluginList) {
- if (plugin.pluginDescription.alwaysEnabled) plugin.setPluginEnabled(plugin.getType(), true);
+ if (plugin.pluginDescription.alwaysEnabled)
+ plugin.setPluginEnabled(plugin.getType(), true);
}
storeSettings("setAlwaysEnabledPluginsEnabled");
}
public void storeSettings(String from) {
if (pluginList != null) {
- if (Config.logPrefsChange)
+ if (L.isEnabled(L.CONFIGBUILDER))
log.debug("Storing settings from: " + from);
+ verifySelectionInCategories();
+
for (PluginBase p : pluginList) {
PluginType type = p.getType();
if (p.pluginDescription.alwaysEnabled && p.pluginDescription.alwayVisible)
@@ -142,23 +115,24 @@ public class ConfigBuilderPlugin extends PluginBase {
}
}
}
- verifySelectionInCategories();
}
}
private void savePref(PluginBase p, PluginType type, boolean storeVisible) {
String settingEnabled = "ConfigBuilder_" + type.name() + "_" + p.getClass().getSimpleName() + "_Enabled";
SP.putBoolean(settingEnabled, p.isEnabled(type));
- log.debug("Storing: " + settingEnabled + ":" + p.isEnabled(type));
+ if (L.isEnabled(L.CONFIGBUILDER))
+ log.debug("Storing: " + settingEnabled + ":" + p.isEnabled(type));
if (storeVisible) {
String settingVisible = "ConfigBuilder_" + type.name() + "_" + p.getClass().getSimpleName() + "_Visible";
SP.putBoolean(settingVisible, p.isFragmentVisible());
- log.debug("Storing: " + settingVisible + ":" + p.isFragmentVisible());
+ if (L.isEnabled(L.CONFIGBUILDER))
+ log.debug("Storing: " + settingVisible + ":" + p.isFragmentVisible());
}
}
private void loadSettings() {
- if (Config.logPrefsChange)
+ if (L.isEnabled(L.CONFIGBUILDER))
log.debug("Loading stored settings");
for (PluginBase p : pluginList) {
PluginType type = p.getType();
@@ -179,7 +153,8 @@ public class ConfigBuilderPlugin extends PluginBase {
else if (p.getType() == type && (p.pluginDescription.enableByDefault || p.pluginDescription.alwaysEnabled)) {
p.setPluginEnabled(type, true);
}
- log.debug("Loaded: " + settingEnabled + ":" + p.isEnabled(type));
+ if (L.isEnabled(L.CONFIGBUILDER))
+ log.debug("Loaded: " + settingEnabled + ":" + p.isEnabled(type));
if (loadVisible) {
String settingVisible = "ConfigBuilder_" + type.name() + "_" + p.getClass().getSimpleName() + "_Visible";
if (SP.contains(settingVisible))
@@ -187,7 +162,8 @@ public class ConfigBuilderPlugin extends PluginBase {
else if (p.getType() == type && p.pluginDescription.visibleByDefault) {
p.setFragmentVisible(type, true);
}
- log.debug("Loaded: " + settingVisible + ":" + p.isFragmentVisible());
+ if (L.isEnabled(L.CONFIGBUILDER))
+ log.debug("Loaded: " + settingVisible + ":" + p.isFragmentVisible());
}
}
@@ -195,10 +171,11 @@ public class ConfigBuilderPlugin extends PluginBase {
private void upgradeSettings() {
if (!SP.contains("ConfigBuilder_1_NSProfilePlugin_Enabled"))
return;
- if (Config.logPrefsChange)
+ if (L.isEnabled(L.CONFIGBUILDER))
log.debug("Upgrading stored settings");
for (PluginBase p : pluginList) {
- log.debug("Processing " + p.getName());
+ if (L.isEnabled(L.CONFIGBUILDER))
+ log.debug("Processing " + p.getName());
for (int type = 1; type < 11; type++) {
PluginType newType;
switch (type) {
@@ -282,20 +259,21 @@ public class ConfigBuilderPlugin extends PluginBase {
}
void logPluginStatus() {
- for (PluginBase p : pluginList) {
- log.debug(p.getName() + ":" +
- (p.isEnabled(PluginType.GENERAL) ? " GENERAL" : "") +
- (p.isEnabled(PluginType.TREATMENT) ? " TREATMENT" : "") +
- (p.isEnabled(PluginType.SENSITIVITY) ? " SENSITIVITY" : "") +
- (p.isEnabled(PluginType.PROFILE) ? " PROFILE" : "") +
- (p.isEnabled(PluginType.APS) ? " APS" : "") +
- (p.isEnabled(PluginType.PUMP) ? " PUMP" : "") +
- (p.isEnabled(PluginType.CONSTRAINTS) ? " CONSTRAINTS" : "") +
- (p.isEnabled(PluginType.LOOP) ? " LOOP" : "") +
- (p.isEnabled(PluginType.BGSOURCE) ? " BGSOURCE" : "") +
- (p.isEnabled(PluginType.INSULIN) ? " INSULIN" : "")
- );
- }
+ if (L.isEnabled(L.CONFIGBUILDER))
+ for (PluginBase p : pluginList) {
+ log.debug(p.getName() + ":" +
+ (p.isEnabled(PluginType.GENERAL) ? " GENERAL" : "") +
+ (p.isEnabled(PluginType.TREATMENT) ? " TREATMENT" : "") +
+ (p.isEnabled(PluginType.SENSITIVITY) ? " SENSITIVITY" : "") +
+ (p.isEnabled(PluginType.PROFILE) ? " PROFILE" : "") +
+ (p.isEnabled(PluginType.APS) ? " APS" : "") +
+ (p.isEnabled(PluginType.PUMP) ? " PUMP" : "") +
+ (p.isEnabled(PluginType.CONSTRAINTS) ? " CONSTRAINTS" : "") +
+ (p.isEnabled(PluginType.LOOP) ? " LOOP" : "") +
+ (p.isEnabled(PluginType.BGSOURCE) ? " BGSOURCE" : "") +
+ (p.isEnabled(PluginType.INSULIN) ? " INSULIN" : "")
+ );
+ }
}
private void verifySelectionInCategories() {
@@ -310,6 +288,8 @@ public class ConfigBuilderPlugin extends PluginBase {
if (activeInsulin == null) {
activeInsulin = InsulinOrefRapidActingPlugin.getPlugin();
InsulinOrefRapidActingPlugin.getPlugin().setPluginEnabled(PluginType.INSULIN, true);
+ if (L.isEnabled(L.CONFIGBUILDER))
+ log.debug("Defaulting InsulinOrefRapidActingPlugin");
}
this.setFragmentVisiblities(((PluginBase) activeInsulin).getName(), pluginsInCategory, PluginType.INSULIN);
@@ -319,6 +299,8 @@ public class ConfigBuilderPlugin extends PluginBase {
if (activeSensitivity == null) {
activeSensitivity = SensitivityOref0Plugin.getPlugin();
SensitivityOref0Plugin.getPlugin().setPluginEnabled(PluginType.SENSITIVITY, true);
+ if (L.isEnabled(L.CONFIGBUILDER))
+ log.debug("Defaulting SensitivityOref0Plugin");
}
this.setFragmentVisiblities(((PluginBase) activeSensitivity).getName(), pluginsInCategory, PluginType.SENSITIVITY);
@@ -334,12 +316,11 @@ public class ConfigBuilderPlugin extends PluginBase {
if (activePump == null) {
activePump = VirtualPumpPlugin.getPlugin();
VirtualPumpPlugin.getPlugin().setPluginEnabled(PluginType.PUMP, true);
+ if (L.isEnabled(L.CONFIGBUILDER))
+ log.debug("Defaulting VirtualPumpPlugin");
}
this.setFragmentVisiblities(((PluginBase) activePump).getName(), pluginsInCategory, PluginType.PUMP);
- // PluginType.LOOP
- activeLoop = this.determineActivePlugin(PluginType.LOOP);
-
// PluginType.TREATMENT
activeTreatments = this.determineActivePlugin(PluginType.TREATMENT);
}
@@ -395,7 +376,7 @@ public class ConfigBuilderPlugin extends PluginBase {
private void setFragmentVisiblities(String activePluginName, ArrayList pluginsInCategory,
PluginType pluginType) {
- if (Config.logConfigBuilder)
+ if (L.isEnabled(L.CONFIGBUILDER))
log.debug("Selected interface: " + activePluginName);
for (PluginBase p : pluginsInCategory) {
if (!p.getName().equals(activePluginName)) {
@@ -421,247 +402,4 @@ public class ConfigBuilderPlugin extends PluginBase {
return found;
}
- /**
- * expect absolute request and allow both absolute and percent response based on pump capabilities
- */
- public void applyTBRRequest(APSResult request, Profile profile, Callback callback) {
- if (!request.tempBasalRequested) {
- if (callback != null) {
- callback.result(new PumpEnactResult().enacted(false).success(true).comment(MainApp.gs(R.string.nochangerequested))).run();
- }
- return;
- }
-
- PumpInterface pump = getActivePump();
-
- request.rateConstraint = new Constraint<>(request.rate);
- request.rate = MainApp.getConstraintChecker().applyBasalConstraints(request.rateConstraint, profile).value();
-
- if (!pump.isInitialized()) {
- log.debug("applyAPSRequest: " + MainApp.gs(R.string.pumpNotInitialized));
- if (callback != null) {
- callback.result(new PumpEnactResult().comment(MainApp.gs(R.string.pumpNotInitialized)).enacted(false).success(false)).run();
- }
- return;
- }
-
- if (pump.isSuspended()) {
- log.debug("applyAPSRequest: " + MainApp.gs(R.string.pumpsuspended));
- if (callback != null) {
- callback.result(new PumpEnactResult().comment(MainApp.gs(R.string.pumpsuspended)).enacted(false).success(false)).run();
- }
- return;
- }
-
- if (Config.logCongigBuilderActions)
- log.debug("applyAPSRequest: " + request.toString());
-
- long now = System.currentTimeMillis();
- TemporaryBasal activeTemp = activeTreatments.getTempBasalFromHistory(now);
- if ((request.rate == 0 && request.duration == 0) || Math.abs(request.rate - pump.getBaseBasalRate()) < pump.getPumpDescription().basalStep) {
- if (activeTemp != null) {
- if (Config.logCongigBuilderActions)
- log.debug("applyAPSRequest: cancelTempBasal()");
- getCommandQueue().cancelTempBasal(false, callback);
- } else {
- if (Config.logCongigBuilderActions)
- log.debug("applyAPSRequest: Basal set correctly");
- if (callback != null) {
- callback.result(new PumpEnactResult().absolute(request.rate).duration(0)
- .enacted(false).success(true).comment(MainApp.gs(R.string.basal_set_correctly))).run();
- }
- }
- } else if (activeTemp != null
- && activeTemp.getPlannedRemainingMinutes() > 5
- && request.duration - activeTemp.getPlannedRemainingMinutes() < 30
- && Math.abs(request.rate - activeTemp.tempBasalConvertedToAbsolute(now, profile)) < pump.getPumpDescription().basalStep) {
- if (Config.logCongigBuilderActions)
- log.debug("applyAPSRequest: Temp basal set correctly");
- if (callback != null) {
- callback.result(new PumpEnactResult().absolute(activeTemp.tempBasalConvertedToAbsolute(now, profile))
- .enacted(false).success(true).duration(activeTemp.getPlannedRemainingMinutes())
- .comment(MainApp.gs(R.string.let_temp_basal_run))).run();
- }
- } else {
- if (Config.logCongigBuilderActions)
- log.debug("applyAPSRequest: setTempBasalAbsolute()");
- getCommandQueue().tempBasalAbsolute(request.rate, request.duration, false, profile, callback);
- }
- }
-
- public void applySMBRequest(APSResult request, Callback callback) {
- if (!request.bolusRequested) {
- return;
- }
-
- long lastBolusTime = activeTreatments.getLastBolusTime();
- if (lastBolusTime != 0 && lastBolusTime + 3 * 60 * 1000 > System.currentTimeMillis()) {
- log.debug("SMB requested but still in 3 min interval");
- if (callback != null) {
- callback.result(new PumpEnactResult()
- .comment(MainApp.gs(R.string.smb_frequency_exceeded))
- .enacted(false).success(false)).run();
- }
- return;
- }
-
- PumpInterface pump = getActivePump();
-
- if (!pump.isInitialized()) {
- log.debug("applySMBRequest: " + MainApp.gs(R.string.pumpNotInitialized));
- if (callback != null) {
- callback.result(new PumpEnactResult().comment(MainApp.gs(R.string.pumpNotInitialized)).enacted(false).success(false)).run();
- }
- return;
- }
-
- if (pump.isSuspended()) {
- log.debug("applySMBRequest: " + MainApp.gs(R.string.pumpsuspended));
- if (callback != null) {
- callback.result(new PumpEnactResult().comment(MainApp.gs(R.string.pumpsuspended)).enacted(false).success(false)).run();
- }
- return;
- }
-
- if (Config.logCongigBuilderActions)
- log.debug("applySMBRequest: " + request.toString());
-
- // deliver SMB
- DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo();
- detailedBolusInfo.lastKnownBolusTime = activeTreatments.getLastBolusTime();
- detailedBolusInfo.eventType = CareportalEvent.CORRECTIONBOLUS;
- detailedBolusInfo.insulin = request.smb;
- detailedBolusInfo.isSMB = true;
- detailedBolusInfo.source = Source.USER;
- detailedBolusInfo.deliverAt = request.deliverAt;
- if (Config.logCongigBuilderActions)
- log.debug("applyAPSRequest: bolus()");
- getCommandQueue().bolus(detailedBolusInfo, callback);
- }
-
- @Subscribe
- public void onProfileSwitch(EventProfileSwitchChange ignored) {
- getCommandQueue().setProfile(getProfile(), new Callback() {
- @Override
- public void run() {
- if (!result.success) {
- Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class);
- i.putExtra("soundid", R.raw.boluserror);
- i.putExtra("status", result.comment);
- i.putExtra("title", MainApp.gs(R.string.failedupdatebasalprofile));
- i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- MainApp.instance().startActivity(i);
- }
- MainApp.bus().post(new EventNewBasalProfile());
- }
- });
- }
-
- public String getProfileName() {
- return getProfileName(System.currentTimeMillis());
- }
-
- public String getProfileName(boolean customized) {
- return getProfileName(System.currentTimeMillis(), customized);
- }
-
- public String getProfileName(long time) {
- return getProfileName(time, true);
- }
-
- public String getProfileName(long time, boolean customized) {
- ProfileSwitch profileSwitch = activeTreatments.getProfileSwitchFromHistory(time);
- if (profileSwitch != null) {
- if (profileSwitch.profileJson != null) {
- return customized ? profileSwitch.getCustomizedName() : profileSwitch.profileName;
- } else {
- ProfileStore profileStore = activeProfile.getProfile();
- if (profileStore != null) {
- Profile profile = profileStore.getSpecificProfile(profileSwitch.profileName);
- if (profile != null)
- return profileSwitch.profileName;
- }
- }
- }
- return MainApp.gs(R.string.noprofileselected);
- }
-
- public boolean isProfileValid(String from) {
- return getProfile() != null && getProfile().isValid(from);
- }
-
- @Nullable
- public Profile getProfile() {
- return getProfile(System.currentTimeMillis());
- }
-
- public String getProfileUnits() {
- Profile profile = getProfile();
- return profile != null ? profile.getUnits() : Constants.MGDL;
- }
-
- @Nullable
- public Profile getProfile(long time) {
- if (activeTreatments == null) {
- log.debug("getProfile activeTreatments == null: returning null");
- return null; //app not initialized
- }
- //log.debug("Profile for: " + new Date(time).toLocaleString() + " : " + getProfileName(time));
- ProfileSwitch profileSwitch = activeTreatments.getProfileSwitchFromHistory(time);
- if (profileSwitch != null) {
- if (profileSwitch.profileJson != null) {
- return profileSwitch.getProfileObject();
- } else if (activeProfile.getProfile() != null) {
- Profile profile = activeProfile.getProfile().getSpecificProfile(profileSwitch.profileName);
- if (profile != null)
- return profile;
- }
- }
- if (activeTreatments.getProfileSwitchesFromHistory().size() > 0) {
- FabricPrivacy.getInstance().logCustom(new CustomEvent("CatchedError")
- .putCustomAttribute("buildversion", BuildConfig.BUILDVERSION)
- .putCustomAttribute("version", BuildConfig.VERSION)
- .putCustomAttribute("time", time)
- .putCustomAttribute("getProfileSwitchesFromHistory", activeTreatments.getProfileSwitchesFromHistory().toString())
- );
- }
- log.debug("getProfile at the end: returning null");
- return null;
- }
-
- public void disconnectPump(int durationInMinutes, Profile profile) {
- LoopPlugin.getPlugin().disconnectTo(System.currentTimeMillis() + durationInMinutes * 60 * 1000L);
- getCommandQueue().tempBasalPercent(0, durationInMinutes, true, profile, new Callback() {
- @Override
- public void run() {
- if (!result.success) {
- ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.tempbasaldeliveryerror));
- }
- }
- });
- if (getActivePump().getPumpDescription().isExtendedBolusCapable && activeTreatments.isInHistoryExtendedBoluslInProgress()) {
- getCommandQueue().cancelExtended(new Callback() {
- @Override
- public void run() {
- if (!result.success) {
- ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.extendedbolusdeliveryerror));
- }
- }
- });
- }
- NSUpload.uploadOpenAPSOffline(durationInMinutes);
- }
-
- public void suspendLoop(int durationInMinutes) {
- LoopPlugin.getPlugin().suspendTo(System.currentTimeMillis() + durationInMinutes * 60 * 1000);
- getCommandQueue().cancelTempBasal(true, new Callback() {
- @Override
- public void run() {
- if (!result.success) {
- ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.tempbasaldeliveryerror));
- }
- }
- });
- NSUpload.uploadOpenAPSOffline(durationInMinutes);
- }
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/DetailedBolusInfoStorage.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/DetailedBolusInfoStorage.java
index 7a4e99b584..9b4e1d0a28 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/DetailedBolusInfoStorage.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/DetailedBolusInfoStorage.java
@@ -6,17 +6,17 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
-import java.util.Date;
import java.util.List;
import info.nightscout.androidaps.data.DetailedBolusInfo;
+import info.nightscout.androidaps.logging.L;
/**
* Created by mike on 08.08.2017.
*/
public class DetailedBolusInfoStorage {
- private static Logger log = LoggerFactory.getLogger(DetailedBolusInfoStorage.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMP);
private static List store = new ArrayList<>();
public static synchronized void add(DetailedBolusInfo detailedBolusInfo) {
@@ -29,23 +29,16 @@ public class DetailedBolusInfoStorage {
DetailedBolusInfo found = null;
for (int i = 0; i < store.size(); i++) {
long infoTime = store.get(i).date;
- log.debug("Existing bolus info: " + store.get(i));
+ if (L.isEnabled(L.PUMP))
+ log.debug("Existing bolus info: " + store.get(i));
if (bolustime > infoTime - 60 * 1000 && bolustime < infoTime + 60 * 1000) {
found = store.get(i);
+ if (L.isEnabled(L.PUMP))
+ log.debug("Using & removing bolus info: " + store.get(i));
+ store.remove(i);
break;
}
}
return found;
}
-
- public static synchronized void remove(long bolustime) {
- for (int i = 0; i < store.size(); i++) {
- long infoTime = store.get(i).date;
- if (bolustime > infoTime - 60 * 1000 && bolustime < infoTime + 60 * 1000) {
- log.debug("Removing bolus info: " + store.get(i));
- store.remove(i);
- break;
- }
- }
- }
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ProfileFunctions.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ProfileFunctions.java
new file mode 100644
index 0000000000..8eff3c525f
--- /dev/null
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ProfileFunctions.java
@@ -0,0 +1,142 @@
+package info.nightscout.androidaps.plugins.ConfigBuilder;
+
+import android.content.Intent;
+import android.support.annotation.Nullable;
+
+import com.crashlytics.android.answers.CustomEvent;
+import com.squareup.otto.Subscribe;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import info.nightscout.androidaps.BuildConfig;
+import info.nightscout.androidaps.Constants;
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.data.Profile;
+import info.nightscout.androidaps.data.ProfileStore;
+import info.nightscout.androidaps.db.ProfileSwitch;
+import info.nightscout.androidaps.events.EventNewBasalProfile;
+import info.nightscout.androidaps.events.EventProfileSwitchChange;
+import info.nightscout.androidaps.interfaces.ProfileInterface;
+import info.nightscout.androidaps.interfaces.TreatmentsInterface;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.Overview.Dialogs.ErrorHelperActivity;
+import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
+import info.nightscout.androidaps.queue.Callback;
+import info.nightscout.utils.FabricPrivacy;
+
+public class ProfileFunctions {
+ private static Logger log = LoggerFactory.getLogger(L.PROFILE);
+
+ private static ProfileFunctions profileFunctions = null;
+
+ public static ProfileFunctions getInstance() {
+ if (profileFunctions == null)
+ profileFunctions = new ProfileFunctions();
+ return profileFunctions;
+ }
+
+ static {
+ ProfileFunctions.getInstance(); // register to bus at start
+ }
+
+ ProfileFunctions() {
+ MainApp.bus().register(this);
+ }
+
+ @Subscribe
+ public void onProfileSwitch(EventProfileSwitchChange ignored) {
+ if (L.isEnabled(L.PROFILE))
+ log.debug("onProfileSwitch");
+ MainApp.getConfigBuilder().getCommandQueue().setProfile(getProfile(), new Callback() {
+ @Override
+ public void run() {
+ if (!result.success) {
+ Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class);
+ i.putExtra("soundid", R.raw.boluserror);
+ i.putExtra("status", result.comment);
+ i.putExtra("title", MainApp.gs(R.string.failedupdatebasalprofile));
+ i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ MainApp.instance().startActivity(i);
+ }
+ MainApp.bus().post(new EventNewBasalProfile());
+ }
+ });
+ }
+
+ public String getProfileName() {
+ return getProfileName(System.currentTimeMillis());
+ }
+
+ public String getProfileName(boolean customized) {
+ return getProfileName(System.currentTimeMillis(), customized);
+ }
+
+ public String getProfileName(long time) {
+ return getProfileName(time, true);
+ }
+
+ public String getProfileName(long time, boolean customized) {
+ TreatmentsInterface activeTreatments = TreatmentsPlugin.getPlugin();
+ ProfileInterface activeProfile = MainApp.getConfigBuilder().getActiveProfileInterface();
+
+ ProfileSwitch profileSwitch = activeTreatments.getProfileSwitchFromHistory(time);
+ if (profileSwitch != null) {
+ if (profileSwitch.profileJson != null) {
+ return customized ? profileSwitch.getCustomizedName() : profileSwitch.profileName;
+ } else {
+ ProfileStore profileStore = activeProfile.getProfile();
+ if (profileStore != null) {
+ Profile profile = profileStore.getSpecificProfile(profileSwitch.profileName);
+ if (profile != null)
+ return profileSwitch.profileName;
+ }
+ }
+ }
+ return MainApp.gs(R.string.noprofileselected);
+ }
+
+ public boolean isProfileValid(String from) {
+ return getProfile() != null && getProfile().isValid(from);
+ }
+
+ @Nullable
+ public Profile getProfile() {
+ return getProfile(System.currentTimeMillis());
+ }
+
+ public String getProfileUnits() {
+ Profile profile = getProfile();
+ return profile != null ? profile.getUnits() : Constants.MGDL;
+ }
+
+ @Nullable
+ public Profile getProfile(long time) {
+ TreatmentsInterface activeTreatments = TreatmentsPlugin.getPlugin();
+ ProfileInterface activeProfile = MainApp.getConfigBuilder().getActiveProfileInterface();
+
+ //log.debug("Profile for: " + new Date(time).toLocaleString() + " : " + getProfileName(time));
+ ProfileSwitch profileSwitch = activeTreatments.getProfileSwitchFromHistory(time);
+ if (profileSwitch != null) {
+ if (profileSwitch.profileJson != null) {
+ return profileSwitch.getProfileObject();
+ } else if (activeProfile.getProfile() != null) {
+ Profile profile = activeProfile.getProfile().getSpecificProfile(profileSwitch.profileName);
+ if (profile != null)
+ return profile;
+ }
+ }
+ if (activeTreatments.getProfileSwitchesFromHistory().size() > 0) {
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("CatchedError")
+ .putCustomAttribute("buildversion", BuildConfig.BUILDVERSION)
+ .putCustomAttribute("version", BuildConfig.VERSION)
+ .putCustomAttribute("time", time)
+ .putCustomAttribute("getProfileSwitchesFromHistory", activeTreatments.getProfileSwitchesFromHistory().toString())
+ );
+ }
+ log.error("getProfile at the end: returning null");
+ return null;
+ }
+
+}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java
index 2f896ba91b..3dcec0920f 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java
@@ -1,18 +1,15 @@
package info.nightscout.androidaps.plugins.ConstraintsObjectives;
-import android.animation.LayoutTransition;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.support.annotation.NonNull;
-import android.support.v4.content.ContextCompat;
import android.support.v7.widget.CardView;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.LinearSmoothScroller;
import android.support.v7.widget.RecyclerView;
import android.text.Html;
-import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -21,28 +18,15 @@ import android.widget.CheckBox;
import android.widget.LinearLayout;
import android.widget.TextView;
-
-import com.squareup.otto.Subscribe;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import java.util.Date;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.events.EventConfigBuilderChange;
-import info.nightscout.androidaps.events.EventNewBG;
-import info.nightscout.androidaps.events.EventProfileSwitchChange;
-import info.nightscout.androidaps.events.EventTreatmentChange;
import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
-import info.nightscout.androidaps.plugins.ConstraintsObjectives.events.EventObjectivesSaved;
import info.nightscout.androidaps.plugins.ConstraintsObjectives.objectives.Objective;
import info.nightscout.utils.FabricPrivacy;
public class ObjectivesFragment extends SubscriberFragment {
- private static Logger log = LoggerFactory.getLogger(ObjectivesFragment.class);
-
RecyclerView recyclerView;
CheckBox enableFake;
TextView reset;
@@ -71,7 +55,7 @@ public class ObjectivesFragment extends SubscriberFragment {
enableFake.setOnClickListener(v -> updateGUI());
reset.setOnClickListener(v -> {
ObjectivesPlugin.getPlugin().reset();
- ObjectivesPlugin.saveProgress();
+ ObjectivesPlugin.getPlugin().saveProgress();
recyclerView.getAdapter().notifyDataSetChanged();
scrollToCurrentObjective();
});
@@ -93,7 +77,7 @@ public class ObjectivesFragment extends SubscriberFragment {
private void startUpdateTimer() {
handler.removeCallbacks(objectiveUpdater);
- for (Objective objective : ObjectivesPlugin.getObjectives()) {
+ for (Objective objective : ObjectivesPlugin.getPlugin().getObjectives()) {
if (objective.isStarted() && !objective.isAccomplished()) {
long timeTillNextMinute = (System.currentTimeMillis() - objective.getStartedOn().getTime()) % (60 * 1000);
handler.postDelayed(objectiveUpdater, timeTillNextMinute);
@@ -103,8 +87,8 @@ public class ObjectivesFragment extends SubscriberFragment {
}
private void scrollToCurrentObjective() {
- for (int i = 0; i < ObjectivesPlugin.getObjectives().size(); i++) {
- Objective objective = ObjectivesPlugin.getObjectives().get(i);
+ for (int i = 0; i < ObjectivesPlugin.getPlugin().getObjectives().size(); i++) {
+ Objective objective = ObjectivesPlugin.getPlugin().getObjectives().get(i);
if (!objective.isStarted() || !objective.isAccomplished()) {
RecyclerView.SmoothScroller smoothScroller = new LinearSmoothScroller(getContext()) {
@Override
@@ -134,7 +118,7 @@ public class ObjectivesFragment extends SubscriberFragment {
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
- Objective objective = ObjectivesPlugin.getObjectives().get(position);
+ Objective objective = ObjectivesPlugin.getPlugin().getObjectives().get(position);
holder.title.setText(MainApp.gs(R.string.nth_objective, position + 1));
if (objective.getObjective() != 0) {
holder.objective.setVisibility(View.VISIBLE);
@@ -148,7 +132,7 @@ public class ObjectivesFragment extends SubscriberFragment {
holder.gate.setTextColor(0xFFFFFFFF);
holder.verify.setVisibility(View.GONE);
holder.progress.setVisibility(View.GONE);
- if (position == 0 || ObjectivesPlugin.getObjectives().get(position - 1).isAccomplished())
+ if (position == 0 || ObjectivesPlugin.getPlugin().getObjectives().get(position - 1).isAccomplished())
holder.start.setVisibility(View.VISIBLE);
else holder.start.setVisibility(View.GONE);
} else if (objective.isAccomplished()) {
@@ -189,7 +173,7 @@ public class ObjectivesFragment extends SubscriberFragment {
@Override
public int getItemCount() {
- return ObjectivesPlugin.getObjectives().size();
+ return ObjectivesPlugin.getPlugin().getObjectives().size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesPlugin.java
index a67f694eb8..aae2d1f029 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
@@ -15,6 +15,7 @@ import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.interfaces.PumpInterface;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.ConstraintsObjectives.events.EventObjectivesSaved;
import info.nightscout.androidaps.plugins.ConstraintsObjectives.objectives.Objective;
@@ -32,14 +33,14 @@ import info.nightscout.utils.SP;
* Created by mike on 05.08.2016.
*/
public class ObjectivesPlugin extends PluginBase implements ConstraintsInterface {
- private static Logger log = LoggerFactory.getLogger(ObjectivesPlugin.class);
+ private static Logger log = LoggerFactory.getLogger(L.CONSTRAINTS);
private static ObjectivesPlugin objectivesPlugin;
- public static List objectives = new ArrayList<>();
- public static boolean bgIsAvailableInNS = false;
- public static boolean pumpStatusIsAvailableInNS = false;
- public static Integer manualEnacts = 0;
+ public List objectives = new ArrayList<>();
+ public boolean bgIsAvailableInNS = false;
+ public boolean pumpStatusIsAvailableInNS = false;
+ public Integer manualEnacts = 0;
public static ObjectivesPlugin getPlugin() {
if (objectivesPlugin == null) {
@@ -52,8 +53,8 @@ public class ObjectivesPlugin extends PluginBase implements ConstraintsInterface
super(new PluginDescription()
.mainType(PluginType.CONSTRAINTS)
.fragmentClass(ObjectivesFragment.class.getName())
- .alwaysEnabled(!Config.NSCLIENT && !Config.G5UPLOADER)
- .showInList(!Config.NSCLIENT && !Config.G5UPLOADER)
+ .alwaysEnabled(!Config.NSCLIENT)
+ .showInList(!Config.NSCLIENT)
.pluginName(R.string.objectives)
.shortName(R.string.objectives_shortname)
.description(R.string.description_objectives)
@@ -90,11 +91,11 @@ public class ObjectivesPlugin extends PluginBase implements ConstraintsInterface
saveProgress();
}
- public static void saveProgress() {
+ public void saveProgress() {
SP.putBoolean("Objectives" + "bgIsAvailableInNS", bgIsAvailableInNS);
SP.putBoolean("Objectives" + "pumpStatusIsAvailableInNS", pumpStatusIsAvailableInNS);
SP.putString("Objectives" + "manualEnacts", Integer.toString(manualEnacts));
- if (Config.logPrefsChange)
+ if (L.isEnabled(L.CONSTRAINTS))
log.debug("Objectives stored");
MainApp.bus().post(new EventObjectivesSaved());
}
@@ -107,11 +108,11 @@ public class ObjectivesPlugin extends PluginBase implements ConstraintsInterface
} catch (Exception e) {
log.error("Unhandled exception", e);
}
- if (Config.logPrefsChange)
+ if (L.isEnabled(L.CONSTRAINTS))
log.debug("Objectives loaded");
}
- public static List getObjectives() {
+ public List getObjectives() {
return objectives;
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective.java
index bba29c5201..5127f64b34 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective.java
@@ -9,6 +9,7 @@ import java.util.List;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.utils.SP;
+import info.nightscout.utils.T;
public abstract class Objective {
@@ -128,9 +129,9 @@ public abstract class Objective {
}
private String getDurationText(long duration) {
- int days = (int) Math.floor((double) duration / (24D * 60D * 60D * 1000D));
- int hours = (int) Math.floor((double) duration / (60D * 60D * 1000D));
- int minutes = (int) Math.floor((double) duration / (60D * 1000D));
+ int days = (int) Math.floor((double) duration / T.days(1).msecs());
+ int hours = (int) Math.floor((double) duration / T.hours(1).msecs());
+ int minutes = (int) Math.floor((double) duration / T.mins(1).msecs());
if (days > 0) return MainApp.gq(R.plurals.objective_days, days, days);
else if (hours > 0) return MainApp.gq(R.plurals.objective_hours, hours, hours);
else return MainApp.gq(R.plurals.objective_minutes, minutes, minutes);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective1.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective1.java
index e374126b11..d1f4f3ebd7 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective1.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective1.java
@@ -27,7 +27,7 @@ public class Objective1 extends Objective {
tasks.add(new Task(R.string.objectives_bgavailableinns) {
@Override
public boolean isCompleted() {
- return ObjectivesPlugin.bgIsAvailableInNS;
+ return ObjectivesPlugin.getPlugin().bgIsAvailableInNS;
}
});
tasks.add(new Task(R.string.nsclienthaswritepermission) {
@@ -50,7 +50,7 @@ public class Objective1 extends Objective {
tasks.add(new Task(R.string.objectives_pumpstatusavailableinns) {
@Override
public boolean isCompleted() {
- return ObjectivesPlugin.pumpStatusIsAvailableInNS;
+ return ObjectivesPlugin.getPlugin().pumpStatusIsAvailableInNS;
}
});
tasks.add(new Task(R.string.hasbgdata) {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective2.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective2.java
index 305f00ec6f..ac5485f953 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective2.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective2.java
@@ -5,10 +5,11 @@ import java.util.List;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.plugins.ConstraintsObjectives.ObjectivesPlugin;
+import info.nightscout.utils.T;
public class Objective2 extends Objective {
- public static final int MANUAL_ENACTS_NEEDED = 20;
+ public final int MANUAL_ENACTS_NEEDED = 20;
public Objective2() {
super(1, R.string.objectives_1_objective, R.string.objectives_1_gate);
@@ -16,17 +17,19 @@ public class Objective2 extends Objective {
@Override
protected void setupTasks(List tasks) {
- tasks.add(new MinimumDurationTask(7L * 24L * 60L * 60L * 1000L));
+ tasks.add(new MinimumDurationTask(T.days(7).msecs()));
tasks.add(new Task(R.string.objectives_manualenacts) {
@Override
public boolean isCompleted() {
- return ObjectivesPlugin.manualEnacts >= MANUAL_ENACTS_NEEDED;
+ return ObjectivesPlugin.getPlugin().manualEnacts >= MANUAL_ENACTS_NEEDED;
}
@Override
public String getProgress() {
- if (ObjectivesPlugin.manualEnacts >= MANUAL_ENACTS_NEEDED) return MainApp.gs(R.string.completed_well_done);
- else return ObjectivesPlugin.manualEnacts + " / " + MANUAL_ENACTS_NEEDED;
+ if (ObjectivesPlugin.getPlugin().manualEnacts >= MANUAL_ENACTS_NEEDED)
+ return MainApp.gs(R.string.completed_well_done);
+ else
+ return ObjectivesPlugin.getPlugin().manualEnacts + " / " + MANUAL_ENACTS_NEEDED;
}
});
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective4.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective4.java
index 36a98babc1..4cac10e514 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective4.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective4.java
@@ -5,6 +5,7 @@ import java.util.List;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.interfaces.Constraint;
import info.nightscout.androidaps.plugins.ConstraintsSafety.SafetyPlugin;
+import info.nightscout.utils.T;
public class Objective4 extends Objective {
@@ -14,7 +15,7 @@ public class Objective4 extends Objective {
@Override
protected void setupTasks(List tasks) {
- tasks.add(new MinimumDurationTask(5L * 24L * 60L * 60L * 1000L));
+ tasks.add(new MinimumDurationTask(T.days(5).msecs()));
tasks.add(new Task(R.string.closedmodeenabled) {
@Override
public boolean isCompleted() {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective5.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective5.java
index 563a114e05..8472f26c6c 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective5.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective5.java
@@ -4,6 +4,7 @@ import java.util.List;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
+import info.nightscout.utils.T;
public class Objective5 extends Objective {
@@ -13,7 +14,7 @@ public class Objective5 extends Objective {
@Override
protected void setupTasks(List tasks) {
- tasks.add(new MinimumDurationTask(24L * 60L * 60L * 1000L));
+ tasks.add(new MinimumDurationTask(T.days(1).msecs()));
tasks.add(new Task(R.string.maxiobset) {
@Override
public boolean isCompleted() {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective6.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective6.java
index 7106d7522b..7867b28e70 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective6.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective6.java
@@ -3,6 +3,7 @@ package info.nightscout.androidaps.plugins.ConstraintsObjectives.objectives;
import java.util.List;
import info.nightscout.androidaps.R;
+import info.nightscout.utils.T;
public class Objective6 extends Objective {
@@ -12,6 +13,6 @@ public class Objective6 extends Objective {
@Override
protected void setupTasks(List tasks) {
- tasks.add(new MinimumDurationTask(7L * 24L * 60L * 60L * 1000L));
+ tasks.add(new MinimumDurationTask(T.days(7).msecs()));
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective7.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective7.java
index cfd041bf13..670cffe746 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective7.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective7.java
@@ -3,6 +3,7 @@ package info.nightscout.androidaps.plugins.ConstraintsObjectives.objectives;
import java.util.List;
import info.nightscout.androidaps.R;
+import info.nightscout.utils.T;
public class Objective7 extends Objective {
@@ -12,6 +13,6 @@ public class Objective7 extends Objective {
@Override
protected void setupTasks(List tasks) {
- tasks.add(new MinimumDurationTask(28L * 24L * 60L * 60L * 1000L));
+ tasks.add(new MinimumDurationTask(T.days(28).msecs()));
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective8.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective8.java
index 376d5fb7a2..9ac4f9b6d7 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective8.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/objectives/Objective8.java
@@ -3,6 +3,7 @@ package info.nightscout.androidaps.plugins.ConstraintsObjectives.objectives;
import java.util.List;
import info.nightscout.androidaps.R;
+import info.nightscout.utils.T;
public class Objective8 extends Objective {
@@ -12,6 +13,6 @@ public class Objective8 extends Objective {
@Override
protected void setupTasks(List tasks) {
- tasks.add(new MinimumDurationTask(28L * 24L * 60L * 60L * 1000L));
+ tasks.add(new MinimumDurationTask(T.days(28).msecs()));
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPlugin.java
index 3d17970edc..59f44c77c7 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPlugin.java
@@ -10,6 +10,8 @@ import info.nightscout.androidaps.interfaces.ConstraintsInterface;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.interfaces.PumpDescription;
+import info.nightscout.androidaps.interfaces.PumpInterface;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.OpenAPSAMA.OpenAPSAMAPlugin;
import info.nightscout.androidaps.plugins.OpenAPSMA.OpenAPSMAPlugin;
@@ -57,7 +59,7 @@ public class SafetyPlugin extends PluginBase implements ConstraintsInterface {
@Override
public Constraint isClosedLoopAllowed(Constraint value) {
- String mode = SP.getString("aps_mode", "open");
+ String mode = SP.getString(R.string.key_aps_mode, "open");
if (!mode.equals("closed"))
value.set(false, MainApp.gs(R.string.closedmodedisabledinpreferences), this);
@@ -121,6 +123,18 @@ public class SafetyPlugin extends PluginBase implements ConstraintsInterface {
absoluteRate.setIfSmaller(maxFromDaily, String.format(MainApp.gs(R.string.limitingbasalratio), maxFromDaily, MainApp.gs(R.string.maxdailybasalmultiplier)), this);
absoluteRate.setIfSmaller(HardLimits.maxBasal(), String.format(MainApp.gs(R.string.limitingbasalratio), HardLimits.maxBasal(), MainApp.gs(R.string.hardlimit)), this);
+
+ PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
+ // check for pump max
+ if (pump != null && pump.getPumpDescription().tempBasalStyle == PumpDescription.ABSOLUTE) {
+ double pumpLimit = pump.getPumpDescription().pumpType.getTbrSettings().getMaxDose();
+ absoluteRate.setIfSmaller(pumpLimit, String.format(MainApp.gs(R.string.limitingbasalratio), pumpLimit, MainApp.gs(R.string.pumplimit)), this);
+ }
+
+ // do rounding
+ if (pump != null && pump.getPumpDescription().tempBasalStyle == PumpDescription.ABSOLUTE) {
+ absoluteRate.set(Round.roundTo(absoluteRate.value(), pump.getPumpDescription().tempAbsoluteStep));
+ }
return absoluteRate;
}
@@ -136,13 +150,23 @@ public class SafetyPlugin extends PluginBase implements ConstraintsInterface {
applyBasalConstraints(absoluteConstraint, profile);
percentRate.copyReasons(absoluteConstraint);
+ PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
+
Integer percentRateAfterConst = Double.valueOf(absoluteConstraint.value() / currentBasal * 100).intValue();
- if (percentRateAfterConst < 100)
- percentRateAfterConst = Round.ceilTo((double) percentRateAfterConst, 10d).intValue();
- else percentRateAfterConst = Round.floorTo((double) percentRateAfterConst, 10d).intValue();
+ if (pump != null) {
+ if (percentRateAfterConst < 100)
+ percentRateAfterConst = Round.ceilTo((double) percentRateAfterConst, (double) pump.getPumpDescription().tempPercentStep).intValue();
+ else
+ percentRateAfterConst = Round.floorTo((double) percentRateAfterConst, (double) pump.getPumpDescription().tempPercentStep).intValue();
+ }
percentRate.set(percentRateAfterConst, String.format(MainApp.gs(R.string.limitingpercentrate), percentRateAfterConst, MainApp.gs(R.string.pumplimit)), this);
+ if (pump != null && pump.getPumpDescription().tempBasalStyle == PumpDescription.PERCENT) {
+ double pumpLimit = pump.getPumpDescription().pumpType.getTbrSettings().getMaxDose();
+ percentRate.setIfSmaller((int) pumpLimit, String.format(MainApp.gs(R.string.limitingbasalratio), pumpLimit, MainApp.gs(R.string.pumplimit)), this);
+ }
+
return percentRate;
}
@@ -154,6 +178,29 @@ public class SafetyPlugin extends PluginBase implements ConstraintsInterface {
insulin.setIfSmaller(maxBolus, String.format(MainApp.gs(R.string.limitingbolus), maxBolus, MainApp.gs(R.string.maxvalueinpreferences)), this);
insulin.setIfSmaller(HardLimits.maxBolus(), String.format(MainApp.gs(R.string.limitingbolus), HardLimits.maxBolus(), MainApp.gs(R.string.hardlimit)), this);
+
+ PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
+ if (pump != null) {
+ double rounded = Round.roundTo(insulin.value(), pump.getPumpDescription().pumpType.determineCorrectBolusSize(insulin.value()));
+ insulin.setIfDifferent(rounded, MainApp.gs(R.string.pumplimit), this);
+ }
+ return insulin;
+ }
+
+ @Override
+ public Constraint applyExtendedBolusConstraints(Constraint insulin) {
+ insulin.setIfGreater(0d, String.format(MainApp.gs(R.string.limitingextendedbolus), 0d, MainApp.gs(R.string.itmustbepositivevalue)), this);
+
+ Double maxBolus = SP.getDouble(R.string.key_treatmentssafety_maxbolus, 3d);
+ insulin.setIfSmaller(maxBolus, String.format(MainApp.gs(R.string.limitingextendedbolus), maxBolus, MainApp.gs(R.string.maxvalueinpreferences)), this);
+
+ insulin.setIfSmaller(HardLimits.maxBolus(), String.format(MainApp.gs(R.string.limitingextendedbolus), HardLimits.maxBolus(), MainApp.gs(R.string.hardlimit)), this);
+
+ PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
+ if (pump != null) {
+ double rounded = Round.roundTo(insulin.value(), pump.getPumpDescription().pumpType.determineCorrectExtendedBolusSize(insulin.value()));
+ insulin.setIfDifferent(rounded, MainApp.gs(R.string.pumplimit), this);
+ }
return insulin;
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Food/FoodFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Food/FoodFragment.java
index 1acf6ea083..677fac5fb2 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Food/FoodFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Food/FoodFragment.java
@@ -33,7 +33,7 @@ import info.nightscout.androidaps.R;
import info.nightscout.androidaps.events.EventFoodDatabaseChanged;
import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
import info.nightscout.utils.FabricPrivacy;
-import info.nightscout.utils.NSUpload;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.utils.SpinnerHelper;
/**
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Food/FoodService.java b/app/src/main/java/info/nightscout/androidaps/plugins/Food/FoodService.java
index 44b96850ae..b2e23dfd69 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Food/FoodService.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Food/FoodService.java
@@ -33,13 +33,14 @@ import info.nightscout.androidaps.db.ICallback;
import info.nightscout.androidaps.events.Event;
import info.nightscout.androidaps.events.EventFoodDatabaseChanged;
import info.nightscout.androidaps.events.EventNsFood;
+import info.nightscout.androidaps.logging.L;
/**
* Created by mike on 24.09.2017.
*/
public class FoodService extends OrmLiteBaseService {
- private static Logger log = LoggerFactory.getLogger(FoodService.class);
+ private Logger log = LoggerFactory.getLogger(L.DATAFOOD);
private static final ScheduledExecutorService foodEventWorker = Executors.newSingleThreadScheduledExecutor();
private static ScheduledFuture> scheduledFoodEventPost = null;
@@ -110,7 +111,8 @@ public class FoodService extends OrmLiteBaseService {
public void onCreate() {
super.onCreate();
try {
- log.info("onCreate");
+ if (L.isEnabled(L.DATAFOOD))
+ log.info("onCreate");
TableUtils.createTableIfNotExists(this.getConnectionSource(), Food.class);
} catch (SQLException e) {
log.error("Can't create database", e);
@@ -119,12 +121,9 @@ public class FoodService extends OrmLiteBaseService {
}
public void onUpgrade(ConnectionSource connectionSource, int oldVersion, int newVersion) {
- if (oldVersion == 7 && newVersion == 8) {
- log.debug("Upgrading database from v7 to v8");
- } else {
+ if (L.isEnabled(L.DATAFOOD))
log.info("onUpgrade");
// this.resetFood();
- }
}
public void onDowngrade(ConnectionSource connectionSource, int oldVersion, int newVersion) {
@@ -161,7 +160,8 @@ public class FoodService extends OrmLiteBaseService {
class PostRunnable implements Runnable {
public void run() {
- log.debug("Firing EventFoodChange");
+ if (L.isEnabled(L.DATAFOOD))
+ log.debug("Firing EventFoodChange");
MainApp.bus().post(event);
callback.setPost(null);
}
@@ -271,7 +271,8 @@ public class FoodService extends OrmLiteBaseService {
public void deleteByNSId(String _id) throws SQLException {
Food stored = this.findByNSId(_id);
if (stored != null) {
- log.debug("FOOD: Removing Food record from database: " + stored.toString());
+ if (L.isEnabled(L.DATAFOOD))
+ log.debug("Removing Food record from database: " + stored.toString());
this.delete(stored);
}
}
@@ -324,7 +325,8 @@ public class FoodService extends OrmLiteBaseService {
public void createOrUpdate(Food food) {
try {
this.getDao().createOrUpdate(food);
- log.debug("FOOD: Created or Updated: " + food.toString());
+ if (L.isEnabled(L.DATAFOOD))
+ log.debug("Created or Updated: " + food.toString());
} catch (SQLException e) {
log.error("Unable to createOrUpdate Food", e);
}
@@ -334,7 +336,8 @@ public class FoodService extends OrmLiteBaseService {
public void create(Food food) {
try {
this.getDao().create(food);
- log.debug("FOOD: New record: " + food.toString());
+ if (L.isEnabled(L.DATAFOOD))
+ log.debug("New record: " + food.toString());
} catch (SQLException e) {
log.error("Unable to create Food", e);
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefBasePlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefBasePlugin.java
index 5d4d1187ac..a2d80efd68 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefBasePlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefBasePlugin.java
@@ -5,6 +5,7 @@ import com.squareup.otto.Bus;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.Iob;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.Treatments.Treatment;
import info.nightscout.androidaps.interfaces.InsulinInterface;
import info.nightscout.androidaps.interfaces.PluginBase;
@@ -61,7 +62,7 @@ public abstract class InsulinOrefBasePlugin extends PluginBase implements Insuli
}
public double getUserDefinedDia() {
- return MainApp.getConfigBuilder().getProfile() != null ? MainApp.getConfigBuilder().getProfile().getDia() : MIN_DIA;
+ return ProfileFunctions.getInstance().getProfile() != null ? ProfileFunctions.getInstance().getProfile().getDia() : MIN_DIA;
}
public Iob iobCalcForTreatment(Treatment treatment, long time) {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/AutosensData.java b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/AutosensData.java
index dd2c50d8c9..60a5851011 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/AutosensData.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/AutosensData.java
@@ -12,6 +12,8 @@ import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.OpenAPSSMB.SMBDefaults;
import info.nightscout.androidaps.plugins.Overview.graphExtensions.DataPointWithLabelInterface;
import info.nightscout.androidaps.plugins.Overview.graphExtensions.PointsWithLabelGraphSeries;
@@ -26,7 +28,7 @@ import info.nightscout.utils.SP;
*/
public class AutosensData implements DataPointWithLabelInterface {
- private static Logger log = LoggerFactory.getLogger("AUTOSENS");
+ private static Logger log = LoggerFactory.getLogger(L.AUTOSENS);
public void setChartTime(long chartTime) {
this.chartTime = chartTime;
@@ -44,11 +46,12 @@ public class AutosensData implements DataPointWithLabelInterface {
remaining = t.carbs;
if (SensitivityAAPSPlugin.getPlugin().isEnabled(PluginType.SENSITIVITY) || SensitivityWeightedAveragePlugin.getPlugin().isEnabled(PluginType.SENSITIVITY)) {
double maxAbsorptionHours = SP.getDouble(R.string.key_absorption_maxtime, Constants.DEFAULT_MAX_ABSORPTION_TIME);
- Profile profile = MainApp.getConfigBuilder().getProfile(t.date);
+ Profile profile = ProfileFunctions.getInstance().getProfile(t.date);
double sens = Profile.toMgdl(profile.getIsf(t.date), profile.getUnits());
double ic = profile.getIc(t.date);
min5minCarbImpact = t.carbs / (maxAbsorptionHours * 60 / 5) * sens / ic;
- log.debug("Min 5m carbs impact for " + carbs + "g @" + new Date(t.date).toLocaleString() + " for " + maxAbsorptionHours + "h calculated to " + min5minCarbImpact + " ISF: " + sens + " IC: " + ic);
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Min 5m carbs impact for " + carbs + "g @" + new Date(t.date).toLocaleString() + " for " + maxAbsorptionHours + "h calculated to " + min5minCarbImpact + " ISF: " + sens + " IC: " + ic);
} else {
min5minCarbImpact = SP.getDouble(R.string.key_openapsama_min_5m_carbimpact, SMBDefaults.min_5m_carbimpact);
}
@@ -107,7 +110,8 @@ public class AutosensData implements DataPointWithLabelInterface {
activeCarbsList.remove(i--);
if (c.remaining > 0)
cob -= c.remaining;
- log.debug("Removing carbs at " + new Date(toTime).toLocaleString() + " + after " + maxAbsorptionHours + "h :" + new Date(c.time).toLocaleString());
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Removing carbs at " + new Date(toTime).toLocaleString() + " + after " + maxAbsorptionHours + "h :" + new Date(c.time).toLocaleString());
}
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/AutosensResult.java b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/AutosensResult.java
index c83095e620..7bd01fa7b2 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/AutosensResult.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/AutosensResult.java
@@ -5,11 +5,13 @@ import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import info.nightscout.androidaps.logging.L;
+
/**
* Created by mike on 06.01.2017.
*/
public class AutosensResult {
- private static Logger log = LoggerFactory.getLogger("AUTOSENS");
+ private static Logger log = LoggerFactory.getLogger(L.AUTOSENS);
//default values to show when autosens algorithm is not called
public double ratio = 1d;
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 096668b996..22c269d8c9 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java
@@ -12,10 +12,8 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
-import java.util.Date;
import java.util.List;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
@@ -32,7 +30,9 @@ import info.nightscout.androidaps.events.EventPreferenceChange;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventNewHistoryData;
import info.nightscout.androidaps.plugins.OpenAPSSMB.OpenAPSSMBPlugin;
import info.nightscout.androidaps.plugins.Sensitivity.SensitivityOref1Plugin;
@@ -48,7 +48,7 @@ import static info.nightscout.utils.DateUtil.now;
*/
public class IobCobCalculatorPlugin extends PluginBase {
- private Logger log = LoggerFactory.getLogger("AUTOSENS");
+ private Logger log = LoggerFactory.getLogger(L.AUTOSENS);
private static IobCobCalculatorPlugin plugin = null;
@@ -98,37 +98,19 @@ public class IobCobCalculatorPlugin extends PluginBase {
return autosensDataTable;
}
+ public List getBgReadings() {
+ return bgReadings;
+ }
+
+ public void setBgReadings(List bgReadings) {
+ this.bgReadings = bgReadings;
+ }
+
public List getBucketedData() {
return bucketed_data;
}
- @Nullable
- public List getBucketedData(long fromTime) {
- //log.debug("Locking getBucketedData");
- synchronized (dataLock) {
- if (bucketed_data == null) {
- log.debug("No bucketed data available");
- return null;
- }
- int index = indexNewerThan(fromTime);
- if (index > -1) {
- List part = bucketed_data.subList(0, index);
- log.debug("Bucketed data striped off: " + part.size() + "/" + bucketed_data.size());
- return part;
- }
- }
- //log.debug("Releasing getBucketedData");
- return null;
- }
-
- private int indexNewerThan(long time) {
- for (int index = 0; index < bucketed_data.size(); index++) {
- if (bucketed_data.get(index).date < time)
- return index - 1;
- }
- return -1;
- }
-
+ // roundup to whole minute
public static long roundUpTime(long time) {
if (time % 60000 == 0)
return time;
@@ -136,16 +118,14 @@ public class IobCobCalculatorPlugin extends PluginBase {
return rounded;
}
- void loadBgData(long start) {
- if (start < oldestDataAvailable()) {
- start = oldestDataAvailable();
- log.debug("Limiting BG data to oldest data available: " + DateUtil.dateAndTimeString(start));
- }
- bgReadings = MainApp.getDbHelper().getBgreadingsDataFromTime((long) (start - 60 * 60 * 1000L * (24 + dia)), false);
- log.debug("BG data loaded. Size: " + bgReadings.size() + " Start date: " + DateUtil.dateAndTimeString(start));
+ void loadBgData(long now) {
+ long start = (long) (now - 60 * 60 * 1000L * (24 + dia));
+ bgReadings = MainApp.getDbHelper().getBgreadingsDataFromTime(start, now, false);
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("BG data loaded. Size: " + bgReadings.size() + " Start date: " + DateUtil.dateAndTimeString(start) + " End date: " + DateUtil.dateAndTimeString(now));
}
- private boolean isAbout5minData() {
+ public boolean isAbout5minData() {
synchronized (dataLock) {
if (bgReadings == null || bgReadings.size() < 3) {
return true;
@@ -155,21 +135,26 @@ public class IobCobCalculatorPlugin extends PluginBase {
long bgTime = bgReadings.get(i).date;
long lastbgTime = bgReadings.get(i - 1).date;
long diff = lastbgTime - bgTime;
+ diff %= T.mins(5).msecs();
+ if (diff > T.mins(2).plus(T.secs(30)).msecs())
+ diff = diff - T.mins(5).msecs();
totalDiff += diff;
- if (diff > 30 * 1000 && diff < 270 * 1000) { // 0:30 - 4:30
- log.debug("Interval detection: values: " + bgReadings.size() + " diff: " + (diff / 1000) + "sec is5minData: " + false);
+ diff = Math.abs(diff);
+ if (diff > T.secs(30).msecs()) {
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Interval detection: values: " + bgReadings.size() + " diff: " + (diff / 1000) + "[s] is5minData: " + false);
return false;
}
}
- double intervals = totalDiff / (5 * 60 * 1000d);
- double variability = Math.abs(intervals - Math.round(intervals));
- boolean is5mindata = variability < 0.02;
- log.debug("Interval detection: values: " + bgReadings.size() + " variability: " + variability + " is5minData: " + is5mindata);
+ double averageDiff = totalDiff / (bgReadings.size() - 1) / 1000d;
+ boolean is5mindata = averageDiff < 10;
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Interval detection: values: " + bgReadings.size() + " averageDiff: " + averageDiff + "[s] is5minData: " + is5mindata);
return is5mindata;
}
}
- void createBucketedData() {
+ public void createBucketedData() {
if (isAbout5minData())
createBucketedData5min();
else
@@ -177,24 +162,26 @@ public class IobCobCalculatorPlugin extends PluginBase {
}
@Nullable
- private BgReading findNewer(long time) {
+ public BgReading findNewer(long time) {
BgReading lastFound = bgReadings.get(0);
if (lastFound.date < time) return null;
for (int i = 1; i < bgReadings.size(); ++i) {
+ if (bgReadings.get(i).date == time) return bgReadings.get(i);
if (bgReadings.get(i).date > time) continue;
- lastFound = bgReadings.get(i);
+ lastFound = bgReadings.get(i - 1);
if (bgReadings.get(i).date < time) break;
}
return lastFound;
}
@Nullable
- private BgReading findOlder(long time) {
+ public BgReading findOlder(long time) {
BgReading lastFound = bgReadings.get(bgReadings.size() - 1);
if (lastFound.date > time) return null;
for (int i = bgReadings.size() - 2; i >= 0; --i) {
+ if (bgReadings.get(i).date == time) return bgReadings.get(i);
if (bgReadings.get(i).date < time) continue;
- lastFound = bgReadings.get(i);
+ lastFound = bgReadings.get(i + 1);
if (bgReadings.get(i).date > time) break;
}
return lastFound;
@@ -207,7 +194,7 @@ public class IobCobCalculatorPlugin extends PluginBase {
}
bucketed_data = new ArrayList<>();
- long currentTime = bgReadings.get(0).date + 5 * 60 * 1000 - bgReadings.get(0).date % (5 * 60 * 1000) - 5 * 60 * 1000L;
+ long currentTime = bgReadings.get(0).date - bgReadings.get(0).date % T.mins(5).msecs();
//log.debug("First reading: " + new Date(currentTime).toLocaleString());
while (true) {
@@ -217,16 +204,20 @@ public class IobCobCalculatorPlugin extends PluginBase {
if (newer == null || older == null)
break;
- double bgDelta = newer.value - older.value;
- long timeDiffToNew = newer.date - currentTime;
+ if (older.date == newer.date) { // direct hit
+ bucketed_data.add(newer);
+ } else {
+ double bgDelta = newer.value - older.value;
+ long timeDiffToNew = newer.date - currentTime;
- double currentBg = newer.value - (double) timeDiffToNew / (newer.date - older.date) * bgDelta;
- BgReading newBgreading = new BgReading();
- newBgreading.date = currentTime;
- newBgreading.value = Math.round(currentBg);
- bucketed_data.add(newBgreading);
- //log.debug("BG: " + newBgreading.value + " (" + new Date(newBgreading.date).toLocaleString() + ") Prev: " + older.value + " (" + new Date(older.date).toLocaleString() + ") Newer: " + newer.value + " (" + new Date(newer.date).toLocaleString() + ")");
- currentTime -= 5 * 60 * 1000L;
+ double currentBg = newer.value - (double) timeDiffToNew / (newer.date - older.date) * bgDelta;
+ BgReading newBgreading = new BgReading();
+ newBgreading.date = currentTime;
+ newBgreading.value = Math.round(currentBg);
+ bucketed_data.add(newBgreading);
+ //log.debug("BG: " + newBgreading.value + " (" + new Date(newBgreading.date).toLocaleString() + ") Prev: " + older.value + " (" + new Date(older.date).toLocaleString() + ") Newer: " + newer.value + " (" + new Date(newer.date).toLocaleString() + ")");
+ }
+ currentTime -= T.mins(5).msecs();
}
}
@@ -267,7 +258,8 @@ public class IobCobCalculatorPlugin extends PluginBase {
newBgreading.value = Math.round(nextbg);
//console.error("Interpolated", bucketed_data[j]);
bucketed_data.add(newBgreading);
- //log.error("******************************************************************************************************* Adding:" + new Date(newBgreading.date).toString() + " " + newBgreading.value);
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Adding. bgTime: " + DateUtil.toISOString(bgTime) + " lastbgTime: " + DateUtil.toISOString(lastbgTime) + " " + newBgreading.toString());
elapsed_minutes = elapsed_minutes - 5;
lastbg = nextbg;
@@ -278,28 +270,51 @@ public class IobCobCalculatorPlugin extends PluginBase {
newBgreading.value = bgReadings.get(i).value;
newBgreading.date = bgTime;
bucketed_data.add(newBgreading);
- //log.error("******************************************************************************************************* Copying:" + new Date(newBgreading.date).toString() + " " + newBgreading.value);
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Adding. bgTime: " + DateUtil.toISOString(bgTime) + " lastbgTime: " + DateUtil.toISOString(lastbgTime) + " " + newBgreading.toString());
} else if (Math.abs(elapsed_minutes) > 2) {
j++;
BgReading newBgreading = new BgReading();
newBgreading.value = bgReadings.get(i).value;
newBgreading.date = bgTime;
bucketed_data.add(newBgreading);
- //log.error("******************************************************************************************************* Copying:" + new Date(newBgreading.date).toString() + " " + newBgreading.value);
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Adding. bgTime: " + DateUtil.toISOString(bgTime) + " lastbgTime: " + DateUtil.toISOString(lastbgTime) + " " + newBgreading.toString());
} else {
bucketed_data.get(j).value = (bucketed_data.get(j).value + bgReadings.get(i).value) / 2;
//log.error("***** Average");
}
}
- log.debug("Bucketed data created. Size: " + bucketed_data.size());
+
+ // Normalize bucketed data
+ for (int i = bucketed_data.size() - 2; i >= 0; i--) {
+ BgReading current = bucketed_data.get(i);
+ BgReading previous = bucketed_data.get(i + 1);
+ long msecDiff = current.date - previous.date;
+ long adjusted = (msecDiff - T.mins(5).msecs()) / 1000;
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Adjusting bucketed data time. Current: " + DateUtil.toISOString(current.date) + " to: " + DateUtil.toISOString(previous.date + T.mins(5).msecs()) + " by " + adjusted + " sec");
+ current.date = previous.date + T.mins(5).msecs();
+ }
+
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Bucketed data created. Size: " + bucketed_data.size());
}
- public long oldestDataAvailable() {
- long now = System.currentTimeMillis();
+ public long calculateDetectionStart(long from, boolean limitDataToOldestAvailable) {
+ Profile profile = ProfileFunctions.getInstance().getProfile(from);
+ double dia = Constants.defaultDIA;
+ if (profile != null) dia = profile.getDia();
long oldestDataAvailable = TreatmentsPlugin.getPlugin().oldestDataAvailable();
- long getBGDataFrom = Math.max(oldestDataAvailable, (long) (now - T.hours(1).msecs() * (24 + MainApp.getConfigBuilder().getProfile().getDia())));
- log.debug("Limiting data to oldest available temps: " + new Date(oldestDataAvailable).toString());
+ long getBGDataFrom;
+ if (limitDataToOldestAvailable) {
+ getBGDataFrom = Math.max(oldestDataAvailable, (long) (from - T.hours(1).msecs() * (24 + dia)));
+ if (getBGDataFrom == oldestDataAvailable)
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Limiting data to oldest available temps: " + DateUtil.dateAndTimeFullString(oldestDataAvailable));
+ } else
+ getBGDataFrom = (long) (from - T.hours(1).msecs() * (24 + dia));
return getBGDataFrom;
}
@@ -343,11 +358,11 @@ public class IobCobCalculatorPlugin extends PluginBase {
}
@Nullable
- private Long findPreviousTimeFromBucketedData(long time) {
+ public Long findPreviousTimeFromBucketedData(long time) {
if (bucketed_data == null)
return null;
for (int index = 0; index < bucketed_data.size(); index++) {
- if (bucketed_data.get(index).date < time)
+ if (bucketed_data.get(index).date <= time)
return bucketed_data.get(index).date;
}
return null;
@@ -403,13 +418,15 @@ public class IobCobCalculatorPlugin extends PluginBase {
@Nullable
public AutosensData getLastAutosensDataSynchronized(String reason) {
- if (thread != null && thread.isAlive()) {
- log.debug("AUTOSENSDATA is waiting for calculation thread: " + reason);
+ if (thread != null && thread.isAlive()) {
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("AUTOSENSDATA is waiting for calculation thread: " + reason);
try {
thread.join(5000);
} catch (InterruptedException ignored) {
}
- log.debug("AUTOSENSDATA finished waiting for calculation thread: " + reason);
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("AUTOSENSDATA finished waiting for calculation thread: " + reason);
}
synchronized (dataLock) {
return getLastAutosensData(reason);
@@ -447,7 +464,8 @@ public class IobCobCalculatorPlugin extends PluginBase {
@Nullable
public AutosensData getLastAutosensData(String reason) {
if (autosensDataTable.size() < 1) {
- log.debug("AUTOSENSDATA null: autosensDataTable empty (" + reason + ")");
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("AUTOSENSDATA null: autosensDataTable empty (" + reason + ")");
return null;
}
AutosensData data;
@@ -461,10 +479,12 @@ public class IobCobCalculatorPlugin extends PluginBase {
return null;
}
if (data.time < System.currentTimeMillis() - 11 * 60 * 1000) {
- log.debug("AUTOSENSDATA null: data is old (" + reason + ") size()=" + autosensDataTable.size() + " lastdata=" + DateUtil.dateAndTimeString(data.time));
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("AUTOSENSDATA null: data is old (" + reason + ") size()=" + autosensDataTable.size() + " lastdata=" + DateUtil.dateAndTimeString(data.time));
return null;
} else {
- log.debug("AUTOSENSDATA (" + reason + ") " + data.toString());
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("AUTOSENSDATA (" + reason + ") " + data.toString());
return data;
}
}
@@ -510,7 +530,7 @@ public class IobCobCalculatorPlugin extends PluginBase {
public AutosensResult detectSensitivityWithLock(long fromTime, long toTime) {
synchronized (dataLock) {
- return ConfigBuilderPlugin.getActiveSensitivity().detectSensitivity(fromTime, toTime);
+ return ConfigBuilderPlugin.getActiveSensitivity().detectSensitivity(this, fromTime, toTime);
}
}
@@ -526,41 +546,46 @@ public class IobCobCalculatorPlugin extends PluginBase {
@SuppressWarnings("unused")
public void onEventAppInitialized(EventAppInitialized ev) {
if (this != getPlugin()) {
- log.debug("Ignoring event for non default instance");
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Ignoring event for non default instance");
return;
}
- runCalculation("onEventAppInitialized", System.currentTimeMillis(), true, ev);
+ runCalculation("onEventAppInitialized", System.currentTimeMillis(), true, true, ev);
}
@Subscribe
@SuppressWarnings("unused")
public void onEventNewBG(EventNewBG ev) {
if (this != getPlugin()) {
- log.debug("Ignoring event for non default instance");
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Ignoring event for non default instance");
return;
}
stopCalculation("onEventNewBG");
- runCalculation("onEventNewBG", System.currentTimeMillis(), true, ev);
+ runCalculation("onEventNewBG", System.currentTimeMillis(), true, true, ev);
}
- private void stopCalculation(String from) {
+ public void stopCalculation(String from) {
if (thread != null && thread.getState() != Thread.State.TERMINATED) {
stopCalculationTrigger = true;
- log.debug("Stopping calculation thread: " + from);
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Stopping calculation thread: " + from);
while (thread.getState() != Thread.State.TERMINATED) {
SystemClock.sleep(100);
}
- log.debug("Calculation thread stopped: " + from);
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Calculation thread stopped: " + from);
}
}
- public void runCalculation(String from, long start, boolean bgDataReload, Event cause) {
- log.debug("Starting calculation thread: " + from);
+ public void runCalculation(String from, long end, boolean bgDataReload, boolean limitDataToOldestAvailable, Event cause) {
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Starting calculation thread: " + from + " to " + DateUtil.dateAndTimeString(end));
if (thread == null || thread.getState() == Thread.State.TERMINATED) {
if (SensitivityOref1Plugin.getPlugin().isEnabled(PluginType.SENSITIVITY))
- thread = new IobCobOref1Thread(this, from, start, bgDataReload, cause);
+ thread = new IobCobOref1Thread(this, from, end, bgDataReload, limitDataToOldestAvailable, cause);
else
- thread = new IobCobThread(this, from, start, bgDataReload, cause);
+ thread = new IobCobThread(this, from, end, bgDataReload, limitDataToOldestAvailable, cause);
thread.start();
}
}
@@ -568,12 +593,13 @@ public class IobCobCalculatorPlugin extends PluginBase {
@Subscribe
public void onNewProfile(EventNewBasalProfile ev) {
if (this != getPlugin()) {
- log.debug("Ignoring event for non default instance");
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Ignoring event for non default instance");
return;
}
if (MainApp.getConfigBuilder() == null)
return; // app still initializing
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
if (profile == null)
return; // app still initializing
dia = profile.getDia();
@@ -582,17 +608,19 @@ public class IobCobCalculatorPlugin extends PluginBase {
}
stopCalculation("onNewProfile");
synchronized (dataLock) {
- log.debug("Invalidating cached data because of new profile. IOB: " + iobTable.size() + " Autosens: " + autosensDataTable.size() + " records");
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Invalidating cached data because of new profile. IOB: " + iobTable.size() + " Autosens: " + autosensDataTable.size() + " records");
iobTable = new LongSparseArray<>();
autosensDataTable = new LongSparseArray<>();
}
- runCalculation("onNewProfile", System.currentTimeMillis(), false, ev);
+ runCalculation("onNewProfile", System.currentTimeMillis(), false, true, ev);
}
@Subscribe
public void onEventPreferenceChange(EventPreferenceChange ev) {
if (this != getPlugin()) {
- log.debug("Ignoring event for non default instance");
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Ignoring event for non default instance");
return;
}
if (ev.isChanged(R.string.key_openapsama_autosens_period) ||
@@ -605,34 +633,38 @@ public class IobCobCalculatorPlugin extends PluginBase {
) {
stopCalculation("onEventPreferenceChange");
synchronized (dataLock) {
- log.debug("Invalidating cached data because of preference change. IOB: " + iobTable.size() + " Autosens: " + autosensDataTable.size() + " records");
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Invalidating cached data because of preference change. IOB: " + iobTable.size() + " Autosens: " + autosensDataTable.size() + " records");
iobTable = new LongSparseArray<>();
autosensDataTable = new LongSparseArray<>();
}
- runCalculation("onEventPreferenceChange", System.currentTimeMillis(), false, ev);
+ runCalculation("onEventPreferenceChange", System.currentTimeMillis(), false, true, ev);
}
}
@Subscribe
public void onEventConfigBuilderChange(EventConfigBuilderChange ev) {
if (this != getPlugin()) {
- log.debug("Ignoring event for non default instance");
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Ignoring event for non default instance");
return;
}
stopCalculation("onEventConfigBuilderChange");
synchronized (dataLock) {
- log.debug("Invalidating cached data because of configuration change. IOB: " + iobTable.size() + " Autosens: " + autosensDataTable.size() + " records");
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Invalidating cached data because of configuration change. IOB: " + iobTable.size() + " Autosens: " + autosensDataTable.size() + " records");
iobTable = new LongSparseArray<>();
autosensDataTable = new LongSparseArray<>();
}
- runCalculation("onEventConfigBuilderChange", System.currentTimeMillis(), false, ev);
+ runCalculation("onEventConfigBuilderChange", System.currentTimeMillis(), false, true, ev);
}
// When historical data is changed (comming from NS etc) finished calculations after this date must be invalidated
@Subscribe
public void onEventNewHistoryData(EventNewHistoryData ev) {
if (this != getPlugin()) {
- log.debug("Ignoring event for non default instance");
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Ignoring event for non default instance");
return;
}
//log.debug("Locking onNewHistoryData");
@@ -640,11 +672,12 @@ public class IobCobCalculatorPlugin extends PluginBase {
synchronized (dataLock) {
// clear up 5 min back for proper COB calculation
long time = ev.time - 5 * 60 * 1000L;
- log.debug("Invalidating cached data to: " + new Date(time).toLocaleString());
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Invalidating cached data to: " + DateUtil.dateAndTimeFullString(time));
for (int index = iobTable.size() - 1; index >= 0; index--) {
if (iobTable.keyAt(index) > time) {
- if (Config.logAutosensData)
- log.debug("Removing from iobTable: " + new Date(iobTable.keyAt(index)).toLocaleString());
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Removing from iobTable: " + DateUtil.dateAndTimeFullString(iobTable.keyAt(index)));
iobTable.removeAt(index);
} else {
break;
@@ -652,8 +685,8 @@ public class IobCobCalculatorPlugin extends PluginBase {
}
for (int index = autosensDataTable.size() - 1; index >= 0; index--) {
if (autosensDataTable.keyAt(index) > time) {
- if (Config.logAutosensData)
- log.debug("Removing from autosensDataTable: " + new Date(autosensDataTable.keyAt(index)).toLocaleString());
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Removing from autosensDataTable: " + DateUtil.dateAndTimeFullString(autosensDataTable.keyAt(index)));
autosensDataTable.removeAt(index);
} else {
break;
@@ -661,21 +694,22 @@ public class IobCobCalculatorPlugin extends PluginBase {
}
for (int index = basalDataTable.size() - 1; index >= 0; index--) {
if (basalDataTable.keyAt(index) > time) {
- if (Config.logAutosensData)
- log.debug("Removing from basalDataTable: " + new Date(basalDataTable.keyAt(index)).toLocaleString());
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Removing from basalDataTable: " + DateUtil.dateAndTimeFullString(basalDataTable.keyAt(index)));
basalDataTable.removeAt(index);
} else {
break;
}
}
}
- runCalculation("onEventNewHistoryData", System.currentTimeMillis(), false, ev);
+ runCalculation("onEventNewHistoryData", System.currentTimeMillis(), false, true, ev);
//log.debug("Releasing onNewHistoryData");
}
public void clearCache() {
synchronized (dataLock) {
- log.debug("Clearing cached data.");
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Clearing cached data.");
iobTable = new LongSparseArray<>();
autosensDataTable = new LongSparseArray<>();
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobOref1Thread.java b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobOref1Thread.java
index d10d0ebe29..9887f1bdd2 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobOref1Thread.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobOref1Thread.java
@@ -17,7 +17,6 @@ import java.util.GregorianCalendar;
import java.util.List;
import info.nightscout.androidaps.BuildConfig;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
@@ -26,9 +25,13 @@ import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.db.BgReading;
import info.nightscout.androidaps.db.TempTarget;
import info.nightscout.androidaps.events.Event;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventAutosensCalculationFinished;
import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventIobCalculationProgress;
import info.nightscout.androidaps.plugins.OpenAPSSMB.SMBDefaults;
+import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
+import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
import info.nightscout.androidaps.plugins.Treatments.Treatment;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.utils.DateUtil;
@@ -43,24 +46,26 @@ import static java.util.Calendar.MINUTE;
*/
public class IobCobOref1Thread extends Thread {
- private static Logger log = LoggerFactory.getLogger("AUTOSENS");
+ private static Logger log = LoggerFactory.getLogger(L.AUTOSENS);
private final Event cause;
private IobCobCalculatorPlugin iobCobCalculatorPlugin;
private boolean bgDataReload;
+ private boolean limitDataToOldestAvailable;
private String from;
- private long start;
+ private long end;
private PowerManager.WakeLock mWakeLock;
- public IobCobOref1Thread(IobCobCalculatorPlugin plugin, String from, long start, boolean bgDataReload, Event cause) {
+ public IobCobOref1Thread(IobCobCalculatorPlugin plugin, String from, long end, boolean bgDataReload, boolean limitDataToOldestAvailable, Event cause) {
super();
this.iobCobCalculatorPlugin = plugin;
this.bgDataReload = bgDataReload;
+ this.limitDataToOldestAvailable = limitDataToOldestAvailable;
this.from = from;
this.cause = cause;
- this.start = start;
+ this.end = end;
PowerManager powerManager = (PowerManager) MainApp.instance().getApplicationContext().getSystemService(Context.POWER_SERVICE);
mWakeLock = powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "iobCobThread");
@@ -70,34 +75,39 @@ public class IobCobOref1Thread extends Thread {
public final void run() {
mWakeLock.acquire();
try {
- log.debug("AUTOSENSDATA thread started: " + from);
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("AUTOSENSDATA thread started: " + from);
if (MainApp.getConfigBuilder() == null) {
- log.debug("Aborting calculation thread (ConfigBuilder not ready): " + from);
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Aborting calculation thread (ConfigBuilder not ready): " + from);
return; // app still initializing
}
- if (!MainApp.getConfigBuilder().isProfileValid("IobCobThread")) {
- log.debug("Aborting calculation thread (No profile): " + from);
+ if (!ProfileFunctions.getInstance().isProfileValid("IobCobThread")) {
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Aborting calculation thread (No profile): " + from);
return; // app still initializing
}
//log.debug("Locking calculateSensitivityData");
- long oldestTimeWithData = iobCobCalculatorPlugin.oldestDataAvailable();
+ long oldestTimeWithData = iobCobCalculatorPlugin.calculateDetectionStart(end, limitDataToOldestAvailable);
synchronized (iobCobCalculatorPlugin.dataLock) {
if (bgDataReload) {
- iobCobCalculatorPlugin.loadBgData(start);
+ iobCobCalculatorPlugin.loadBgData(end);
iobCobCalculatorPlugin.createBucketedData();
}
List bucketed_data = iobCobCalculatorPlugin.getBucketedData();
- LongSparseArray autosensDataTable = IobCobCalculatorPlugin.getPlugin().getAutosensDataTable();
+ LongSparseArray autosensDataTable = iobCobCalculatorPlugin.getAutosensDataTable();
if (bucketed_data == null || bucketed_data.size() < 3) {
- log.debug("Aborting calculation thread (No bucketed data available): " + from);
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Aborting calculation thread (No bucketed data available): " + from);
return;
}
long prevDataTime = IobCobCalculatorPlugin.roundUpTime(bucketed_data.get(bucketed_data.size() - 3).date);
- log.debug("Prev data time: " + new Date(prevDataTime).toLocaleString());
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Prev data time: " + new Date(prevDataTime).toLocaleString());
AutosensData previous = autosensDataTable.get(prevDataTime);
// start from oldest to be able sub cob
for (int i = bucketed_data.size() - 4; i >= 0; i--) {
@@ -106,7 +116,8 @@ public class IobCobOref1Thread extends Thread {
if (iobCobCalculatorPlugin.stopCalculationTrigger) {
iobCobCalculatorPlugin.stopCalculationTrigger = false;
- log.debug("Aborting calculation thread (trigger): " + from);
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Aborting calculation thread (trigger): " + from);
return;
}
// check if data already exists
@@ -121,13 +132,14 @@ public class IobCobOref1Thread extends Thread {
continue;
}
- Profile profile = MainApp.getConfigBuilder().getProfile(bgTime);
+ Profile profile = ProfileFunctions.getInstance().getProfile(bgTime);
if (profile == null) {
- log.debug("Aborting calculation thread (no profile): " + from);
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Aborting calculation thread (no profile): " + from);
return; // profile not set yet
}
- if (Config.logAutosensData)
+ if (L.isEnabled(L.AUTOSENS))
log.debug("Processing calculation thread: " + from + " (" + i + "/" + bucketed_data.size() + ")");
double sens = Profile.toMgdl(profile.getIsf(bgTime), profile.getUnits());
@@ -166,15 +178,28 @@ public class IobCobOref1Thread extends Thread {
// https://github.com/openaps/oref0/blob/master/lib/determine-basal/cob-autosens.js#L169
if (i < bucketed_data.size() - 16) { // we need 1h of data to calculate minDeviationSlope
long hourago = bgTime + 10 * 1000 - 60 * 60 * 1000L;
- AutosensData hourAgoData = IobCobCalculatorPlugin.getPlugin().getAutosensData(hourago);
+ AutosensData hourAgoData = iobCobCalculatorPlugin.getAutosensData(hourago);
if (hourAgoData != null) {
int initialIndex = autosensDataTable.indexOfKey(hourAgoData.time);
- if (Config.logAutosensData)
- log.debug(">>>>> bucketed_data.size()=" + bucketed_data.size() + " i=" + i + "hourAgoData=" + hourAgoData.toString());
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug(">>>>> bucketed_data.size()=" + bucketed_data.size() + " i=" + i + " hourAgoData=" + hourAgoData.toString());
int past = 1;
try {
for (; past < 12; past++) {
AutosensData ad = autosensDataTable.valueAt(initialIndex + past);
+ if (L.isEnabled(L.AUTOSENS)) {
+ log.debug(">>>>> past=" + past + " ad=" + (ad != null ? ad.toString() : null));
+ if (ad == null) {
+ log.debug(autosensDataTable.toString());
+ log.debug(bucketed_data.toString());
+ log.debug(IobCobCalculatorPlugin.getPlugin().getBgReadings().toString());
+ Notification notification = new Notification(Notification.SENDLOGFILES, MainApp.gs(R.string.sendlogfiles), Notification.LOW);
+ MainApp.bus().post(new EventNewNotification(notification));
+ SP.putBoolean("log_AUTOSENS", true);
+ break;
+ }
+ }
+ // let it here crash on NPE to get more data as i cannot reproduce this bug
double deviationSlope = (ad.avgDeviation - avgDeviation) / (ad.time - bgTime) * 1000 * 60 * 5;
if (ad.avgDeviation > maxDeviation) {
slopeFromMaxDeviation = Math.min(0, deviationSlope);
@@ -185,7 +210,7 @@ public class IobCobOref1Thread extends Thread {
minDeviation = ad.avgDeviation;
}
- //if (Config.logAutosensData)
+ //if (Config.isEnabled(L.AUTOSENS))
// log.debug("Deviations: " + new Date(bgTime) + new Date(ad.time) + " avgDeviation=" + avgDeviation + " deviationSlope=" + deviationSlope + " slopeFromMaxDeviation=" + slopeFromMaxDeviation + " slopeFromMinDeviation=" + slopeFromMinDeviation);
}
} catch (Exception e) {
@@ -198,7 +223,17 @@ public class IobCobOref1Thread extends Thread {
.putCustomAttribute("for_data", ">>>>> bucketed_data.size()=" + bucketed_data.size() + " i=" + i + "hourAgoData=" + hourAgoData.toString())
.putCustomAttribute("past", past)
);
+ log.debug(autosensDataTable.toString());
+ log.debug(bucketed_data.toString());
+ log.debug(IobCobCalculatorPlugin.getPlugin().getBgReadings().toString());
+ Notification notification = new Notification(Notification.SENDLOGFILES, MainApp.gs(R.string.sendlogfiles), Notification.LOW);
+ MainApp.bus().post(new EventNewNotification(notification));
+ SP.putBoolean("log_AUTOSENS", true);
+ break;
}
+ } else {
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug(">>>>> bucketed_data.size()=" + bucketed_data.size() + " i=" + i + " hourAgoData=" + "null");
}
}
@@ -338,13 +373,13 @@ public class IobCobOref1Thread extends Thread {
previous = autosensData;
if (bgTime < now())
autosensDataTable.put(bgTime, autosensData);
- if (Config.logAutosensData)
- log.debug("Running detectSensitivity from: " + DateUtil.dateAndTimeString(oldestTimeWithData) + " to: " + DateUtil.dateAndTimeString(bgTime) + " lastDataTime:" + IobCobCalculatorPlugin.getPlugin().lastDataTime());
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Running detectSensitivity from: " + DateUtil.dateAndTimeString(oldestTimeWithData) + " to: " + DateUtil.dateAndTimeString(bgTime) + " lastDataTime:" + iobCobCalculatorPlugin.lastDataTime());
AutosensResult sensitivity = iobCobCalculatorPlugin.detectSensitivityWithLock(oldestTimeWithData, bgTime);
- if (Config.logAutosensData)
+ if (L.isEnabled(L.AUTOSENS))
log.debug("Sensitivity result: " + sensitivity.toString());
autosensData.autosensResult = sensitivity;
- if (Config.logAutosensData)
+ if (L.isEnabled(L.AUTOSENS))
log.debug(autosensData.toString());
}
}
@@ -355,7 +390,8 @@ public class IobCobOref1Thread extends Thread {
} finally {
mWakeLock.release();
MainApp.bus().post(new EventIobCalculationProgress(""));
- log.debug("AUTOSENSDATA thread ended: " + from);
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("AUTOSENSDATA thread ended: " + from);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobThread.java b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobThread.java
index d60efb5bc6..45b1f1de31 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobThread.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobThread.java
@@ -15,7 +15,6 @@ import java.util.Date;
import java.util.List;
import info.nightscout.androidaps.BuildConfig;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
@@ -24,9 +23,13 @@ import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.db.BgReading;
import info.nightscout.androidaps.events.Event;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventAutosensCalculationFinished;
import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventIobCalculationProgress;
import info.nightscout.androidaps.plugins.OpenAPSSMB.SMBDefaults;
+import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
+import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
import info.nightscout.androidaps.plugins.Sensitivity.SensitivityAAPSPlugin;
import info.nightscout.androidaps.plugins.Sensitivity.SensitivityWeightedAveragePlugin;
import info.nightscout.androidaps.plugins.Treatments.Treatment;
@@ -42,24 +45,26 @@ import static info.nightscout.utils.DateUtil.now;
*/
public class IobCobThread extends Thread {
- private static Logger log = LoggerFactory.getLogger("AUTOSENS");
+ private static Logger log = LoggerFactory.getLogger(L.AUTOSENS);
private final Event cause;
private IobCobCalculatorPlugin iobCobCalculatorPlugin;
private boolean bgDataReload;
+ private boolean limitDataToOldestAvailable;
private String from;
- private long start;
+ private long end;
private PowerManager.WakeLock mWakeLock;
- public IobCobThread(IobCobCalculatorPlugin plugin, String from, long start, boolean bgDataReload, Event cause) {
+ public IobCobThread(IobCobCalculatorPlugin plugin, String from, long end, boolean bgDataReload, boolean limitDataToOldestAvailable, Event cause) {
super();
this.iobCobCalculatorPlugin = plugin;
this.bgDataReload = bgDataReload;
+ this.limitDataToOldestAvailable = limitDataToOldestAvailable;
this.from = from;
this.cause = cause;
- this.start = start;
+ this.end = end;
PowerManager powerManager = (PowerManager) MainApp.instance().getApplicationContext().getSystemService(Context.POWER_SERVICE);
mWakeLock = powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "iobCobThread");
@@ -69,34 +74,39 @@ public class IobCobThread extends Thread {
public final void run() {
mWakeLock.acquire();
try {
- log.debug("AUTOSENSDATA thread started: " + from);
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("AUTOSENSDATA thread started: " + from);
if (MainApp.getConfigBuilder() == null) {
- log.debug("Aborting calculation thread (ConfigBuilder not ready): " + from);
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Aborting calculation thread (ConfigBuilder not ready): " + from);
return; // app still initializing
}
- if (!MainApp.getConfigBuilder().isProfileValid("IobCobThread")) {
- log.debug("Aborting calculation thread (No profile): " + from);
+ if (!ProfileFunctions.getInstance().isProfileValid("IobCobThread")) {
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Aborting calculation thread (No profile): " + from);
return; // app still initializing
}
//log.debug("Locking calculateSensitivityData");
- long oldestTimeWithData = iobCobCalculatorPlugin.oldestDataAvailable();
+ long oldestTimeWithData = iobCobCalculatorPlugin.calculateDetectionStart(end, limitDataToOldestAvailable);
synchronized (iobCobCalculatorPlugin.dataLock) {
if (bgDataReload) {
- iobCobCalculatorPlugin.loadBgData(start);
+ iobCobCalculatorPlugin.loadBgData(end);
iobCobCalculatorPlugin.createBucketedData();
}
List bucketed_data = iobCobCalculatorPlugin.getBucketedData();
- LongSparseArray autosensDataTable = IobCobCalculatorPlugin.getPlugin().getAutosensDataTable();
+ LongSparseArray autosensDataTable = iobCobCalculatorPlugin.getAutosensDataTable();
if (bucketed_data == null || bucketed_data.size() < 3) {
- log.debug("Aborting calculation thread (No bucketed data available): " + from);
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Aborting calculation thread (No bucketed data available): " + from);
return;
}
long prevDataTime = IobCobCalculatorPlugin.roundUpTime(bucketed_data.get(bucketed_data.size() - 3).date);
- log.debug("Prev data time: " + new Date(prevDataTime).toLocaleString());
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Prev data time: " + new Date(prevDataTime).toLocaleString());
AutosensData previous = autosensDataTable.get(prevDataTime);
// start from oldest to be able sub cob
for (int i = bucketed_data.size() - 4; i >= 0; i--) {
@@ -105,7 +115,8 @@ public class IobCobThread extends Thread {
if (iobCobCalculatorPlugin.stopCalculationTrigger) {
iobCobCalculatorPlugin.stopCalculationTrigger = false;
- log.debug("Aborting calculation thread (trigger): " + from);
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Aborting calculation thread (trigger): " + from);
return;
}
// check if data already exists
@@ -120,13 +131,14 @@ public class IobCobThread extends Thread {
continue;
}
- Profile profile = MainApp.getConfigBuilder().getProfile(bgTime);
+ Profile profile = ProfileFunctions.getInstance().getProfile(bgTime);
if (profile == null) {
- log.debug("Aborting calculation thread (no profile): " + from);
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Aborting calculation thread (no profile): " + from);
return; // profile not set yet
}
- if (Config.logAutosensData)
+ if (L.isEnabled(L.AUTOSENS))
log.debug("Processing calculation thread: " + from + " (" + i + "/" + bucketed_data.size() + ")");
double sens = Profile.toMgdl(profile.getIsf(bgTime), profile.getUnits());
@@ -165,15 +177,28 @@ public class IobCobThread extends Thread {
// https://github.com/openaps/oref0/blob/master/lib/determine-basal/cob-autosens.js#L169
if (i < bucketed_data.size() - 16) { // we need 1h of data to calculate minDeviationSlope
long hourago = bgTime + 10 * 1000 - 60 * 60 * 1000L;
- AutosensData hourAgoData = IobCobCalculatorPlugin.getPlugin().getAutosensData(hourago);
+ AutosensData hourAgoData = iobCobCalculatorPlugin.getAutosensData(hourago);
if (hourAgoData != null) {
int initialIndex = autosensDataTable.indexOfKey(hourAgoData.time);
- if (Config.logAutosensData)
- log.debug(">>>>> bucketed_data.size()=" + bucketed_data.size() + " i=" + i + "hourAgoData=" + hourAgoData.toString());
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug(">>>>> bucketed_data.size()=" + bucketed_data.size() + " i=" + i + " hourAgoData=" + hourAgoData.toString());
int past = 1;
try {
for (; past < 12; past++) {
AutosensData ad = autosensDataTable.valueAt(initialIndex + past);
+ if (L.isEnabled(L.AUTOSENS)) {
+ log.debug(">>>>> past=" + past + " ad=" + (ad != null ? ad.toString() : null));
+ if (ad == null) {
+ log.debug(autosensDataTable.toString());
+ log.debug(bucketed_data.toString());
+ log.debug(IobCobCalculatorPlugin.getPlugin().getBgReadings().toString());
+ Notification notification = new Notification(Notification.SENDLOGFILES, MainApp.gs(R.string.sendlogfiles), Notification.LOW);
+ MainApp.bus().post(new EventNewNotification(notification));
+ SP.putBoolean("log_AUTOSENS", true);
+ break;
+ }
+ }
+ // let it here crash on NPE to get more data as i cannot reproduce this bug
double deviationSlope = (ad.avgDeviation - avgDeviation) / (ad.time - bgTime) * 1000 * 60 * 5;
if (ad.avgDeviation > maxDeviation) {
slopeFromMaxDeviation = Math.min(0, deviationSlope);
@@ -184,7 +209,7 @@ public class IobCobThread extends Thread {
minDeviation = ad.avgDeviation;
}
- //if (Config.logAutosensData)
+ //if (Config.isEnabled(L.AUTOSENS))
// log.debug("Deviations: " + new Date(bgTime) + new Date(ad.time) + " avgDeviation=" + avgDeviation + " deviationSlope=" + deviationSlope + " slopeFromMaxDeviation=" + slopeFromMaxDeviation + " slopeFromMinDeviation=" + slopeFromMinDeviation);
}
} catch (Exception e) {
@@ -197,7 +222,17 @@ public class IobCobThread extends Thread {
.putCustomAttribute("for_data", ">>>>> bucketed_data.size()=" + bucketed_data.size() + " i=" + i + "hourAgoData=" + hourAgoData.toString())
.putCustomAttribute("past", past)
);
+ log.debug(autosensDataTable.toString());
+ log.debug(bucketed_data.toString());
+ log.debug(IobCobCalculatorPlugin.getPlugin().getBgReadings().toString());
+ Notification notification = new Notification(Notification.SENDLOGFILES, MainApp.gs(R.string.sendlogfiles), Notification.LOW);
+ MainApp.bus().post(new EventNewNotification(notification));
+ SP.putBoolean("log_AUTOSENS", true);
+ break;
}
+ } else {
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug(">>>>> bucketed_data.size()=" + bucketed_data.size() + " i=" + i + " hourAgoData=" + "null");
}
}
@@ -265,13 +300,13 @@ public class IobCobThread extends Thread {
previous = autosensData;
if (bgTime < now())
autosensDataTable.put(bgTime, autosensData);
- if (Config.logAutosensData)
- log.debug("Running detectSensitivity from: " + DateUtil.dateAndTimeString(oldestTimeWithData) + " to: " + DateUtil.dateAndTimeString(bgTime) + " lastDataTime:" + IobCobCalculatorPlugin.getPlugin().lastDataTime());
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("Running detectSensitivity from: " + DateUtil.dateAndTimeString(oldestTimeWithData) + " to: " + DateUtil.dateAndTimeString(bgTime) + " lastDataTime:" + iobCobCalculatorPlugin.lastDataTime());
AutosensResult sensitivity = iobCobCalculatorPlugin.detectSensitivityWithLock(oldestTimeWithData, bgTime);
- if (Config.logAutosensData)
+ if (L.isEnabled(L.AUTOSENS))
log.debug("Sensitivity result: " + sensitivity.toString());
autosensData.autosensResult = sensitivity;
- if (Config.logAutosensData)
+ if (L.isEnabled(L.AUTOSENS))
log.debug(autosensData.toString());
}
}
@@ -282,7 +317,8 @@ public class IobCobThread extends Thread {
} finally {
mWakeLock.release();
MainApp.bus().post(new EventIobCalculationProgress(""));
- log.debug("AUTOSENSDATA thread ended: " + from);
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("AUTOSENSDATA thread ended: " + from);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java
index ce63ad67e5..62d2bc3a7d 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java
@@ -15,21 +15,30 @@ import java.util.List;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.IobTotal;
+import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.db.BgReading;
+import info.nightscout.androidaps.db.TemporaryBasal;
import info.nightscout.androidaps.interfaces.Constraint;
+import info.nightscout.androidaps.interfaces.PumpDescription;
import info.nightscout.androidaps.interfaces.PumpInterface;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
+import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.utils.DecimalFormatter;
+import info.nightscout.utils.SP;
/**
* Created by mike on 09.06.2016.
*/
public class APSResult {
- private static Logger log = LoggerFactory.getLogger(APSResult.class);
+ private static Logger log = LoggerFactory.getLogger(L.APS);
public long date = 0;
public String reason;
public double rate;
+ public int percent;
+ public boolean usePercent = false;
public int duration;
public boolean tempBasalRequested = false;
public boolean bolusRequested = false;
@@ -42,8 +51,39 @@ public class APSResult {
public Constraint inputConstraints;
public Constraint rateConstraint;
+ public Constraint percentConstraint;
public Constraint smbConstraint;
+ public APSResult rate(double rate) {
+ this.rate = rate;
+ return this;
+ }
+
+ public APSResult duration(int duration) {
+ this.duration = duration;
+ return this;
+ }
+
+ public APSResult percent(int percent) {
+ this.percent = percent;
+ return this;
+ }
+
+ public APSResult tempBasalRequested(boolean tempBasalRequested) {
+ this.tempBasalRequested = tempBasalRequested;
+ return this;
+ }
+
+ public APSResult usePercent(boolean usePercent) {
+ this.usePercent = usePercent;
+ return this;
+ }
+
+ public APSResult json(JSONObject json) {
+ this.json = json;
+ return this;
+ }
+
@Override
public String toString() {
final PumpInterface pump = ConfigBuilderPlugin.getActivePump();
@@ -54,6 +94,10 @@ public class APSResult {
ret = MainApp.gs(R.string.canceltemp) + "\n";
else if (rate == -1)
ret = MainApp.gs(R.string.let_temp_basal_run) + "\n";
+ else if (usePercent)
+ ret = MainApp.gs(R.string.rate) + ": " + DecimalFormatter.to2Decimal(percent) + "% " +
+ "(" + DecimalFormatter.to2Decimal(percent * pump.getBaseBasalRate() / 100d) + " U/h)\n" +
+ MainApp.gs(R.string.duration) + ": " + DecimalFormatter.to2Decimal(duration) + " min\n";
else
ret = MainApp.gs(R.string.rate) + ": " + DecimalFormatter.to2Decimal(rate) + " U/h " +
"(" + DecimalFormatter.to2Decimal(rate / pump.getBaseBasalRate() * 100) + "%) \n" +
@@ -79,9 +123,13 @@ public class APSResult {
ret = MainApp.gs(R.string.canceltemp) + " ";
else if (rate == -1)
ret = MainApp.gs(R.string.let_temp_basal_run) + " ";
+ else if (usePercent)
+ ret = "" + MainApp.gs(R.string.rate) + ": " + DecimalFormatter.to2Decimal(percent) + "% " +
+ "(" + DecimalFormatter.to2Decimal(percent * pump.getBaseBasalRate() / 100d) + " U/h) " +
+ "" + MainApp.gs(R.string.duration) + ": " + DecimalFormatter.to2Decimal(duration) + " min ";
else
ret = "" + MainApp.gs(R.string.rate) + ": " + DecimalFormatter.to2Decimal(rate) + " U/h " +
- "(" + DecimalFormatter.to2Decimal(rate / pump.getBaseBasalRate() * 100) + "%) " +
+ "(" + DecimalFormatter.to2Decimal(rate / pump.getBaseBasalRate() * 100d) + "%) " +
"" + MainApp.gs(R.string.duration) + ": " + DecimalFormatter.to2Decimal(duration) + " min ";
// smb
@@ -100,21 +148,33 @@ public class APSResult {
public APSResult clone() {
APSResult newResult = new APSResult();
- newResult.reason = reason;
+ doClone(newResult);
+ return newResult;
+ }
+
+ protected void doClone(APSResult newResult) {
+ newResult.date = date;
+ newResult.reason = reason != null ? new String(reason) : null;
newResult.rate = rate;
newResult.duration = duration;
newResult.tempBasalRequested = tempBasalRequested;
newResult.bolusRequested = bolusRequested;
newResult.iob = iob;
- newResult.json = json;
+ try {
+ newResult.json = new JSONObject(json.toString());
+ } catch (JSONException e) {
+ log.error("Unhandled exception", e);
+ }
newResult.hasPredictions = hasPredictions;
newResult.smb = smb;
newResult.deliverAt = deliverAt;
newResult.rateConstraint = rateConstraint;
newResult.smbConstraint = smbConstraint;
- return newResult;
+ newResult.percent = percent;
+ newResult.usePercent = usePercent;
}
+
public JSONObject json() {
JSONObject json = new JSONObject();
try {
@@ -227,6 +287,114 @@ public class APSResult {
}
public boolean isChangeRequested() {
- return tempBasalRequested || bolusRequested;
+ Constraint closedLoopEnabled = MainApp.getConstraintChecker().isClosedLoopAllowed();
+ // closed loop mode: handle change at driver level
+ if (closedLoopEnabled.value()) {
+ if (L.isEnabled(L.APS))
+ log.debug("DEFAULT: Closed mode");
+ return tempBasalRequested || bolusRequested;
+ }
+
+ // open loop mode: try to limit request
+ if (!tempBasalRequested && !bolusRequested) {
+ if (L.isEnabled(L.APS))
+ log.debug("FALSE: No request");
+ return false;
+ }
+
+ long now = System.currentTimeMillis();
+ TemporaryBasal activeTemp = TreatmentsPlugin.getPlugin().getTempBasalFromHistory(now);
+ PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
+
+ if (usePercent) {
+ if (activeTemp == null && percent == 100) {
+ if (L.isEnabled(L.APS))
+ log.debug("FALSE: No temp running, asking cancel temp");
+ return false;
+ }
+ if (activeTemp != null && Math.abs(percent - activeTemp.tempBasalConvertedToPercent(now, profile)) < pump.getPumpDescription().basalStep) {
+ if (L.isEnabled(L.APS))
+ log.debug("FALSE: Temp equal");
+ return false;
+ }
+ // always report zerotemp
+ if (percent == 0) {
+ if (L.isEnabled(L.APS))
+ log.debug("TRUE: Zero temp");
+ return true;
+ }
+ // always report hightemp
+ if (pump != null && pump.getPumpDescription().tempBasalStyle == PumpDescription.PERCENT) {
+ double pumpLimit = pump.getPumpDescription().pumpType.getTbrSettings().getMaxDose();
+ if (percent == pumpLimit) {
+ if (L.isEnabled(L.APS))
+ log.debug("TRUE: Pump limit");
+ return true;
+ }
+ }
+ // report change bigger than 30%
+ double percentMinChangeChange = SP.getDouble(R.string.key_loop_openmode_min_change, 30d);
+ percentMinChangeChange /= 100d;
+ double lowThreshold = 1 - percentMinChangeChange;
+ double highThreshold = 1 + percentMinChangeChange;
+ double change = percent / 100d;
+ if (activeTemp != null)
+ change = percent / (double) activeTemp.tempBasalConvertedToPercent(now, profile);
+
+ if (change < lowThreshold || change > highThreshold) {
+ if (L.isEnabled(L.APS))
+ log.debug("TRUE: Outside allowed range " + (change * 100d) + "%");
+ return true;
+ } else {
+ if (L.isEnabled(L.APS))
+ log.debug("TRUE: Inside allowed range " + (change * 100d) + "%");
+ return false;
+ }
+ } else {
+ if (activeTemp == null && rate == pump.getBaseBasalRate()) {
+ if (L.isEnabled(L.APS))
+ log.debug("FALSE: No temp running, asking cancel temp");
+ return false;
+ }
+ if (activeTemp != null && Math.abs(rate - activeTemp.tempBasalConvertedToAbsolute(now, profile)) < pump.getPumpDescription().basalStep) {
+ if (L.isEnabled(L.APS))
+ log.debug("FALSE: Temp equal");
+ return false;
+ }
+ // always report zerotemp
+ if (rate == 0) {
+ if (L.isEnabled(L.APS))
+ log.debug("TRUE: Zero temp");
+ return true;
+ }
+ // always report hightemp
+ if (pump != null && pump.getPumpDescription().tempBasalStyle == PumpDescription.ABSOLUTE) {
+ double pumpLimit = pump.getPumpDescription().pumpType.getTbrSettings().getMaxDose();
+ if (rate == pumpLimit) {
+ if (L.isEnabled(L.APS))
+ log.debug("TRUE: Pump limit");
+ return true;
+ }
+ }
+ // report change bigger than 30%
+ double percentMinChangeChange = SP.getDouble(R.string.key_loop_openmode_min_change, 30d);
+ percentMinChangeChange /= 100d;
+ double lowThreshold = 1 - percentMinChangeChange;
+ double highThreshold = 1 + percentMinChangeChange;
+ double change = rate / profile.getBasal();
+ if (activeTemp != null)
+ change = rate / activeTemp.tempBasalConvertedToAbsolute(now, profile);
+
+ if (change < lowThreshold || change > highThreshold) {
+ if (L.isEnabled(L.APS))
+ log.debug("TRUE: Outside allowed range " + (change * 100d) + "%");
+ return true;
+ } else {
+ if (L.isEnabled(L.APS))
+ log.debug("TRUE: Inside allowed range " + (change * 100d) + "%");
+ return false;
+ }
+ }
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/DeviceStatus.java b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/DeviceStatus.java
index acf59865d1..2c2bb1a2ee 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/DeviceStatus.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/DeviceStatus.java
@@ -1,17 +1,11 @@
package info.nightscout.androidaps.plugins.Loop;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.MainApp;
-import info.nightscout.androidaps.Services.Intents;
-import info.nightscout.androidaps.plugins.NSClientInternal.data.DbLogger;
+import info.nightscout.androidaps.logging.L;
/*
{
@@ -371,7 +365,7 @@ import info.nightscout.androidaps.plugins.NSClientInternal.data.DbLogger;
*/
public class DeviceStatus {
- private static Logger log = LoggerFactory.getLogger(DeviceStatus.class);
+ private static Logger log = LoggerFactory.getLogger(L.APS);
public String device = null;
public JSONObject pump = null;
@@ -381,12 +375,12 @@ public class DeviceStatus {
public int uploaderBattery = 0;
public String created_at = null;
- public JSONObject mongoRecord () {
+ public JSONObject mongoRecord() {
JSONObject record = new JSONObject();
try {
- if (device != null) record.put("device" , device);
- if (pump != null) record.put("pump" , pump);
+ if (device != null) record.put("device", device);
+ if (pump != null) record.put("pump", pump);
if (suggested != null) {
JSONObject openaps = new JSONObject();
if (enacted != null) openaps.put("enacted", enacted);
@@ -395,7 +389,7 @@ public class DeviceStatus {
record.put("openaps", openaps);
}
if (uploaderBattery != 0) record.put("uploaderBattery", uploaderBattery);
- if (created_at != null) record.put("created_at" , created_at);
+ if (created_at != null) record.put("created_at", created_at);
} catch (JSONException e) {
log.error("Unhandled exception", e);
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopFragment.java
index 7fa810f8c0..0c0e31fb03 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopFragment.java
@@ -28,8 +28,6 @@ import info.nightscout.androidaps.plugins.Loop.events.EventLoopUpdateGui;
import info.nightscout.utils.FabricPrivacy;
public class LoopFragment extends SubscriberFragment {
- private static Logger log = LoggerFactory.getLogger(LoopFragment.class);
-
@BindView(R.id.loop_run)
Button runNowButton;
@BindView(R.id.loop_lastrun)
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 480646ccfc..9a2a72746e 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java
@@ -21,47 +21,58 @@ import org.slf4j.LoggerFactory;
import java.util.Date;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainActivity;
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.BgReading;
+import info.nightscout.androidaps.db.CareportalEvent;
import info.nightscout.androidaps.db.DatabaseHelper;
-import info.nightscout.androidaps.events.Event;
+import info.nightscout.androidaps.db.Source;
+import info.nightscout.androidaps.db.TemporaryBasal;
import info.nightscout.androidaps.events.EventNewBG;
-import info.nightscout.androidaps.events.EventTreatmentChange;
import info.nightscout.androidaps.interfaces.APSInterface;
import info.nightscout.androidaps.interfaces.Constraint;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.interfaces.PumpDescription;
import info.nightscout.androidaps.interfaces.PumpInterface;
+import info.nightscout.androidaps.interfaces.TreatmentsInterface;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConstraintsObjectives.ObjectivesPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventAutosensCalculationFinished;
import info.nightscout.androidaps.plugins.Loop.events.EventLoopSetLastRunGui;
import info.nightscout.androidaps.plugins.Loop.events.EventLoopUpdateGui;
import info.nightscout.androidaps.plugins.Loop.events.EventNewOpenLoopNotification;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
+import info.nightscout.androidaps.plugins.PumpVirtual.VirtualPumpPlugin;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
+import info.nightscout.androidaps.plugins.Wear.ActionStringHandler;
+import info.nightscout.androidaps.events.EventAcceptOpenLoopChange;
import info.nightscout.androidaps.queue.Callback;
import info.nightscout.androidaps.queue.commands.Command;
import info.nightscout.utils.FabricPrivacy;
-import info.nightscout.utils.NSUpload;
import info.nightscout.utils.SP;
+import info.nightscout.utils.T;
+import info.nightscout.utils.ToastUtils;
/**
* Created by mike on 05.08.2016.
*/
public class LoopPlugin extends PluginBase {
- private static Logger log = LoggerFactory.getLogger(LoopPlugin.class);
+ private static Logger log = LoggerFactory.getLogger(L.APS);
- public static final String CHANNEL_ID = "AndroidAPS-Openloop";
+ private static final String CHANNEL_ID = "AndroidAPS-Openloop";
- long lastBgTriggeredRun = 0;
+ private long lastBgTriggeredRun = 0;
- protected static LoopPlugin loopPlugin;
+ private static LoopPlugin loopPlugin;
@NonNull
public static LoopPlugin getPlugin() {
@@ -94,7 +105,7 @@ public class LoopPlugin extends PluginBase {
.fragmentClass(LoopFragment.class.getName())
.pluginName(R.string.loop)
.shortName(R.string.loop_shortname)
- .preferencesId(R.xml.pref_closedmode)
+ .preferencesId(R.xml.pref_loop)
.description(R.string.description_loop)
);
loopSuspendedTill = SP.getLong("loopSuspendedTill", 0L);
@@ -132,15 +143,13 @@ public class LoopPlugin extends PluginBase {
PumpInterface pump = ConfigBuilderPlugin.getActivePump();
return pump == null || pump.getPumpDescription().isTempBasalCapable;
}
-
+
/**
* This method is triggered once autosens calculation has completed, so the LoopPlugin
* has current data to work with. However, autosens calculation can be triggered by multiple
* sources and currently only a new BG should trigger a loop run. Hence we return early if
* the event causing the calculation is not EventNewBg.
- *
- * Callers of {@link info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin#runCalculation(String, long, boolean, Event)}
- * are sources triggering a calculation which triggers this method upon completion.
+ *
*/
@Subscribe
public void onStatusEvent(final EventAutosensCalculationFinished ev) {
@@ -249,19 +258,20 @@ public class LoopPlugin extends PluginBase {
return isDisconnected;
}
- public synchronized void invoke(String initiator, boolean allowNotification){
+ public synchronized void invoke(String initiator, boolean allowNotification) {
invoke(initiator, allowNotification, false);
}
public synchronized void invoke(String initiator, boolean allowNotification, boolean tempBasalFallback) {
try {
- if (Config.logFunctionCalls)
+ if (L.isEnabled(L.APS))
log.debug("invoke from " + initiator);
Constraint loopEnabled = MainApp.getConstraintChecker().isLoopInvokationAllowed();
if (!loopEnabled.value()) {
String message = MainApp.gs(R.string.loopdisabled) + "\n" + loopEnabled.getReasons();
- log.debug(message);
+ if (L.isEnabled(L.APS))
+ log.debug(message);
MainApp.bus().post(new EventLoopSetLastRunGui(message));
return;
}
@@ -271,10 +281,11 @@ public class LoopPlugin extends PluginBase {
if (!isEnabled(PluginType.LOOP))
return;
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
- if (!MainApp.getConfigBuilder().isProfileValid("Loop")) {
- log.debug(MainApp.gs(R.string.noprofileselected));
+ if (!ProfileFunctions.getInstance().isProfileValid("Loop")) {
+ if (L.isEnabled(L.APS))
+ log.debug(MainApp.gs(R.string.noprofileselected));
MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.gs(R.string.noprofileselected)));
return;
}
@@ -294,17 +305,28 @@ public class LoopPlugin extends PluginBase {
return;
}
+ // Prepare for pumps using % basals
+ if (pump.getPumpDescription().tempBasalStyle == PumpDescription.PERCENT) {
+ result.usePercent = true;
+ }
+ result.percent = (int) (result.rate / profile.getBasal() * 100);
+
// check rate for constrais
final APSResult resultAfterConstraints = result.clone();
resultAfterConstraints.rateConstraint = new Constraint<>(resultAfterConstraints.rate);
resultAfterConstraints.rate = MainApp.getConstraintChecker().applyBasalConstraints(resultAfterConstraints.rateConstraint, profile).value();
+
+ resultAfterConstraints.percentConstraint = new Constraint<>(resultAfterConstraints.percent);
+ resultAfterConstraints.percent = MainApp.getConstraintChecker().applyBasalPercentConstraints(resultAfterConstraints.percentConstraint, profile).value();
+
resultAfterConstraints.smbConstraint = new Constraint<>(resultAfterConstraints.smb);
resultAfterConstraints.smb = MainApp.getConstraintChecker().applyBolusConstraints(resultAfterConstraints.smbConstraint).value();
// safety check for multiple SMBs
long lastBolusTime = TreatmentsPlugin.getPlugin().getLastBolusTime();
- if (lastBolusTime != 0 && lastBolusTime + 3 * 60 * 1000 > System.currentTimeMillis()) {
- log.debug("SMB requsted but still in 3 min interval");
+ if (lastBolusTime != 0 && lastBolusTime + T.mins(3).msecs() > System.currentTimeMillis()) {
+ if (L.isEnabled(L.APS))
+ log.debug("SMB requsted but still in 3 min interval");
resultAfterConstraints.smb = 0;
}
@@ -319,13 +341,15 @@ public class LoopPlugin extends PluginBase {
NSUpload.uploadDeviceStatus();
if (isSuspended()) {
- log.debug(MainApp.gs(R.string.loopsuspended));
+ if (L.isEnabled(L.APS))
+ log.debug(MainApp.gs(R.string.loopsuspended));
MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.gs(R.string.loopsuspended)));
return;
}
if (pump.isSuspended()) {
- log.debug(MainApp.gs(R.string.pumpsuspended));
+ if (L.isEnabled(L.APS))
+ log.debug(MainApp.gs(R.string.pumpsuspended));
MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.gs(R.string.pumpsuspended)));
return;
}
@@ -333,7 +357,7 @@ public class LoopPlugin extends PluginBase {
Constraint closedLoopEnabled = MainApp.getConstraintChecker().isClosedLoopAllowed();
if (closedLoopEnabled.value()) {
- if (result.isChangeRequested()
+ if (resultAfterConstraints.isChangeRequested()
&& !ConfigBuilderPlugin.getCommandQueue().bolusInQueue()
&& !ConfigBuilderPlugin.getCommandQueue().isRunning(Command.CommandType.BOLUS)) {
final PumpEnactResult waiting = new PumpEnactResult();
@@ -344,13 +368,13 @@ public class LoopPlugin extends PluginBase {
lastRun.smbSetByPump = waiting;
MainApp.bus().post(new EventLoopUpdateGui());
FabricPrivacy.getInstance().logCustom(new CustomEvent("APSRequest"));
- MainApp.getConfigBuilder().applyTBRRequest(resultAfterConstraints, profile, new Callback() {
+ applyTBRRequest(resultAfterConstraints, profile, new Callback() {
@Override
public void run() {
if (result.enacted || result.success) {
lastRun.tbrSetByPump = result;
lastRun.lastEnact = lastRun.lastAPSRun;
- MainApp.getConfigBuilder().applySMBRequest(resultAfterConstraints, new Callback() {
+ applySMBRequest(resultAfterConstraints, new Callback() {
@Override
public void run() {
//Callback is only called if a bolus was acutally requested
@@ -376,7 +400,7 @@ public class LoopPlugin extends PluginBase {
lastRun.smbSetByPump = null;
}
} else {
- if (result.isChangeRequested() && allowNotification) {
+ if (resultAfterConstraints.isChangeRequested() && allowNotification) {
NotificationCompat.Builder builder =
new NotificationCompat.Builder(MainApp.instance().getApplicationContext(), CHANNEL_ID);
builder.setSmallIcon(R.drawable.notif_icon)
@@ -385,7 +409,8 @@ public class LoopPlugin extends PluginBase {
.setAutoCancel(true)
.setPriority(Notification.PRIORITY_HIGH)
.setCategory(Notification.CATEGORY_ALARM)
- .setVisibility(Notification.VISIBILITY_PUBLIC);
+ .setVisibility(Notification.VISIBILITY_PUBLIC)
+ .setLocalOnly(true);
// Creates an explicit intent for an Activity in your app
Intent resultIntent = new Intent(MainApp.instance().getApplicationContext(), MainActivity.class);
@@ -407,14 +432,243 @@ public class LoopPlugin extends PluginBase {
// mId allows you to update the notification later on.
mNotificationManager.notify(Constants.notificationID, builder.build());
MainApp.bus().post(new EventNewOpenLoopNotification());
+
+ // Send to Wear
+ ActionStringHandler.handleInitiate("changeRequest");
+ } else if (allowNotification) {
+ // dismiss notifications
+ NotificationManager notificationManager =
+ (NotificationManager) MainApp.instance().getSystemService(Context.NOTIFICATION_SERVICE);
+ notificationManager.cancel(Constants.notificationID);
+ ActionStringHandler.handleInitiate("cancelChangeRequest");
}
}
MainApp.bus().post(new EventLoopUpdateGui());
} finally {
- if (Config.logFunctionCalls)
+ if (L.isEnabled(L.APS))
log.debug("invoke end");
}
}
+ public void acceptChangeRequest() {
+ Profile profile = ProfileFunctions.getInstance().getProfile();
+
+ applyTBRRequest(lastRun.constraintsProcessed, profile, new Callback() {
+ @Override
+ public void run() {
+ if (result.enacted) {
+ lastRun.tbrSetByPump = result;
+ lastRun.lastEnact = new Date();
+ lastRun.lastOpenModeAccept = new Date();
+ NSUpload.uploadDeviceStatus();
+ ObjectivesPlugin objectivesPlugin = MainApp.getSpecificPlugin(ObjectivesPlugin.class);
+ if (objectivesPlugin != null) {
+ ObjectivesPlugin.getPlugin().manualEnacts++;
+ ObjectivesPlugin.getPlugin().saveProgress();
+ }
+ }
+ MainApp.bus().post(new EventAcceptOpenLoopChange());
+ }
+ });
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("AcceptTemp"));
+ }
+
+ /**
+ * expect absolute request and allow both absolute and percent response based on pump capabilities
+ * TODO: update pump drivers to support APS request in %
+ */
+
+ public void applyTBRRequest(APSResult request, Profile profile, Callback callback) {
+ boolean allowPercentage = VirtualPumpPlugin.getPlugin().isEnabled(PluginType.PUMP);
+
+ if (!request.tempBasalRequested) {
+ if (callback != null) {
+ callback.result(new PumpEnactResult().enacted(false).success(true).comment(MainApp.gs(R.string.nochangerequested))).run();
+ }
+ return;
+ }
+
+ PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
+ TreatmentsInterface activeTreatments = TreatmentsPlugin.getPlugin();
+
+ if (!pump.isInitialized()) {
+ if (L.isEnabled(L.APS))
+ log.debug("applyAPSRequest: " + MainApp.gs(R.string.pumpNotInitialized));
+ if (callback != null) {
+ callback.result(new PumpEnactResult().comment(MainApp.gs(R.string.pumpNotInitialized)).enacted(false).success(false)).run();
+ }
+ return;
+ }
+
+ if (pump.isSuspended()) {
+ if (L.isEnabled(L.APS))
+ log.debug("applyAPSRequest: " + MainApp.gs(R.string.pumpsuspended));
+ if (callback != null) {
+ callback.result(new PumpEnactResult().comment(MainApp.gs(R.string.pumpsuspended)).enacted(false).success(false)).run();
+ }
+ return;
+ }
+
+ if (L.isEnabled(L.APS))
+ log.debug("applyAPSRequest: " + request.toString());
+
+ long now = System.currentTimeMillis();
+ TemporaryBasal activeTemp = activeTreatments.getTempBasalFromHistory(now);
+ if (request.usePercent && allowPercentage) {
+ if (request.percent == 100 && request.duration == 0) {
+ if (activeTemp != null) {
+ if (L.isEnabled(L.APS))
+ log.debug("applyAPSRequest: cancelTempBasal()");
+ MainApp.getConfigBuilder().getCommandQueue().cancelTempBasal(false, callback);
+ } else {
+ if (L.isEnabled(L.APS))
+ log.debug("applyAPSRequest: Basal set correctly");
+ if (callback != null) {
+ callback.result(new PumpEnactResult().percent(request.percent).duration(0)
+ .enacted(false).success(true).comment(MainApp.gs(R.string.basal_set_correctly))).run();
+ }
+ }
+ } else if (activeTemp != null
+ && activeTemp.getPlannedRemainingMinutes() > 5
+ && request.duration - activeTemp.getPlannedRemainingMinutes() < 30
+ && request.percent == activeTemp.percentRate) {
+ if (L.isEnabled(L.APS))
+ log.debug("applyAPSRequest: Temp basal set correctly");
+ if (callback != null) {
+ callback.result(new PumpEnactResult().percent(request.percent)
+ .enacted(false).success(true).duration(activeTemp.getPlannedRemainingMinutes())
+ .comment(MainApp.gs(R.string.let_temp_basal_run))).run();
+ }
+ } else {
+ if (L.isEnabled(L.APS))
+ log.debug("applyAPSRequest: tempBasalPercent()");
+ MainApp.getConfigBuilder().getCommandQueue().tempBasalPercent(request.percent, request.duration, false, profile, callback);
+ }
+ } else {
+ if ((request.rate == 0 && request.duration == 0) || Math.abs(request.rate - pump.getBaseBasalRate()) < pump.getPumpDescription().basalStep) {
+ if (activeTemp != null) {
+ if (L.isEnabled(L.APS))
+ log.debug("applyAPSRequest: cancelTempBasal()");
+ MainApp.getConfigBuilder().getCommandQueue().cancelTempBasal(false, callback);
+ } else {
+ if (L.isEnabled(L.APS))
+ log.debug("applyAPSRequest: Basal set correctly");
+ if (callback != null) {
+ callback.result(new PumpEnactResult().absolute(request.rate).duration(0)
+ .enacted(false).success(true).comment(MainApp.gs(R.string.basal_set_correctly))).run();
+ }
+ }
+ } else if (activeTemp != null
+ && activeTemp.getPlannedRemainingMinutes() > 5
+ && request.duration - activeTemp.getPlannedRemainingMinutes() < 30
+ && Math.abs(request.rate - activeTemp.tempBasalConvertedToAbsolute(now, profile)) < pump.getPumpDescription().basalStep) {
+ if (L.isEnabled(L.APS))
+ log.debug("applyAPSRequest: Temp basal set correctly");
+ if (callback != null) {
+ callback.result(new PumpEnactResult().absolute(activeTemp.tempBasalConvertedToAbsolute(now, profile))
+ .enacted(false).success(true).duration(activeTemp.getPlannedRemainingMinutes())
+ .comment(MainApp.gs(R.string.let_temp_basal_run))).run();
+ }
+ } else {
+ if (L.isEnabled(L.APS))
+ log.debug("applyAPSRequest: setTempBasalAbsolute()");
+ MainApp.getConfigBuilder().getCommandQueue().tempBasalAbsolute(request.rate, request.duration, false, profile, callback);
+ }
+ }
+ }
+
+ public void applySMBRequest(APSResult request, Callback callback) {
+ if (!request.bolusRequested) {
+ return;
+ }
+
+ PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
+ TreatmentsInterface activeTreatments = TreatmentsPlugin.getPlugin();
+
+ long lastBolusTime = activeTreatments.getLastBolusTime();
+ if (lastBolusTime != 0 && lastBolusTime + 3 * 60 * 1000 > System.currentTimeMillis()) {
+ if (L.isEnabled(L.APS))
+ log.debug("SMB requested but still in 3 min interval");
+ if (callback != null) {
+ callback.result(new PumpEnactResult()
+ .comment(MainApp.gs(R.string.smb_frequency_exceeded))
+ .enacted(false).success(false)).run();
+ }
+ return;
+ }
+
+ if (!pump.isInitialized()) {
+ if (L.isEnabled(L.APS))
+ log.debug("applySMBRequest: " + MainApp.gs(R.string.pumpNotInitialized));
+ if (callback != null) {
+ callback.result(new PumpEnactResult().comment(MainApp.gs(R.string.pumpNotInitialized)).enacted(false).success(false)).run();
+ }
+ return;
+ }
+
+ if (pump.isSuspended()) {
+ if (L.isEnabled(L.APS))
+ log.debug("applySMBRequest: " + MainApp.gs(R.string.pumpsuspended));
+ if (callback != null) {
+ callback.result(new PumpEnactResult().comment(MainApp.gs(R.string.pumpsuspended)).enacted(false).success(false)).run();
+ }
+ return;
+ }
+
+ if (L.isEnabled(L.APS))
+ log.debug("applySMBRequest: " + request.toString());
+
+ // deliver SMB
+ DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo();
+ detailedBolusInfo.lastKnownBolusTime = activeTreatments.getLastBolusTime();
+ detailedBolusInfo.eventType = CareportalEvent.CORRECTIONBOLUS;
+ detailedBolusInfo.insulin = request.smb;
+ detailedBolusInfo.isSMB = true;
+ detailedBolusInfo.source = Source.USER;
+ detailedBolusInfo.deliverAt = request.deliverAt;
+ if (L.isEnabled(L.APS))
+ log.debug("applyAPSRequest: bolus()");
+ MainApp.getConfigBuilder().getCommandQueue().bolus(detailedBolusInfo, callback);
+ }
+
+ public void disconnectPump(int durationInMinutes, Profile profile) {
+ PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
+ TreatmentsInterface activeTreatments = TreatmentsPlugin.getPlugin();
+
+ LoopPlugin.getPlugin().disconnectTo(System.currentTimeMillis() + durationInMinutes * 60 * 1000L);
+ MainApp.getConfigBuilder().getCommandQueue().tempBasalPercent(0, durationInMinutes, true, profile, new Callback() {
+ @Override
+ public void run() {
+ if (!result.success) {
+ ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.tempbasaldeliveryerror));
+ }
+ }
+ });
+ if (pump.getPumpDescription().isExtendedBolusCapable && activeTreatments.isInHistoryExtendedBoluslInProgress()) {
+ MainApp.getConfigBuilder().getCommandQueue().cancelExtended(new Callback() {
+ @Override
+ public void run() {
+ if (!result.success) {
+ ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.extendedbolusdeliveryerror));
+ }
+ }
+ });
+ }
+ NSUpload.uploadOpenAPSOffline(durationInMinutes);
+ }
+
+ public void suspendLoop(int durationInMinutes) {
+ LoopPlugin.getPlugin().suspendTo(System.currentTimeMillis() + durationInMinutes * 60 * 1000);
+ MainApp.getConfigBuilder().getCommandQueue().cancelTempBasal(true, new Callback() {
+ @Override
+ public void run() {
+ if (!result.success) {
+ ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.tempbasaldeliveryerror));
+ }
+ }
+ });
+ NSUpload.uploadOpenAPSOffline(durationInMinutes);
+ }
+
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Maintenance/ImportExportPrefs.java b/app/src/main/java/info/nightscout/androidaps/plugins/Maintenance/ImportExportPrefs.java
new file mode 100644
index 0000000000..d108382c92
--- /dev/null
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Maintenance/ImportExportPrefs.java
@@ -0,0 +1,160 @@
+package info.nightscout.androidaps.plugins.Maintenance;
+
+import android.Manifest;
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.os.Environment;
+import android.preference.PreferenceManager;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.app.Fragment;
+import android.support.v4.content.ContextCompat;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Map;
+
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.events.EventAppExit;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.utils.OKDialog;
+import info.nightscout.utils.ToastUtils;
+
+/**
+ * Created by mike on 03.07.2016.
+ */
+
+public class ImportExportPrefs {
+ private static Logger log = LoggerFactory.getLogger(L.CORE);
+ static File path = new File(Environment.getExternalStorageDirectory().toString());
+ static public final File file = new File(path, MainApp.gs(R.string.app_name) + "Preferences");
+
+ private static final int REQUEST_EXTERNAL_STORAGE = 1;
+ private static String[] PERMISSIONS_STORAGE = {
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE
+ };
+
+ public static void verifyStoragePermissions(Activity activity) {
+ // Check if we have write permission
+ int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
+
+ if (permission != PackageManager.PERMISSION_GRANTED) {
+ // We don't have permission so prompt the user
+ ActivityCompat.requestPermissions(
+ activity,
+ PERMISSIONS_STORAGE,
+ REQUEST_EXTERNAL_STORAGE
+ );
+ }
+ }
+
+ public static void verifyStoragePermissions(Fragment fragment) {
+ int permission = ContextCompat.checkSelfPermission(fragment.getContext(),
+ Manifest.permission.WRITE_EXTERNAL_STORAGE);
+
+ if (permission != PackageManager.PERMISSION_GRANTED) {
+ // We don't have permission so prompt the user
+ fragment.requestPermissions(PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);
+ }
+
+ }
+
+ public static void exportSharedPreferences(final Fragment f) {
+ exportSharedPreferences(f.getContext());
+ }
+
+ public static void exportSharedPreferences(final Context c) {
+
+ new AlertDialog.Builder(c)
+ .setMessage(MainApp.gs(R.string.export_to) + " " + file + " ?")
+ .setPositiveButton(android.R.string.yes, (dialog, which) -> {
+
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(c);
+ try {
+ FileWriter fw = new FileWriter(file);
+ PrintWriter pw = new PrintWriter(fw);
+ Map prefsMap = prefs.getAll();
+ for (Map.Entry entry : prefsMap.entrySet()) {
+ pw.println(entry.getKey() + "::" + entry.getValue().toString());
+ }
+ pw.close();
+ fw.close();
+ ToastUtils.showToastInUiThread(c, MainApp.gs(R.string.exported));
+ } catch (FileNotFoundException e) {
+ ToastUtils.showToastInUiThread(c, MainApp.gs(R.string.filenotfound) + " " + file);
+ log.error("Unhandled exception", e);
+ } catch (IOException e) {
+ log.error("Unhandled exception", e);
+ }
+ })
+ .setNegativeButton(android.R.string.cancel, null)
+ .show();
+ }
+
+ public static void importSharedPreferences(final Fragment fragment) {
+ importSharedPreferences(fragment.getContext());
+ }
+
+ public static void importSharedPreferences(final Context context) {
+ new AlertDialog.Builder(context)
+ .setMessage(MainApp.gs(R.string.import_from) + " " + file + " ?")
+ .setPositiveButton(android.R.string.yes, (dialog, which) -> {
+
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ SharedPreferences.Editor editor = prefs.edit();
+ String line;
+ String[] lineParts;
+ try {
+ editor.clear();
+ editor.commit();
+
+ BufferedReader reader = new BufferedReader(new FileReader(file));
+ while ((line = reader.readLine()) != null) {
+ lineParts = line.split("::");
+ if (lineParts.length == 2) {
+ if (lineParts[1].equals("true") || lineParts[1].equals("false")) {
+ editor.putBoolean(lineParts[0], Boolean.parseBoolean(lineParts[1]));
+ } else {
+ editor.putString(lineParts[0], lineParts[1]);
+ }
+ }
+ }
+ reader.close();
+ editor.commit();
+ OKDialog.show(context, MainApp.gs(R.string.setting_imported), MainApp.gs(R.string.restartingapp), () -> {
+ log.debug("Exiting");
+ MainApp.instance().stopKeepAliveService();
+ MainApp.bus().post(new EventAppExit());
+ MainApp.closeDbHelper();
+ if (context instanceof Activity) {
+ ((Activity)context).finish();
+ }
+ System.runFinalization();
+ System.exit(0);
+ });
+ } catch (FileNotFoundException e) {
+ ToastUtils.showToastInUiThread(context, MainApp.gs(R.string.filenotfound) + " " + file);
+ log.error("Unhandled exception", e);
+ } catch (IOException e) {
+ log.error("Unhandled exception", e);
+ }
+ })
+ .setNegativeButton(android.R.string.cancel, null)
+ .show();
+ }
+
+}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Maintenance/LoggerUtils.java b/app/src/main/java/info/nightscout/androidaps/plugins/Maintenance/LoggerUtils.java
new file mode 100644
index 0000000000..fc1cc0362a
--- /dev/null
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Maintenance/LoggerUtils.java
@@ -0,0 +1,29 @@
+package info.nightscout.androidaps.plugins.Maintenance;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import ch.qos.logback.classic.LoggerContext;
+import info.nightscout.androidaps.logging.L;
+
+/**
+ * This class provides serveral methods for log-handling (eg. sending logs as emails).
+ */
+public class LoggerUtils {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(L.CORE);
+
+ public static String SUFFIX = ".log.zip";
+
+ /**
+ * Returns the directory, in which the logs are stored on the system. This is configured in the
+ * logback.xml file.
+ *
+ * @return
+ */
+ public static String getLogDirectory() {
+ LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
+ return lc.getProperty("EXT_FILES_DIR");
+ }
+
+}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Maintenance/MaintenanceFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Maintenance/MaintenanceFragment.java
new file mode 100644
index 0000000000..f9c00d56c7
--- /dev/null
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Maintenance/MaintenanceFragment.java
@@ -0,0 +1,83 @@
+package info.nightscout.androidaps.plugins.Maintenance;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v7.app.AlertDialog;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.plugins.Food.FoodPlugin;
+import info.nightscout.androidaps.plugins.Maintenance.activities.LogSettingActivity;
+import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
+
+/**
+ *
+ */
+public class MaintenanceFragment extends Fragment {
+
+ private Fragment f;
+
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ this.f = this;
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+
+ this.f = null;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.maintenance_fragment, container, false);
+
+ final Fragment f = this;
+
+ view.findViewById(R.id.log_send).setOnClickListener(view1 -> MaintenancePlugin.getPlugin().sendLogs());
+
+ view.findViewById(R.id.log_delete).setOnClickListener(view1 -> MaintenancePlugin.getPlugin().deleteLogs());
+
+ view.findViewById(R.id.nav_resetdb).setOnClickListener(view1 -> new AlertDialog.Builder(f.getContext())
+ .setTitle(R.string.nav_resetdb)
+ .setMessage(R.string.reset_db_confirm)
+ .setNegativeButton(android.R.string.cancel, null)
+ .setPositiveButton(android.R.string.ok, (dialog, which) -> {
+ MainApp.getDbHelper().resetDatabases();
+ // should be handled by Plugin-Interface and
+ // additional service interface and plugin registry
+ FoodPlugin.getPlugin().getService().resetFood();
+ TreatmentsPlugin.getPlugin().getService().resetTreatments();
+ })
+ .create()
+ .show());
+
+ view.findViewById(R.id.nav_export).setOnClickListener(view1 -> {
+ // start activity for checking permissions...
+ ImportExportPrefs.verifyStoragePermissions(f);
+ ImportExportPrefs.exportSharedPreferences(f);
+ });
+
+ view.findViewById(R.id.nav_import).setOnClickListener(view1 -> {
+ // start activity for checking permissions...
+ ImportExportPrefs.verifyStoragePermissions(f);
+ ImportExportPrefs.importSharedPreferences(f);
+ });
+
+ view.findViewById(R.id.nav_logsettings).setOnClickListener(view1 -> {
+ startActivity(new Intent(getActivity(), LogSettingActivity.class));
+ });
+
+
+ return view;
+ }
+
+}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Maintenance/MaintenancePlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Maintenance/MaintenancePlugin.java
new file mode 100644
index 0000000000..09ab7feee1
--- /dev/null
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Maintenance/MaintenancePlugin.java
@@ -0,0 +1,261 @@
+package info.nightscout.androidaps.plugins.Maintenance;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.support.v4.content.FileProvider;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+import info.nightscout.androidaps.BuildConfig;
+import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.interfaces.PluginBase;
+import info.nightscout.androidaps.interfaces.PluginDescription;
+import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.NSClientInternal.data.NSSettingsStatus;
+import info.nightscout.utils.SP;
+
+public class MaintenancePlugin extends PluginBase {
+
+ private static final Logger LOG = LoggerFactory.getLogger(L.CORE);
+
+ private final Context ctx;
+
+ private static MaintenancePlugin maintenancePlugin;
+
+ public static MaintenancePlugin getPlugin() {
+ return maintenancePlugin;
+ }
+
+ public static MaintenancePlugin initPlugin(Context ctx) {
+
+ if (maintenancePlugin == null) {
+ maintenancePlugin = new MaintenancePlugin(ctx);
+ }
+
+ return maintenancePlugin;
+ }
+
+ public MaintenancePlugin() {
+ // required for testing
+ super(null);
+ this.ctx = null;
+ }
+
+ MaintenancePlugin(Context ctx) {
+ super(new PluginDescription()
+ .mainType(PluginType.GENERAL)
+ .fragmentClass(MaintenanceFragment.class.getName())
+ .alwayVisible(false)
+ .alwaysEnabled(true)
+ .pluginName(R.string.maintenance)
+ .shortName(R.string.maintenance_shortname)
+ .preferencesId(R.xml.pref_maintenance)
+ .description(R.string.description_maintenance)
+ );
+ this.ctx = ctx;
+ }
+
+ public void sendLogs() {
+ String recipient = SP.getString("key_maintenance_logs_email", "logs@androidaps.org");
+ int amount = SP.getInt("key_maintenance_logs_amount", 2);
+
+ String logDirectory = LoggerUtils.getLogDirectory();
+ List logs = this.getLogfiles(logDirectory, amount);
+
+ File zipDir = this.ctx.getExternalFilesDir("exports");
+ File zipFile = new File(zipDir, this.constructName());
+
+ LOG.debug("zipFile: {}", zipFile.getAbsolutePath());
+ File zip = this.zipLogs(zipFile, logs);
+
+ Uri attachementUri = FileProvider.getUriForFile(this.ctx, BuildConfig.APPLICATION_ID + ".fileprovider", zip);
+ Intent emailIntent = this.sendMail(attachementUri, recipient, "Log Export");
+ LOG.debug("sending emailIntent");
+ ctx.startActivity(emailIntent);
+ }
+
+ //todo replace this with a call on startup of the application, specifically to remove
+ // unnecessary garbage from the log exports
+ public void deleteLogs() {
+ String logDirectory = LoggerUtils.getLogDirectory();
+ File logDir = new File(logDirectory);
+
+ File[] files = logDir.listFiles((file, name) -> name.startsWith("AndroidAPS")
+ && name.endsWith(".zip"));
+
+ Arrays.sort(files, (f1, f2) -> f1.getName().compareTo(f2.getName()));
+
+ List delFiles = Arrays.asList(files);
+ int amount = SP.getInt("key_logshipper_amount", 2);
+ int keepIndex = amount - 1;
+
+ if (keepIndex < delFiles.size()) {
+ delFiles = delFiles.subList(keepIndex, delFiles.size());
+
+ for (File file : delFiles) {
+ file.delete();
+ }
+ }
+
+ File exportDir = new File(logDirectory, "exports");
+
+ if (exportDir.exists()) {
+ File[] expFiles = exportDir.listFiles();
+
+ for (File file : expFiles) {
+ file.delete();
+ }
+ exportDir.delete();
+ }
+ }
+
+ /**
+ * returns a list of log files. The number of returned logs is given via the amount
+ * parameter.
+ *
+ * The log files are sorted by the name descending.
+ *
+ * @param directory
+ * @param amount
+ * @return
+ */
+ public List getLogfiles(String directory, int amount) {
+ LOG.debug("getting {} logs from directory {}", amount, directory);
+ File logDir = new File(directory);
+
+ File[] files = logDir.listFiles((file, name) -> name.startsWith("AndroidAPS")
+ && (name.endsWith(".log")
+ || (name.endsWith(".zip") && !name.endsWith(LoggerUtils.SUFFIX))));
+
+ Arrays.sort(files, (f1, f2) -> f2.getName().compareTo(f1.getName()));
+
+ List result = Arrays.asList(files);
+ int toIndex = amount++;
+
+ if (toIndex > result.size()) {
+ toIndex = result.size();
+ }
+
+ LOG.debug("returning sublist 0 to {}", toIndex);
+ return result.subList(0, toIndex);
+ }
+
+ public File zipLogs(File zipFile, List files) {
+ LOG.debug("creating zip {}", zipFile.getAbsolutePath());
+
+ try {
+ zip(zipFile, files);
+ } catch (IOException e) {
+ LOG.error("Cannot retrieve zip", e);
+ }
+
+ return zipFile;
+ }
+
+ /**
+ * construct the name of zip file which is used to export logs.
+ *
+ * The name is constructed using the following scheme:
+ * AndroidAPS_LOG_ + Long Time + .log.zip
+ *
+ * @return
+ */
+ public String constructName() {
+ return "AndroidAPS_LOG_" + String.valueOf(new Date().getTime()) + LoggerUtils.SUFFIX;
+ }
+
+ public void zip(File zipFile, List files) throws IOException {
+ final int BUFFER_SIZE = 2048;
+
+ ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile)));
+
+ for (File file : files) {
+ byte data[] = new byte[BUFFER_SIZE];
+
+ try(FileInputStream fileInputStream = new FileInputStream( file )) {
+
+ try(BufferedInputStream origin = new BufferedInputStream(fileInputStream, BUFFER_SIZE)) {
+ ZipEntry entry = new ZipEntry(file.getName());
+
+ out.putNextEntry(entry);
+ int count;
+ while ((count = origin.read(data, 0, BUFFER_SIZE)) != -1) {
+ out.write(data, 0, count);
+ }
+
+ }
+ }
+ }
+
+ out.close();
+ }
+
+ public static Intent sendMail(Uri attachementUri, String recipient, String subject) {
+ StringBuilder builder =new StringBuilder();
+
+ builder.append("ADD TIME OF EVENT HERE: " + System.lineSeparator());
+ builder.append("ADD ISSUE DESCRIPTION OR GITHUB ISSUE REFERENCE NUMBER: " + System.lineSeparator());
+ builder.append("-------------------------------------------------------" + System.lineSeparator());
+ builder.append(MainApp.gs(R.string.app_name) + " " + BuildConfig.VERSION + System.lineSeparator());
+ if (Config.NSCLIENT)
+ builder.append("NSCLIENT" + System.lineSeparator());
+
+ builder.append("Build: " + BuildConfig.BUILDVERSION + System.lineSeparator());
+ builder.append("Flavor: " + BuildConfig.FLAVOR + BuildConfig.BUILD_TYPE + System.lineSeparator());
+ builder.append(MainApp.gs(R.string.configbuilder_nightscoutversion_label) + " " + NSSettingsStatus.getInstance().nightscoutVersionName + System.lineSeparator());
+ if (MainApp.engineeringMode)
+ builder.append(MainApp.gs(R.string.engineering_mode_enabled));
+
+ return sendMail(attachementUri, recipient, subject, builder.toString());
+ }
+
+
+ /**
+ * send a mail with the given file to the recipients with the given subject.
+ *
+ * the returned intent should be used to really send the mail using
+ *
+ * startActivity(Intent.createChooser(emailIntent , "Send email..."));
+ *
+ * @param attachementUri
+ * @param recipient
+ * @param subject
+ * @param body
+ *
+ * @return
+ */
+ public static Intent sendMail(Uri attachementUri, String recipient, String subject, String body) {
+ LOG.debug("sending email to {} with subject {}", recipient, subject);
+ Intent emailIntent = new Intent(Intent.ACTION_SEND);
+
+ emailIntent.setType("text/plain");
+ emailIntent.putExtra(Intent.EXTRA_EMAIL , new String[]{recipient});
+ emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
+ emailIntent.putExtra(Intent.EXTRA_TEXT, body);
+
+ LOG.debug("put path {}", attachementUri.toString());
+ emailIntent.putExtra(Intent.EXTRA_STREAM, attachementUri);
+ emailIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+ return emailIntent;
+ }
+
+
+}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Maintenance/activities/LogSettingActivity.java b/app/src/main/java/info/nightscout/androidaps/plugins/Maintenance/activities/LogSettingActivity.java
new file mode 100644
index 0000000000..7d21d561b9
--- /dev/null
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Maintenance/activities/LogSettingActivity.java
@@ -0,0 +1,80 @@
+package info.nightscout.androidaps.plugins.Maintenance.activities;
+
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.view.View;
+import android.widget.CheckBox;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import butterknife.OnClick;
+import butterknife.Unbinder;
+import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.logging.L;
+
+public class LogSettingActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_logsetting);
+ ButterKnife.bind(this);
+
+ createViewsForSettings(L.getLogElements());
+ }
+
+ private void createViewsForSettings(List elements) {
+ if (elements.size() == 0) return;
+ LinearLayout container = (LinearLayout) findViewById(R.id.logsettings_placeholder);
+ container.removeAllViews();
+ for (L.LogElement element : elements) {
+ PluginViewHolder pluginViewHolder = new PluginViewHolder(element);
+ container.addView(pluginViewHolder.getBaseView());
+ }
+ }
+
+ @OnClick(R.id.logsettings_reset)
+ public void onResetClick() {
+ L.resetToDefaults();
+ createViewsForSettings(L.getLogElements());
+ }
+
+ public class PluginViewHolder {
+
+ private Unbinder unbinder;
+ private L.LogElement element;
+
+ LinearLayout baseView;
+ @BindView(R.id.logsettings_description)
+ TextView description;
+ @BindView(R.id.logsettings_visibility)
+ CheckBox enabled;
+
+ public PluginViewHolder(L.LogElement element) {
+ this.element = element;
+ baseView = (LinearLayout) getLayoutInflater().inflate(R.layout.logsettings_item, null);
+ unbinder = ButterKnife.bind(this, baseView);
+
+ description.setText(element.name);
+ enabled.setChecked(element.enabled);
+ }
+
+ public View getBaseView() {
+ return baseView;
+ }
+
+ @OnClick(R.id.logsettings_visibility)
+ void onEnagledChanged() {
+ element.setEnabled(enabled.isChecked());
+ }
+
+ public void unbind() {
+ unbinder.unbind();
+ }
+ }
+
+}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientFragment.java
index 3bff1c9be3..9eff2ca84c 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientFragment.java
@@ -34,8 +34,6 @@ import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.SP;
public class NSClientFragment extends SubscriberFragment implements View.OnClickListener, CompoundButton.OnCheckedChangeListener {
- private static Logger log = LoggerFactory.getLogger(NSClientFragment.class);
-
private TextView logTextView;
private TextView queueTextView;
private TextView urlTextView;
@@ -133,9 +131,7 @@ public class NSClientFragment extends SubscriberFragment implements View.OnClick
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
switch (buttonView.getId()) {
case R.id.nsclientinternal_paused:
- SP.putBoolean(R.string.key_nsclientinternal_paused, isChecked);
- NSClientPlugin.getPlugin().paused = isChecked;
- MainApp.bus().post(new EventPreferenceChange(R.string.key_nsclientinternal_paused));
+ NSClientPlugin.getPlugin().pause(isChecked);
updateGUI();
FabricPrivacy.getInstance().logCustom(new CustomEvent("NSClientPause"));
break;
@@ -156,19 +152,17 @@ public class NSClientFragment extends SubscriberFragment implements View.OnClick
protected void updateGUI() {
Activity activity = getActivity();
if (activity != null)
- activity.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- NSClientPlugin.getPlugin().updateLog();
- logTextView.setText(NSClientPlugin.getPlugin().textLog);
- if (NSClientPlugin.getPlugin().autoscroll) {
- logScrollview.fullScroll(ScrollView.FOCUS_DOWN);
- }
- urlTextView.setText(NSClientPlugin.getPlugin().url());
- Spanned queuetext = Html.fromHtml(MainApp.gs(R.string.queue) + " " + UploadQueue.size() + "");
- queueTextView.setText(queuetext);
- statusTextView.setText(NSClientPlugin.getPlugin().status);
+ activity.runOnUiThread(() -> {
+ NSClientPlugin.getPlugin().updateLog();
+ pausedCheckbox.setChecked(SP.getBoolean(R.string.key_nsclientinternal_paused, false));
+ logTextView.setText(NSClientPlugin.getPlugin().textLog);
+ if (NSClientPlugin.getPlugin().autoscroll) {
+ logScrollview.fullScroll(ScrollView.FOCUS_DOWN);
}
+ urlTextView.setText(NSClientPlugin.getPlugin().url());
+ Spanned queuetext = Html.fromHtml(MainApp.gs(R.string.queue) + " " + UploadQueue.size() + "");
+ queueTextView.setText(queuetext);
+ statusTextView.setText(NSClientPlugin.getPlugin().status);
});
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientPlugin.java
index 6949cdc8b1..69de5934f8 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientPlugin.java
@@ -29,6 +29,7 @@ import info.nightscout.androidaps.events.EventPreferenceChange;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientNewLog;
import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientStatus;
import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientUpdateGUI;
@@ -37,7 +38,7 @@ import info.nightscout.utils.SP;
import info.nightscout.utils.ToastUtils;
public class NSClientPlugin extends PluginBase {
- private static Logger log = LoggerFactory.getLogger(NSClientPlugin.class);
+ private Logger log = LoggerFactory.getLogger(L.NSCLIENT);
static NSClientPlugin nsClientPlugin;
@@ -53,8 +54,8 @@ public class NSClientPlugin extends PluginBase {
private final List listLog = new ArrayList<>();
Spanned textLog = Html.fromHtml("");
- public boolean paused = false;
- boolean autoscroll = true;
+ public boolean paused;
+ boolean autoscroll;
public String status = "";
@@ -72,7 +73,7 @@ public class NSClientPlugin extends PluginBase {
.description(R.string.description_ns_client)
);
- if (Config.NSCLIENT || Config.G5UPLOADER) {
+ if (Config.NSCLIENT) {
pluginDescription.alwaysEnabled(true).visibleByDefault(true);
}
paused = SP.getBoolean(R.string.key_nsclientinternal_paused, false);
@@ -132,12 +133,14 @@ public class NSClientPlugin extends PluginBase {
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceDisconnected(ComponentName name) {
- log.debug("Service is disconnected");
+ if (L.isEnabled(L.NSCLIENT))
+ log.debug("Service is disconnected");
nsClientService = null;
}
public void onServiceConnected(ComponentName name, IBinder service) {
- log.debug("Service is connected");
+ if (L.isEnabled(L.NSCLIENT))
+ log.debug("Service is connected");
NSClientService.LocalBinder mLocalBinder = (NSClientService.LocalBinder) service;
if (mLocalBinder != null) // is null when running in roboelectric
nsClientService = mLocalBinder.getServiceInstance();
@@ -155,7 +158,8 @@ public class NSClientPlugin extends PluginBase {
@Subscribe
public void onStatusEvent(final EventNSClientNewLog ev) {
addToLog(ev);
- log.debug(ev.action + " " + ev.logText);
+ if (L.isEnabled(L.NSCLIENT))
+ log.debug(ev.action + " " + ev.logText);
}
@Subscribe
@@ -165,30 +169,24 @@ public class NSClientPlugin extends PluginBase {
}
synchronized void clearLog() {
- handler.post(new Runnable() {
- @Override
- public void run() {
- synchronized (listLog) {
- listLog.clear();
- }
- MainApp.bus().post(new EventNSClientUpdateGUI());
+ handler.post(() -> {
+ synchronized (listLog) {
+ listLog.clear();
}
+ MainApp.bus().post(new EventNSClientUpdateGUI());
});
}
private synchronized void addToLog(final EventNSClientNewLog ev) {
- handler.post(new Runnable() {
- @Override
- public void run() {
- synchronized (listLog) {
- listLog.add(ev);
- // remove the first line if log is too large
- if (listLog.size() >= Constants.MAX_LOG_LINES) {
- listLog.remove(0);
- }
+ handler.post(() -> {
+ synchronized (listLog) {
+ listLog.add(ev);
+ // remove the first line if log is too large
+ if (listLog.size() >= Constants.MAX_LOG_LINES) {
+ listLog.remove(0);
}
- MainApp.bus().post(new EventNSClientUpdateGUI());
}
+ MainApp.bus().post(new EventNSClientUpdateGUI());
});
}
@@ -211,6 +209,12 @@ public class NSClientPlugin extends PluginBase {
nsClientService.resend(reason);
}
+ public void pause(boolean newState) {
+ SP.putBoolean(R.string.key_nsclientinternal_paused, newState);
+ paused = newState;
+ MainApp.bus().post(new EventPreferenceChange(R.string.key_nsclientinternal_paused));
+ }
+
public UploadQueue queue() {
return NSClientService.uploadQueue;
}
diff --git a/app/src/main/java/info/nightscout/utils/NSUpload.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSUpload.java
similarity index 91%
rename from app/src/main/java/info/nightscout/utils/NSUpload.java
rename to app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSUpload.java
index 00d5e39821..5a1f06a247 100644
--- a/app/src/main/java/info/nightscout/utils/NSUpload.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSUpload.java
@@ -1,4 +1,4 @@
-package info.nightscout.utils;
+package info.nightscout.androidaps.plugins.NSClientInternal;
import android.content.Context;
import android.content.Intent;
@@ -8,6 +8,7 @@ import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.Nullable;
+import android.support.v4.content.LocalBroadcastManager;
import org.apache.commons.lang3.StringUtils;
import org.json.JSONArray;
@@ -23,7 +24,9 @@ import java.util.Locale;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.Services.Intents;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
+import info.nightscout.androidaps.services.Intents;
import info.nightscout.androidaps.data.DetailedBolusInfo;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.db.BgReading;
@@ -37,13 +40,16 @@ import info.nightscout.androidaps.plugins.Loop.APSResult;
import info.nightscout.androidaps.plugins.Loop.DeviceStatus;
import info.nightscout.androidaps.plugins.Loop.LoopPlugin;
import info.nightscout.androidaps.plugins.NSClientInternal.data.DbLogger;
+import info.nightscout.utils.BatteryLevel;
+import info.nightscout.utils.DateUtil;
+import info.nightscout.utils.SP;
/**
* Created by mike on 26.05.2017.
*/
public class NSUpload {
- private static Logger log = LoggerFactory.getLogger(NSUpload.class);
+ private static Logger log = LoggerFactory.getLogger(L.NSCLIENT);
public static void uploadTempBasalStartAbsolute(TemporaryBasal temporaryBasal, Double originalExtendedAmount) {
try {
@@ -52,6 +58,7 @@ public class NSUpload {
data.put("eventType", CareportalEvent.TEMPBASAL);
data.put("duration", temporaryBasal.durationInMinutes);
data.put("absolute", temporaryBasal.absoluteRate);
+ data.put("rate", temporaryBasal.absoluteRate);
if (temporaryBasal.pumpId != 0)
data.put("pumpId", temporaryBasal.pumpId);
data.put("created_at", DateUtil.toISOString(temporaryBasal.date));
@@ -65,7 +72,7 @@ public class NSUpload {
Intent intent = new Intent(Intents.ACTION_DATABASE);
intent.putExtras(bundle);
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
- context.sendBroadcast(intent);
+ LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
DbLogger.dbAdd(intent, data.toString());
} catch (JSONException e) {
log.error("Unhandled exception", e);
@@ -76,12 +83,16 @@ public class NSUpload {
try {
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
boolean useAbsolute = SP.getBoolean("ns_sync_use_absolute", false);
+ Profile profile = ProfileFunctions.getInstance().getProfile(temporaryBasal.date);
+ double absoluteRate = 0;
+ if (profile != null) {
+ absoluteRate = profile.getBasal(temporaryBasal.date) * temporaryBasal.percentRate / 100d;
+ }
if (useAbsolute) {
TemporaryBasal t = temporaryBasal.clone();
t.isAbsolute = true;
- Profile profile = MainApp.getConfigBuilder().getProfile();
if (profile != null) {
- t.absoluteRate = profile.getBasal(temporaryBasal.date) * temporaryBasal.percentRate / 100d;
+ t.absoluteRate = absoluteRate;
uploadTempBasalStartAbsolute(t, null);
}
} else {
@@ -90,6 +101,8 @@ public class NSUpload {
data.put("eventType", CareportalEvent.TEMPBASAL);
data.put("duration", temporaryBasal.durationInMinutes);
data.put("percent", temporaryBasal.percentRate - 100);
+ if (profile != null)
+ data.put("rate", absoluteRate);
if (temporaryBasal.pumpId != 0)
data.put("pumpId", temporaryBasal.pumpId);
data.put("created_at", DateUtil.toISOString(temporaryBasal.date));
@@ -101,7 +114,7 @@ public class NSUpload {
Intent intent = new Intent(Intents.ACTION_DATABASE);
intent.putExtras(bundle);
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
- context.sendBroadcast(intent);
+ LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
DbLogger.dbAdd(intent, data.toString());
}
} catch (JSONException e) {
@@ -127,7 +140,7 @@ public class NSUpload {
Intent intent = new Intent(Intents.ACTION_DATABASE);
intent.putExtras(bundle);
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
- context.sendBroadcast(intent);
+ LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
DbLogger.dbAdd(intent, data.toString());
} catch (JSONException e) {
log.error("Unhandled exception", e);
@@ -155,7 +168,7 @@ public class NSUpload {
Intent intent = new Intent(Intents.ACTION_DATABASE);
intent.putExtras(bundle);
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
- context.sendBroadcast(intent);
+ LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
DbLogger.dbAdd(intent, data.toString());
} catch (JSONException e) {
log.error("Unhandled exception", e);
@@ -183,7 +196,7 @@ public class NSUpload {
Intent intent = new Intent(Intents.ACTION_DATABASE);
intent.putExtras(bundle);
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
- context.sendBroadcast(intent);
+ LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
DbLogger.dbAdd(intent, data.toString());
} catch (JSONException e) {
log.error("Unhandled exception", e);
@@ -191,8 +204,8 @@ public class NSUpload {
}
public static void uploadDeviceStatus() {
- Profile profile = MainApp.getConfigBuilder().getProfile();
- String profileName = MainApp.getConfigBuilder().getProfileName();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
+ String profileName = ProfileFunctions.getInstance().getProfileName();
if (profile == null || profileName == null) {
log.error("Profile is null. Skipping upload");
@@ -232,7 +245,8 @@ public class NSUpload {
deviceStatus.enacted.put("requested", requested);
}
} else {
- log.debug("OpenAPS data too old to upload");
+ if (L.isEnabled(L.NSCLIENT))
+ log.debug("OpenAPS data too old to upload");
}
deviceStatus.device = "openaps://" + Build.MANUFACTURER + " " + Build.MODEL;
JSONObject pumpstatus = ConfigBuilderPlugin.getActivePump().getJSONStatus(profile, profileName);
@@ -252,7 +266,7 @@ public class NSUpload {
Intent intent = new Intent(Intents.ACTION_DATABASE);
intent.putExtras(bundle);
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
- context.sendBroadcast(intent);
+ LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
DbLogger.dbAdd(intent, deviceStatus.mongoRecord().toString());
} catch (JSONException e) {
log.error("Unhandled exception", e);
@@ -298,7 +312,7 @@ public class NSUpload {
public static void uploadTempTarget(TempTarget tempTarget) {
try {
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
if (profile == null) {
log.error("Profile is null. Skipping upload");
@@ -333,7 +347,7 @@ public class NSUpload {
Intent intent = new Intent(Intents.ACTION_DATABASE);
intent.putExtras(bundle);
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
- context.sendBroadcast(intent);
+ LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
DbLogger.dbAdd(intent, data.toString());
}
} catch (JSONException e) {
@@ -381,7 +395,7 @@ public class NSUpload {
Intent intent = new Intent(Intents.ACTION_DATABASE);
intent.putExtras(bundle);
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
- context.sendBroadcast(intent);
+ LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
DbLogger.dbAdd(intent, data.toString());
} catch (Exception e) {
log.error("Unhandled exception", e);
@@ -399,7 +413,7 @@ public class NSUpload {
Intent intent = new Intent(Intents.ACTION_DATABASE);
intent.putExtras(bundle);
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
- context.sendBroadcast(intent);
+ LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
DbLogger.dbRemove(intent, _id);
} catch (Exception e) {
log.error("Unhandled exception", e);
@@ -422,7 +436,7 @@ public class NSUpload {
Intent intent = new Intent(Intents.ACTION_DATABASE);
intent.putExtras(bundle);
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
- context.sendBroadcast(intent);
+ LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
DbLogger.dbAdd(intent, data.toString());
} catch (JSONException e) {
log.error("Unhandled exception", e);
@@ -452,7 +466,7 @@ public class NSUpload {
Intent intent = new Intent(Intents.ACTION_DATABASE);
intent.putExtras(bundle);
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
- context.sendBroadcast(intent);
+ LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
DbLogger.dbAdd(intent, data.toString());
}
@@ -476,7 +490,7 @@ public class NSUpload {
Intent intent = new Intent(Intents.ACTION_DATABASE);
intent.putExtras(bundle);
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
- context.sendBroadcast(intent);
+ LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
DbLogger.dbAdd(intent, data.toString());
}
@@ -490,7 +504,7 @@ public class NSUpload {
try {
data.put("eventType", "Note");
data.put("created_at", DateUtil.toISOString(new Date()));
- data.put("notes", MainApp.gs(R.string.androidaps_start)+" - "+ Build.MANUFACTURER + " "+ Build.MODEL);
+ data.put("notes", MainApp.gs(R.string.androidaps_start) + " - " + Build.MANUFACTURER + " " + Build.MODEL);
} catch (JSONException e) {
log.error("Unhandled exception", e);
}
@@ -498,9 +512,9 @@ public class NSUpload {
Intent intent = new Intent(Intents.ACTION_DATABASE);
intent.putExtras(bundle);
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
- context.sendBroadcast(intent);
+ LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
DbLogger.dbAdd(intent, data.toString());
- }
+ }
}
public static void uploadEvent(String careportalEvent, long time, @Nullable String notes) {
@@ -523,7 +537,7 @@ public class NSUpload {
Intent intent = new Intent(Intents.ACTION_DATABASE);
intent.putExtras(bundle);
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
- context.sendBroadcast(intent);
+ LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
DbLogger.dbAdd(intent, data.toString());
}
@@ -537,7 +551,7 @@ public class NSUpload {
Intent intent = new Intent(Intents.ACTION_DATABASE);
intent.putExtras(bundle);
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
- context.sendBroadcast(intent);
+ LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
DbLogger.dbRemove(intent, _id);
} catch (Exception e) {
log.error("Unhandled exception", e);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/UploadQueue.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/UploadQueue.java
index 17cc1dced3..9c0284029c 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/UploadQueue.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/UploadQueue.java
@@ -16,13 +16,14 @@ import java.sql.SQLException;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.db.DatabaseHelper;
import info.nightscout.androidaps.db.DbRequest;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.NSClientInternal.services.NSClientService;
/**
* Created by mike on 21.02.2016.
*/
public class UploadQueue {
- private static Logger log = LoggerFactory.getLogger(UploadQueue.class);
+ private static Logger log = LoggerFactory.getLogger(L.NSCLIENT);
public static String status() {
return "QUEUE: " + MainApp.getDbHelper().size(DatabaseHelper.DATABASE_DBREQUESTS);
@@ -43,15 +44,13 @@ public class UploadQueue {
public static void add(final DbRequest dbr) {
startService();
if (NSClientService.handler != null) {
- NSClientService.handler.post(new Runnable() {
- @Override
- public void run() {
- log.debug("QUEUE adding: " + dbr.data);
- MainApp.getDbHelper().create(dbr);
- NSClientPlugin plugin = NSClientPlugin.getPlugin();
- if (plugin != null) {
- plugin.resend("newdata");
- }
+ NSClientService.handler.post(() -> {
+ if (L.isEnabled(L.NSCLIENT))
+ log.debug("Adding to queue: " + dbr.data);
+ MainApp.getDbHelper().create(dbr);
+ NSClientPlugin plugin = NSClientPlugin.getPlugin();
+ if (plugin != null) {
+ plugin.resend("newdata");
}
});
}
@@ -60,13 +59,12 @@ public class UploadQueue {
public static void clearQueue() {
startService();
if (NSClientService.handler != null) {
- NSClientService.handler.post(new Runnable() {
- @Override
- public void run() {
- log.debug("QUEUE ClearQueue");
- MainApp.getDbHelper().deleteAllDbRequests();
+ NSClientService.handler.post(() -> {
+ if (L.isEnabled(L.NSCLIENT))
+ log.debug("ClearQueue");
+ MainApp.getDbHelper().deleteAllDbRequests();
+ if (L.isEnabled(L.NSCLIENT))
log.debug(status());
- }
});
}
}
@@ -74,22 +72,20 @@ public class UploadQueue {
public static void removeID(final JSONObject record) {
startService();
if (NSClientService.handler != null) {
- NSClientService.handler.post(new Runnable() {
- @Override
- public void run() {
- try {
- String id;
- if (record.has("NSCLIENT_ID")) {
- id = record.getString("NSCLIENT_ID");
- } else {
- return;
- }
- if (MainApp.getDbHelper().deleteDbRequest(id) == 1) {
- log.debug("Removed item from UploadQueue. " + UploadQueue.status());
- }
- } catch (JSONException e) {
- log.error("Unhandled exception", e);
+ NSClientService.handler.post(() -> {
+ try {
+ String id;
+ if (record.has("NSCLIENT_ID")) {
+ id = record.getString("NSCLIENT_ID");
+ } else {
+ return;
}
+ if (MainApp.getDbHelper().deleteDbRequest(id) == 1) {
+ if (L.isEnabled(L.NSCLIENT))
+ log.debug("Removed item from UploadQueue. " + UploadQueue.status());
+ }
+ } catch (JSONException e) {
+ log.error("Unhandled exception", e);
}
});
}
@@ -100,18 +96,17 @@ public class UploadQueue {
return;
startService();
if (NSClientService.handler != null) {
- NSClientService.handler.post(new Runnable() {
- @Override
- public void run() {
- MainApp.getDbHelper().deleteDbRequestbyMongoId(action, _id);
- }
+ NSClientService.handler.post(() -> {
+ MainApp.getDbHelper().deleteDbRequestbyMongoId(action, _id);
+ if (L.isEnabled(L.NSCLIENT))
+ log.debug("Removing " + _id + " from UploadQueue. " + UploadQueue.status());
});
}
}
public String textList() {
String result = "";
- CloseableIterator iterator = null;
+ CloseableIterator iterator;
try {
iterator = MainApp.getDbHelper().getDbRequestInterator();
try {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/acks/NSAddAck.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/acks/NSAddAck.java
index e90dce3bec..ed9c4c3013 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/acks/NSAddAck.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/acks/NSAddAck.java
@@ -1,13 +1,13 @@
package info.nightscout.androidaps.plugins.NSClientInternal.acks;
import org.json.JSONArray;
-import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.events.Event;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientRestart;
import io.socket.client.Ack;
@@ -15,17 +15,18 @@ import io.socket.client.Ack;
* Created by mike on 29.12.2015.
*/
public class NSAddAck extends Event implements Ack {
- private static Logger log = LoggerFactory.getLogger(NSAddAck.class);
+ private static Logger log = LoggerFactory.getLogger(L.NSCLIENT);
public String _id = null;
public String nsClientID = null;
public JSONObject json = null;
- public void call(Object...args) {
+
+ public void call(Object... args) {
// Regular response
try {
JSONArray responsearray = (JSONArray) (args[0]);
JSONObject response = null;
- if (responsearray.length()>0) {
- response = responsearray.getJSONObject(0);
+ if (responsearray.length() > 0) {
+ response = responsearray.getJSONObject(0);
_id = response.getString("_id");
json = response;
if (response.has("NSCLIENT_ID")) {
@@ -35,6 +36,7 @@ public class NSAddAck extends Event implements Ack {
MainApp.bus().post(this);
return;
} catch (Exception e) {
+ log.error("Unhandled exception", e);
}
// Check for not authorized
try {
@@ -45,7 +47,8 @@ public class NSAddAck extends Event implements Ack {
MainApp.bus().post(new EventNSClientRestart());
return;
}
- log.debug("DBACCESS " + response.getString("result"));
+ if (L.isEnabled(L.NSCLIENT))
+ log.debug("DBACCESS " + response.getString("result"));
}
return;
} catch (Exception e) {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/acks/NSUpdateAck.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/acks/NSUpdateAck.java
index 2bf520da64..42534387b2 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/acks/NSUpdateAck.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/acks/NSUpdateAck.java
@@ -7,15 +7,16 @@ import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.events.Event;
+import info.nightscout.androidaps.logging.L;
import io.socket.client.Ack;
/**
* Created by mike on 21.02.2016.
*/
public class NSUpdateAck extends Event implements Ack {
- private static Logger log = LoggerFactory.getLogger(NSUpdateAck.class);
+ private static Logger log = LoggerFactory.getLogger(L.NSCLIENT);
public boolean result = false;
- public String _id = null;
+ public String _id;
public String action;
public void call(Object...args) {
JSONObject response = (JSONObject)args[0];
@@ -29,6 +30,7 @@ public class NSUpdateAck extends Event implements Ack {
}
MainApp.bus().post(this);
} catch (JSONException e) {
+ log.error("Unhandled exception", e);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastAckAlarm.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastAckAlarm.java
index 216fa3d19a..f94f9e51aa 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastAckAlarm.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastAckAlarm.java
@@ -2,18 +2,12 @@ package info.nightscout.androidaps.plugins.NSClientInternal.broadcasts;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.Services.Intents;
+import info.nightscout.androidaps.services.Intents;
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSAlarm;
import info.nightscout.utils.SP;
@@ -22,7 +16,6 @@ import info.nightscout.utils.SP;
*/
public class BroadcastAckAlarm {
- private static Logger log = LoggerFactory.getLogger(BroadcastAckAlarm.class);
public static void handleClearAlarm(NSAlarm originalAlarm, Context context, long silenceTimeInMsec) {
@@ -35,7 +28,7 @@ public class BroadcastAckAlarm {
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
LocalBroadcastManager.getInstance(MainApp.instance()).sendBroadcast(intent);
- if(SP.getBoolean(R.string.key_nsclient_localbroadcasts, true)) {
+ if(SP.getBoolean(R.string.key_nsclient_localbroadcasts, false)) {
bundle = new Bundle();
bundle.putInt("level", originalAlarm.getLevel());
bundle.putString("group", originalAlarm.getGroup());
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastAlarm.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastAlarm.java
index 0fee6600bd..8f75d92365 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastAlarm.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastAlarm.java
@@ -2,27 +2,20 @@ package info.nightscout.androidaps.plugins.NSClientInternal.broadcasts;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import org.json.JSONObject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.Services.Intents;
+import info.nightscout.androidaps.services.Intents;
import info.nightscout.utils.SP;
/**
* Created by mike on 26.06.2016.
*/
public class BroadcastAlarm {
- private static Logger log = LoggerFactory.getLogger(BroadcastAlarm.class);
-
public static void handleAlarm(JSONObject alarm, Context context) {
Bundle bundle = new Bundle();
bundle.putString("data", alarm.toString());
@@ -31,7 +24,7 @@ public class BroadcastAlarm {
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
LocalBroadcastManager.getInstance(MainApp.instance()).sendBroadcast(intent);
- if(SP.getBoolean(R.string.key_nsclient_localbroadcasts, true)) {
+ if(SP.getBoolean(R.string.key_nsclient_localbroadcasts, false)) {
bundle = new Bundle();
bundle.putString("data", alarm.toString());
intent = new Intent(Intents.ACTION_ALARM);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastAnnouncement.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastAnnouncement.java
index 9b133c2551..5e1b01f225 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastAnnouncement.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastAnnouncement.java
@@ -2,28 +2,20 @@ package info.nightscout.androidaps.plugins.NSClientInternal.broadcasts;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
-import org.json.JSONArray;
import org.json.JSONObject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.Services.Intents;
+import info.nightscout.androidaps.services.Intents;
import info.nightscout.utils.SP;
/**
* Created by mike on 26.06.2016.
*/
public class BroadcastAnnouncement {
- private static Logger log = LoggerFactory.getLogger(BroadcastAnnouncement.class);
-
public static void handleAnnouncement(JSONObject announcement, Context context) {
Bundle bundle = new Bundle();
bundle.putString("data", announcement.toString());
@@ -32,7 +24,7 @@ public class BroadcastAnnouncement {
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
LocalBroadcastManager.getInstance(MainApp.instance()).sendBroadcast(intent);
- if(SP.getBoolean(R.string.key_nsclient_localbroadcasts, true)) {
+ if(SP.getBoolean(R.string.key_nsclient_localbroadcasts, false)) {
bundle = new Bundle();
bundle.putString("data", announcement.toString());
intent = new Intent(Intents.ACTION_ANNOUNCEMENT);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastCals.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastCals.java
index 7580a00088..4e49785f82 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastCals.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastCals.java
@@ -2,27 +2,20 @@ package info.nightscout.androidaps.plugins.NSClientInternal.broadcasts;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import org.json.JSONArray;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.Services.Intents;
+import info.nightscout.androidaps.services.Intents;
import info.nightscout.utils.SP;
/**
* Created by mike on 26.06.2016.
*/
public class BroadcastCals {
- private static Logger log = LoggerFactory.getLogger(BroadcastCals.class);
-
public static void handleNewCal(JSONArray cals, Context context, boolean isDelta) {
Bundle bundle = new Bundle();
@@ -33,7 +26,7 @@ public class BroadcastCals {
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
LocalBroadcastManager.getInstance(MainApp.instance()).sendBroadcast(intent);
- if(SP.getBoolean(R.string.key_nsclient_localbroadcasts, true)) {
+ if(SP.getBoolean(R.string.key_nsclient_localbroadcasts, false)) {
bundle = new Bundle();
bundle.putString("cals", cals.toString());
bundle.putBoolean("delta", isDelta);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastClearAlarm.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastClearAlarm.java
index 23406837a7..e6fec32ffa 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastClearAlarm.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastClearAlarm.java
@@ -2,27 +2,20 @@ package info.nightscout.androidaps.plugins.NSClientInternal.broadcasts;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import org.json.JSONObject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.Services.Intents;
+import info.nightscout.androidaps.services.Intents;
import info.nightscout.utils.SP;
/**
* Created by mike on 26.06.2016.
*/
public class BroadcastClearAlarm {
- private static Logger log = LoggerFactory.getLogger(BroadcastClearAlarm.class);
-
public static void handleClearAlarm(JSONObject clearalarm, Context context) {
Bundle bundle = new Bundle();
bundle.putString("data", clearalarm.toString());
@@ -31,7 +24,7 @@ public class BroadcastClearAlarm {
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
LocalBroadcastManager.getInstance(MainApp.instance()).sendBroadcast(intent);
- if(SP.getBoolean(R.string.key_nsclient_localbroadcasts, true)) {
+ if(SP.getBoolean(R.string.key_nsclient_localbroadcasts, false)) {
bundle = new Bundle();
bundle.putString("data", clearalarm.toString());
intent = new Intent(Intents.ACTION_CLEAR_ALARM);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastDeviceStatus.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastDeviceStatus.java
index 59f5ab136c..4915608673 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastDeviceStatus.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastDeviceStatus.java
@@ -2,45 +2,20 @@ package info.nightscout.androidaps.plugins.NSClientInternal.broadcasts;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import org.json.JSONArray;
-import org.json.JSONObject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import java.util.List;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.Services.Intents;
+import info.nightscout.androidaps.services.Intents;
import info.nightscout.utils.SP;
public class BroadcastDeviceStatus {
- private static Logger log = LoggerFactory.getLogger(BroadcastDeviceStatus.class);
-
- public static void handleNewDeviceStatus(JSONObject status, Context context, boolean isDelta) {
- Bundle bundle = new Bundle();
- bundle.putString("devicestatus", status.toString());
- bundle.putBoolean("delta", isDelta);
- Intent intent = new Intent(Intents.ACTION_NEW_DEVICESTATUS);
- intent.putExtras(bundle);
- intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
- LocalBroadcastManager.getInstance(MainApp.instance()).sendBroadcast(intent);
-
- if(SP.getBoolean(R.string.key_nsclient_localbroadcasts, true)) {
- bundle = new Bundle();
- bundle.putString("devicestatus", status.toString());
- bundle.putBoolean("delta", isDelta);
- intent = new Intent(Intents.ACTION_NEW_DEVICESTATUS);
- intent.putExtras(bundle);
- intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
- context.sendBroadcast(intent);
- }
- }
public static void handleNewDeviceStatus(JSONArray statuses, Context context, boolean isDelta) {
List splitted = BroadcastTreatment.splitArray(statuses);
@@ -54,7 +29,7 @@ public class BroadcastDeviceStatus {
LocalBroadcastManager.getInstance(MainApp.instance()).sendBroadcast(intent);
}
- if(SP.getBoolean(R.string.key_nsclient_localbroadcasts, true)) {
+ if(SP.getBoolean(R.string.key_nsclient_localbroadcasts, false)) {
splitted = BroadcastTreatment.splitArray(statuses);
for (JSONArray part : splitted) {
Bundle bundle = new Bundle();
@@ -67,31 +42,4 @@ public class BroadcastDeviceStatus {
}
}
}
-
- public static void handleNewFoods(JSONArray foods, Context context, boolean isDelta) {
-
- List splitted = BroadcastTreatment.splitArray(foods);
- for (JSONArray part: splitted) {
- Bundle bundle = new Bundle();
- bundle.putString("foods", part.toString());
- bundle.putBoolean("delta", isDelta);
- Intent intent = new Intent(Intents.ACTION_NEW_FOOD);
- intent.putExtras(bundle);
- intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
- LocalBroadcastManager.getInstance(MainApp.instance()).sendBroadcast(intent);
- }
-
- if(SP.getBoolean(R.string.key_nsclient_localbroadcasts, true)) {
- splitted = BroadcastTreatment.splitArray(foods);
- for (JSONArray part : splitted) {
- Bundle bundle = new Bundle();
- bundle.putString("foods", part.toString());
- bundle.putBoolean("delta", isDelta);
- Intent intent = new Intent(Intents.ACTION_NEW_FOOD);
- intent.putExtras(bundle);
- intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
- context.sendBroadcast(intent);
- }
- }
- }
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastFood.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastFood.java
index dbb3385fbb..f38141ec6d 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastFood.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastFood.java
@@ -6,26 +6,18 @@ import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import java.util.ArrayList;
import java.util.List;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.Services.Intents;
-import info.nightscout.androidaps.plugins.NSClientInternal.data.NSTreatment;
+import info.nightscout.androidaps.services.Intents;
import info.nightscout.utils.SP;
/**
* Created by mike on 20.02.2016.
*/
public class BroadcastFood {
- private static Logger log = LoggerFactory.getLogger(BroadcastFood.class);
-
public static void handleNewFood(JSONArray foods, Context context, boolean isDelta) {
List splitted = BroadcastTreatment.splitArray(foods);
@@ -39,7 +31,7 @@ public class BroadcastFood {
LocalBroadcastManager.getInstance(MainApp.instance()).sendBroadcast(intent);
}
- if (SP.getBoolean(R.string.key_nsclient_localbroadcasts, true)) {
+ if (SP.getBoolean(R.string.key_nsclient_localbroadcasts, false)) {
for (JSONArray part : splitted) {
Bundle bundle = new Bundle();
bundle.putString("foods", part.toString());
@@ -65,7 +57,7 @@ public class BroadcastFood {
LocalBroadcastManager.getInstance(MainApp.instance()).sendBroadcast(intent);
}
- if (SP.getBoolean(R.string.key_nsclient_localbroadcasts, true)) {
+ if (SP.getBoolean(R.string.key_nsclient_localbroadcasts, false)) {
for (JSONArray part : splitted) {
Bundle bundle = new Bundle();
bundle.putString("foods", part.toString());
@@ -89,7 +81,7 @@ public class BroadcastFood {
LocalBroadcastManager.getInstance(MainApp.instance()).sendBroadcast(intent);
- if (SP.getBoolean(R.string.key_nsclient_localbroadcasts, true)) {
+ if (SP.getBoolean(R.string.key_nsclient_localbroadcasts, false)) {
bundle = new Bundle();
bundle.putString("foods", foods.toString());
bundle.putBoolean("delta", isDelta);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastMbgs.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastMbgs.java
index a715747791..e91c3e2fd6 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastMbgs.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastMbgs.java
@@ -2,27 +2,20 @@ package info.nightscout.androidaps.plugins.NSClientInternal.broadcasts;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import org.json.JSONArray;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.Services.Intents;
+import info.nightscout.androidaps.services.Intents;
import info.nightscout.utils.SP;
/**
* Created by mike on 26.06.2016.
*/
public class BroadcastMbgs {
- private static Logger log = LoggerFactory.getLogger(BroadcastMbgs.class);
-
public static void handleNewMbg(JSONArray mbgs, Context context, boolean isDelta) {
Bundle bundle = new Bundle();
@@ -33,7 +26,7 @@ public class BroadcastMbgs {
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
LocalBroadcastManager.getInstance(MainApp.instance()).sendBroadcast(intent);
- if(SP.getBoolean(R.string.key_nsclient_localbroadcasts, true)) {
+ if(SP.getBoolean(R.string.key_nsclient_localbroadcasts, false)) {
bundle = new Bundle();
bundle.putString("mbgs", mbgs.toString());
bundle.putBoolean("delta", isDelta);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastProfile.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastProfile.java
index 3802b09657..6bd6bbc81a 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastProfile.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastProfile.java
@@ -2,18 +2,12 @@ package info.nightscout.androidaps.plugins.NSClientInternal.broadcasts;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.Services.Intents;
+import info.nightscout.androidaps.services.Intents;
import info.nightscout.androidaps.data.ProfileStore;
import info.nightscout.utils.SP;
@@ -22,8 +16,6 @@ import info.nightscout.utils.SP;
* Created by mike on 20.02.2016.
*/
public class BroadcastProfile {
- private static Logger log = LoggerFactory.getLogger(BroadcastProfile.class);
-
public static void handleNewTreatment(ProfileStore profile, Context context, boolean isDelta) {
Bundle bundle = new Bundle();
@@ -34,7 +26,7 @@ public class BroadcastProfile {
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
LocalBroadcastManager.getInstance(MainApp.instance()).sendBroadcast(intent);
- if(SP.getBoolean(R.string.key_nsclient_localbroadcasts, true)) {
+ if(SP.getBoolean(R.string.key_nsclient_localbroadcasts, false)) {
bundle = new Bundle();
bundle.putString("profile", profile.getData().toString());
bundle.putBoolean("delta", isDelta);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastQueueStatus.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastQueueStatus.java
deleted file mode 100644
index abc49be18a..0000000000
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastQueueStatus.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package info.nightscout.androidaps.plugins.NSClientInternal.broadcasts;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.PowerManager;
-
-import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.Services.Intents;
-import info.nightscout.utils.SP;
-
-/**
- * Created by mike on 28.02.2016.
- */
-public class BroadcastQueueStatus {
- public static void handleNewStatus(int size, Context context) {
-
- if(!SP.getBoolean(R.string.key_nsclient_localbroadcasts, true)) return;
-
- PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
- PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
- "sendQueue");
- wakeLock.acquire();
- try {
- Bundle bundle = new Bundle();
- bundle.putInt("size", size);
- Intent intent = new Intent(Intents.ACTION_QUEUE_STATUS);
- intent.putExtras(bundle);
- intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
- context.sendBroadcast(intent);
- } finally {
- wakeLock.release();
- }
- }
-}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastSgvs.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastSgvs.java
index 65a90f3b74..dea4cf8713 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastSgvs.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastSgvs.java
@@ -2,49 +2,22 @@ package info.nightscout.androidaps.plugins.NSClientInternal.broadcasts;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import org.json.JSONArray;
-import org.json.JSONObject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import java.util.List;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.Services.Intents;
+import info.nightscout.androidaps.services.Intents;
import info.nightscout.utils.SP;
/**
* Created by mike on 22.02.2016.
*/
public class BroadcastSgvs {
- private static Logger log = LoggerFactory.getLogger(BroadcastSgvs.class);
-
- public static void handleNewSgv(JSONObject sgv, Context context, boolean isDelta) {
-
- Bundle bundle = new Bundle();
- bundle.putString("sgv", sgv.toString());
- bundle.putBoolean("delta", isDelta);
- Intent intent = new Intent(Intents.ACTION_NEW_SGV);
- intent.putExtras(bundle);
- intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
- LocalBroadcastManager.getInstance(MainApp.instance()).sendBroadcast(intent);
-
- if(SP.getBoolean(R.string.key_nsclient_localbroadcasts, true)) {
- bundle = new Bundle();
- bundle.putString("sgv", sgv.toString());
- bundle.putBoolean("delta", isDelta);
- intent = new Intent(Intents.ACTION_NEW_SGV);
- intent.putExtras(bundle);
- intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
- context.sendBroadcast(intent);
- }
- }
-
public static void handleNewSgv(JSONArray sgvs, Context context, boolean isDelta) {
List splitted = BroadcastTreatment.splitArray(sgvs);
@@ -58,7 +31,7 @@ public class BroadcastSgvs {
LocalBroadcastManager.getInstance(MainApp.instance()).sendBroadcast(intent);
}
- if(SP.getBoolean(R.string.key_nsclient_localbroadcasts, true)) {
+ if(SP.getBoolean(R.string.key_nsclient_localbroadcasts, false)) {
for (JSONArray part : splitted) {
Bundle bundle = new Bundle();
bundle.putString("sgvs", part.toString());
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastStatus.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastStatus.java
index a2b6e64aec..a0e8607efc 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastStatus.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastStatus.java
@@ -3,18 +3,16 @@ package info.nightscout.androidaps.plugins.NSClientInternal.broadcasts;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.List;
-
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.Services.Intents;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.services.Intents;
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSSettingsStatus;
import info.nightscout.androidaps.plugins.NSClientInternal.services.NSClientService;
import info.nightscout.utils.SP;
@@ -23,13 +21,13 @@ import info.nightscout.utils.SP;
* Created by mike on 24.02.2016.
*/
public class BroadcastStatus {
- private static Logger log = LoggerFactory.getLogger(BroadcastStatus.class);
+ private static Logger log = LoggerFactory.getLogger(L.NSCLIENT);
public static void handleNewStatus(NSSettingsStatus status, Context context, boolean isDelta) {
LocalBroadcastManager.getInstance(MainApp.instance())
.sendBroadcast(createIntent(status, isDelta));
- if(SP.getBoolean(R.string.key_nsclient_localbroadcasts, true)) {
+ if(SP.getBoolean(R.string.key_nsclient_localbroadcasts, false)) {
context.sendBroadcast(createIntent(status, isDelta));
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastTreatment.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastTreatment.java
index 94b83c56bd..4f36d85348 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastTreatment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastTreatment.java
@@ -15,14 +15,15 @@ import java.util.List;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.Services.Intents;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.services.Intents;
import info.nightscout.utils.SP;
/**
* Created by mike on 20.02.2016.
*/
public class BroadcastTreatment {
- private static Logger log = LoggerFactory.getLogger(BroadcastTreatment.class);
+ private static Logger log = LoggerFactory.getLogger(L.NSCLIENT);
public static void handleNewTreatment(JSONObject treatment, boolean isDelta, boolean isLocalBypass) {
@@ -35,7 +36,7 @@ public class BroadcastTreatment {
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
LocalBroadcastManager.getInstance(MainApp.instance()).sendBroadcast(intent);
- if (SP.getBoolean(R.string.key_nsclient_localbroadcasts, true)) {
+ if (SP.getBoolean(R.string.key_nsclient_localbroadcasts, false)) {
bundle = new Bundle();
bundle.putString("treatment", treatment.toString());
bundle.putBoolean("delta", isDelta);
@@ -59,7 +60,7 @@ public class BroadcastTreatment {
LocalBroadcastManager.getInstance(MainApp.instance()).sendBroadcast(intent);
}
- if (SP.getBoolean(R.string.key_nsclient_localbroadcasts, true)) {
+ if (SP.getBoolean(R.string.key_nsclient_localbroadcasts, false)) {
splitted = splitArray(treatments);
for (JSONArray part : splitted) {
Bundle bundle = new Bundle();
@@ -73,28 +74,6 @@ public class BroadcastTreatment {
}
}
- public void handleChangedTreatment(JSONObject treatment, boolean isDelta) {
-
- Bundle bundle = new Bundle();
- bundle.putString("treatment", treatment.toString());
- bundle.putBoolean("delta", isDelta);
- Intent intent = new Intent(Intents.ACTION_CHANGED_TREATMENT);
- intent.putExtras(bundle);
- intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
- LocalBroadcastManager.getInstance(MainApp.instance()).sendBroadcast(intent);
-
-
- if (SP.getBoolean(R.string.key_nsclient_localbroadcasts, true)) {
- bundle = new Bundle();
- bundle.putString("treatment", treatment.toString());
- bundle.putBoolean("delta", isDelta);
- intent = new Intent(Intents.ACTION_CHANGED_TREATMENT);
- intent.putExtras(bundle);
- intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
- MainApp.instance().getApplicationContext().sendBroadcast(intent);
- }
- }
-
public static void handleChangedTreatment(JSONArray treatments, boolean isDelta) {
List splitted = splitArray(treatments);
@@ -108,7 +87,7 @@ public class BroadcastTreatment {
LocalBroadcastManager.getInstance(MainApp.instance()).sendBroadcast(intent);
}
- if (SP.getBoolean(R.string.key_nsclient_localbroadcasts, true)) {
+ if (SP.getBoolean(R.string.key_nsclient_localbroadcasts, false)) {
splitted = splitArray(treatments);
for (JSONArray part : splitted) {
Bundle bundle = new Bundle();
@@ -122,28 +101,6 @@ public class BroadcastTreatment {
}
}
- public static void handleRemovedTreatment(JSONObject treatment, boolean isDelta) {
-
- Bundle bundle = new Bundle();
- bundle.putString("treatment", treatment.toString());
- bundle.putBoolean("delta", isDelta);
- Intent intent = new Intent(Intents.ACTION_REMOVED_TREATMENT);
- intent.putExtras(bundle);
- intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
- LocalBroadcastManager.getInstance(MainApp.instance()).sendBroadcast(intent);
-
-
- if (SP.getBoolean(R.string.key_nsclient_localbroadcasts, true)) {
- bundle = new Bundle();
- bundle.putString("treatment", treatment.toString());
- bundle.putBoolean("delta", isDelta);
- intent = new Intent(Intents.ACTION_REMOVED_TREATMENT);
- intent.putExtras(bundle);
- intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
- MainApp.instance().getApplicationContext().sendBroadcast(intent);
- }
- }
-
public static void handleRemovedTreatment(JSONArray treatments, boolean isDelta) {
Bundle bundle = new Bundle();
@@ -155,7 +112,7 @@ public class BroadcastTreatment {
LocalBroadcastManager.getInstance(MainApp.instance()).sendBroadcast(intent);
- if (SP.getBoolean(R.string.key_nsclient_localbroadcasts, true)) {
+ if (SP.getBoolean(R.string.key_nsclient_localbroadcasts, false)) {
bundle = new Bundle();
bundle.putString("treatments", treatments.toString());
bundle.putBoolean("delta", isDelta);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastUrgentAlarm.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastUrgentAlarm.java
index c332be03af..c8988141d7 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastUrgentAlarm.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastUrgentAlarm.java
@@ -2,27 +2,20 @@ package info.nightscout.androidaps.plugins.NSClientInternal.broadcasts;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import org.json.JSONObject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.Services.Intents;
+import info.nightscout.androidaps.services.Intents;
import info.nightscout.utils.SP;
/**
* Created by mike on 26.06.2016.
*/
public class BroadcastUrgentAlarm {
- private static Logger log = LoggerFactory.getLogger(BroadcastUrgentAlarm.class);
-
public static void handleUrgentAlarm(JSONObject urgentalarm, Context context) {
Bundle bundle = new Bundle();
bundle.putString("data", urgentalarm.toString());
@@ -31,7 +24,7 @@ public class BroadcastUrgentAlarm {
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
LocalBroadcastManager.getInstance(MainApp.instance()).sendBroadcast(intent);
- if(SP.getBoolean(R.string.key_nsclient_localbroadcasts, true)) {
+ if(SP.getBoolean(R.string.key_nsclient_localbroadcasts, false)) {
bundle = new Bundle();
bundle.putString("data", urgentalarm.toString());
intent = new Intent(Intents.ACTION_URGENT_ALARM);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/DbLogger.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/DbLogger.java
index 2723fc0748..ec31141002 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/DbLogger.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/DbLogger.java
@@ -8,32 +8,36 @@ import org.slf4j.LoggerFactory;
import java.util.List;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.utils.ToastUtils;
/**
* Created by mike on 02.07.2016.
*/
public class DbLogger {
- private static Logger log = LoggerFactory.getLogger(DbLogger.class);
+ private static Logger log = LoggerFactory.getLogger(L.NSCLIENT);
public static void dbAdd(Intent intent, String data) {
List q = MainApp.instance().getApplicationContext().getPackageManager().queryBroadcastReceivers(intent, 0);
if (q.size() < 1) {
- ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(),MainApp.gs(R.string.nsclientnotinstalled));
+ ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.nsclientnotinstalled));
log.error("DBADD No receivers");
- } else if (Config.logNSUpload)
- log.debug("DBADD dbAdd " + q.size() + " receivers " + data);
+ } else if (L.isEnabled(L.NSCLIENT)) {
+ if (L.isEnabled(L.NSCLIENT))
+ log.debug("DBADD dbAdd " + q.size() + " receivers " + data);
+ }
}
- public static void dbRemove(Intent intent, String data) {
+ public static void dbRemove(Intent intent, String data) {
List q = MainApp.instance().getApplicationContext().getPackageManager().queryBroadcastReceivers(intent, 0);
if (q.size() < 1) {
- ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(),MainApp.gs(R.string.nsclientnotinstalled));
+ ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.nsclientnotinstalled));
log.error("DBREMOVE No receivers");
- } else if (Config.logNSUpload)
- log.debug("DBREMOVE dbRemove " + q.size() + " receivers " + data);
+ } else if (L.isEnabled(L.NSCLIENT)) {
+ if (L.isEnabled(L.NSCLIENT))
+ log.debug("DBREMOVE dbRemove " + q.size() + " receivers " + data);
+ }
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSAlarm.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSAlarm.java
index 1c28b790d7..7ad82220da 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSAlarm.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSAlarm.java
@@ -5,12 +5,14 @@ import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import info.nightscout.androidaps.logging.L;
+
/**
* Created by mike on 11.06.2017.
*/
public class NSAlarm {
- private static Logger log = LoggerFactory.getLogger(NSAlarm.class);
+ private static Logger log = LoggerFactory.getLogger(L.NSCLIENT);
JSONObject data;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSCal.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSCal.java
index 93d46fa18e..83fe44073e 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSCal.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSCal.java
@@ -5,8 +5,10 @@ import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import info.nightscout.androidaps.logging.L;
+
public class NSCal {
- private static Logger log = LoggerFactory.getLogger(NSCal.class);
+ private static Logger log = LoggerFactory.getLogger(L.NSCLIENT);
public long date;
public double slope;
public double intercept;
@@ -20,7 +22,7 @@ public class NSCal {
scale = json.getDouble("scale");
} catch (JSONException e) {
log.error("Unhandled exception", e);
- log.debug("Data: " + json.toString());
+ log.error("Data: " + json.toString());
}
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSDeviceStatus.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSDeviceStatus.java
index 29d1b33467..b48319f979 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSDeviceStatus.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSDeviceStatus.java
@@ -1,8 +1,11 @@
package info.nightscout.androidaps.plugins.NSClientInternal.data;
+import android.content.Intent;
+import android.os.Bundle;
import android.text.Html;
import android.text.Spanned;
+import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
@@ -12,8 +15,12 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
+import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.ConstraintsObjectives.ObjectivesPlugin;
import info.nightscout.androidaps.plugins.Loop.APSResult;
+import info.nightscout.androidaps.logging.BundleLogger;
import info.nightscout.utils.DateUtil;
import info.nightscout.utils.Round;
import info.nightscout.utils.SP;
@@ -73,7 +80,7 @@ import info.nightscout.utils.SP;
}
*/
public class NSDeviceStatus {
- private static Logger log = LoggerFactory.getLogger(NSDeviceStatus.class);
+ private Logger log = LoggerFactory.getLogger(L.NSCLIENT);
private static NSDeviceStatus instance = null;
@@ -88,6 +95,41 @@ public class NSDeviceStatus {
public NSDeviceStatus() {
}
+ public void handleNewData(Intent intent) {
+ Bundle bundle = intent.getExtras();
+ if (bundle == null) return;
+
+ if (L.isEnabled(L.NSCLIENT))
+ log.debug("Got NS devicestatus: " + BundleLogger.log(bundle));
+
+ try {
+ if (bundle.containsKey("devicestatus")) {
+ JSONObject devicestatusJson = new JSONObject(bundle.getString("devicestatus"));
+ setData(devicestatusJson);
+ if (devicestatusJson.has("pump")) {
+ // Objectives 0
+ ObjectivesPlugin.getPlugin().pumpStatusIsAvailableInNS = true;
+ ObjectivesPlugin.getPlugin().saveProgress();
+ }
+ }
+ if (bundle.containsKey("devicestatuses")) {
+ String devicestatusesstring = bundle.getString("devicestatuses");
+ JSONArray jsonArray = new JSONArray(devicestatusesstring);
+ for (int i = 0; i < jsonArray.length(); i++) {
+ JSONObject devicestatusJson = jsonArray.getJSONObject(i);
+ setData(devicestatusJson);
+ if (devicestatusJson.has("pump")) {
+ // Objectives 0
+ ObjectivesPlugin.getPlugin().pumpStatusIsAvailableInNS = true;
+ ObjectivesPlugin.getPlugin().saveProgress();
+ }
+ }
+ }
+ } catch (Exception e) {
+ log.error("Unhandled exception", e);
+ }
+ }
+
public NSDeviceStatus setData(JSONObject obj) {
this.data = obj;
updatePumpData(obj);
@@ -133,10 +175,14 @@ public class NSDeviceStatus {
public Spanned getPumpStatus() {
//String[] ALL_STATUS_FIELDS = {"reservoir", "battery", "clock", "status", "device"};
+ StringBuilder string = new StringBuilder();
+ string.append("");
+ string.append(MainApp.gs(R.string.pump));
+ string.append(": ");
+
if (deviceStatusPumpData == null)
return Html.fromHtml("");
- StringBuilder string = new StringBuilder();
// test warning level
int level = Levels.INFO;
long now = System.currentTimeMillis();
@@ -288,6 +334,10 @@ public class NSDeviceStatus {
public Spanned getOpenApsStatus() {
StringBuilder string = new StringBuilder();
+ string.append("");
+ string.append(MainApp.gs(R.string.openaps_short));
+ string.append(": ");
+
// test warning level
int level = Levels.INFO;
long now = System.currentTimeMillis();
@@ -385,6 +435,26 @@ public class NSDeviceStatus {
return minBattery + "%";
}
+ public Spanned getUploaderStatusSpanned() {
+ StringBuilder string = new StringBuilder();
+ string.append("");
+ string.append(MainApp.gs(R.string.uploader_short));
+ string.append(": ");
+
+ Iterator iter = uploaders.entrySet().iterator();
+ int minBattery = 100;
+ while (iter.hasNext()) {
+ Map.Entry pair = (Map.Entry) iter.next();
+ Uploader uploader = (Uploader) pair.getValue();
+ if (minBattery > uploader.battery)
+ minBattery = uploader.battery;
+ }
+
+ string.append(minBattery);
+ string.append("%");
+ return Html.fromHtml(string.toString());
+ }
+
public Spanned getExtendedUploaderStatus() {
StringBuilder string = new StringBuilder();
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSMbg.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSMbg.java
index 353dd49b74..cd4cd9cdba 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSMbg.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSMbg.java
@@ -5,8 +5,10 @@ import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import info.nightscout.androidaps.logging.L;
+
public class NSMbg {
- private static Logger log = LoggerFactory.getLogger(NSMbg.class);
+ private static Logger log = LoggerFactory.getLogger(L.NSCLIENT);
public long date;
public double mbg;
public String json;
@@ -18,7 +20,7 @@ public class NSMbg {
this.json = json.toString();
} catch (JSONException e) {
log.error("Unhandled exception", e);
- log.debug("Data: " + json.toString());
+ log.error("Data: " + json.toString());
}
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSSettingsStatus.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSSettingsStatus.java
index 8d09a05146..dc3c9f742e 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSSettingsStatus.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSSettingsStatus.java
@@ -1,5 +1,8 @@
package info.nightscout.androidaps.plugins.NSClientInternal.data;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
import android.support.annotation.Nullable;
import org.json.JSONException;
@@ -10,6 +13,16 @@ import org.slf4j.LoggerFactory;
import java.util.Date;
import java.util.Objects;
+import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.Overview.OverviewPlugin;
+import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification;
+import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
+import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
+import info.nightscout.androidaps.logging.BundleLogger;
+
/*
{
"status": "ok",
@@ -101,7 +114,7 @@ import java.util.Objects;
}
*/
public class NSSettingsStatus {
- private static Logger log = LoggerFactory.getLogger(NSSettingsStatus.class);
+ private Logger log = LoggerFactory.getLogger(L.NSCLIENT);
private static NSSettingsStatus instance = null;
@@ -111,6 +124,8 @@ public class NSSettingsStatus {
return instance;
}
+ public String nightscoutVersionName = "";
+
private JSONObject data = null;
public NSSettingsStatus() {
@@ -121,6 +136,59 @@ public class NSSettingsStatus {
return this;
}
+ public void handleNewData(Intent intent) {
+ Bundle bundle = intent.getExtras();
+ if (bundle == null) return;
+
+ if (L.isEnabled(L.NSCLIENT))
+ log.debug("Got NS status: " + BundleLogger.log(bundle));
+
+ if (bundle.containsKey("nsclientversioncode")) {
+
+ Integer nightscoutVersionCode = bundle.getInt("nightscoutversioncode");
+ nightscoutVersionName = bundle.getString("nightscoutversionname");
+ Integer nsClientVersionCode = bundle.getInt("nsclientversioncode");
+ String nsClientVersionName = bundle.getString("nsclientversionname");
+ if (L.isEnabled(L.NSCLIENT))
+ log.debug("Got versions: NSClient: " + nsClientVersionName + " Nightscout: " + nightscoutVersionName);
+ try {
+ if (nsClientVersionCode < MainApp.instance().getPackageManager().getPackageInfo(MainApp.instance().getPackageName(), 0).versionCode) {
+ Notification notification = new Notification(Notification.OLD_NSCLIENT, MainApp.gs(R.string.unsupportedclientver), Notification.URGENT);
+ MainApp.bus().post(new EventNewNotification(notification));
+ } else {
+ MainApp.bus().post(new EventDismissNotification(Notification.OLD_NSCLIENT));
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ log.error("Unhandled exception", e);
+ }
+ if (nightscoutVersionCode < Config.SUPPORTEDNSVERSION) {
+ Notification notification = new Notification(Notification.OLD_NS, MainApp.gs(R.string.unsupportednsversion), Notification.NORMAL);
+ MainApp.bus().post(new EventNewNotification(notification));
+ } else {
+ MainApp.bus().post(new EventDismissNotification(Notification.OLD_NS));
+ }
+ } else {
+ Notification notification = new Notification(Notification.OLD_NSCLIENT, MainApp.gs(R.string.unsupportedclientver), Notification.URGENT);
+ MainApp.bus().post(new EventNewNotification(notification));
+ }
+ if (bundle.containsKey("status")) {
+ try {
+ JSONObject statusJson = new JSONObject(bundle.getString("status"));
+ setData(statusJson);
+ if (L.isEnabled(L.NSCLIENT))
+ log.debug("Received status: " + statusJson.toString());
+ Double targetHigh = getThreshold("bgTargetTop");
+ Double targetlow = getThreshold("bgTargetBottom");
+ if (targetHigh != null)
+ OverviewPlugin.bgTargetHigh = targetHigh;
+ if (targetlow != null)
+ OverviewPlugin.bgTargetLow = targetlow;
+ } catch (JSONException e) {
+ log.error("Unhandled exception", e);
+ }
+ }
+ }
+
public String getName() {
return getStringOrNull("name");
}
@@ -134,7 +202,7 @@ public class NSSettingsStatus {
}
public Date getServerTime() {
- return getDateOrNull("versionNum");
+ return getDateOrNull("serverTime");
}
public boolean getApiEnabled() {
@@ -202,13 +270,11 @@ public class NSSettingsStatus {
if (settingsO.has("thresholds")) {
JSONObject tObject = settingsO.getJSONObject("thresholds");
if (tObject.has(what)) {
- Double result = tObject.getDouble(what);
- return result;
+ return tObject.getDouble(what);
}
}
if (settingsO.has("alarmTimeagoWarnMins") && Objects.equals(what, "alarmTimeagoWarnMins")) {
- Double result = settingsO.getDouble(what);
- return result;
+ return settingsO.getDouble(what);
}
}
} catch (JSONException e) {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSSgv.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSSgv.java
index 50336a5f52..2212884a3e 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSSgv.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSSgv.java
@@ -5,12 +5,14 @@ import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import info.nightscout.androidaps.logging.L;
+
/**
*
* {"mgdl":105,"mills":1455136282375,"device":"xDrip-BluetoothWixel","direction":"Flat","filtered":98272,"unfiltered":98272,"noise":1,"rssi":100}
*/
public class NSSgv {
- private static Logger log = LoggerFactory.getLogger(NSSgv.class);
+ private static Logger log = LoggerFactory.getLogger(L.NSCLIENT);
private JSONObject data;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSTreatment.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSTreatment.java
index a9f960edd0..d4ee20e2a1 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSTreatment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSTreatment.java
@@ -7,8 +7,10 @@ import org.slf4j.LoggerFactory;
import java.util.Date;
+import info.nightscout.androidaps.logging.L;
+
public class NSTreatment {
- private static Logger log = LoggerFactory.getLogger(NSTreatment.class);
+ private static Logger log = LoggerFactory.getLogger(L.NSCLIENT);
private JSONObject data;
private String action = null; // "update", "remove" or null (add)
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/receivers/AckAlarmReceiver.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/receivers/AckAlarmReceiver.java
index 2aae41538a..f23533e9ab 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/receivers/AckAlarmReceiver.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/receivers/AckAlarmReceiver.java
@@ -11,15 +11,15 @@ import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.NSClientInternal.NSClientPlugin;
import info.nightscout.androidaps.plugins.NSClientInternal.data.AlarmAck;
import info.nightscout.androidaps.plugins.NSClientInternal.services.NSClientService;
import info.nightscout.utils.SP;
public class AckAlarmReceiver extends BroadcastReceiver {
- private static Logger log = LoggerFactory.getLogger(AckAlarmReceiver.class);
+ private static Logger log = LoggerFactory.getLogger(L.NSCLIENT);
@Override
@@ -32,7 +32,8 @@ public class AckAlarmReceiver extends BroadcastReceiver {
return;
}
if (SP.getBoolean(R.string.key_ns_noupload, false)) {
- log.debug("Upload disabled. Message dropped");
+ if (L.isEnabled(L.NSCLIENT))
+ log.debug("Upload disabled. Message dropped");
return;
}
wakeLock.acquire();
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 332ccc2ea3..896382d818 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
@@ -15,6 +15,8 @@ import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.db.DbRequest;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.logging.BundleLogger;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.NSClientInternal.NSClientPlugin;
import info.nightscout.androidaps.plugins.NSClientInternal.UploadQueue;
import info.nightscout.androidaps.plugins.NSClientInternal.broadcasts.BroadcastTreatment;
@@ -22,7 +24,7 @@ import info.nightscout.utils.DateUtil;
import info.nightscout.utils.SP;
public class DBAccessReceiver extends BroadcastReceiver {
- private static Logger log = LoggerFactory.getLogger(DBAccessReceiver.class);
+ private static Logger log = LoggerFactory.getLogger(L.NSCLIENT);
@Override
@@ -36,6 +38,9 @@ public class DBAccessReceiver extends BroadcastReceiver {
if (bundles == null) return;
if (!bundles.containsKey("action")) return;
+ if (L.isEnabled(L.NSCLIENT))
+ log.debug(BundleLogger.log(bundles));
+
String collection = null;
String _id = null;
JSONObject data = null;
@@ -43,18 +48,26 @@ public class DBAccessReceiver extends BroadcastReceiver {
try {
collection = bundles.getString("collection");
} catch (Exception e) {
+ log.error("Unhandled exception", e);
+ return;
}
try {
- _id = bundles.getString("_id");
+ if (!action.equals("dbAdd"))
+ _id = bundles.getString("_id");
} catch (Exception e) {
+ log.error("Unhandled exception", e);
+ return;
}
try {
- data = new JSONObject(bundles.getString("data"));
+ if (!action.equals("dbRemove"))
+ data = new JSONObject(bundles.getString("data"));
} catch (Exception e) {
+ log.error("Unhandled exception", e);
+ return;
}
if (data == null && !action.equals("dbRemove") || _id == null && action.equals("dbRemove")) {
- log.debug("DBACCESS no data inside record");
+ log.error("DBACCESS no data inside record");
return;
}
@@ -70,7 +83,7 @@ public class DBAccessReceiver extends BroadcastReceiver {
}
if (!isAllowedCollection(collection)) {
- log.debug("DBACCESS wrong collection specified");
+ log.error("DBACCESS wrong collection specified");
return;
}
@@ -79,7 +92,7 @@ public class DBAccessReceiver extends BroadcastReceiver {
DbRequest dbr = new DbRequest(action, collection, nsclientid.toString(), _id);
UploadQueue.add(dbr);
}
- } else if (action.equals("dbUpdate")) {
+ } else if (action.equals("dbUpdate")) {
if (shouldUpload()) {
DbRequest dbr = new DbRequest(action, collection, nsclientid.toString(), _id, data);
UploadQueue.add(dbr);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java
index fab9a181c4..2066aaa423 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java
@@ -8,7 +8,7 @@ import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.PowerManager;
-
+import android.os.SystemClock;
import com.google.common.base.Charsets;
import com.google.common.hash.Hashing;
@@ -23,7 +23,7 @@ import org.slf4j.LoggerFactory;
import java.net.URISyntaxException;
import java.sql.SQLException;
-import java.util.Date;
+import java.util.ArrayList;
import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
@@ -34,6 +34,7 @@ import info.nightscout.androidaps.events.EventAppExit;
import info.nightscout.androidaps.events.EventConfigBuilderChange;
import info.nightscout.androidaps.events.EventPreferenceChange;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.NSClientInternal.NSClientPlugin;
import info.nightscout.androidaps.plugins.NSClientInternal.UploadQueue;
import info.nightscout.androidaps.plugins.NSClientInternal.acks.NSAddAck;
@@ -58,6 +59,7 @@ import info.nightscout.androidaps.plugins.NSClientInternal.data.NSTreatment;
import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientNewLog;
import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientRestart;
import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientStatus;
+import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientUpdateGUI;
import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
@@ -65,12 +67,13 @@ import info.nightscout.utils.DateUtil;
import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.JsonHelper;
import info.nightscout.utils.SP;
+import info.nightscout.utils.T;
import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;
public class NSClientService extends Service {
- private static Logger log = LoggerFactory.getLogger(NSClientService.class);
+ private static Logger log = LoggerFactory.getLogger(L.NSCLIENT);
static public PowerManager.WakeLock mWakeLock;
private IBinder mBinder = new NSClientService.LocalBinder();
@@ -103,6 +106,11 @@ public class NSClientService extends Service {
public static UploadQueue uploadQueue = new UploadQueue();
+ private ArrayList reconnections = new ArrayList<>();
+ private int WATCHDOG_INTERVAL_MINUTES = 2;
+ private int WATCHDOG_RECONNECT_IN = 15;
+ private int WATCHDOG_MAXCONNECTIONS = 5;
+
public NSClientService() {
registerBus();
if (handler == null) {
@@ -156,14 +164,12 @@ public class NSClientService extends Service {
@Subscribe
public void onStatusEvent(EventAppExit event) {
- if (Config.logFunctionCalls)
+ if (L.isEnabled(L.NSCLIENT))
log.debug("EventAppExit received");
destroy();
stopSelf();
- if (Config.logFunctionCalls)
- log.debug("EventAppExit finished");
}
@Subscribe
@@ -242,20 +248,50 @@ public class NSClientService extends Service {
@Override
public void call(Object... args) {
connectCounter++;
- MainApp.bus().post(new EventNSClientNewLog("NSCLIENT", "connect #" + connectCounter + " event. ID: " + mSocket.id()));
- sendAuthMessage(new NSAuthAck());
+ String socketId = mSocket != null ? mSocket.id() : "NULL";
+ MainApp.bus().post(new EventNSClientNewLog("NSCLIENT", "connect #" + connectCounter + " event. ID: " + socketId));
+ if (mSocket != null)
+ sendAuthMessage(new NSAuthAck());
+ watchdog();
}
};
+ void watchdog() {
+ synchronized (reconnections) {
+ long now = DateUtil.now();
+ reconnections.add(now);
+ for (int i = 0; i < reconnections.size(); i++) {
+ Long r = reconnections.get(i);
+ if (r < now - T.mins(WATCHDOG_INTERVAL_MINUTES).msecs()) {
+ reconnections.remove(r);
+ }
+ }
+ MainApp.bus().post(new EventNSClientNewLog("WATCHDOG", "connections in last " + WATCHDOG_INTERVAL_MINUTES + " mins: " + reconnections.size() + "/" + WATCHDOG_MAXCONNECTIONS));
+ if (reconnections.size() >= WATCHDOG_MAXCONNECTIONS) {
+ Notification n = new Notification(Notification.NSMALFUNCTION, MainApp.gs(R.string.nsmalfunction), Notification.URGENT);
+ MainApp.bus().post(new EventNewNotification(n));
+ MainApp.bus().post(new EventNSClientNewLog("WATCHDOG", "pausing for " + WATCHDOG_RECONNECT_IN + " mins"));
+ NSClientPlugin.getPlugin().pause(true);
+ MainApp.bus().post(new EventNSClientUpdateGUI());
+ new Thread(() -> {
+ SystemClock.sleep(T.mins(WATCHDOG_RECONNECT_IN).msecs());
+ MainApp.bus().post(new EventNSClientNewLog("WATCHDOG", "reenabling NSClient"));
+ NSClientPlugin.getPlugin().pause(false);
+ }).start();
+ }
+ }
+ }
+
private Emitter.Listener onDisconnect = new Emitter.Listener() {
@Override
public void call(Object... args) {
- log.debug("disconnect reason: {}", args);
+ if (L.isEnabled(L.NSCLIENT))
+ log.debug("disconnect reason: {}", args);
MainApp.bus().post(new EventNSClientNewLog("NSCLIENT", "disconnect event"));
}
};
- public void destroy() {
+ public synchronized void destroy() {
if (mSocket != null) {
mSocket.off(Socket.EVENT_CONNECT);
mSocket.off(Socket.EVENT_DISCONNECT);
@@ -288,7 +324,8 @@ public class NSClientService extends Service {
return;
}
MainApp.bus().post(new EventNSClientNewLog("AUTH", "requesting auth"));
- mSocket.emit("authorize", authMessage, ack);
+ if (mSocket != null)
+ mSocket.emit("authorize", authMessage, ack);
}
@Subscribe
@@ -326,8 +363,7 @@ public class NSClientService extends Service {
private Emitter.Listener onPing = new Emitter.Listener() {
@Override
public void call(final Object... args) {
- if (Config.detailedLog)
- MainApp.bus().post(new EventNSClientNewLog("PING", "received"));
+ MainApp.bus().post(new EventNSClientNewLog("PING", "received"));
// send data if there is something waiting
resend("Ping received");
}
@@ -352,16 +388,18 @@ public class NSClientService extends Service {
data = (JSONObject) args[0];
} catch (Exception e) {
FabricPrivacy.log("Wrong Announcement from NS: " + args[0]);
+ log.error("Unhandled exception", e);
return;
}
- if (Config.detailedLog)
- try {
- MainApp.bus().post(new EventNSClientNewLog("ANNOUNCEMENT", JsonHelper.safeGetString(data, "message", "received")));
- } catch (Exception e) {
- FabricPrivacy.logException(e);
- }
+ try {
+ MainApp.bus().post(new EventNSClientNewLog("ANNOUNCEMENT", JsonHelper.safeGetString(data, "message", "received")));
+ } catch (Exception e) {
+ FabricPrivacy.logException(e);
+ log.error("Unhandled exception", e);
+ }
BroadcastAnnouncement.handleAnnouncement(data, getApplicationContext());
- log.debug(data.toString());
+ if (L.isEnabled(L.NSCLIENT))
+ log.debug(data.toString());
}
};
@@ -381,17 +419,18 @@ public class NSClientService extends Service {
*/
@Override
public void call(final Object... args) {
- if (Config.detailedLog)
- MainApp.bus().post(new EventNSClientNewLog("ALARM", "received"));
+ MainApp.bus().post(new EventNSClientNewLog("ALARM", "received"));
JSONObject data;
try {
data = (JSONObject) args[0];
} catch (Exception e) {
FabricPrivacy.log("Wrong alarm from NS: " + args[0]);
+ log.error("Unhandled exception", e);
return;
}
BroadcastAlarm.handleAlarm(data, getApplicationContext());
- log.debug(data.toString());
+ if (L.isEnabled(L.NSCLIENT))
+ log.debug(data.toString());
}
};
@@ -416,12 +455,13 @@ public class NSClientService extends Service {
data = (JSONObject) args[0];
} catch (Exception e) {
FabricPrivacy.log("Wrong Urgent alarm from NS: " + args[0]);
+ log.error("Unhandled exception", e);
return;
}
- if (Config.detailedLog)
- MainApp.bus().post(new EventNSClientNewLog("URGENTALARM", "received"));
+ MainApp.bus().post(new EventNSClientNewLog("URGENTALARM", "received"));
BroadcastUrgentAlarm.handleUrgentAlarm(data, getApplicationContext());
- log.debug(data.toString());
+ if (L.isEnabled(L.NSCLIENT))
+ log.debug(data.toString());
}
};
@@ -441,12 +481,13 @@ public class NSClientService extends Service {
data = (JSONObject) args[0];
} catch (Exception e) {
FabricPrivacy.log("Wrong Urgent alarm from NS: " + args[0]);
+ log.error("Unhandled exception", e);
return;
}
- if (Config.detailedLog)
- MainApp.bus().post(new EventNSClientNewLog("CLEARALARM", "received"));
+ MainApp.bus().post(new EventNSClientNewLog("CLEARALARM", "received"));
BroadcastClearAlarm.handleClearAlarm(data, getApplicationContext());
- log.debug(data.toString());
+ if (L.isEnabled(L.NSCLIENT))
+ log.debug(data.toString());
}
};
@@ -743,17 +784,6 @@ public class NSClientService extends Service {
}
}
- private boolean isCurrent(NSTreatment treatment) {
- long now = (new Date()).getTime();
- long minPast = now - nsHours * 60L * 60 * 1000;
- if (treatment.getMills() == null) {
- log.debug("treatment.getMills() == null " + treatment.getData().toString());
- return false;
- }
- if (treatment.getMills() > minPast) return true;
- return false;
- }
-
public void resend(final String reason) {
if (UploadQueue.size() == 0)
return;
@@ -766,7 +796,8 @@ public class NSClientService extends Service {
if (mSocket == null || !mSocket.connected()) return;
if (lastResendTime > System.currentTimeMillis() - 10 * 1000L) {
- log.debug("Skipping resend by lastResendTime: " + ((System.currentTimeMillis() - lastResendTime) / 1000L) + " sec");
+ if (L.isEnabled(L.NSCLIENT))
+ log.debug("Skipping resend by lastResendTime: " + ((System.currentTimeMillis() - lastResendTime) / 1000L) + " sec");
return;
}
lastResendTime = System.currentTimeMillis();
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java
index 4c8de10b9c..50e79d1e37 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java
@@ -3,7 +3,6 @@ package info.nightscout.androidaps.plugins.OpenAPSAMA;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
-import org.mozilla.javascript.Callable;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Function;
import org.mozilla.javascript.NativeJSON;
@@ -18,7 +17,6 @@ import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
@@ -27,6 +25,7 @@ import info.nightscout.androidaps.data.IobTotal;
import info.nightscout.androidaps.data.MealData;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.db.TemporaryBasal;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
import info.nightscout.androidaps.plugins.Loop.ScriptReader;
import info.nightscout.androidaps.plugins.OpenAPSMA.LoggerCallback;
@@ -35,7 +34,7 @@ import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.utils.SP;
public class DetermineBasalAdapterAMAJS {
- private static Logger log = LoggerFactory.getLogger(DetermineBasalAdapterAMAJS.class);
+ private static Logger log = LoggerFactory.getLogger(L.APS);
private ScriptReader mScriptReader = null;
@@ -56,23 +55,24 @@ public class DetermineBasalAdapterAMAJS {
private String scriptDebug = "";
- public DetermineBasalAdapterAMAJS(ScriptReader scriptReader) throws IOException {
+ public DetermineBasalAdapterAMAJS(ScriptReader scriptReader) {
mScriptReader = scriptReader;
}
public DetermineBasalResultAMA invoke() {
-
- log.debug(">>> Invoking detemine_basal <<<");
- log.debug("Glucose status: " + (storedGlucoseStatus = mGlucoseStatus.toString()));
- log.debug("IOB data: " + (storedIobData = mIobData.toString()));
- log.debug("Current temp: " + (storedCurrentTemp = mCurrentTemp.toString()));
- log.debug("Profile: " + (storedProfile = mProfile.toString()));
- log.debug("Meal data: " + (storedMeal_data = mMealData.toString()));
- if (mAutosensData != null)
- log.debug("Autosens data: " + (storedAutosens_data = mAutosensData.toString()));
- else
- log.debug("Autosens data: " + (storedAutosens_data = "undefined"));
+ if (L.isEnabled(L.APS)) {
+ log.debug(">>> Invoking detemine_basal <<<");
+ log.debug("Glucose status: " + (storedGlucoseStatus = mGlucoseStatus.toString()));
+ log.debug("IOB data: " + (storedIobData = mIobData.toString()));
+ log.debug("Current temp: " + (storedCurrentTemp = mCurrentTemp.toString()));
+ log.debug("Profile: " + (storedProfile = mProfile.toString()));
+ log.debug("Meal data: " + (storedMeal_data = mMealData.toString()));
+ if (mAutosensData != null)
+ log.debug("Autosens data: " + (storedAutosens_data = mAutosensData.toString()));
+ else
+ log.debug("Autosens data: " + (storedAutosens_data = "undefined"));
+ }
DetermineBasalResultAMA determineBasalResultAMA = null;
@@ -119,7 +119,7 @@ public class DetermineBasalAdapterAMAJS {
// Parse the jsResult object to a JSON-String
String result = NativeJSON.stringify(rhino, scope, jsResult, null, null).toString();
- if (Config.logAPSResult)
+ if (L.isEnabled(L.APS))
log.debug("Result: " + result);
try {
determineBasalResultAMA = new DetermineBasalResultAMA(jsResult, new JSONObject(result));
@@ -127,17 +127,13 @@ public class DetermineBasalAdapterAMAJS {
log.error("Unhandled exception", e);
}
} else {
- log.debug("Problem loading JS Functions");
+ log.error("Problem loading JS Functions");
}
} catch (IOException e) {
- log.debug("IOException");
+ log.error("IOException");
} catch (RhinoException e) {
log.error("RhinoException: (" + e.lineNumber() + "," + e.columnNumber() + ") " + e.toString());
- } catch (IllegalAccessException e) {
- log.error(e.toString());
- } catch (InstantiationException e) {
- log.error(e.toString());
- } catch (InvocationTargetException e) {
+ } catch (IllegalAccessException | InstantiationException | InvocationTargetException e) {
log.error(e.toString());
} finally {
Context.exit();
@@ -214,7 +210,7 @@ public class DetermineBasalAdapterAMAJS {
mProfile.put("temptargetSet", tempTargetSet);
mProfile.put("autosens_adjust_targets", SP.getBoolean(R.string.key_openapsama_autosens_adjusttargets, true));
//align with max-absorption model in AMA sensitivity
- if(mealData.usedMinCarbsImpact > 0){
+ if (mealData.usedMinCarbsImpact > 0) {
mProfile.put("min_5m_carbimpact", mealData.usedMinCarbsImpact);
} else {
mProfile.put("min_5m_carbimpact", SP.getDouble(R.string.key_openapsama_min_5m_carbimpact, SMBDefaults.min_5m_carbimpact));
@@ -265,31 +261,21 @@ public class DetermineBasalAdapterAMAJS {
}
- public Object makeParam(JSONObject jsonObject, Context rhino, Scriptable scope) {
+ private Object makeParam(JSONObject jsonObject, Context rhino, Scriptable scope) {
if (jsonObject == null) return Undefined.instance;
- Object param = NativeJSON.parse(rhino, scope, jsonObject.toString(), new Callable() {
- @Override
- public Object call(Context context, Scriptable scriptable, Scriptable scriptable1, Object[] objects) {
- return objects[1];
- }
- });
+ Object param = NativeJSON.parse(rhino, scope, jsonObject.toString(), (context, scriptable, scriptable1, objects) -> objects[1]);
return param;
}
- public Object makeParamArray(JSONArray jsonArray, Context rhino, Scriptable scope) {
+ private Object makeParamArray(JSONArray jsonArray, Context rhino, Scriptable scope) {
//Object param = NativeJSON.parse(rhino, scope, "{myarray: " + jsonArray.toString() + " }", new Callable() {
- Object param = NativeJSON.parse(rhino, scope, jsonArray.toString(), new Callable() {
- @Override
- public Object call(Context context, Scriptable scriptable, Scriptable scriptable1, Object[] objects) {
- return objects[1];
- }
- });
+ Object param = NativeJSON.parse(rhino, scope, jsonArray.toString(), (context, scriptable, scriptable1, objects) -> objects[1]);
return param;
}
- public String readFile(String filename) throws IOException {
+ private String readFile(String filename) throws IOException {
byte[] bytes = mScriptReader.readFile(filename);
String string = new String(bytes, "UTF-8");
if (string.startsWith("#!/usr/bin/env node")) {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalResultAMA.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalResultAMA.java
index ac7a7c2b49..77c8d8a860 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalResultAMA.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalResultAMA.java
@@ -6,11 +6,12 @@ import org.mozilla.javascript.NativeObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Loop.APSResult;
import info.nightscout.utils.DateUtil;
public class DetermineBasalResultAMA extends APSResult {
- private static Logger log = LoggerFactory.getLogger(DetermineBasalResultAMA.class);
+ private static Logger log = LoggerFactory.getLogger(L.APS);
private double eventualBG;
private double snoozeBG;
@@ -47,28 +48,17 @@ public class DetermineBasalResultAMA extends APSResult {
bolusRequested = false;
}
- public DetermineBasalResultAMA() {
+ private DetermineBasalResultAMA() {
hasPredictions = true;
}
@Override
public DetermineBasalResultAMA clone() {
DetermineBasalResultAMA newResult = new DetermineBasalResultAMA();
- newResult.reason = reason;
- newResult.rate = rate;
- newResult.duration = duration;
- newResult.tempBasalRequested = tempBasalRequested;
- newResult.rate = rate;
- newResult.duration = duration;
+ doClone(newResult);
- try {
- newResult.json = new JSONObject(json.toString());
- } catch (JSONException e) {
- log.error("Unhandled exception", e);
- }
newResult.eventualBG = eventualBG;
newResult.snoozeBG = snoozeBG;
- newResult.date = date;
return newResult;
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAFragment.java
index f05b0ac696..1874816ddc 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAFragment.java
@@ -2,7 +2,6 @@ package info.nightscout.androidaps.plugins.OpenAPSAMA;
import android.app.Activity;
import android.os.Bundle;
-import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -19,14 +18,16 @@ import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSUpdateGui;
import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSUpdateResultGui;
+import info.nightscout.utils.DateUtil;
import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.JSONFormatter;
public class OpenAPSAMAFragment extends SubscriberFragment implements View.OnClickListener {
- private static Logger log = LoggerFactory.getLogger(OpenAPSAMAFragment.class);
+ private static Logger log = LoggerFactory.getLogger(L.APS);
Button run;
TextView lastRunView;
@@ -43,29 +44,23 @@ public class OpenAPSAMAFragment extends SubscriberFragment implements View.OnCli
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
- try {
- View view = inflater.inflate(R.layout.openapsama_fragment, container, false);
+ View view = inflater.inflate(R.layout.openapsama_fragment, container, false);
- run = (Button) view.findViewById(R.id.openapsma_run);
- run.setOnClickListener(this);
- lastRunView = (TextView) view.findViewById(R.id.openapsma_lastrun);
- glucoseStatusView = (TextView) view.findViewById(R.id.openapsma_glucosestatus);
- currentTempView = (TextView) view.findViewById(R.id.openapsma_currenttemp);
- iobDataView = (TextView) view.findViewById(R.id.openapsma_iobdata);
- profileView = (TextView) view.findViewById(R.id.openapsma_profile);
- mealDataView = (TextView) view.findViewById(R.id.openapsma_mealdata);
- autosensDataView = (TextView) view.findViewById(R.id.openapsma_autosensdata);
- scriptdebugView = (TextView) view.findViewById(R.id.openapsma_scriptdebugdata);
- resultView = (TextView) view.findViewById(R.id.openapsma_result);
- requestView = (TextView) view.findViewById(R.id.openapsma_request);
+ run = (Button) view.findViewById(R.id.openapsma_run);
+ run.setOnClickListener(this);
+ lastRunView = (TextView) view.findViewById(R.id.openapsma_lastrun);
+ glucoseStatusView = (TextView) view.findViewById(R.id.openapsma_glucosestatus);
+ currentTempView = (TextView) view.findViewById(R.id.openapsma_currenttemp);
+ iobDataView = (TextView) view.findViewById(R.id.openapsma_iobdata);
+ profileView = (TextView) view.findViewById(R.id.openapsma_profile);
+ mealDataView = (TextView) view.findViewById(R.id.openapsma_mealdata);
+ autosensDataView = (TextView) view.findViewById(R.id.openapsma_autosensdata);
+ scriptdebugView = (TextView) view.findViewById(R.id.openapsma_scriptdebugdata);
+ resultView = (TextView) view.findViewById(R.id.openapsma_result);
+ requestView = (TextView) view.findViewById(R.id.openapsma_request);
- updateGUI();
- return view;
- } catch (Exception e) {
- FabricPrivacy.logException(e);
- }
-
- return null;
+ updateGUI();
+ return view;
}
@Override
@@ -93,35 +88,32 @@ public class OpenAPSAMAFragment extends SubscriberFragment implements View.OnCli
protected void updateGUI() {
Activity activity = getActivity();
if (activity != null)
- activity.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- DetermineBasalResultAMA lastAPSResult = OpenAPSAMAPlugin.getPlugin().lastAPSResult;
- if (lastAPSResult != null) {
- resultView.setText(JSONFormatter.format(lastAPSResult.json));
- requestView.setText(lastAPSResult.toSpanned());
- }
- DetermineBasalAdapterAMAJS determineBasalAdapterAMAJS = OpenAPSAMAPlugin.getPlugin().lastDetermineBasalAdapterAMAJS;
- if (determineBasalAdapterAMAJS != null) {
- glucoseStatusView.setText(JSONFormatter.format(determineBasalAdapterAMAJS.getGlucoseStatusParam()));
- currentTempView.setText(JSONFormatter.format(determineBasalAdapterAMAJS.getCurrentTempParam()));
- try {
- JSONArray iobArray = new JSONArray(determineBasalAdapterAMAJS.getIobDataParam());
- iobDataView.setText(String.format(MainApp.gs(R.string.array_of_elements), iobArray.length()) + "\n" + JSONFormatter.format(iobArray.getString(0)));
- } catch (JSONException e) {
- log.error("Unhandled exception", e);
- iobDataView.setText("JSONException");
- }
- profileView.setText(JSONFormatter.format(determineBasalAdapterAMAJS.getProfileParam()));
- mealDataView.setText(JSONFormatter.format(determineBasalAdapterAMAJS.getMealDataParam()));
- scriptdebugView.setText(determineBasalAdapterAMAJS.getScriptDebug());
- }
- if (OpenAPSAMAPlugin.getPlugin().lastAPSRun != null) {
- lastRunView.setText(OpenAPSAMAPlugin.getPlugin().lastAPSRun.toLocaleString());
- }
- if (OpenAPSAMAPlugin.getPlugin().lastAutosensResult != null) {
- autosensDataView.setText(JSONFormatter.format(OpenAPSAMAPlugin.getPlugin().lastAutosensResult.json()));
+ activity.runOnUiThread(() -> {
+ DetermineBasalResultAMA lastAPSResult = OpenAPSAMAPlugin.getPlugin().lastAPSResult;
+ if (lastAPSResult != null) {
+ resultView.setText(JSONFormatter.format(lastAPSResult.json));
+ requestView.setText(lastAPSResult.toSpanned());
+ }
+ DetermineBasalAdapterAMAJS determineBasalAdapterAMAJS = OpenAPSAMAPlugin.getPlugin().lastDetermineBasalAdapterAMAJS;
+ if (determineBasalAdapterAMAJS != null) {
+ glucoseStatusView.setText(JSONFormatter.format(determineBasalAdapterAMAJS.getGlucoseStatusParam()));
+ currentTempView.setText(JSONFormatter.format(determineBasalAdapterAMAJS.getCurrentTempParam()));
+ try {
+ JSONArray iobArray = new JSONArray(determineBasalAdapterAMAJS.getIobDataParam());
+ iobDataView.setText(String.format(MainApp.gs(R.string.array_of_elements), iobArray.length()) + "\n" + JSONFormatter.format(iobArray.getString(0)));
+ } catch (JSONException e) {
+ log.error("Unhandled exception", e);
+ iobDataView.setText("JSONException");
}
+ profileView.setText(JSONFormatter.format(determineBasalAdapterAMAJS.getProfileParam()));
+ mealDataView.setText(JSONFormatter.format(determineBasalAdapterAMAJS.getMealDataParam()));
+ scriptdebugView.setText(determineBasalAdapterAMAJS.getScriptDebug());
+ }
+ if (OpenAPSAMAPlugin.getPlugin().lastAPSRun != 0) {
+ lastRunView.setText(DateUtil.dateAndTimeFullString(OpenAPSAMAPlugin.getPlugin().lastAPSRun));
+ }
+ if (OpenAPSAMAPlugin.getPlugin().lastAutosensResult != null) {
+ autosensDataView.setText(JSONFormatter.format(OpenAPSAMAPlugin.getPlugin().lastAutosensResult.json()));
}
});
}
@@ -129,20 +121,17 @@ public class OpenAPSAMAFragment extends SubscriberFragment implements View.OnCli
void updateResultGUI(final String text) {
Activity activity = getActivity();
if (activity != null)
- activity.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- resultView.setText(text);
- glucoseStatusView.setText("");
- currentTempView.setText("");
- iobDataView.setText("");
- profileView.setText("");
- mealDataView.setText("");
- autosensDataView.setText("");
- scriptdebugView.setText("");
- requestView.setText("");
- lastRunView.setText("");
- }
+ activity.runOnUiThread(() -> {
+ resultView.setText(text);
+ glucoseStatusView.setText("");
+ currentTempView.setText("");
+ iobDataView.setText("");
+ profileView.setText("");
+ mealDataView.setText("");
+ autosensDataView.setText("");
+ scriptdebugView.setText("");
+ requestView.setText("");
+ lastRunView.setText("");
});
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java
index 74d15cd2a4..413b75cd1a 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java
@@ -1,14 +1,9 @@
package info.nightscout.androidaps.plugins.OpenAPSAMA;
-import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData;
import org.json.JSONException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.IOException;
-import java.util.Date;
-
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.GlucoseStatus;
@@ -22,7 +17,10 @@ import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.interfaces.PumpInterface;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
+import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData;
import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensResult;
import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
import info.nightscout.androidaps.plugins.Loop.APSResult;
@@ -39,7 +37,7 @@ import info.nightscout.utils.Round;
* Created by mike on 05.08.2016.
*/
public class OpenAPSAMAPlugin extends PluginBase implements APSInterface {
- private static Logger log = LoggerFactory.getLogger(OpenAPSAMAPlugin.class);
+ private static Logger log = LoggerFactory.getLogger(L.APS);
private static OpenAPSAMAPlugin openAPSAMAPlugin;
@@ -52,11 +50,11 @@ public class OpenAPSAMAPlugin extends PluginBase implements APSInterface {
// last values
DetermineBasalAdapterAMAJS lastDetermineBasalAdapterAMAJS = null;
- Date lastAPSRun = null;
+ long lastAPSRun = 0;
DetermineBasalResultAMA lastAPSResult = null;
AutosensResult lastAutosensResult = null;
- public OpenAPSAMAPlugin() {
+ private OpenAPSAMAPlugin() {
super(new PluginDescription()
.mainType(PluginType.APS)
.fragmentClass(OpenAPSAMAFragment.class.getName())
@@ -85,43 +83,39 @@ public class OpenAPSAMAPlugin extends PluginBase implements APSInterface {
}
@Override
- public Date getLastAPSRun() {
+ public long getLastAPSRun() {
return lastAPSRun;
}
@Override
public void invoke(String initiator, boolean tempBasalFallback) {
- log.debug("invoke from " + initiator + " tempBasalFallback: " + tempBasalFallback);
+ if (L.isEnabled(L.APS))
+ log.debug("invoke from " + initiator + " tempBasalFallback: " + tempBasalFallback);
lastAPSResult = null;
DetermineBasalAdapterAMAJS determineBasalAdapterAMAJS;
- try {
- determineBasalAdapterAMAJS = new DetermineBasalAdapterAMAJS(new ScriptReader(MainApp.instance().getBaseContext()));
- } catch (IOException e) {
- log.error(e.getMessage(), e);
- return;
- }
+ determineBasalAdapterAMAJS = new DetermineBasalAdapterAMAJS(new ScriptReader(MainApp.instance().getBaseContext()));
GlucoseStatus glucoseStatus = GlucoseStatus.getGlucoseStatusData();
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
PumpInterface pump = ConfigBuilderPlugin.getActivePump();
if (profile == null) {
MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.gs(R.string.noprofileselected)));
- if (Config.logAPSResult)
+ if (L.isEnabled(L.APS))
log.debug(MainApp.gs(R.string.noprofileselected));
return;
}
if (!isEnabled(PluginType.APS)) {
MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.gs(R.string.openapsma_disabled)));
- if (Config.logAPSResult)
+ if (L.isEnabled(L.APS))
log.debug(MainApp.gs(R.string.openapsma_disabled));
return;
}
if (glucoseStatus == null) {
MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.gs(R.string.openapsma_noglucosedata)));
- if (Config.logAPSResult)
+ if (L.isEnabled(L.APS))
log.debug(MainApp.gs(R.string.openapsma_noglucosedata));
return;
}
@@ -136,14 +130,16 @@ public class OpenAPSAMAPlugin extends PluginBase implements APSInterface {
minBg = Round.roundTo(minBg, 0.1d);
maxBg = Round.roundTo(maxBg, 0.1d);
- Date start = new Date();
- Date startPart = new Date();
+ long start = System.currentTimeMillis();
+ long startPart = System.currentTimeMillis();
IobTotal[] iobArray = IobCobCalculatorPlugin.getPlugin().calculateIobArrayInDia(profile);
- Profiler.log(log, "calculateIobArrayInDia()", startPart);
+ if (L.isEnabled(L.APS))
+ Profiler.log(log, "calculateIobArrayInDia()", startPart);
- startPart = new Date();
+ startPart = System.currentTimeMillis();
MealData mealData = TreatmentsPlugin.getPlugin().getMealData();
- Profiler.log(log, "getMealData()", startPart);
+ if (L.isEnabled(L.APS))
+ Profiler.log(log, "getMealData()", startPart);
double maxIob = MainApp.getConstraintChecker().getMaxIOBAllowed().value();
@@ -163,7 +159,7 @@ public class OpenAPSAMAPlugin extends PluginBase implements APSInterface {
if (!HardLimits.checkOnlyHardLimits(profile.getDia(), "dia", HardLimits.MINDIA, HardLimits.MAXDIA))
return;
- if (!HardLimits.checkOnlyHardLimits(profile.getIcTimeFromMidnight(profile.secondsFromMidnight()), "carbratio", HardLimits.MINIC, HardLimits.MAXIC))
+ if (!HardLimits.checkOnlyHardLimits(profile.getIcTimeFromMidnight(Profile.secondsFromMidnight()), "carbratio", HardLimits.MINIC, HardLimits.MAXIC))
return;
if (!HardLimits.checkOnlyHardLimits(Profile.toMgdl(profile.getIsf(), units), "sens", HardLimits.MINISF, HardLimits.MAXISF))
return;
@@ -172,21 +168,24 @@ public class OpenAPSAMAPlugin extends PluginBase implements APSInterface {
if (!HardLimits.checkOnlyHardLimits(pump.getBaseBasalRate(), "current_basal", 0.01, HardLimits.maxBasal()))
return;
- startPart = new Date();
+ startPart = System.currentTimeMillis();
if (MainApp.getConstraintChecker().isAutosensModeEnabled().value()) {
AutosensData autosensData = IobCobCalculatorPlugin.getPlugin().getLastAutosensDataSynchronized("OpenAPSPlugin");
if (autosensData == null) {
MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.gs(R.string.openaps_noasdata)));
return;
}
+ lastAutosensResult = autosensData.autosensResult;
} else {
lastAutosensResult = new AutosensResult();
lastAutosensResult.sensResult = "autosens disabled";
}
- Profiler.log(log, "detectSensitivityandCarbAbsorption()", startPart);
- Profiler.log(log, "AMA data gathering", start);
+ if (L.isEnabled(L.APS))
+ Profiler.log(log, "detectSensitivityandCarbAbsorption()", startPart);
+ if (L.isEnabled(L.APS))
+ Profiler.log(log, "AMA data gathering", start);
- start = new Date();
+ start = System.currentTimeMillis();
try {
determineBasalAdapterAMAJS.setData(profile, maxIob, maxBasal, minBg, maxBg, targetBg, ConfigBuilderPlugin.getActivePump().getBaseBasalRate(), iobArray, glucoseStatus, mealData,
@@ -199,25 +198,15 @@ public class OpenAPSAMAPlugin extends PluginBase implements APSInterface {
DetermineBasalResultAMA determineBasalResultAMA = determineBasalAdapterAMAJS.invoke();
- Profiler.log(log, "AMA calculation", start);
+ if (L.isEnabled(L.APS))
+ Profiler.log(log, "AMA calculation", start);
// Fix bug determine basal
if (determineBasalResultAMA.rate == 0d && determineBasalResultAMA.duration == 0 && !TreatmentsPlugin.getPlugin().isTempBasalInProgress())
determineBasalResultAMA.tempBasalRequested = false;
- // limit requests on openloop mode
- if (!MainApp.getConstraintChecker().isClosedLoopAllowed().value()) {
- long now = System.currentTimeMillis();
- TemporaryBasal activeTemp = TreatmentsPlugin.getPlugin().getTempBasalFromHistory(now);
- if (activeTemp != null && determineBasalResultAMA.rate == 0 && determineBasalResultAMA.duration == 0) {
- // going to cancel
- } else if (activeTemp != null && Math.abs(determineBasalResultAMA.rate - activeTemp.tempBasalConvertedToAbsolute(now, profile)) < 0.1) {
- determineBasalResultAMA.tempBasalRequested = false;
- } else if (activeTemp == null && Math.abs(determineBasalResultAMA.rate - ConfigBuilderPlugin.getActivePump().getBaseBasalRate()) < 0.1)
- determineBasalResultAMA.tempBasalRequested = false;
- }
determineBasalResultAMA.iob = iobArray[0];
- Date now = new Date();
+ long now = System.currentTimeMillis();
try {
determineBasalResultAMA.json.put("timestamp", DateUtil.toISOString(now));
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/DetermineBasalAdapterMAJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/DetermineBasalAdapterMAJS.java
index 6275154450..1574665dc4 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/DetermineBasalAdapterMAJS.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/DetermineBasalAdapterMAJS.java
@@ -2,7 +2,6 @@ package info.nightscout.androidaps.plugins.OpenAPSMA;
import org.json.JSONException;
import org.json.JSONObject;
-import org.mozilla.javascript.Callable;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Function;
import org.mozilla.javascript.NativeJSON;
@@ -16,7 +15,6 @@ import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.GlucoseStatus;
@@ -24,14 +22,15 @@ import info.nightscout.androidaps.data.IobTotal;
import info.nightscout.androidaps.data.MealData;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.db.TemporaryBasal;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Loop.ScriptReader;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.utils.SP;
public class DetermineBasalAdapterMAJS {
- private static Logger log = LoggerFactory.getLogger(DetermineBasalAdapterMAJS.class);
+ private static Logger log = LoggerFactory.getLogger(L.APS);
- private ScriptReader mScriptReader = null;
+ private ScriptReader mScriptReader;
private JSONObject mProfile;
private JSONObject mGlucoseStatus;
private JSONObject mIobData;
@@ -39,12 +38,12 @@ public class DetermineBasalAdapterMAJS {
private JSONObject mCurrentTemp;
private String storedCurrentTemp = null;
- public String storedIobData = null;
+ private String storedIobData = null;
private String storedGlucoseStatus = null;
private String storedProfile = null;
private String storedMeal_data = null;
- public DetermineBasalAdapterMAJS(ScriptReader scriptReader) throws IOException {
+ DetermineBasalAdapterMAJS(ScriptReader scriptReader) {
mScriptReader = scriptReader;
}
@@ -97,7 +96,7 @@ public class DetermineBasalAdapterMAJS {
// Parse the jsResult object to a JSON-String
String result = NativeJSON.stringify(rhino, scope, jsResult, null, null).toString();
- if (Config.logAPSResult)
+ if (L.isEnabled(L.APS))
log.debug("Result: " + result);
try {
determineBasalResultMA = new DetermineBasalResultMA(jsResult, new JSONObject(result));
@@ -108,14 +107,10 @@ public class DetermineBasalAdapterMAJS {
log.debug("Problem loading JS Functions");
}
} catch (IOException e) {
- log.debug("IOException");
+ log.error("IOException");
} catch (RhinoException e) {
log.error("RhinoException: (" + e.lineNumber() + "," + e.columnNumber() + ") " + e.toString());
- } catch (IllegalAccessException e) {
- log.error(e.toString());
- } catch (InstantiationException e) {
- log.error(e.toString());
- } catch (InvocationTargetException e) {
+ } catch (IllegalAccessException | InstantiationException | InvocationTargetException e) {
log.error(e.toString());
} finally {
Context.exit();
@@ -210,7 +205,7 @@ public class DetermineBasalAdapterMAJS {
mMealData.put("boluses", mealData.boluses);
}
- public String readFile(String filename) throws IOException {
+ private String readFile(String filename) throws IOException {
byte[] bytes = mScriptReader.readFile(filename);
String string = new String(bytes, "UTF-8");
if (string.startsWith("#!/usr/bin/env node")) {
@@ -219,13 +214,8 @@ public class DetermineBasalAdapterMAJS {
return string;
}
- public Object makeParam(JSONObject jsonObject, Context rhino, Scriptable scope) {
- Object param = NativeJSON.parse(rhino, scope, jsonObject.toString(), new Callable() {
- @Override
- public Object call(Context context, Scriptable scriptable, Scriptable scriptable1, Object[] objects) {
- return objects[1];
- }
- });
+ private Object makeParam(JSONObject jsonObject, Context rhino, Scriptable scope) {
+ Object param = NativeJSON.parse(rhino, scope, jsonObject.toString(), (context, scriptable, scriptable1, objects) -> objects[1]);
return param;
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/DetermineBasalResultMA.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/DetermineBasalResultMA.java
index 75928f09d0..d3e1869f87 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/DetermineBasalResultMA.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/DetermineBasalResultMA.java
@@ -6,17 +6,17 @@ import org.mozilla.javascript.NativeObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Loop.APSResult;
public class DetermineBasalResultMA extends APSResult {
- private static Logger log = LoggerFactory.getLogger(DetermineBasalResultMA.class);
+ private static Logger log = LoggerFactory.getLogger(L.APS);
- public JSONObject json = new JSONObject();
- public double eventualBG;
- public double snoozeBG;
- public String mealAssist;
+ private double eventualBG;
+ private double snoozeBG;
+ private String mealAssist;
- public DetermineBasalResultMA(NativeObject result, JSONObject j) {
+ DetermineBasalResultMA(NativeObject result, JSONObject j) {
json = j;
if (result.containsKey("error")) {
reason = (String) result.get("error");
@@ -49,25 +49,14 @@ public class DetermineBasalResultMA extends APSResult {
}
}
- public DetermineBasalResultMA() {
+ private DetermineBasalResultMA() {
}
@Override
public DetermineBasalResultMA clone() {
DetermineBasalResultMA newResult = new DetermineBasalResultMA();
- newResult.reason = new String(reason);
- newResult.rate = rate;
- newResult.duration = duration;
- newResult.tempBasalRequested = isChangeRequested();
- newResult.rate = rate;
- newResult.duration = duration;
- newResult.tempBasalRequested = isChangeRequested();
+ doClone(newResult);
- try {
- newResult.json = new JSONObject(json.toString());
- } catch (JSONException e) {
- log.error("Unhandled exception", e);
- }
newResult.eventualBG = eventualBG;
newResult.snoozeBG = snoozeBG;
newResult.mealAssist = mealAssist;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/LoggerCallback.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/LoggerCallback.java
index 991ec2b25e..8907166951 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/LoggerCallback.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/LoggerCallback.java
@@ -4,8 +4,7 @@ import org.mozilla.javascript.ScriptableObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.MainApp;
-import info.nightscout.utils.ToastUtils;
+import info.nightscout.androidaps.logging.L;
/**
* Created by adrian on 15/10/17.
@@ -14,10 +13,10 @@ import info.nightscout.utils.ToastUtils;
public class LoggerCallback extends ScriptableObject {
- private static Logger log = LoggerFactory.getLogger(DetermineBasalAdapterMAJS.class);
+ private static Logger log = LoggerFactory.getLogger(L.APS);
- static StringBuffer errorBuffer = new StringBuffer();
- static StringBuffer logBuffer = new StringBuffer();
+ private static StringBuffer errorBuffer = new StringBuffer();
+ private static StringBuffer logBuffer = new StringBuffer();
public LoggerCallback() {
@@ -36,26 +35,27 @@ public class LoggerCallback extends ScriptableObject {
}
public void jsFunction_log(Object obj1) {
- log.debug(obj1.toString());
+ if (L.isEnabled(L.APS))
+ log.debug(obj1.toString());
logBuffer.append(obj1.toString());
logBuffer.append(' ');
}
public void jsFunction_error(Object obj1) {
- log.error(obj1.toString());
+ if (L.isEnabled(L.APS))
+ log.error(obj1.toString());
errorBuffer.append(obj1.toString());
errorBuffer.append(' ');
}
-
- public static String getScriptDebug(){
+ public static String getScriptDebug() {
String ret = "";
- if(errorBuffer.length() > 0){
+ if (errorBuffer.length() > 0) {
ret += "e:\n" + errorBuffer.toString();
}
- if(ret.length() > 0 && logBuffer.length() > 0) ret += '\n';
- if(logBuffer.length() > 0){
+ if (ret.length() > 0 && logBuffer.length() > 0) ret += '\n';
+ if (logBuffer.length() > 0) {
ret += "d:\n" + logBuffer.toString();
}
return ret;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAFragment.java
index 7360bb8b2a..12d7988a16 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAFragment.java
@@ -2,7 +2,6 @@ package info.nightscout.androidaps.plugins.OpenAPSMA;
import android.app.Activity;
import android.os.Bundle;
-import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -12,20 +11,15 @@ import android.widget.TextView;
import com.crashlytics.android.answers.CustomEvent;
import com.squareup.otto.Subscribe;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSUpdateGui;
import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSUpdateResultGui;
+import info.nightscout.utils.DateUtil;
import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.JSONFormatter;
public class OpenAPSMAFragment extends SubscriberFragment implements View.OnClickListener {
- private static Logger log = LoggerFactory.getLogger(OpenAPSMAFragment.class);
-
Button run;
TextView lastRunView;
TextView glucoseStatusView;
@@ -87,25 +81,22 @@ public class OpenAPSMAFragment extends SubscriberFragment implements View.OnClic
protected void updateGUI() {
Activity activity = getActivity();
if (activity != null)
- activity.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- DetermineBasalResultMA lastAPSResult = OpenAPSMAPlugin.getPlugin().lastAPSResult;
- if (lastAPSResult != null) {
- resultView.setText(JSONFormatter.format(lastAPSResult.json));
- requestView.setText(lastAPSResult.toSpanned());
- }
- DetermineBasalAdapterMAJS determineBasalAdapterMAJS = OpenAPSMAPlugin.getPlugin().lastDetermineBasalAdapterMAJS;
- if (determineBasalAdapterMAJS != null) {
- glucoseStatusView.setText(JSONFormatter.format(determineBasalAdapterMAJS.getGlucoseStatusParam()));
- currentTempView.setText(JSONFormatter.format(determineBasalAdapterMAJS.getCurrentTempParam()));
- iobDataView.setText(JSONFormatter.format(determineBasalAdapterMAJS.getIobDataParam()));
- profileView.setText(JSONFormatter.format(determineBasalAdapterMAJS.getProfileParam()));
- mealDataView.setText(JSONFormatter.format(determineBasalAdapterMAJS.getMealDataParam()));
- }
- if (OpenAPSMAPlugin.getPlugin().lastAPSRun != null) {
- lastRunView.setText(OpenAPSMAPlugin.getPlugin().lastAPSRun.toLocaleString());
- }
+ activity.runOnUiThread(() -> {
+ DetermineBasalResultMA lastAPSResult = OpenAPSMAPlugin.getPlugin().lastAPSResult;
+ if (lastAPSResult != null) {
+ resultView.setText(JSONFormatter.format(lastAPSResult.json));
+ requestView.setText(lastAPSResult.toSpanned());
+ }
+ DetermineBasalAdapterMAJS determineBasalAdapterMAJS = OpenAPSMAPlugin.getPlugin().lastDetermineBasalAdapterMAJS;
+ if (determineBasalAdapterMAJS != null) {
+ glucoseStatusView.setText(JSONFormatter.format(determineBasalAdapterMAJS.getGlucoseStatusParam()));
+ currentTempView.setText(JSONFormatter.format(determineBasalAdapterMAJS.getCurrentTempParam()));
+ iobDataView.setText(JSONFormatter.format(determineBasalAdapterMAJS.getIobDataParam()));
+ profileView.setText(JSONFormatter.format(determineBasalAdapterMAJS.getProfileParam()));
+ mealDataView.setText(JSONFormatter.format(determineBasalAdapterMAJS.getMealDataParam()));
+ }
+ if (OpenAPSMAPlugin.getPlugin().lastAPSRun != 0) {
+ lastRunView.setText(DateUtil.dateAndTimeFullString(OpenAPSMAPlugin.getPlugin().lastAPSRun));
}
});
}
@@ -113,18 +104,15 @@ public class OpenAPSMAFragment extends SubscriberFragment implements View.OnClic
private void updateResultGUI(final String text) {
Activity activity = getActivity();
if (activity != null)
- activity.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- resultView.setText(text);
- glucoseStatusView.setText("");
- currentTempView.setText("");
- iobDataView.setText("");
- profileView.setText("");
- mealDataView.setText("");
- requestView.setText("");
- lastRunView.setText("");
- }
+ activity.runOnUiThread(() -> {
+ resultView.setText(text);
+ glucoseStatusView.setText("");
+ currentTempView.setText("");
+ iobDataView.setText("");
+ profileView.setText("");
+ mealDataView.setText("");
+ requestView.setText("");
+ lastRunView.setText("");
});
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAPlugin.java
index 39d05f8ffb..954204e47a 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAPlugin.java
@@ -4,10 +4,6 @@ import org.json.JSONException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.IOException;
-import java.util.Date;
-
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.GlucoseStatus;
@@ -21,7 +17,9 @@ import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.interfaces.PumpInterface;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.Loop.APSResult;
import info.nightscout.androidaps.plugins.Loop.ScriptReader;
import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSUpdateGui;
@@ -39,7 +37,7 @@ import static info.nightscout.utils.HardLimits.verifyHardLimits;
* Created by mike on 05.08.2016.
*/
public class OpenAPSMAPlugin extends PluginBase implements APSInterface {
- private static Logger log = LoggerFactory.getLogger(OpenAPSMAPlugin.class);
+ private static Logger log = LoggerFactory.getLogger(L.APS);
private static OpenAPSMAPlugin openAPSMAPlugin;
@@ -52,10 +50,10 @@ public class OpenAPSMAPlugin extends PluginBase implements APSInterface {
// last values
DetermineBasalAdapterMAJS lastDetermineBasalAdapterMAJS = null;
- Date lastAPSRun = null;
+ long lastAPSRun = 0;
DetermineBasalResultMA lastAPSResult = null;
- public OpenAPSMAPlugin() {
+ private OpenAPSMAPlugin() {
super(new PluginDescription()
.mainType(PluginType.APS)
.fragmentClass(OpenAPSMAFragment.class.getName())
@@ -84,43 +82,39 @@ public class OpenAPSMAPlugin extends PluginBase implements APSInterface {
}
@Override
- public Date getLastAPSRun() {
+ public long getLastAPSRun() {
return lastAPSRun;
}
@Override
public void invoke(String initiator, boolean tempBasalFallback) {
- log.debug("invoke from " + initiator + " tempBasalFallback: " + tempBasalFallback);
+ if (L.isEnabled(L.APS))
+ log.debug("invoke from " + initiator + " tempBasalFallback: " + tempBasalFallback);
lastAPSResult = null;
- DetermineBasalAdapterMAJS determineBasalAdapterMAJS = null;
- try {
- determineBasalAdapterMAJS = new DetermineBasalAdapterMAJS(new ScriptReader(MainApp.instance().getBaseContext()));
- } catch (IOException e) {
- log.error(e.getMessage(), e);
- return;
- }
+ DetermineBasalAdapterMAJS determineBasalAdapterMAJS;
+ determineBasalAdapterMAJS = new DetermineBasalAdapterMAJS(new ScriptReader(MainApp.instance().getBaseContext()));
GlucoseStatus glucoseStatus = GlucoseStatus.getGlucoseStatusData();
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
PumpInterface pump = ConfigBuilderPlugin.getActivePump();
if (profile == null) {
MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.gs(R.string.noprofileselected)));
- if (Config.logAPSResult)
+ if (L.isEnabled(L.APS))
log.debug(MainApp.gs(R.string.noprofileselected));
return;
}
if (!isEnabled(PluginType.APS)) {
MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.gs(R.string.openapsma_disabled)));
- if (Config.logAPSResult)
+ if (L.isEnabled(L.APS))
log.debug(MainApp.gs(R.string.openapsma_disabled));
return;
}
if (glucoseStatus == null) {
MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.gs(R.string.openapsma_noglucosedata)));
- if (Config.logAPSResult)
+ if (L.isEnabled(L.APS))
log.debug(MainApp.gs(R.string.openapsma_noglucosedata));
return;
}
@@ -136,7 +130,7 @@ public class OpenAPSMAPlugin extends PluginBase implements APSInterface {
minBg = Round.roundTo(minBg, 0.1d);
maxBg = Round.roundTo(maxBg, 0.1d);
- Date start = new Date();
+ long start = System.currentTimeMillis();
TreatmentsPlugin.getPlugin().updateTotalIOBTreatments();
TreatmentsPlugin.getPlugin().updateTotalIOBTempBasals();
IobTotal bolusIob = TreatmentsPlugin.getPlugin().getLastCalculationTreatments();
@@ -147,7 +141,8 @@ public class OpenAPSMAPlugin extends PluginBase implements APSInterface {
MealData mealData = TreatmentsPlugin.getPlugin().getMealData();
double maxIob = MainApp.getConstraintChecker().getMaxIOBAllowed().value();
- Profiler.log(log, "MA data gathering", start);
+ if (L.isEnabled(L.APS))
+ Profiler.log(log, "MA data gathering", start);
minBg = verifyHardLimits(minBg, "minBg", HardLimits.VERY_HARD_LIMIT_MIN_BG[0], HardLimits.VERY_HARD_LIMIT_MIN_BG[1]);
maxBg = verifyHardLimits(maxBg, "maxBg", HardLimits.VERY_HARD_LIMIT_MAX_BG[0], HardLimits.VERY_HARD_LIMIT_MAX_BG[1]);
@@ -162,7 +157,7 @@ public class OpenAPSMAPlugin extends PluginBase implements APSInterface {
if (!checkOnlyHardLimits(profile.getDia(), "dia", HardLimits.MINDIA, HardLimits.MAXDIA))
return;
- if (!checkOnlyHardLimits(profile.getIcTimeFromMidnight(profile.secondsFromMidnight()), "carbratio", HardLimits.MINIC, HardLimits.MAXIC))
+ if (!checkOnlyHardLimits(profile.getIcTimeFromMidnight(Profile.secondsFromMidnight()), "carbratio", HardLimits.MINIC, HardLimits.MAXIC))
return;
if (!checkOnlyHardLimits(Profile.toMgdl(profile.getIsf(), units), "sens", HardLimits.MINISF, HardLimits.MAXISF))
return;
@@ -171,13 +166,14 @@ public class OpenAPSMAPlugin extends PluginBase implements APSInterface {
if (!checkOnlyHardLimits(pump.getBaseBasalRate(), "current_basal", 0.01, HardLimits.maxBasal()))
return;
- start = new Date();
+ start = System.currentTimeMillis();
try {
determineBasalAdapterMAJS.setData(profile, maxIob, maxBasal, minBg, maxBg, targetBg, ConfigBuilderPlugin.getActivePump().getBaseBasalRate(), iobTotal, glucoseStatus, mealData);
} catch (JSONException e) {
log.error("Unhandled exception", e);
}
- Profiler.log(log, "MA calculation", start);
+ if (L.isEnabled(L.APS))
+ Profiler.log(log, "MA calculation", start);
long now = System.currentTimeMillis();
@@ -186,16 +182,6 @@ public class OpenAPSMAPlugin extends PluginBase implements APSInterface {
// Fix bug determinef basal
if (determineBasalResultMA.rate == 0d && determineBasalResultMA.duration == 0 && !TreatmentsPlugin.getPlugin().isTempBasalInProgress())
determineBasalResultMA.tempBasalRequested = false;
- // limit requests on openloop mode
- if (!MainApp.getConstraintChecker().isClosedLoopAllowed().value()) {
- TemporaryBasal activeTemp = TreatmentsPlugin.getPlugin().getTempBasalFromHistory(now);
- if (activeTemp != null && determineBasalResultMA.rate == 0 && determineBasalResultMA.duration == 0) {
- // going to cancel
- } else if (activeTemp != null && Math.abs(determineBasalResultMA.rate - activeTemp.tempBasalConvertedToAbsolute(now, profile)) < 0.1) {
- determineBasalResultMA.tempBasalRequested = false;
- } else if (activeTemp == null && Math.abs(determineBasalResultMA.rate - ConfigBuilderPlugin.getActivePump().getBaseBasalRate()) < 0.1)
- determineBasalResultMA.tempBasalRequested = false;
- }
determineBasalResultMA.iob = iobTotal;
@@ -207,7 +193,7 @@ public class OpenAPSMAPlugin extends PluginBase implements APSInterface {
lastDetermineBasalAdapterMAJS = determineBasalAdapterMAJS;
lastAPSResult = determineBasalResultMA;
- lastAPSRun = new Date(now);
+ lastAPSRun = now;
MainApp.bus().post(new EventOpenAPSUpdateGui());
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/events/EventOpenAPSUpdateResultGui.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/events/EventOpenAPSUpdateResultGui.java
index e65cdd2c57..177133f155 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/events/EventOpenAPSUpdateResultGui.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/events/EventOpenAPSUpdateResultGui.java
@@ -6,7 +6,7 @@ import info.nightscout.androidaps.events.EventUpdateGui;
* Created by mike on 05.08.2016.
*/
public class EventOpenAPSUpdateResultGui extends EventUpdateGui {
- public String text = null;
+ public String text;
public EventOpenAPSUpdateResultGui(String text) {
this.text = text;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java
index 48a4c16ccd..f974ff472e 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java
@@ -3,7 +3,6 @@ package info.nightscout.androidaps.plugins.OpenAPSSMB;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
-import org.mozilla.javascript.Callable;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Function;
import org.mozilla.javascript.NativeJSON;
@@ -18,7 +17,6 @@ import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
@@ -27,6 +25,7 @@ import info.nightscout.androidaps.data.IobTotal;
import info.nightscout.androidaps.data.MealData;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.db.TemporaryBasal;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
import info.nightscout.androidaps.plugins.Loop.ScriptReader;
import info.nightscout.androidaps.plugins.OpenAPSMA.LoggerCallback;
@@ -35,10 +34,10 @@ import info.nightscout.utils.SP;
import info.nightscout.utils.SafeParse;
public class DetermineBasalAdapterSMBJS {
- private static Logger log = LoggerFactory.getLogger(DetermineBasalAdapterSMBJS.class);
+ private static Logger log = LoggerFactory.getLogger(L.APS);
- private ScriptReader mScriptReader = null;
+ private ScriptReader mScriptReader;
private JSONObject mProfile;
private JSONObject mGlucoseStatus;
private JSONArray mIobData;
@@ -64,7 +63,7 @@ public class DetermineBasalAdapterSMBJS {
* Main code
*/
- public DetermineBasalAdapterSMBJS(ScriptReader scriptReader) throws IOException {
+ DetermineBasalAdapterSMBJS(ScriptReader scriptReader) {
mScriptReader = scriptReader;
}
@@ -72,19 +71,21 @@ public class DetermineBasalAdapterSMBJS {
public DetermineBasalResultSMB invoke() {
- log.debug(">>> Invoking detemine_basal <<<");
- log.debug("Glucose status: " + (storedGlucoseStatus = mGlucoseStatus.toString()));
- log.debug("IOB data: " + (storedIobData = mIobData.toString()));
- log.debug("Current temp: " + (storedCurrentTemp = mCurrentTemp.toString()));
- log.debug("Profile: " + (storedProfile = mProfile.toString()));
- log.debug("Meal data: " + (storedMeal_data = mMealData.toString()));
- if (mAutosensData != null)
- log.debug("Autosens data: " + (storedAutosens_data = mAutosensData.toString()));
- else
- log.debug("Autosens data: " + (storedAutosens_data = "undefined"));
- log.debug("Reservoir data: " + "undefined");
- log.debug("MicroBolusAllowed: " + (storedMicroBolusAllowed = "" + mMicrobolusAllowed));
- log.debug("SMBAlwaysAllowed: " + (storedSMBAlwaysAllowed = "" + mSMBAlwaysAllowed));
+ if (L.isEnabled(L.APS)) {
+ log.debug(">>> Invoking detemine_basal <<<");
+ log.debug("Glucose status: " + (storedGlucoseStatus = mGlucoseStatus.toString()));
+ log.debug("IOB data: " + (storedIobData = mIobData.toString()));
+ log.debug("Current temp: " + (storedCurrentTemp = mCurrentTemp.toString()));
+ log.debug("Profile: " + (storedProfile = mProfile.toString()));
+ log.debug("Meal data: " + (storedMeal_data = mMealData.toString()));
+ if (mAutosensData != null)
+ log.debug("Autosens data: " + (storedAutosens_data = mAutosensData.toString()));
+ else
+ log.debug("Autosens data: " + (storedAutosens_data = "undefined"));
+ log.debug("Reservoir data: " + "undefined");
+ log.debug("MicroBolusAllowed: " + (storedMicroBolusAllowed = "" + mMicrobolusAllowed));
+ log.debug("SMBAlwaysAllowed: " + (storedSMBAlwaysAllowed = "" + mSMBAlwaysAllowed));
+ }
DetermineBasalResultSMB determineBasalResultSMB = null;
@@ -135,7 +136,7 @@ public class DetermineBasalAdapterSMBJS {
// Parse the jsResult object to a JSON-String
String result = NativeJSON.stringify(rhino, scope, jsResult, null, null).toString();
- if (Config.logAPSResult)
+ if (L.isEnabled(L.APS))
log.debug("Result: " + result);
try {
determineBasalResultSMB = new DetermineBasalResultSMB(new JSONObject(result));
@@ -143,17 +144,13 @@ public class DetermineBasalAdapterSMBJS {
log.error("Unhandled exception", e);
}
} else {
- log.debug("Problem loading JS Functions");
+ log.error("Problem loading JS Functions");
}
} catch (IOException e) {
- log.debug("IOException");
+ log.error("IOException");
} catch (RhinoException e) {
log.error("RhinoException: (" + e.lineNumber() + "," + e.columnNumber() + ") " + e.toString());
- } catch (IllegalAccessException e) {
- log.error(e.toString());
- } catch (InstantiationException e) {
- log.error(e.toString());
- } catch (InvocationTargetException e) {
+ } catch (IllegalAccessException | InstantiationException | InvocationTargetException e) {
log.error(e.toString());
} finally {
Context.exit();
@@ -243,12 +240,12 @@ public class DetermineBasalAdapterSMBJS {
mProfile.put("half_basal_exercise_target", SMBDefaults.half_basal_exercise_target);
mProfile.put("maxCOB", SMBDefaults.maxCOB);
mProfile.put("skip_neutral_temps", SMBDefaults.skip_neutral_temps);
- //align with max-absorption model in AMA sensitivity
- if(mealData.usedMinCarbsImpact > 0){
- mProfile.put("min_5m_carbimpact", mealData.usedMinCarbsImpact);
- } else {
- mProfile.put("min_5m_carbimpact", SP.getDouble(R.string.key_openapsama_min_5m_carbimpact, SMBDefaults.min_5m_carbimpact));
- }
+ // min_5m_carbimpact is not used within SMB determinebasal
+ //if (mealData.usedMinCarbsImpact > 0) {
+ // mProfile.put("min_5m_carbimpact", mealData.usedMinCarbsImpact);
+ //} else {
+ // mProfile.put("min_5m_carbimpact", SP.getDouble(R.string.key_openapsama_min_5m_carbimpact, SMBDefaults.min_5m_carbimpact));
+ //}
mProfile.put("remainingCarbsCap", SMBDefaults.remainingCarbsCap);
mProfile.put("enableUAM", SP.getBoolean(R.string.key_use_uam, false));
mProfile.put("A52_risk_enable", SMBDefaults.A52_risk_enable);
@@ -319,31 +316,21 @@ public class DetermineBasalAdapterSMBJS {
}
- public Object makeParam(JSONObject jsonObject, Context rhino, Scriptable scope) {
+ private Object makeParam(JSONObject jsonObject, Context rhino, Scriptable scope) {
if (jsonObject == null) return Undefined.instance;
- Object param = NativeJSON.parse(rhino, scope, jsonObject.toString(), new Callable() {
- @Override
- public Object call(Context context, Scriptable scriptable, Scriptable scriptable1, Object[] objects) {
- return objects[1];
- }
- });
+ Object param = NativeJSON.parse(rhino, scope, jsonObject.toString(), (context, scriptable, scriptable1, objects) -> objects[1]);
return param;
}
- public Object makeParamArray(JSONArray jsonArray, Context rhino, Scriptable scope) {
+ private Object makeParamArray(JSONArray jsonArray, Context rhino, Scriptable scope) {
//Object param = NativeJSON.parse(rhino, scope, "{myarray: " + jsonArray.toString() + " }", new Callable() {
- Object param = NativeJSON.parse(rhino, scope, jsonArray.toString(), new Callable() {
- @Override
- public Object call(Context context, Scriptable scriptable, Scriptable scriptable1, Object[] objects) {
- return objects[1];
- }
- });
+ Object param = NativeJSON.parse(rhino, scope, jsonArray.toString(), (context, scriptable, scriptable1, objects) -> objects[1]);
return param;
}
- public String readFile(String filename) throws IOException {
+ private String readFile(String filename) throws IOException {
byte[] bytes = mScriptReader.readFile(filename);
String string = new String(bytes, "UTF-8");
if (string.startsWith("#!/usr/bin/env node")) {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalResultSMB.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalResultSMB.java
index d5f108bf4f..364731bea5 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalResultSMB.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalResultSMB.java
@@ -5,16 +5,15 @@ import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Loop.APSResult;
import info.nightscout.utils.DateUtil;
public class DetermineBasalResultSMB extends APSResult {
- private static final Logger log = LoggerFactory.getLogger(DetermineBasalResultSMB.class);
+ private static final Logger log = LoggerFactory.getLogger(L.APS);
private double eventualBG;
private double snoozeBG;
- //public double insulinReq;
- //public double carbsReq;
DetermineBasalResultSMB(JSONObject result) {
this();
@@ -69,24 +68,10 @@ public class DetermineBasalResultSMB extends APSResult {
@Override
public DetermineBasalResultSMB clone() {
DetermineBasalResultSMB newResult = new DetermineBasalResultSMB();
- newResult.reason = reason;
- newResult.rate = rate;
- newResult.duration = duration;
- newResult.tempBasalRequested = tempBasalRequested;
- newResult.bolusRequested = bolusRequested;
- newResult.rate = rate;
- newResult.duration = duration;
- newResult.smb = smb;
- newResult.deliverAt = deliverAt;
+ doClone(newResult);
- try {
- newResult.json = new JSONObject(json.toString());
- } catch (JSONException e) {
- log.error("Error clone parsing determine-basal result", e);
- }
newResult.eventualBG = eventualBG;
newResult.snoozeBG = snoozeBG;
- newResult.date = date;
return newResult;
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBFragment.java
index 20ccd46b40..d27f8b31d0 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBFragment.java
@@ -21,14 +21,16 @@ import butterknife.ButterKnife;
import butterknife.OnClick;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSUpdateGui;
import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSUpdateResultGui;
+import info.nightscout.utils.DateUtil;
import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.JSONFormatter;
public class OpenAPSSMBFragment extends SubscriberFragment {
- private static Logger log = LoggerFactory.getLogger(OpenAPSSMBFragment.class);
+ private static Logger log = LoggerFactory.getLogger(L.APS);
@BindView(R.id.openapsma_run)
Button run;
@@ -84,40 +86,37 @@ public class OpenAPSSMBFragment extends SubscriberFragment {
protected void updateGUI() {
Activity activity = getActivity();
if (activity != null)
- activity.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- synchronized (OpenAPSSMBFragment.this) {
- if (!isBound()) return;
- OpenAPSSMBPlugin plugin = OpenAPSSMBPlugin.getPlugin();
- DetermineBasalResultSMB lastAPSResult = plugin.lastAPSResult;
- if (lastAPSResult != null) {
- resultView.setText(JSONFormatter.format(lastAPSResult.json));
- requestView.setText(lastAPSResult.toSpanned());
- }
- DetermineBasalAdapterSMBJS determineBasalAdapterSMBJS = plugin.lastDetermineBasalAdapterSMBJS;
- if (determineBasalAdapterSMBJS != null) {
- glucoseStatusView.setText(JSONFormatter.format(determineBasalAdapterSMBJS.getGlucoseStatusParam()).toString().trim());
- currentTempView.setText(JSONFormatter.format(determineBasalAdapterSMBJS.getCurrentTempParam()).toString().trim());
- try {
- JSONArray iobArray = new JSONArray(determineBasalAdapterSMBJS.getIobDataParam());
- iobDataView.setText((String.format(MainApp.gs(R.string.array_of_elements), iobArray.length()) + "\n" + JSONFormatter.format(iobArray.getString(0))).trim());
- } catch (JSONException e) {
- log.error("Unhandled exception", e);
- iobDataView.setText("JSONException see log for details");
- }
- profileView.setText(JSONFormatter.format(determineBasalAdapterSMBJS.getProfileParam()).toString().trim());
- mealDataView.setText(JSONFormatter.format(determineBasalAdapterSMBJS.getMealDataParam()).toString().trim());
- scriptdebugView.setText(determineBasalAdapterSMBJS.getScriptDebug().trim());
- if (lastAPSResult != null && lastAPSResult.inputConstraints != null)
- constraintsView.setText(lastAPSResult.inputConstraints.getReasons().trim());
- }
- if (plugin.lastAPSRun != null) {
- lastRunView.setText(plugin.lastAPSRun.toLocaleString().trim());
- }
- if (plugin.lastAutosensResult != null) {
- autosensDataView.setText(JSONFormatter.format(plugin.lastAutosensResult.json()).toString().trim());
+ activity.runOnUiThread(() -> {
+ synchronized (OpenAPSSMBFragment.this) {
+ if (!isBound()) return;
+ OpenAPSSMBPlugin plugin = OpenAPSSMBPlugin.getPlugin();
+ DetermineBasalResultSMB lastAPSResult = plugin.lastAPSResult;
+ if (lastAPSResult != null) {
+ resultView.setText(JSONFormatter.format(lastAPSResult.json));
+ requestView.setText(lastAPSResult.toSpanned());
+ }
+ DetermineBasalAdapterSMBJS determineBasalAdapterSMBJS = plugin.lastDetermineBasalAdapterSMBJS;
+ if (determineBasalAdapterSMBJS != null) {
+ glucoseStatusView.setText(JSONFormatter.format(determineBasalAdapterSMBJS.getGlucoseStatusParam()).toString().trim());
+ currentTempView.setText(JSONFormatter.format(determineBasalAdapterSMBJS.getCurrentTempParam()).toString().trim());
+ try {
+ JSONArray iobArray = new JSONArray(determineBasalAdapterSMBJS.getIobDataParam());
+ iobDataView.setText((String.format(MainApp.gs(R.string.array_of_elements), iobArray.length()) + "\n" + JSONFormatter.format(iobArray.getString(0))).trim());
+ } catch (JSONException e) {
+ log.error("Unhandled exception", e);
+ iobDataView.setText("JSONException see log for details");
}
+ profileView.setText(JSONFormatter.format(determineBasalAdapterSMBJS.getProfileParam()).toString().trim());
+ mealDataView.setText(JSONFormatter.format(determineBasalAdapterSMBJS.getMealDataParam()).toString().trim());
+ scriptdebugView.setText(determineBasalAdapterSMBJS.getScriptDebug().trim());
+ if (lastAPSResult != null && lastAPSResult.inputConstraints != null)
+ constraintsView.setText(lastAPSResult.inputConstraints.getReasons().trim());
+ }
+ if (plugin.lastAPSRun != 0) {
+ lastRunView.setText(DateUtil.dateAndTimeFullString(plugin.lastAPSRun));
+ }
+ if (plugin.lastAutosensResult != null) {
+ autosensDataView.setText(JSONFormatter.format(plugin.lastAutosensResult.json()).toString().trim());
}
}
});
@@ -126,22 +125,19 @@ public class OpenAPSSMBFragment extends SubscriberFragment {
void updateResultGUI(final String text) {
Activity activity = getActivity();
if (activity != null)
- activity.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- synchronized (OpenAPSSMBFragment.this) {
- if (isBound()) {
- resultView.setText(text);
- glucoseStatusView.setText("");
- currentTempView.setText("");
- iobDataView.setText("");
- profileView.setText("");
- mealDataView.setText("");
- autosensDataView.setText("");
- scriptdebugView.setText("");
- requestView.setText("");
- lastRunView.setText("");
- }
+ activity.runOnUiThread(() -> {
+ synchronized (OpenAPSSMBFragment.this) {
+ if (isBound()) {
+ resultView.setText(text);
+ glucoseStatusView.setText("");
+ currentTempView.setText("");
+ iobDataView.setText("");
+ profileView.setText("");
+ mealDataView.setText("");
+ autosensDataView.setText("");
+ scriptdebugView.setText("");
+ requestView.setText("");
+ lastRunView.setText("");
}
}
});
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBPlugin.java
index 570b76502f..9390b9b588 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBPlugin.java
@@ -1,14 +1,11 @@
package info.nightscout.androidaps.plugins.OpenAPSSMB;
-import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData;
import org.json.JSONException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.IOException;
import java.util.Date;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.GlucoseStatus;
@@ -23,17 +20,20 @@ import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.interfaces.PumpInterface;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
+import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData;
import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensResult;
import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
import info.nightscout.androidaps.plugins.Loop.APSResult;
import info.nightscout.androidaps.plugins.Loop.ScriptReader;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSUpdateGui;
import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSUpdateResultGui;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.utils.DateUtil;
import info.nightscout.utils.HardLimits;
-import info.nightscout.utils.NSUpload;
import info.nightscout.utils.Profiler;
import info.nightscout.utils.Round;
import info.nightscout.utils.ToastUtils;
@@ -42,7 +42,7 @@ import info.nightscout.utils.ToastUtils;
* Created by mike on 05.08.2016.
*/
public class OpenAPSSMBPlugin extends PluginBase implements APSInterface {
- private static Logger log = LoggerFactory.getLogger(OpenAPSSMBPlugin.class);
+ private static Logger log = LoggerFactory.getLogger(L.APS);
private static OpenAPSSMBPlugin openAPSSMBPlugin;
@@ -55,7 +55,7 @@ public class OpenAPSSMBPlugin extends PluginBase implements APSInterface {
// last values
DetermineBasalAdapterSMBJS lastDetermineBasalAdapterSMBJS = null;
- Date lastAPSRun = null;
+ long lastAPSRun = 0;
DetermineBasalResultSMB lastAPSResult = null;
AutosensResult lastAutosensResult = null;
@@ -88,43 +88,39 @@ public class OpenAPSSMBPlugin extends PluginBase implements APSInterface {
}
@Override
- public Date getLastAPSRun() {
+ public long getLastAPSRun() {
return lastAPSRun;
}
@Override
public void invoke(String initiator, boolean tempBasalFallback) {
- log.debug("invoke from " + initiator + " tempBasalFallback: " + tempBasalFallback);
+ if (L.isEnabled(L.APS))
+ log.debug("invoke from " + initiator + " tempBasalFallback: " + tempBasalFallback);
lastAPSResult = null;
- DetermineBasalAdapterSMBJS determineBasalAdapterSMBJS = null;
- try {
- determineBasalAdapterSMBJS = new DetermineBasalAdapterSMBJS(new ScriptReader(MainApp.instance().getBaseContext()));
- } catch (IOException e) {
- log.error(e.getMessage(), e);
- return;
- }
+ DetermineBasalAdapterSMBJS determineBasalAdapterSMBJS;
+ determineBasalAdapterSMBJS = new DetermineBasalAdapterSMBJS(new ScriptReader(MainApp.instance().getBaseContext()));
GlucoseStatus glucoseStatus = GlucoseStatus.getGlucoseStatusData();
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
PumpInterface pump = ConfigBuilderPlugin.getActivePump();
if (profile == null) {
MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.gs(R.string.noprofileselected)));
- if (Config.logAPSResult)
+ if (L.isEnabled(L.APS))
log.debug(MainApp.gs(R.string.noprofileselected));
return;
}
if (!isEnabled(PluginType.APS)) {
MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.gs(R.string.openapsma_disabled)));
- if (Config.logAPSResult)
+ if (L.isEnabled(L.APS))
log.debug(MainApp.gs(R.string.openapsma_disabled));
return;
}
if (glucoseStatus == null) {
MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.gs(R.string.openapsma_noglucosedata)));
- if (Config.logAPSResult)
+ if (L.isEnabled(L.APS))
log.debug(MainApp.gs(R.string.openapsma_noglucosedata));
return;
}
@@ -143,14 +139,16 @@ public class OpenAPSSMBPlugin extends PluginBase implements APSInterface {
minBg = Round.roundTo(minBg, 0.1d);
maxBg = Round.roundTo(maxBg, 0.1d);
- Date start = new Date();
- Date startPart = new Date();
+ long start = System.currentTimeMillis();
+ long startPart = System.currentTimeMillis();
IobTotal[] iobArray = IobCobCalculatorPlugin.getPlugin().calculateIobArrayForSMB(profile);
- Profiler.log(log, "calculateIobArrayInDia()", startPart);
+ if (L.isEnabled(L.APS))
+ Profiler.log(log, "calculateIobArrayInDia()", startPart);
- startPart = new Date();
+ startPart = System.currentTimeMillis();
MealData mealData = TreatmentsPlugin.getPlugin().getMealData();
- Profiler.log(log, "getMealData()", startPart);
+ if (L.isEnabled(L.APS))
+ Profiler.log(log, "getMealData()", startPart);
double maxIob = MainApp.getConstraintChecker().getMaxIOBAllowed().value();
@@ -170,7 +168,7 @@ public class OpenAPSSMBPlugin extends PluginBase implements APSInterface {
if (!checkOnlyHardLimits(profile.getDia(), "dia", HardLimits.MINDIA, HardLimits.MAXDIA))
return;
- if (!checkOnlyHardLimits(profile.getIcTimeFromMidnight(profile.secondsFromMidnight()), "carbratio", HardLimits.MINIC, HardLimits.MAXIC))
+ if (!checkOnlyHardLimits(profile.getIcTimeFromMidnight(Profile.secondsFromMidnight()), "carbratio", HardLimits.MINIC, HardLimits.MAXIC))
return;
if (!checkOnlyHardLimits(Profile.toMgdl(profile.getIsf(), units), "sens", HardLimits.MINISF, HardLimits.MAXISF))
return;
@@ -179,7 +177,7 @@ public class OpenAPSSMBPlugin extends PluginBase implements APSInterface {
if (!checkOnlyHardLimits(pump.getBaseBasalRate(), "current_basal", 0.01, HardLimits.maxBasal()))
return;
- startPart = new Date();
+ startPart = System.currentTimeMillis();
if (MainApp.getConstraintChecker().isAutosensModeEnabled().value()) {
AutosensData autosensData = IobCobCalculatorPlugin.getPlugin().getLastAutosensDataSynchronized("OpenAPSPlugin");
if (autosensData == null) {
@@ -200,10 +198,12 @@ public class OpenAPSSMBPlugin extends PluginBase implements APSInterface {
MainApp.getConstraintChecker().isAdvancedFilteringEnabled(advancedFiltering);
inputConstraints.copyReasons(advancedFiltering);
- Profiler.log(log, "detectSensitivityandCarbAbsorption()", startPart);
- Profiler.log(log, "SMB data gathering", start);
+ if (L.isEnabled(L.APS))
+ Profiler.log(log, "detectSensitivityandCarbAbsorption()", startPart);
+ if (L.isEnabled(L.APS))
+ Profiler.log(log, "SMB data gathering", start);
- start = new Date();
+ start = System.currentTimeMillis();
try {
determineBasalAdapterSMBJS.setData(profile, maxIob, maxBasal, minBg, maxBg, targetBg, ConfigBuilderPlugin.getActivePump().getBaseBasalRate(), iobArray, glucoseStatus, mealData,
lastAutosensResult.ratio, //autosensDataRatio
@@ -219,21 +219,12 @@ public class OpenAPSSMBPlugin extends PluginBase implements APSInterface {
long now = System.currentTimeMillis();
DetermineBasalResultSMB determineBasalResultSMB = determineBasalAdapterSMBJS.invoke();
- Profiler.log(log, "SMB calculation", start);
+ if (L.isEnabled(L.APS))
+ Profiler.log(log, "SMB calculation", start);
// TODO still needed with oref1?
// Fix bug determine basal
if (determineBasalResultSMB.rate == 0d && determineBasalResultSMB.duration == 0 && !TreatmentsPlugin.getPlugin().isTempBasalInProgress())
determineBasalResultSMB.tempBasalRequested = false;
- // limit requests on openloop mode
- if (!MainApp.getConstraintChecker().isClosedLoopAllowed().value()) {
- TemporaryBasal activeTemp = TreatmentsPlugin.getPlugin().getTempBasalFromHistory(now);
- if (activeTemp != null && determineBasalResultSMB.rate == 0 && determineBasalResultSMB.duration == 0) {
- // going to cancel
- } else if (activeTemp != null && Math.abs(determineBasalResultSMB.rate - activeTemp.tempBasalConvertedToAbsolute(now, profile)) < 0.1) {
- determineBasalResultSMB.tempBasalRequested = false;
- } else if (activeTemp == null && Math.abs(determineBasalResultSMB.rate - ConfigBuilderPlugin.getActivePump().getBaseBasalRate()) < 0.1)
- determineBasalResultSMB.tempBasalRequested = false;
- }
determineBasalResultSMB.iob = iobArray[0];
@@ -247,7 +238,7 @@ public class OpenAPSSMBPlugin extends PluginBase implements APSInterface {
lastDetermineBasalAdapterSMBJS = determineBasalAdapterSMBJS;
lastAPSResult = determineBasalResultSMB;
- lastAPSRun = new Date(now);
+ lastAPSRun = now;
MainApp.bus().post(new EventOpenAPSUpdateGui());
//deviceStatus.suggested = determineBasalResultAMA.json;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java
index 9974471528..f8f2b1dff4 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java
@@ -20,12 +20,13 @@ import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.events.EventPumpStatusChanged;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.Overview.events.EventDismissBolusprogressIfRunning;
import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress;
public class BolusProgressDialog extends DialogFragment implements View.OnClickListener {
- private static Logger log = LoggerFactory.getLogger(BolusProgressDialog.class);
+ private static Logger log = LoggerFactory.getLogger(L.UI);
Button stopButton;
TextView statusView;
TextView stopPressedView;
@@ -70,7 +71,9 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL
@Override
public void onResume() {
super.onResume();
- if(!ConfigBuilderPlugin.getCommandQueue().bolusInQueue()) {
+ if (L.isEnabled(L.UI))
+ log.debug("onResume");
+ if (!ConfigBuilderPlugin.getCommandQueue().bolusInQueue()) {
bolusEnded = true;
}
if (bolusEnded) {
@@ -80,17 +83,22 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL
getDialog().getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
MainApp.subscribe(this);
running = true;
+ if (L.isEnabled(L.UI))
+ log.debug("onResume running");
}
}
@Override
public void dismiss() {
+ if (L.isEnabled(L.UI))
+ log.debug("dismiss");
try {
super.dismiss();
} catch (IllegalStateException e) {
// dialog not running yet. onResume will try again. Set bolusEnded to make extra
// sure onResume will catch this
bolusEnded = true;
+ log.error("Unhandled exception", e);
}
if (helperActivity != null) {
helperActivity.finish();
@@ -102,13 +110,16 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL
super.onPause();
MainApp.unsubscribe(this);
running = false;
+ if (L.isEnabled(L.UI))
+ log.debug("onPause");
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.overview_bolusprogress_stop:
- log.debug("Stop bolus delivery button pressed");
+ if (L.isEnabled(L.UI))
+ log.debug("Stop bolus delivery button pressed");
stopPressed = true;
stopPressedView.setVisibility(View.VISIBLE);
stopButton.setVisibility(View.INVISIBLE);
@@ -122,7 +133,8 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL
Activity activity = getActivity();
if (activity != null) {
activity.runOnUiThread(() -> {
- log.debug("Status: " + ev.status + " Percent: " + ev.percent);
+ if (L.isEnabled(L.UI))
+ log.debug("Status: " + ev.status + " Percent: " + ev.percent);
statusView.setText(ev.status);
progressBar.setProgress(ev.percent);
if (ev.percent == 100) {
@@ -135,6 +147,8 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL
@Subscribe
public void onStatusEvent(final EventDismissBolusprogressIfRunning ev) {
+ if (L.isEnabled(L.UI))
+ log.debug("EventDismissBolusprogressIfRunning");
if (BolusProgressDialog.running) {
dismiss();
}
@@ -142,6 +156,8 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL
@Subscribe
public void onStatusEvent(final EventPumpStatusChanged c) {
+ if (L.isEnabled(L.UI))
+ log.debug("EventPumpStatusChanged");
Activity activity = getActivity();
if (activity != null) {
activity.runOnUiThread(() -> statusView.setText(c.textStatus()));
@@ -149,18 +165,25 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL
}
private void scheduleDismiss() {
+ if (L.isEnabled(L.UI))
+ log.debug("scheduleDismiss");
Thread t = new Thread(() -> {
SystemClock.sleep(5000);
BolusProgressDialog.bolusEnded = true;
Activity activity = getActivity();
if (activity != null) {
activity.runOnUiThread(() -> {
+ if (L.isEnabled(L.UI))
+ log.debug("executing");
try {
dismiss();
} catch (Exception e) {
log.error("Unhandled exception", e);
}
});
+ } else {
+ if (L.isEnabled(L.UI))
+ log.debug("activity == null");
}
});
t.start();
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/CalibrationDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/CalibrationDialog.java
index f0ccdd9809..f1f62c0bc4 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/CalibrationDialog.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/CalibrationDialog.java
@@ -23,6 +23,7 @@ import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.GlucoseStatus;
import info.nightscout.androidaps.data.Profile;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.NumberPicker;
import info.nightscout.utils.SafeParse;
@@ -63,7 +64,7 @@ public class CalibrationDialog extends DialogFragment implements View.OnClickLis
view.findViewById(R.id.ok).setOnClickListener(this);
view.findViewById(R.id.cancel).setOnClickListener(this);
- String units = MainApp.getConfigBuilder().getProfileUnits();
+ String units = ProfileFunctions.getInstance().getProfileUnits();
Double bg = Profile.fromMgdlToUnits(GlucoseStatus.getGlucoseStatusData() != null ? GlucoseStatus.getGlucoseStatusData().glucose : 0d, units);
bgNumber = (NumberPicker) view.findViewById(R.id.overview_calibration_bg);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/ErrorDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/ErrorDialog.java
index 7d45c35792..dc4fa21aca 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/ErrorDialog.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/ErrorDialog.java
@@ -15,7 +15,7 @@ import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.Services.AlarmSoundService;
+import info.nightscout.androidaps.services.AlarmSoundService;
public class ErrorDialog extends DialogFragment implements View.OnClickListener {
private static Logger log = LoggerFactory.getLogger(ErrorDialog.class);
@@ -74,7 +74,7 @@ public class ErrorDialog extends DialogFragment implements View.OnClickListener
@Override
public void dismiss() {
- super.dismiss();
+ super.dismissAllowingStateLoss();
if (helperActivity != null) {
helperActivity.finish();
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/ErrorHelperActivity.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/ErrorHelperActivity.java
index 90cf9aecd5..c556a6c844 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/ErrorHelperActivity.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/ErrorHelperActivity.java
@@ -4,7 +4,7 @@ import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import info.nightscout.androidaps.R;
-import info.nightscout.utils.NSUpload;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.utils.SP;
public class ErrorHelperActivity extends AppCompatActivity {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewCarbsDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewCarbsDialog.java
index 26f46081ea..40450adf77 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewCarbsDialog.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewCarbsDialog.java
@@ -21,7 +21,8 @@ import android.widget.RadioButton;
import com.google.common.base.Joiner;
-import info.nightscout.utils.NSUpload;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -157,13 +158,22 @@ public class NewCarbsDialog extends DialogFragment implements OnClickListener, C
BgReading bgReading = DatabaseHelper.actualBg();
if (bgReading != null && bgReading.value < 72) {
- startHypoTTCheckbox.setOnCheckedChangeListener(null);
startHypoTTCheckbox.setChecked(true);
+ // see #onCheckedChanged why listeners are registered like this
+ startHypoTTCheckbox.setOnClickListener(this);
+ } else {
+ startHypoTTCheckbox.setOnCheckedChangeListener(this);
}
- startHypoTTCheckbox.setOnClickListener(this);
setCancelable(true);
getDialog().setCanceledOnTouchOutside(false);
+
+ //recovering state if there is something
+ if (savedInstanceState != null) {
+ editCarbs.setValue(savedInstanceState.getDouble("editCarbs"));
+ editTime.setValue(savedInstanceState.getDouble("editTime"));
+ editDuration.setValue(savedInstanceState.getDouble("editDuration"));
+ }
return view;
}
@@ -171,6 +181,19 @@ public class NewCarbsDialog extends DialogFragment implements OnClickListener, C
return value > 0 ? "+" + value : String.valueOf(value);
}
+
+ @Override
+ public void onSaveInstanceState(Bundle carbsDialogState) {
+ carbsDialogState.putBoolean("startActivityTTCheckbox",startActivityTTCheckbox.isChecked());
+ carbsDialogState.putBoolean("startEatingSoonTTCheckbox", startEatingSoonTTCheckbox.isChecked());
+ carbsDialogState.putBoolean("startHypoTTCheckbox", startHypoTTCheckbox.isChecked());
+ carbsDialogState.putDouble("editTime", editTime.getValue());
+ carbsDialogState.putDouble("editDuration", editDuration.getValue());
+ carbsDialogState.putDouble("editCarbs", editCarbs.getValue());
+ super.onSaveInstanceState(carbsDialogState);
+ }
+
+
@Override
public synchronized void onClick(View view) {
switch (view.getId()) {
@@ -228,6 +251,8 @@ public class NewCarbsDialog extends DialogFragment implements OnClickListener, C
}
}
+
+
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// Logic to disable a selected radio when pressed: when a checked radio
@@ -285,7 +310,7 @@ public class NewCarbsDialog extends DialogFragment implements OnClickListener, C
}
okClicked = true;
try {
- final Profile currentProfile = MainApp.getConfigBuilder().getProfile();
+ final Profile currentProfile = ProfileFunctions.getInstance().getProfile();
if (currentProfile == null) {
return;
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewInsulinDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewInsulinDialog.java
index 2889c8266b..942fde95fb 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewInsulinDialog.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewInsulinDialog.java
@@ -39,7 +39,9 @@ import info.nightscout.androidaps.db.CareportalEvent;
import info.nightscout.androidaps.db.Source;
import info.nightscout.androidaps.db.TempTarget;
import info.nightscout.androidaps.interfaces.Constraint;
+import info.nightscout.androidaps.interfaces.PumpInterface;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.androidaps.queue.Callback;
import info.nightscout.utils.DateUtil;
@@ -48,6 +50,7 @@ import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.NumberPicker;
import info.nightscout.utils.SP;
import info.nightscout.utils.SafeParse;
+import info.nightscout.utils.T;
import info.nightscout.utils.ToastUtils;
import static info.nightscout.utils.DateUtil.now;
@@ -208,8 +211,9 @@ public class NewInsulinDialog extends DialogFragment implements OnClickListener
okClicked = true;
try {
- Profile currentProfile = MainApp.getConfigBuilder().getProfile();
- if (currentProfile == null)
+ Profile currentProfile = ProfileFunctions.getInstance().getProfile();
+ final PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
+ if (currentProfile == null || pump == null)
return;
Double insulin = SafeParse.stringToDouble(editInsulin.getText());
@@ -217,13 +221,13 @@ public class NewInsulinDialog extends DialogFragment implements OnClickListener
List actions = new LinkedList<>();
if (insulin > 0) {
- actions.add(MainApp.gs(R.string.bolus) + ": " + "" + insulinAfterConstraints + "U" + "");
+ actions.add(MainApp.gs(R.string.bolus) + ": " + "" + DecimalFormatter.toPumpSupportedBolus(insulinAfterConstraints) + "U" + "");
if (recordOnlyCheckbox.isChecked()) {
actions.add("" + MainApp.gs(R.string.bolusrecordedonly) + "");
}
}
- if (!insulinAfterConstraints.equals(insulin))
+ if (Math.abs(insulinAfterConstraints - insulin) > pump.getPumpDescription().pumpType.determineCorrectBolusSize(insulinAfterConstraints))
actions.add("" + MainApp.gs(R.string.bolusconstraintapplied) + "");
int eatingSoonTTDuration = SP.getInt(R.string.key_eatingsoon_duration, Constants.defaultEatingSoonTTDuration);
@@ -239,7 +243,7 @@ public class NewInsulinDialog extends DialogFragment implements OnClickListener
}
int timeOffset = editTime.getValue().intValue();
- final long time = now() + timeOffset * 1000 * 60;
+ final long time = now() + T.mins(timeOffset).msecs();
if (timeOffset != 0) {
actions.add(MainApp.gs(R.string.time) + ": " + DateUtil.dateAndTimeString(time));
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewTreatmentDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewTreatmentDialog.java
index 5fb698d1c5..df85279592 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewTreatmentDialog.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewTreatmentDialog.java
@@ -31,6 +31,7 @@ import info.nightscout.androidaps.data.DetailedBolusInfo;
import info.nightscout.androidaps.db.CareportalEvent;
import info.nightscout.androidaps.db.Source;
import info.nightscout.androidaps.interfaces.Constraint;
+import info.nightscout.androidaps.interfaces.PumpInterface;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.androidaps.queue.Callback;
@@ -125,6 +126,11 @@ public class NewTreatmentDialog extends DialogFragment implements OnClickListene
okClicked = true;
try {
+ final PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
+
+ if (pump == null)
+ return;
+
Double insulin = SafeParse.stringToDouble(editInsulin.getText());
final Integer carbs = SafeParse.stringToInt(editCarbs.getText());
@@ -134,15 +140,15 @@ public class NewTreatmentDialog extends DialogFragment implements OnClickListene
Integer carbsAfterConstraints = MainApp.getConstraintChecker().applyCarbsConstraints(new Constraint<>(carbs)).value();
if (insulin > 0) {
- confirmMessage += MainApp.gs(R.string.bolus) + ": " + "" + insulinAfterConstraints + "U" + "";
+ confirmMessage += MainApp.gs(R.string.bolus) + ": " + "" + DecimalFormatter.toPumpSupportedBolus(insulinAfterConstraints) + "U" + "";
if (recordOnlyCheckbox.isChecked()) {
- confirmMessage += " " + MainApp.gs(R.string.bolusrecordedonly) + "";
+ confirmMessage += " " + MainApp.gs(R.string.bolusrecordedonly) + "";
}
+ if (Math.abs(insulinAfterConstraints - insulin) > pump.getPumpDescription().pumpType.determineCorrectBolusSize(insulinAfterConstraints) || !Objects.equals(carbsAfterConstraints, carbs))
+ confirmMessage += " " + MainApp.gs(R.string.bolusconstraintapplied) + "";
}
if (carbsAfterConstraints > 0)
- confirmMessage += " " + MainApp.gs(R.string.carbs) + ": " + carbsAfterConstraints + "g";
- if (insulinAfterConstraints - insulin != 0 || !Objects.equals(carbsAfterConstraints, carbs))
- confirmMessage += " " + MainApp.gs(R.string.constraintapllied);
+ confirmMessage += " " + MainApp.gs(R.string.carbs) + ": " + "" + carbsAfterConstraints + "g" + "";
final double finalInsulinAfterConstraints = insulinAfterConstraints;
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 032104e103..ed66fe7b2f 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
@@ -55,7 +55,9 @@ import info.nightscout.androidaps.events.EventNewBG;
import info.nightscout.androidaps.events.EventRefreshOverview;
import info.nightscout.androidaps.interfaces.Constraint;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.interfaces.PumpInterface;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.IobCobCalculator.CobInfo;
import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventAutosensCalculationFinished;
@@ -147,6 +149,22 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com
MainApp.bus().unregister(this);
}
+ @Override
+ public void onSaveInstanceState(Bundle savedInstanceState) {
+ savedInstanceState.putBoolean("bgCheckbox", bgCheckbox.isChecked());
+ savedInstanceState.putBoolean("ttCheckbox", ttCheckbox.isChecked());
+ savedInstanceState.putBoolean("bolusIobCheckbox", bolusIobCheckbox.isChecked());
+ savedInstanceState.putBoolean("basalIobCheckbox", basalIobCheckbox.isChecked());
+ savedInstanceState.putBoolean("bgtrendCheckbox", bgtrendCheckbox.isChecked());
+ savedInstanceState.putBoolean("cobCheckbox", cobCheckbox.isChecked());
+ savedInstanceState.putDouble("editBg", editBg.getValue());
+ savedInstanceState.putDouble("editCarbs", editCarbs.getValue());
+ savedInstanceState.putDouble("editCorr", editCorr.getValue());
+ savedInstanceState.putDouble("editCarbTime", editCarbTime.getValue());
+ super.onSaveInstanceState(savedInstanceState);
+ }
+
+
@Subscribe
public void onStatusEvent(final EventNewBG e) {
Activity activity = getActivity();
@@ -189,7 +207,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.overview_wizard_dialog, null, false);
+ View view = inflater.inflate(R.layout.overview_wizard_dialog, container, false);
getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
@@ -259,6 +277,13 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com
setCancelable(true);
getDialog().setCanceledOnTouchOutside(false);
+ //recovering state if there is something
+ if (savedInstanceState != null) {
+ editCarbs.setValue(savedInstanceState.getDouble("editCarbs"));
+ editBg.setValue(savedInstanceState.getDouble("editBg"));
+ editCarbTime.setValue(savedInstanceState.getDouble("editCarbTime"));
+ editCorr.setValue(savedInstanceState.getDouble("editCorr"));
+ }
return view;
}
@@ -301,9 +326,10 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com
return;
}
okClicked = true;
- final Profile profile = MainApp.getConfigBuilder().getProfile();
+ final Profile profile = ProfileFunctions.getInstance().getProfile();
+ final PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
- if (profile != null && (calculatedTotalInsulin > 0d || calculatedCarbs > 0d)) {
+ if (pump != null && profile != null && (calculatedTotalInsulin > 0d || calculatedCarbs > 0d)) {
String confirmMessage = MainApp.gs(R.string.entertreatmentquestion);
Double insulinAfterConstraints = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(calculatedTotalInsulin)).value();
@@ -314,14 +340,8 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com
if (carbsAfterConstraints > 0)
confirmMessage += " " + MainApp.gs(R.string.carbs) + ": " + "" + carbsAfterConstraints + "g" + "";
- if (insulinAfterConstraints - calculatedTotalInsulin != 0 || !carbsAfterConstraints.equals(calculatedCarbs)) {
- okClicked = false;
- AlertDialog.Builder builder = new AlertDialog.Builder(context);
- builder.setTitle(MainApp.gs(R.string.treatmentdeliveryerror));
- builder.setMessage(MainApp.gs(R.string.constraints_violation) + "\n" + MainApp.gs(R.string.changeyourinput));
- builder.setPositiveButton(MainApp.gs(R.string.ok), null);
- builder.show();
- return;
+ if (Math.abs(insulinAfterConstraints - calculatedTotalInsulin) > pump.getPumpDescription().pumpType.determineCorrectBolusSize(insulinAfterConstraints) || !carbsAfterConstraints.equals(calculatedCarbs)) {
+ confirmMessage += " " + MainApp.gs(R.string.bolusconstraintapplied) + "";
}
final Double finalInsulinAfterConstraints = insulinAfterConstraints;
@@ -408,7 +428,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com
}
private void initDialog() {
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
ProfileStore profileStore = MainApp.getConfigBuilder().getActiveProfileInterface() != null ? MainApp.getConfigBuilder().getActiveProfileInterface().getProfile() : null;
if (profile == null || profileStore == null) {
@@ -458,9 +478,10 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com
return; // not initialized yet
String selectedAlternativeProfile = profileSpinner.getSelectedItem().toString();
Profile specificProfile;
- if (selectedAlternativeProfile.equals(MainApp.gs(R.string.active)))
- specificProfile = MainApp.getConfigBuilder().getProfile();
- else
+ if (selectedAlternativeProfile.equals(MainApp.gs(R.string.active))) {
+ specificProfile = ProfileFunctions.getInstance().getProfile();
+ selectedAlternativeProfile = ProfileFunctions.getInstance().getProfileName();
+ } else
specificProfile = profileStore.getSpecificProfile(selectedAlternativeProfile);
// Entered values
@@ -470,13 +491,13 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com
Double corrAfterConstraint = c_correction;
if (c_correction > 0)
c_correction = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(c_correction)).value();
- if (c_correction - corrAfterConstraint != 0) { // c_correction != corrAfterConstraint doesn't work
+ if (Math.abs(c_correction - corrAfterConstraint) > 0.01d) { // c_correction != corrAfterConstraint doesn't work
editCorr.setValue(0d);
ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.bolusconstraintapplied));
return;
}
Integer carbsAfterConstraint = MainApp.getConstraintChecker().applyCarbsConstraints(new Constraint<>(c_carbs)).value();
- if (c_carbs - carbsAfterConstraint != 0) {
+ if (Math.abs(c_carbs - carbsAfterConstraint) > 0.01d) {
editCarbs.setValue(0d);
ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.carbsconstraintapplied));
return;
@@ -554,12 +575,15 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com
boluscalcJSON = new JSONObject();
try {
boluscalcJSON.put("profile", selectedAlternativeProfile);
+ boluscalcJSON.put("notes", notesEdit.getText());
boluscalcJSON.put("eventTime", DateUtil.toISOString(new Date()));
boluscalcJSON.put("targetBGLow", wizard.targetBGLow);
boluscalcJSON.put("targetBGHigh", wizard.targetBGHigh);
boluscalcJSON.put("isf", wizard.sens);
boluscalcJSON.put("ic", wizard.ic);
boluscalcJSON.put("iob", -(wizard.insulingFromBolusIOB + wizard.insulingFromBasalsIOB));
+ boluscalcJSON.put("bolusiob", wizard.insulingFromBolusIOB);
+ boluscalcJSON.put("basaliob", wizard.insulingFromBasalsIOB);
boluscalcJSON.put("bolusiobused", bolusIobCheckbox.isChecked());
boluscalcJSON.put("basaliobused", basalIobCheckbox.isChecked());
boluscalcJSON.put("bg", c_bg);
@@ -569,11 +593,18 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com
boluscalcJSON.put("insulincarbs", wizard.insulinFromCarbs);
boluscalcJSON.put("carbs", c_carbs);
boluscalcJSON.put("cob", c_cob);
+ boluscalcJSON.put("cobused", cobCheckbox.isChecked());
boluscalcJSON.put("insulincob", wizard.insulinFromCOB);
boluscalcJSON.put("othercorrection", corrAfterConstraint);
boluscalcJSON.put("insulinsuperbolus", wizard.insulinFromSuperBolus);
boluscalcJSON.put("insulintrend", wizard.insulinFromTrend);
boluscalcJSON.put("insulin", calculatedTotalInsulin);
+ boluscalcJSON.put("superbolusused", superbolusCheckbox.isChecked());
+ boluscalcJSON.put("insulinsuperbolus", wizard.insulinFromSuperBolus);
+ boluscalcJSON.put("trendused", bgtrendCheckbox.isChecked());
+ boluscalcJSON.put("insulintrend", wizard.insulinFromTrend);
+ boluscalcJSON.put("trend", bgTrend.getText());
+ boluscalcJSON.put("ttused", ttCheckbox.isChecked());
} catch (JSONException e) {
log.error("Unhandled exception", e);
}
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 2b4ab247b8..f01c90423e 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
@@ -66,6 +66,7 @@ import info.nightscout.androidaps.db.ExtendedBolus;
import info.nightscout.androidaps.db.Source;
import info.nightscout.androidaps.db.TempTarget;
import info.nightscout.androidaps.db.TemporaryBasal;
+import info.nightscout.androidaps.events.EventAcceptOpenLoopChange;
import info.nightscout.androidaps.events.EventCareportalEventChange;
import info.nightscout.androidaps.events.EventExtendedBolusChange;
import info.nightscout.androidaps.events.EventInitializationChanged;
@@ -80,12 +81,13 @@ import info.nightscout.androidaps.interfaces.Constraint;
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.Careportal.CareportalFragment;
import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialog;
import info.nightscout.androidaps.plugins.Careportal.OptionsToShow;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
-import info.nightscout.androidaps.plugins.ConstraintsObjectives.ObjectivesPlugin;
-import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensResult;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
+import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData;
import info.nightscout.androidaps.plugins.IobCobCalculator.CobInfo;
import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventAutosensCalculationFinished;
@@ -93,6 +95,7 @@ import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventIobCalcul
import info.nightscout.androidaps.plugins.Loop.APSResult;
import info.nightscout.androidaps.plugins.Loop.LoopPlugin;
import info.nightscout.androidaps.plugins.Loop.events.EventNewOpenLoopNotification;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSDeviceStatus;
import info.nightscout.androidaps.plugins.Overview.Dialogs.CalibrationDialog;
import info.nightscout.androidaps.plugins.Overview.Dialogs.ErrorHelperActivity;
@@ -108,13 +111,13 @@ import info.nightscout.androidaps.plugins.Source.SourceDexcomG5Plugin;
import info.nightscout.androidaps.plugins.Source.SourceXdripPlugin;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.androidaps.plugins.Treatments.fragments.ProfileViewerDialog;
+import info.nightscout.androidaps.plugins.Wear.ActionStringHandler;
import info.nightscout.androidaps.queue.Callback;
import info.nightscout.utils.BolusWizard;
import info.nightscout.utils.DateUtil;
import info.nightscout.utils.DecimalFormatter;
import info.nightscout.utils.DefaultValueHelper;
import info.nightscout.utils.FabricPrivacy;
-import info.nightscout.utils.NSUpload;
import info.nightscout.utils.OKDialog;
import info.nightscout.utils.Profiler;
import info.nightscout.utils.SP;
@@ -125,7 +128,7 @@ import info.nightscout.utils.ToastUtils;
import static info.nightscout.utils.DateUtil.now;
public class OverviewFragment extends Fragment implements View.OnClickListener, View.OnLongClickListener {
- private static Logger log = LoggerFactory.getLogger(OverviewFragment.class);
+ private static Logger log = LoggerFactory.getLogger(L.OVERVIEW);
TextView timeView;
TextView bgView;
@@ -185,8 +188,6 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
Handler sLoopHandler = new Handler();
Runnable sRefreshLoop = null;
- final Object updateSync = new Object();
-
public enum CHARTTYPE {PRE, BAS, IOB, COB, DEV, SEN, DEVSLOPE}
private static final ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor();
@@ -200,255 +201,242 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
- try {
- //check screen width
- final DisplayMetrics dm = new DisplayMetrics();
- getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);
- int screen_width = dm.widthPixels;
- int screen_height = dm.heightPixels;
- smallWidth = screen_width <= Constants.SMALL_WIDTH;
- smallHeight = screen_height <= Constants.SMALL_HEIGHT;
- boolean landscape = screen_height < screen_width;
+ //check screen width
+ final DisplayMetrics dm = new DisplayMetrics();
+ getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);
+ int screen_width = dm.widthPixels;
+ int screen_height = dm.heightPixels;
+ smallWidth = screen_width <= Constants.SMALL_WIDTH;
+ smallHeight = screen_height <= Constants.SMALL_HEIGHT;
+ boolean landscape = screen_height < screen_width;
- View view;
+ View view;
- if (MainApp.sResources.getBoolean(R.bool.isTablet) && (Config.NSCLIENT || Config.G5UPLOADER)) {
- view = inflater.inflate(R.layout.overview_fragment_nsclient_tablet, container, false);
- } else if (Config.NSCLIENT || Config.G5UPLOADER) {
- view = inflater.inflate(R.layout.overview_fragment_nsclient, container, false);
- shorttextmode = true;
- } else if (smallHeight || landscape) {
- view = inflater.inflate(R.layout.overview_fragment_smallheight, container, false);
- } else {
- view = inflater.inflate(R.layout.overview_fragment, container, false);
- }
-
- timeView = (TextView) view.findViewById(R.id.overview_time);
- bgView = (TextView) view.findViewById(R.id.overview_bg);
- arrowView = (TextView) view.findViewById(R.id.overview_arrow);
- if (smallWidth) {
- arrowView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 35);
- }
- sensitivityView = (TextView) view.findViewById(R.id.overview_sensitivity);
- timeAgoView = (TextView) view.findViewById(R.id.overview_timeago);
- timeAgoShortView = (TextView) view.findViewById(R.id.overview_timeagoshort);
- deltaView = (TextView) view.findViewById(R.id.overview_delta);
- deltaShortView = (TextView) view.findViewById(R.id.overview_deltashort);
- avgdeltaView = (TextView) view.findViewById(R.id.overview_avgdelta);
- baseBasalView = (TextView) view.findViewById(R.id.overview_basebasal);
- extendedBolusView = (TextView) view.findViewById(R.id.overview_extendedbolus);
- activeProfileView = (TextView) view.findViewById(R.id.overview_activeprofile);
- pumpStatusView = (TextView) view.findViewById(R.id.overview_pumpstatus);
- pumpDeviceStatusView = (TextView) view.findViewById(R.id.overview_pump);
- openapsDeviceStatusView = (TextView) view.findViewById(R.id.overview_openaps);
- uploaderDeviceStatusView = (TextView) view.findViewById(R.id.overview_uploader);
- iobCalculationProgressView = (TextView) view.findViewById(R.id.overview_iobcalculationprogess);
- loopStatusLayout = (LinearLayout) view.findViewById(R.id.overview_looplayout);
- pumpStatusLayout = (LinearLayout) view.findViewById(R.id.overview_pumpstatuslayout);
-
- pumpStatusView.setBackgroundColor(MainApp.gc(R.color.colorInitializingBorder));
-
- iobView = (TextView) view.findViewById(R.id.overview_iob);
- cobView = (TextView) view.findViewById(R.id.overview_cob);
- apsModeView = (TextView) view.findViewById(R.id.overview_apsmode);
- tempTargetView = (TextView) view.findViewById(R.id.overview_temptarget);
-
- iage = (TextView) view.findViewById(R.id.careportal_insulinage);
- cage = (TextView) view.findViewById(R.id.careportal_canulaage);
- sage = (TextView) view.findViewById(R.id.careportal_sensorage);
- pbage = (TextView) view.findViewById(R.id.careportal_pbage);
-
- bgGraph = (GraphView) view.findViewById(R.id.overview_bggraph);
- iobGraph = (GraphView) view.findViewById(R.id.overview_iobgraph);
-
- treatmentButton = (SingleClickButton) view.findViewById(R.id.overview_treatmentbutton);
- treatmentButton.setOnClickListener(this);
- wizardButton = (SingleClickButton) view.findViewById(R.id.overview_wizardbutton);
- wizardButton.setOnClickListener(this);
- insulinButton = (SingleClickButton) view.findViewById(R.id.overview_insulinbutton);
- if (insulinButton != null)
- insulinButton.setOnClickListener(this);
- carbsButton = (SingleClickButton) view.findViewById(R.id.overview_carbsbutton);
- if (carbsButton != null)
- carbsButton.setOnClickListener(this);
- acceptTempButton = (SingleClickButton) view.findViewById(R.id.overview_accepttempbutton);
- if (acceptTempButton != null)
- acceptTempButton.setOnClickListener(this);
- quickWizardButton = (SingleClickButton) view.findViewById(R.id.overview_quickwizardbutton);
- quickWizardButton.setOnClickListener(this);
- quickWizardButton.setOnLongClickListener(this);
- calibrationButton = (SingleClickButton) view.findViewById(R.id.overview_calibrationbutton);
- if (calibrationButton != null)
- calibrationButton.setOnClickListener(this);
- cgmButton = (SingleClickButton) view.findViewById(R.id.overview_cgmbutton);
- if (cgmButton != null)
- cgmButton.setOnClickListener(this);
-
- acceptTempLayout = (LinearLayout) view.findViewById(R.id.overview_accepttemplayout);
-
- notificationsView = (RecyclerView) view.findViewById(R.id.overview_notifications);
- notificationsView.setHasFixedSize(false);
- llm = new LinearLayoutManager(view.getContext());
- notificationsView.setLayoutManager(llm);
-
- int axisWidth = 50;
-
- if (dm.densityDpi <= 120)
- axisWidth = 3;
- else if (dm.densityDpi <= 160)
- axisWidth = 10;
- else if (dm.densityDpi <= 320)
- axisWidth = 35;
- else if (dm.densityDpi <= 420)
- axisWidth = 50;
- else if (dm.densityDpi <= 560)
- axisWidth = 70;
- else
- axisWidth = 80;
-
- bgGraph.getGridLabelRenderer().setGridColor(MainApp.gc(R.color.graphgrid));
- bgGraph.getGridLabelRenderer().reloadStyles();
- iobGraph.getGridLabelRenderer().setGridColor(MainApp.gc(R.color.graphgrid));
- iobGraph.getGridLabelRenderer().reloadStyles();
- iobGraph.getGridLabelRenderer().setHorizontalLabelsVisible(false);
- bgGraph.getGridLabelRenderer().setLabelVerticalWidth(axisWidth);
- iobGraph.getGridLabelRenderer().setLabelVerticalWidth(axisWidth);
- iobGraph.getGridLabelRenderer().setNumVerticalLabels(3);
-
- rangeToDisplay = SP.getInt(R.string.key_rangetodisplay, 6);
-
- bgGraph.setOnLongClickListener(new View.OnLongClickListener() {
- @Override
- public boolean onLongClick(View v) {
- rangeToDisplay += 6;
- rangeToDisplay = rangeToDisplay > 24 ? 6 : rangeToDisplay;
- SP.putInt(R.string.key_rangetodisplay, rangeToDisplay);
- updateGUI("rangeChange");
- return false;
- }
- });
-
- setupChartMenu(view);
-
- return view;
- } catch (Exception e) {
- FabricPrivacy.logException(e);
- log.debug("Runtime Exception", e);
+ if (MainApp.sResources.getBoolean(R.bool.isTablet) && (Config.NSCLIENT)) {
+ view = inflater.inflate(R.layout.overview_fragment_nsclient_tablet, container, false);
+ } else if (Config.NSCLIENT) {
+ view = inflater.inflate(R.layout.overview_fragment_nsclient, container, false);
+ shorttextmode = true;
+ } else if (smallHeight || landscape) {
+ view = inflater.inflate(R.layout.overview_fragment_smallheight, container, false);
+ } else {
+ view = inflater.inflate(R.layout.overview_fragment, container, false);
}
- return null;
+ timeView = (TextView) view.findViewById(R.id.overview_time);
+ bgView = (TextView) view.findViewById(R.id.overview_bg);
+ arrowView = (TextView) view.findViewById(R.id.overview_arrow);
+ if (smallWidth) {
+ arrowView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 35);
+ }
+ sensitivityView = (TextView) view.findViewById(R.id.overview_sensitivity);
+ timeAgoView = (TextView) view.findViewById(R.id.overview_timeago);
+ timeAgoShortView = (TextView) view.findViewById(R.id.overview_timeagoshort);
+ deltaView = (TextView) view.findViewById(R.id.overview_delta);
+ deltaShortView = (TextView) view.findViewById(R.id.overview_deltashort);
+ avgdeltaView = (TextView) view.findViewById(R.id.overview_avgdelta);
+ baseBasalView = (TextView) view.findViewById(R.id.overview_basebasal);
+ extendedBolusView = (TextView) view.findViewById(R.id.overview_extendedbolus);
+ activeProfileView = (TextView) view.findViewById(R.id.overview_activeprofile);
+ pumpStatusView = (TextView) view.findViewById(R.id.overview_pumpstatus);
+ pumpDeviceStatusView = (TextView) view.findViewById(R.id.overview_pump);
+ openapsDeviceStatusView = (TextView) view.findViewById(R.id.overview_openaps);
+ uploaderDeviceStatusView = (TextView) view.findViewById(R.id.overview_uploader);
+ iobCalculationProgressView = (TextView) view.findViewById(R.id.overview_iobcalculationprogess);
+ loopStatusLayout = (LinearLayout) view.findViewById(R.id.overview_looplayout);
+ pumpStatusLayout = (LinearLayout) view.findViewById(R.id.overview_pumpstatuslayout);
+
+ pumpStatusView.setBackgroundColor(MainApp.gc(R.color.colorInitializingBorder));
+
+ iobView = (TextView) view.findViewById(R.id.overview_iob);
+ cobView = (TextView) view.findViewById(R.id.overview_cob);
+ apsModeView = (TextView) view.findViewById(R.id.overview_apsmode);
+ tempTargetView = (TextView) view.findViewById(R.id.overview_temptarget);
+
+ iage = (TextView) view.findViewById(R.id.careportal_insulinage);
+ cage = (TextView) view.findViewById(R.id.careportal_canulaage);
+ sage = (TextView) view.findViewById(R.id.careportal_sensorage);
+ pbage = (TextView) view.findViewById(R.id.careportal_pbage);
+
+ bgGraph = (GraphView) view.findViewById(R.id.overview_bggraph);
+ iobGraph = (GraphView) view.findViewById(R.id.overview_iobgraph);
+
+ treatmentButton = (SingleClickButton) view.findViewById(R.id.overview_treatmentbutton);
+ treatmentButton.setOnClickListener(this);
+ wizardButton = (SingleClickButton) view.findViewById(R.id.overview_wizardbutton);
+ wizardButton.setOnClickListener(this);
+ insulinButton = (SingleClickButton) view.findViewById(R.id.overview_insulinbutton);
+ if (insulinButton != null)
+ insulinButton.setOnClickListener(this);
+ carbsButton = (SingleClickButton) view.findViewById(R.id.overview_carbsbutton);
+ if (carbsButton != null)
+ carbsButton.setOnClickListener(this);
+ acceptTempButton = (SingleClickButton) view.findViewById(R.id.overview_accepttempbutton);
+ if (acceptTempButton != null)
+ acceptTempButton.setOnClickListener(this);
+ quickWizardButton = (SingleClickButton) view.findViewById(R.id.overview_quickwizardbutton);
+ quickWizardButton.setOnClickListener(this);
+ quickWizardButton.setOnLongClickListener(this);
+ calibrationButton = (SingleClickButton) view.findViewById(R.id.overview_calibrationbutton);
+ if (calibrationButton != null)
+ calibrationButton.setOnClickListener(this);
+ cgmButton = (SingleClickButton) view.findViewById(R.id.overview_cgmbutton);
+ if (cgmButton != null)
+ cgmButton.setOnClickListener(this);
+
+ acceptTempLayout = (LinearLayout) view.findViewById(R.id.overview_accepttemplayout);
+
+ notificationsView = (RecyclerView) view.findViewById(R.id.overview_notifications);
+ notificationsView.setHasFixedSize(false);
+ llm = new LinearLayoutManager(view.getContext());
+ notificationsView.setLayoutManager(llm);
+
+ int axisWidth = 50;
+
+ if (dm.densityDpi <= 120)
+ axisWidth = 3;
+ else if (dm.densityDpi <= 160)
+ axisWidth = 10;
+ else if (dm.densityDpi <= 320)
+ axisWidth = 35;
+ else if (dm.densityDpi <= 420)
+ axisWidth = 50;
+ else if (dm.densityDpi <= 560)
+ axisWidth = 70;
+ else
+ axisWidth = 80;
+
+ bgGraph.getGridLabelRenderer().setGridColor(MainApp.gc(R.color.graphgrid));
+ bgGraph.getGridLabelRenderer().reloadStyles();
+ iobGraph.getGridLabelRenderer().setGridColor(MainApp.gc(R.color.graphgrid));
+ iobGraph.getGridLabelRenderer().reloadStyles();
+ iobGraph.getGridLabelRenderer().setHorizontalLabelsVisible(false);
+ bgGraph.getGridLabelRenderer().setLabelVerticalWidth(axisWidth);
+ iobGraph.getGridLabelRenderer().setLabelVerticalWidth(axisWidth);
+ iobGraph.getGridLabelRenderer().setNumVerticalLabels(3);
+
+ rangeToDisplay = SP.getInt(R.string.key_rangetodisplay, 6);
+
+ bgGraph.setOnLongClickListener(v -> {
+ rangeToDisplay += 6;
+ rangeToDisplay = rangeToDisplay > 24 ? 6 : rangeToDisplay;
+ SP.putInt(R.string.key_rangetodisplay, rangeToDisplay);
+ updateGUI("rangeChange");
+ return false;
+ });
+
+ setupChartMenu(view);
+
+ return view;
}
private void setupChartMenu(View view) {
chartButton = (ImageButton) view.findViewById(R.id.overview_chartMenuButton);
- chartButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- final LoopPlugin.LastRun finalLastRun = LoopPlugin.lastRun;
- boolean predictionsAvailable;
- if (Config.APS)
- predictionsAvailable = finalLastRun != null && finalLastRun.request.hasPredictions;
- else if (Config.NSCLIENT)
- predictionsAvailable = true;
- else
- predictionsAvailable = false;
+ chartButton.setOnClickListener(v -> {
+ final LoopPlugin.LastRun finalLastRun = LoopPlugin.lastRun;
+ boolean predictionsAvailable;
+ if (Config.APS)
+ predictionsAvailable = finalLastRun != null && finalLastRun.request.hasPredictions;
+ else if (Config.NSCLIENT)
+ predictionsAvailable = true;
+ else
+ predictionsAvailable = false;
- MenuItem item;
- CharSequence title;
- SpannableString s;
- PopupMenu popup = new PopupMenu(v.getContext(), v);
+ MenuItem item;
+ CharSequence title;
+ SpannableString s;
+ PopupMenu popup = new PopupMenu(v.getContext(), v);
- if (predictionsAvailable) {
- item = popup.getMenu().add(Menu.NONE, CHARTTYPE.PRE.ordinal(), Menu.NONE, "Predictions");
- title = item.getTitle();
- s = new SpannableString(title);
- s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.prediction, null)), 0, s.length(), 0);
- item.setTitle(s);
- item.setCheckable(true);
- item.setChecked(SP.getBoolean("showprediction", true));
- }
-
- item = popup.getMenu().add(Menu.NONE, CHARTTYPE.BAS.ordinal(), Menu.NONE, MainApp.gs(R.string.overview_show_basals));
+ if (predictionsAvailable) {
+ item = popup.getMenu().add(Menu.NONE, CHARTTYPE.PRE.ordinal(), Menu.NONE, "Predictions");
title = item.getTitle();
s = new SpannableString(title);
- s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.basal, null)), 0, s.length(), 0);
+ s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.prediction, null)), 0, s.length(), 0);
item.setTitle(s);
item.setCheckable(true);
- item.setChecked(SP.getBoolean("showbasals", true));
-
- item = popup.getMenu().add(Menu.NONE, CHARTTYPE.IOB.ordinal(), Menu.NONE, MainApp.gs(R.string.overview_show_iob));
- title = item.getTitle();
- s = new SpannableString(title);
- s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.iob, null)), 0, s.length(), 0);
- item.setTitle(s);
- item.setCheckable(true);
- item.setChecked(SP.getBoolean("showiob", true));
-
- item = popup.getMenu().add(Menu.NONE, CHARTTYPE.COB.ordinal(), Menu.NONE, MainApp.gs(R.string.overview_show_cob));
- title = item.getTitle();
- s = new SpannableString(title);
- s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.cob, null)), 0, s.length(), 0);
- item.setTitle(s);
- item.setCheckable(true);
- item.setChecked(SP.getBoolean("showcob", true));
-
- item = popup.getMenu().add(Menu.NONE, CHARTTYPE.DEV.ordinal(), Menu.NONE, MainApp.gs(R.string.overview_show_deviations));
- title = item.getTitle();
- s = new SpannableString(title);
- s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.deviations, null)), 0, s.length(), 0);
- item.setTitle(s);
- item.setCheckable(true);
- item.setChecked(SP.getBoolean("showdeviations", false));
-
- item = popup.getMenu().add(Menu.NONE, CHARTTYPE.SEN.ordinal(), Menu.NONE, MainApp.gs(R.string.overview_show_sensitivity));
- title = item.getTitle();
- s = new SpannableString(title);
- s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.ratio, null)), 0, s.length(), 0);
- item.setTitle(s);
- item.setCheckable(true);
- item.setChecked(SP.getBoolean("showratios", false));
-
- if (MainApp.devBranch) {
- item = popup.getMenu().add(Menu.NONE, CHARTTYPE.DEVSLOPE.ordinal(), Menu.NONE, "Deviation slope");
- title = item.getTitle();
- s = new SpannableString(title);
- s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.devslopepos, null)), 0, s.length(), 0);
- item.setTitle(s);
- item.setCheckable(true);
- item.setChecked(SP.getBoolean("showdevslope", false));
- }
-
- popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
- @Override
- public boolean onMenuItemClick(MenuItem item) {
- if (item.getItemId() == CHARTTYPE.PRE.ordinal()) {
- SP.putBoolean("showprediction", !item.isChecked());
- } else if (item.getItemId() == CHARTTYPE.BAS.ordinal()) {
- SP.putBoolean("showbasals", !item.isChecked());
- } else if (item.getItemId() == CHARTTYPE.IOB.ordinal()) {
- SP.putBoolean("showiob", !item.isChecked());
- } else if (item.getItemId() == CHARTTYPE.COB.ordinal()) {
- SP.putBoolean("showcob", !item.isChecked());
- } else if (item.getItemId() == CHARTTYPE.DEV.ordinal()) {
- SP.putBoolean("showdeviations", !item.isChecked());
- } else if (item.getItemId() == CHARTTYPE.SEN.ordinal()) {
- SP.putBoolean("showratios", !item.isChecked());
- } else if (item.getItemId() == CHARTTYPE.DEVSLOPE.ordinal()) {
- SP.putBoolean("showdevslope", !item.isChecked());
- }
- scheduleUpdateGUI("onGraphCheckboxesCheckedChanged");
- return true;
- }
- });
- chartButton.setImageResource(R.drawable.ic_arrow_drop_up_white_24dp);
- popup.setOnDismissListener(new PopupMenu.OnDismissListener() {
- @Override
- public void onDismiss(PopupMenu menu) {
- chartButton.setImageResource(R.drawable.ic_arrow_drop_down_white_24dp);
- }
- });
- popup.show();
+ item.setChecked(SP.getBoolean("showprediction", true));
}
+
+ item = popup.getMenu().add(Menu.NONE, CHARTTYPE.BAS.ordinal(), Menu.NONE, MainApp.gs(R.string.overview_show_basals));
+ title = item.getTitle();
+ s = new SpannableString(title);
+ s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.basal, null)), 0, s.length(), 0);
+ item.setTitle(s);
+ item.setCheckable(true);
+ item.setChecked(SP.getBoolean("showbasals", true));
+
+ item = popup.getMenu().add(Menu.NONE, CHARTTYPE.IOB.ordinal(), Menu.NONE, MainApp.gs(R.string.overview_show_iob));
+ title = item.getTitle();
+ s = new SpannableString(title);
+ s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.iob, null)), 0, s.length(), 0);
+ item.setTitle(s);
+ item.setCheckable(true);
+ item.setChecked(SP.getBoolean("showiob", true));
+
+ item = popup.getMenu().add(Menu.NONE, CHARTTYPE.COB.ordinal(), Menu.NONE, MainApp.gs(R.string.overview_show_cob));
+ title = item.getTitle();
+ s = new SpannableString(title);
+ s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.cob, null)), 0, s.length(), 0);
+ item.setTitle(s);
+ item.setCheckable(true);
+ item.setChecked(SP.getBoolean("showcob", true));
+
+ item = popup.getMenu().add(Menu.NONE, CHARTTYPE.DEV.ordinal(), Menu.NONE, MainApp.gs(R.string.overview_show_deviations));
+ title = item.getTitle();
+ s = new SpannableString(title);
+ s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.deviations, null)), 0, s.length(), 0);
+ item.setTitle(s);
+ item.setCheckable(true);
+ item.setChecked(SP.getBoolean("showdeviations", false));
+
+ item = popup.getMenu().add(Menu.NONE, CHARTTYPE.SEN.ordinal(), Menu.NONE, MainApp.gs(R.string.overview_show_sensitivity));
+ title = item.getTitle();
+ s = new SpannableString(title);
+ s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.ratio, null)), 0, s.length(), 0);
+ item.setTitle(s);
+ item.setCheckable(true);
+ item.setChecked(SP.getBoolean("showratios", false));
+
+ if (MainApp.devBranch) {
+ item = popup.getMenu().add(Menu.NONE, CHARTTYPE.DEVSLOPE.ordinal(), Menu.NONE, "Deviation slope");
+ title = item.getTitle();
+ s = new SpannableString(title);
+ s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.devslopepos, null)), 0, s.length(), 0);
+ item.setTitle(s);
+ item.setCheckable(true);
+ item.setChecked(SP.getBoolean("showdevslope", false));
+ }
+
+ popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ if (item.getItemId() == CHARTTYPE.PRE.ordinal()) {
+ SP.putBoolean("showprediction", !item.isChecked());
+ } else if (item.getItemId() == CHARTTYPE.BAS.ordinal()) {
+ SP.putBoolean("showbasals", !item.isChecked());
+ } else if (item.getItemId() == CHARTTYPE.IOB.ordinal()) {
+ SP.putBoolean("showiob", !item.isChecked());
+ } else if (item.getItemId() == CHARTTYPE.COB.ordinal()) {
+ SP.putBoolean("showcob", !item.isChecked());
+ } else if (item.getItemId() == CHARTTYPE.DEV.ordinal()) {
+ SP.putBoolean("showdeviations", !item.isChecked());
+ } else if (item.getItemId() == CHARTTYPE.SEN.ordinal()) {
+ SP.putBoolean("showratios", !item.isChecked());
+ } else if (item.getItemId() == CHARTTYPE.DEVSLOPE.ordinal()) {
+ SP.putBoolean("showdevslope", !item.isChecked());
+ }
+ scheduleUpdateGUI("onGraphCheckboxesCheckedChanged");
+ return true;
+ }
+ });
+ chartButton.setImageResource(R.drawable.ic_arrow_drop_up_white_24dp);
+ popup.setOnDismissListener(new PopupMenu.OnDismissListener() {
+ @Override
+ public void onDismiss(PopupMenu menu) {
+ chartButton.setImageResource(R.drawable.ic_arrow_drop_down_white_24dp);
+ }
+ });
+ popup.show();
});
}
@@ -459,7 +447,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
if (v == apsModeView) {
final LoopPlugin loopPlugin = LoopPlugin.getPlugin();
final PumpDescription pumpDescription = ConfigBuilderPlugin.getActivePump().getPumpDescription();
- if (loopPlugin == null || !MainApp.getConfigBuilder().isProfileValid("ContexMenuCreation"))
+ if (!ProfileFunctions.getInstance().isProfileValid("ContexMenuCreation"))
return;
menu.setHeaderTitle(MainApp.gs(R.string.loop));
if (loopPlugin.isEnabled(PluginType.LOOP)) {
@@ -502,7 +490,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
@Override
public boolean onContextItemSelected(MenuItem item) {
- final Profile profile = MainApp.getConfigBuilder().getProfile();
+ final Profile profile = ProfileFunctions.getInstance().getProfile();
if (profile == null)
return true;
final LoopPlugin loopPlugin = LoopPlugin.getPlugin();
@@ -542,39 +530,39 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
NSUpload.uploadOpenAPSOffline(0);
return true;
} else if (item.getTitle().equals(MainApp.gs(R.string.suspendloopfor1h))) {
- MainApp.getConfigBuilder().suspendLoop(60);
+ LoopPlugin.getPlugin().suspendLoop(60);
updateGUI("suspendmenu");
return true;
} else if (item.getTitle().equals(MainApp.gs(R.string.suspendloopfor2h))) {
- MainApp.getConfigBuilder().suspendLoop(120);
+ LoopPlugin.getPlugin().suspendLoop(120);
updateGUI("suspendmenu");
return true;
} else if (item.getTitle().equals(MainApp.gs(R.string.suspendloopfor3h))) {
- MainApp.getConfigBuilder().suspendLoop(180);
+ LoopPlugin.getPlugin().suspendLoop(180);
updateGUI("suspendmenu");
return true;
} else if (item.getTitle().equals(MainApp.gs(R.string.suspendloopfor10h))) {
- MainApp.getConfigBuilder().suspendLoop(600);
+ LoopPlugin.getPlugin().suspendLoop(600);
updateGUI("suspendmenu");
return true;
} else if (item.getTitle().equals(MainApp.gs(R.string.disconnectpumpfor15m))) {
- MainApp.getConfigBuilder().disconnectPump(15, profile);
+ LoopPlugin.getPlugin().disconnectPump(15, profile);
updateGUI("suspendmenu");
return true;
} else if (item.getTitle().equals(MainApp.gs(R.string.disconnectpumpfor30m))) {
- MainApp.getConfigBuilder().disconnectPump(30, profile);
+ LoopPlugin.getPlugin().disconnectPump(30, profile);
updateGUI("suspendmenu");
return true;
} else if (item.getTitle().equals(MainApp.gs(R.string.disconnectpumpfor1h))) {
- MainApp.getConfigBuilder().disconnectPump(60, profile);
+ LoopPlugin.getPlugin().disconnectPump(60, profile);
updateGUI("suspendmenu");
return true;
} else if (item.getTitle().equals(MainApp.gs(R.string.disconnectpumpfor2h))) {
- MainApp.getConfigBuilder().disconnectPump(120, profile);
+ LoopPlugin.getPlugin().disconnectPump(120, profile);
updateGUI("suspendmenu");
return true;
} else if (item.getTitle().equals(MainApp.gs(R.string.disconnectpumpfor3h))) {
- MainApp.getConfigBuilder().disconnectPump(180, profile);
+ LoopPlugin.getPlugin().disconnectPump(180, profile);
updateGUI("suspendmenu");
return true;
} else if (item.getTitle().equals(MainApp.gs(R.string.careportal_profileswitch))) {
@@ -595,8 +583,8 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
.duration(defHelper.determineEatingSoonTTDuration())
.reason(MainApp.gs(R.string.eatingsoon))
.source(Source.USER)
- .low(target)
- .high(target);
+ .low(Profile.toMgdl(target, profile.getUnits()))
+ .high(Profile.toMgdl(target, profile.getUnits()));
TreatmentsPlugin.getPlugin().addToHistoryTempTarget(tempTarget);
} else if (item.getTitle().equals(MainApp.gs(R.string.activity))) {
DefaultValueHelper defHelper = new DefaultValueHelper();
@@ -606,8 +594,8 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
.duration(defHelper.determineActivityTTDuration())
.reason(MainApp.gs(R.string.activity))
.source(Source.USER)
- .low(target)
- .high(target);
+ .low(Profile.toMgdl(target, profile.getUnits()))
+ .high(Profile.toMgdl(target, profile.getUnits()));
TreatmentsPlugin.getPlugin().addToHistoryTempTarget(tempTarget);
} else if (item.getTitle().equals(MainApp.gs(R.string.hypo))) {
DefaultValueHelper defHelper = new DefaultValueHelper();
@@ -615,10 +603,10 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
TempTarget tempTarget = new TempTarget()
.date(now())
.duration(defHelper.determineHypoTTDuration())
- .reason(MainApp.gs(R.string.activity))
+ .reason(MainApp.gs(R.string.hypo))
.source(Source.USER)
- .low(target)
- .high(target);
+ .low(Profile.toMgdl(target, profile.getUnits()))
+ .high(Profile.toMgdl(target, profile.getUnits()));
TreatmentsPlugin.getPlugin().addToHistoryTempTarget(tempTarget);
} else if (item.getTitle().equals(MainApp.gs(R.string.custom))) {
NewNSTreatmentDialog newTTDialog = new NewNSTreatmentDialog();
@@ -641,9 +629,9 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
@Override
public void onClick(View v) {
- boolean xdrip = MainApp.getSpecificPlugin(SourceXdripPlugin.class) != null && MainApp.getSpecificPlugin(SourceXdripPlugin.class).isEnabled(PluginType.BGSOURCE);
- boolean g5 = MainApp.getSpecificPlugin(SourceDexcomG5Plugin.class) != null && MainApp.getSpecificPlugin(SourceDexcomG5Plugin.class).isEnabled(PluginType.BGSOURCE);
- String units = MainApp.getConfigBuilder().getProfileUnits();
+ boolean xdrip = SourceXdripPlugin.getPlugin().isEnabled(PluginType.BGSOURCE);
+ boolean g5 = SourceDexcomG5Plugin.getPlugin().isEnabled(PluginType.BGSOURCE);
+ String units = ProfileFunctions.getInstance().getProfileUnits();
FragmentManager manager = getFragmentManager();
// try to fix https://fabric.io/nightscout3/android/apps/info.nightscout.androidaps/issues/5aca7a1536c7b23527eb4be7?time=last-seven-days
@@ -731,7 +719,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
}
private void onClickAcceptTemp() {
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
Context context = getContext();
if (context == null) return;
@@ -746,24 +734,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
builder.setPositiveButton(MainApp.gs(R.string.ok), (dialog, id) -> {
hideTempRecommendation();
clearNotification();
- MainApp.getConfigBuilder().applyTBRRequest(finalLastRun.constraintsProcessed, profile, new Callback() {
- @Override
- public void run() {
- if (result.enacted) {
- finalLastRun.tbrSetByPump = result;
- finalLastRun.lastEnact = new Date();
- finalLastRun.lastOpenModeAccept = new Date();
- NSUpload.uploadDeviceStatus();
- ObjectivesPlugin objectivesPlugin = MainApp.getSpecificPlugin(ObjectivesPlugin.class);
- if (objectivesPlugin != null) {
- ObjectivesPlugin.manualEnacts++;
- ObjectivesPlugin.saveProgress();
- }
- }
- scheduleUpdateGUI("onClickAcceptTemp");
- }
- });
- FabricPrivacy.getInstance().logCustom(new CustomEvent("AcceptTemp"));
+ LoopPlugin.getPlugin().acceptChangeRequest();
});
builder.setNegativeButton(MainApp.gs(R.string.cancel), null);
builder.show();
@@ -773,7 +744,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
void onClickQuickwizard() {
final BgReading actualBg = DatabaseHelper.actualBg();
- final Profile profile = MainApp.getConfigBuilder().getProfile();
+ final Profile profile = ProfileFunctions.getInstance().getProfile();
final TempTarget tempTarget = TreatmentsPlugin.getPlugin().getTempTargetFromHistory();
final QuickWizardEntry quickWizardEntry = OverviewPlugin.getPlugin().quickWizard.getActive();
@@ -832,7 +803,8 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
builder.setPositiveButton(MainApp.gs(R.string.ok), (dialog, id) -> {
synchronized (builder) {
if (accepted) {
- log.debug("guarding: already accepted");
+ if (L.isEnabled(L.OVERVIEW))
+ log.debug("guarding: already accepted");
return;
}
accepted = true;
@@ -962,6 +934,11 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
scheduleUpdateGUI("EventNewOpenLoopNotification");
}
+ @Subscribe
+ public void onStatusEvent(final EventAcceptOpenLoopChange ev) {
+ scheduleUpdateGUI("EventAcceptOpenLoopChange");
+ }
+
@Subscribe
public void onStatusEvent(final EventTempTargetChange ev) {
scheduleUpdateGUI("EventTempTargetChange");
@@ -1002,6 +979,8 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
NotificationManager notificationManager =
(NotificationManager) MainApp.instance().getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(Constants.notificationID);
+
+ ActionStringHandler.handleInitiate("cancelChangeRequest");
}
private void updatePumpStatus(String status) {
@@ -1037,8 +1016,9 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
@SuppressLint("SetTextI18n")
public void updateGUI(final String from) {
- log.debug("updateGUI entered from: " + from);
- final Date updateGUIStart = new Date();
+ if (L.isEnabled(L.OVERVIEW))
+ log.debug("updateGUI entered from: " + from);
+ final long updateGUIStart = System.currentTimeMillis();
if (getActivity() == null)
return;
@@ -1052,7 +1032,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
pumpStatusLayout.setVisibility(View.GONE);
loopStatusLayout.setVisibility(View.GONE);
- if (!MainApp.getConfigBuilder().isProfileValid("Overview")) {
+ if (!ProfileFunctions.getInstance().isProfileValid("Overview")) {
pumpStatusView.setText(R.string.noprofileset);
pumpStatusLayout.setVisibility(View.VISIBLE);
return;
@@ -1065,7 +1045,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
final PumpInterface pump = ConfigBuilderPlugin.getActivePump();
- final Profile profile = MainApp.getConfigBuilder().getProfile();
+ final Profile profile = ProfileFunctions.getInstance().getProfile();
final String units = profile.getUnits();
final double lowLine = OverviewPlugin.getPlugin().determineLowLine(units);
@@ -1212,7 +1192,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
if (activeTemp != null) {
basalText = activeTemp.toStringFull() + " ";
}
- if (Config.NSCLIENT || Config.G5UPLOADER)
+ if (Config.NSCLIENT)
basalText += "(" + DecimalFormatter.to2Decimal(profile.getBasal()) + " U/h)";
else if (pump.getPumpDescription().isTempBasalCapable) {
basalText += "(" + DecimalFormatter.to2Decimal(pump.getBaseBasalRate()) + "U/h)";
@@ -1240,16 +1220,16 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
}
}
extendedBolusView.setText(extendedBolusText);
- if (Config.NSCLIENT || Config.G5UPLOADER) {
+ if (Config.NSCLIENT) {
extendedBolusView.setOnClickListener(v -> OKDialog.show(getActivity(), MainApp.gs(R.string.extendedbolus), extendedBolus.toString(), null));
}
if (extendedBolusText.equals(""))
- extendedBolusView.setVisibility(Config.NSCLIENT || Config.G5UPLOADER ? View.INVISIBLE : View.GONE);
+ extendedBolusView.setVisibility(Config.NSCLIENT ? View.INVISIBLE : View.GONE);
else
extendedBolusView.setVisibility(View.VISIBLE);
}
- activeProfileView.setText(MainApp.getConfigBuilder().getProfileName());
+ activeProfileView.setText(ProfileFunctions.getInstance().getProfileName());
activeProfileView.setBackgroundColor(Color.GRAY);
// QuickWizard button
@@ -1284,14 +1264,14 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
treatmentButton.setVisibility(View.GONE);
}
}
- if (wizardButton != null) {
+ if (pump.isInitialized() && !pump.isSuspended() && wizardButton != null) {
if (SP.getBoolean(R.string.key_show_wizard_button, true)) {
wizardButton.setVisibility(View.VISIBLE);
} else {
wizardButton.setVisibility(View.GONE);
}
}
- if (insulinButton != null) {
+ if (pump.isInitialized() && !pump.isSuspended() && insulinButton != null) {
if (SP.getBoolean(R.string.key_show_insulin_button, true)) {
insulinButton.setVisibility(View.VISIBLE);
} else {
@@ -1378,15 +1358,15 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
// Uploader status from ns
if (uploaderDeviceStatusView != null) {
- uploaderDeviceStatusView.setText(NSDeviceStatus.getInstance().getUploaderStatus());
+ uploaderDeviceStatusView.setText(NSDeviceStatus.getInstance().getUploaderStatusSpanned());
uploaderDeviceStatusView.setOnClickListener(v -> OKDialog.show(getActivity(), MainApp.gs(R.string.uploader), NSDeviceStatus.getInstance().getExtendedUploaderStatus(), null));
}
// Sensitivity
if (sensitivityView != null) {
- AutosensResult lastAutosensResult = IobCobCalculatorPlugin.getPlugin().detectSensitivityWithLock(IobCobCalculatorPlugin.getPlugin().oldestDataAvailable(), System.currentTimeMillis());
- if (lastAutosensResult != null)
- sensitivityView.setText(String.format("%.0f%%", lastAutosensResult.ratio * 100));
+ AutosensData autosensData = IobCobCalculatorPlugin.getPlugin().getLastAutosensDataSynchronized("Overview");
+ if (autosensData != null)
+ sensitivityView.setText(String.format("%.0f%%", autosensData.autosensResult.ratio * 100));
else
sensitivityView.setText("");
}
@@ -1432,7 +1412,8 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
final long now = System.currentTimeMillis();
// ------------------ 1st graph
- Profiler.log(log, from + " - 1st graph - START", updateGUIStart);
+ if (L.isEnabled(L.OVERVIEW))
+ Profiler.log(log, from + " - 1st graph - START", updateGUIStart);
final GraphData graphData = new GraphData(bgGraph, IobCobCalculatorPlugin.getPlugin());
@@ -1464,7 +1445,8 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
graphData.addNowLine(now);
// ------------------ 2nd graph
- Profiler.log(log, from + " - 2nd graph - START", updateGUIStart);
+ if (L.isEnabled(L.OVERVIEW))
+ Profiler.log(log, from + " - 2nd graph - START", updateGUIStart);
final GraphData secondGraphData = new GraphData(iobGraph, IobCobCalculatorPlugin.getPlugin());
@@ -1518,12 +1500,14 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
// finally enforce drawing of graphs
graphData.performUpdate();
secondGraphData.performUpdate();
- Profiler.log(log, from + " - onDataChanged", updateGUIStart);
+ if (L.isEnabled(L.OVERVIEW))
+ Profiler.log(log, from + " - onDataChanged", updateGUIStart);
});
}
}).start();
- Profiler.log(log, from, updateGUIStart);
+ if (L.isEnabled(L.OVERVIEW))
+ Profiler.log(log, from, updateGUIStart);
}
//Notifications
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewPlugin.java
index 3b787fd768..b184201908 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewPlugin.java
@@ -15,6 +15,8 @@ import info.nightscout.androidaps.events.EventRefreshOverview;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.Overview.notifications.NotificationStore;
@@ -24,7 +26,7 @@ import info.nightscout.utils.SP;
* Created by mike on 05.08.2016.
*/
public class OverviewPlugin extends PluginBase {
- private static Logger log = LoggerFactory.getLogger(OverviewPlugin.class);
+ private static Logger log = LoggerFactory.getLogger(L.OVERVIEW);
private static OverviewPlugin overviewPlugin = new OverviewPlugin();
@@ -91,7 +93,7 @@ public class OverviewPlugin extends PluginBase {
}
public double determineLowLine() {
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
if (profile == null) {
return bgTargetLow;
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/events/EventOverviewBolusProgress.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/events/EventOverviewBolusProgress.java
index 6f9526369e..18e8ff91bc 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/events/EventOverviewBolusProgress.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/events/EventOverviewBolusProgress.java
@@ -7,7 +7,6 @@ import info.nightscout.androidaps.plugins.Treatments.Treatment;
import info.nightscout.androidaps.events.Event;
public class EventOverviewBolusProgress extends Event {
- private static Logger log = LoggerFactory.getLogger(EventOverviewBolusProgress.class);
public String status = "";
public Treatment t = null;
public int percent = 0;
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 20feb76124..948e0e1ef4 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
@@ -11,6 +11,9 @@ import com.jjoe64.graphview.series.DataPoint;
import com.jjoe64.graphview.series.LineGraphSeries;
import com.jjoe64.graphview.series.Series;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -24,7 +27,9 @@ import info.nightscout.androidaps.db.CareportalEvent;
import info.nightscout.androidaps.db.ExtendedBolus;
import info.nightscout.androidaps.db.ProfileSwitch;
import info.nightscout.androidaps.db.TempTarget;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData;
import info.nightscout.androidaps.plugins.IobCobCalculator.BasalData;
import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
@@ -47,6 +52,7 @@ import info.nightscout.utils.Round;
*/
public class GraphData {
+ private static Logger log = LoggerFactory.getLogger(L.OVERVIEW);
private GraphView graph;
public double maxY = Double.MIN_VALUE;
@@ -58,21 +64,25 @@ public class GraphData {
private IobCobCalculatorPlugin iobCobCalculatorPlugin;
public GraphData(GraphView graph, IobCobCalculatorPlugin iobCobCalculatorPlugin) {
- units = MainApp.getConfigBuilder().getProfileUnits();
+ units = ProfileFunctions.getInstance().getProfileUnits();
this.graph = graph;
this.iobCobCalculatorPlugin = iobCobCalculatorPlugin;
}
public void addBgReadings(long fromTime, long toTime, double lowLine, double highLine, List predictions) {
double maxBgValue = Double.MIN_VALUE;
- bgReadingsArray = MainApp.getDbHelper().getBgreadingsDataFromTime(fromTime, true);
+ //bgReadingsArray = MainApp.getDbHelper().getBgreadingsDataFromTime(fromTime, true);
+ bgReadingsArray = iobCobCalculatorPlugin.getBgReadings();
List bgListArray = new ArrayList<>();
- if (bgReadingsArray.size() == 0) {
+ if (bgReadingsArray == null || bgReadingsArray.size() == 0) {
+ if (L.isEnabled(L.OVERVIEW))
+ log.debug("No BG data.");
return;
}
for (BgReading bg : bgReadingsArray) {
+ if (bg.date < fromTime || bg.date > toTime) continue;
if (bg.value > maxBgValue) maxBgValue = bg.value;
bgListArray.add(bg);
}
@@ -135,9 +145,9 @@ public class GraphData {
double lastBaseBasal = 0;
double lastTempBasal = 0;
for (long time = fromTime; time < toTime; time += 60 * 1000L) {
- Profile profile = MainApp.getConfigBuilder().getProfile(time);
+ Profile profile = ProfileFunctions.getInstance().getProfile(time);
if (profile == null) continue;
- BasalData basalData = IobCobCalculatorPlugin.getPlugin().getBasalData(profile, time);
+ BasalData basalData = iobCobCalculatorPlugin.getBasalData(profile, time);
double baseBasalValue = basalData.basal;
double absoluteLineValue = baseBasalValue;
double tempBasalValue = 0;
@@ -233,7 +243,7 @@ public class GraphData {
targetsScale.setMultiplier(1);
List targetsSeriesArray = new ArrayList<>();
- double lastTarget = 0;
+ double lastTarget = -1;
if (LoopPlugin.lastRun != null && LoopPlugin.lastRun.constraintsProcessed != null) {
APSResult apsResult = LoopPlugin.lastRun.constraintsProcessed;
@@ -243,22 +253,22 @@ public class GraphData {
}
}
- for (long time = fromTime; time < toTime; time += 60 * 1000L) {
+ for (long time = fromTime; time < toTime; time += 5 * 60 * 1000L) {
TempTarget tt = TreatmentsPlugin.getPlugin().getTempTargetFromHistory(time);
double value;
if (tt == null) {
value = (profile.getTargetLow(time) + profile.getTargetHigh(time)) / 2;
} else {
- value = tt.target();
- value = Profile.fromMgdlToUnits(value, profile.getUnits());
+ value = Profile.fromMgdlToUnits(tt.target(), profile.getUnits());
}
- if (lastTarget > 0 && lastTarget != value) {
- targetsSeriesArray.add(new DataPoint(time, lastTarget));
+ if (lastTarget != value) {
+ if (lastTarget != -1)
+ targetsSeriesArray.add(new DataPoint(time, lastTarget));
+ targetsSeriesArray.add(new DataPoint(time, value));
}
lastTarget = value;
-
- targetsSeriesArray.add(new DataPoint(time, value));
}
+ targetsSeriesArray.add(new DataPoint(toTime, lastTarget));
DataPoint[] targets = new DataPoint[targetsSeriesArray.size()];
targets = targetsSeriesArray.toArray(targets);
@@ -321,13 +331,15 @@ public class GraphData {
}
private double getNearestBg(long date) {
- for (int r = bgReadingsArray.size() - 1; r >= 0; r--) {
+ if (bgReadingsArray == null)
+ return Profile.fromMgdlToUnits(100, units);
+ for (int r = 0; r < bgReadingsArray.size(); r++) {
BgReading reading = bgReadingsArray.get(r);
if (reading.date > date) continue;
return Profile.fromMgdlToUnits(reading.value, units);
}
return bgReadingsArray.size() > 0
- ? Profile.fromMgdlToUnits(bgReadingsArray.get(0).value, units) : 0;
+ ? Profile.fromMgdlToUnits(bgReadingsArray.get(0).value, units) : Profile.fromMgdlToUnits(100, units);
}
// scale in % of vertical size (like 0.3)
@@ -339,10 +351,10 @@ public class GraphData {
Scale iobScale = new Scale();
for (long time = fromTime; time <= toTime; time += 5 * 60 * 1000L) {
- Profile profile = MainApp.getConfigBuilder().getProfile(time);
+ Profile profile = ProfileFunctions.getInstance().getProfile(time);
double iob = 0d;
if (profile != null)
- iob = IobCobCalculatorPlugin.getPlugin().calculateFromTreatmentsAndTempsSynchronized(time, profile).iob;
+ iob = iobCobCalculatorPlugin.calculateFromTreatmentsAndTempsSynchronized(time, profile).iob;
if (Math.abs(lastIob - iob) > 0.02) {
if (Math.abs(lastIob - iob) > 0.2)
iobArray.add(new ScaledDataPoint(time, lastIob, iobScale));
@@ -380,7 +392,7 @@ public class GraphData {
Scale cobScale = new Scale();
for (long time = fromTime; time <= toTime; time += 5 * 60 * 1000L) {
- AutosensData autosensData = IobCobCalculatorPlugin.getPlugin().getAutosensData(time);
+ AutosensData autosensData = iobCobCalculatorPlugin.getAutosensData(time);
if (autosensData != null) {
int cob = (int) autosensData.cob;
if (cob != lastCob) {
@@ -438,7 +450,7 @@ public class GraphData {
Scale devScale = new Scale();
for (long time = fromTime; time <= toTime; time += 5 * 60 * 1000L) {
- AutosensData autosensData = IobCobCalculatorPlugin.getPlugin().getAutosensData(time);
+ AutosensData autosensData = iobCobCalculatorPlugin.getAutosensData(time);
if (autosensData != null) {
int color = MainApp.gc(R.color.deviationblack); // "="
if (autosensData.type.equals("") || autosensData.type.equals("non-meal")) {
@@ -488,7 +500,7 @@ public class GraphData {
Scale ratioScale = new Scale();
for (long time = fromTime; time <= toTime; time += 5 * 60 * 1000L) {
- AutosensData autosensData = IobCobCalculatorPlugin.getPlugin().getAutosensData(time);
+ AutosensData autosensData = iobCobCalculatorPlugin.getAutosensData(time);
if (autosensData != null) {
ratioArray.add(new ScaledDataPoint(time, autosensData.autosensResult.ratio - 1, ratioScale));
maxRatioValueFound = Math.max(maxRatioValueFound, autosensData.autosensResult.ratio - 1);
@@ -504,11 +516,11 @@ public class GraphData {
ratioSeries.setThickness(3);
if (useForScale) {
- maxY = maxRatioValueFound;
- minY = minRatioValueFound;
+ maxY = Math.max(maxRatioValueFound, Math.abs(minRatioValueFound));
+ minY = -maxY;
}
- ratioScale.setMultiplier(maxY * scale / maxRatioValueFound);
+ ratioScale.setMultiplier(maxY * scale / Math.max(maxRatioValueFound, Math.abs(minRatioValueFound)));
addSeries(ratioSeries);
}
@@ -525,7 +537,7 @@ public class GraphData {
Scale dsMinScale = new Scale();
for (long time = fromTime; time <= toTime; time += 5 * 60 * 1000L) {
- AutosensData autosensData = IobCobCalculatorPlugin.getPlugin().getAutosensData(time);
+ AutosensData autosensData = iobCobCalculatorPlugin.getAutosensData(time);
if (autosensData != null) {
dsMaxArray.add(new ScaledDataPoint(time, autosensData.slopeFromMaxDeviation, dsMaxScale));
dsMinArray.add(new ScaledDataPoint(time, autosensData.slopeFromMinDeviation, dsMinScale));
@@ -604,8 +616,10 @@ public class GraphData {
}
}
- graph.getViewport().setMaxY(Round.ceilTo(maxY, 1d));
- graph.getViewport().setMinY(Round.floorTo(minY, 1d));
+ double step = 1d;
+ if (maxY < 1) step = 0.1d;
+ graph.getViewport().setMaxY(Round.ceilTo(maxY, step));
+ graph.getViewport().setMinY(Round.floorTo(minY, step));
graph.getViewport().setYAxisBoundsManual(true);
// draw it
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/Notification.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/Notification.java
index 9952865761..e79a26a503 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/Notification.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/Notification.java
@@ -20,8 +20,6 @@ import info.nightscout.utils.SP;
*/
public class Notification {
- private static Logger log = LoggerFactory.getLogger(Notification.class);
-
public static final int URGENT = 0;
public static final int NORMAL = 1;
public static final int LOW = 2;
@@ -67,7 +65,11 @@ public class Notification {
public static final int PERMISSION_BATTERY = 37;
public static final int PERMISSION_SMS = 38;
public static final int MAXIMUM_BASAL_VALUE_REPLACED = 39;
- public static final int MEDTRONIC_PUMP_ALARM = 40;
+ public static final int NSMALFUNCTION = 40;
+ public static final int NEWVERSIONDETECTED = 41;
+ public static final int SENDLOGFILES = 42;
+ public static final int MEDTRONIC_PUMP_ALARM = 44;
+
public int id;
public Date date;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationRecyclerViewAdapter.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationRecyclerViewAdapter.java
index 895b99a43e..9af6be3be3 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationRecyclerViewAdapter.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationRecyclerViewAdapter.java
@@ -17,6 +17,7 @@ import java.util.Objects;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.NSClientInternal.broadcasts.BroadcastAckAlarm;
import info.nightscout.androidaps.plugins.Overview.OverviewPlugin;
import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification;
@@ -24,7 +25,7 @@ import info.nightscout.utils.DateUtil;
import info.nightscout.utils.SP;
public class NotificationRecyclerViewAdapter extends RecyclerView.Adapter {
- private static Logger log = LoggerFactory.getLogger(NotificationRecyclerViewAdapter.class);
+ private static Logger log = LoggerFactory.getLogger(L.NOTIFICATION);
private List notificationsList;
@@ -96,11 +97,13 @@ public class NotificationRecyclerViewAdapter extends RecyclerView.Adapter store = new ArrayList();
- public long snoozedUntil = 0L;
+ private static Logger log = LoggerFactory.getLogger(L.NOTIFICATION);
+ public List store = new ArrayList<>();
private boolean usesChannels;
public NotificationStore() {
@@ -52,7 +52,8 @@ public class NotificationStore {
}
public synchronized boolean add(Notification n) {
- log.info("Notification received: " + n.text);
+ if (L.isEnabled(L.NOTIFICATION))
+ log.debug("Notification received: " + n.text);
for (Notification storeNotification : store) {
if (storeNotification.id == n.id) {
storeNotification.date = n.date;
@@ -107,7 +108,8 @@ public class NotificationStore {
}
public void snoozeTo(long timeToSnooze) {
- log.debug("Snoozing alarm until: " + timeToSnooze);
+ if (L.isEnabled(L.NOTIFICATION))
+ log.debug("Snoozing alarm until: " + timeToSnooze);
SP.putLong("snoozedTo", timeToSnooze);
}
@@ -116,7 +118,8 @@ public class NotificationStore {
Notification notification = new Notification(Notification.NSALARM, MainApp.gs(R.string.nsalarm_staledata), Notification.URGENT);
SP.putLong("snoozedTo", System.currentTimeMillis());
add(notification);
- log.debug("Snoozed to current time and added back notification!");
+ if (L.isEnabled(L.NOTIFICATION))
+ log.debug("Snoozed to current time and added back notification!");
}
}
@@ -125,7 +128,7 @@ public class NotificationStore {
NotificationManager mgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Bitmap largeIcon = BitmapFactory.decodeResource(context.getResources(), R.mipmap.blueowl);
int smallIcon = R.drawable.ic_notification;
- if (Config.NSCLIENT || Config.G5UPLOADER){
+ if (Config.NSCLIENT) {
largeIcon = BitmapFactory.decodeResource(MainApp.instance().getResources(), R.mipmap.yellowowl);
smallIcon = R.drawable.nsclient_smallicon;
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/DummyService.java b/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/DummyService.java
index fad1147dfc..56b3a2cd09 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/DummyService.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/DummyService.java
@@ -6,10 +6,21 @@ import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
+import com.squareup.otto.Subscribe;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.events.EventAppExit;
+import info.nightscout.androidaps.logging.L;
+
/**
* Keeps AndroidAPS in foreground state, so it won't be terminated by Android nor get restricted by the background execution limits
*/
public class DummyService extends Service {
+ private static Logger log = LoggerFactory.getLogger(L.CORE);
+
@Nullable
@Override
public IBinder onBind(Intent intent) {
@@ -24,8 +35,24 @@ public class DummyService extends Service {
return START_STICKY;
}
+ @Subscribe
+ public void onStatusEvent(EventAppExit event) {
+ if (L.isEnabled(L.CORE))
+ log.debug("EventAppExit received");
+
+ stopSelf();
+ }
+
+ @Override
+ public void onCreate() {
+ MainApp.bus().register(this);
+ }
+
@Override
public void onDestroy() {
+ if (L.isEnabled(L.CORE))
+ log.debug("onDestroy");
+ MainApp.bus().unregister(this);
stopForeground(true);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java
index f6a9494a20..a8263b541f 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java
@@ -37,6 +37,7 @@ import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.utils.DecimalFormatter;
@@ -108,9 +109,9 @@ public class PersistentNotificationPlugin extends PluginBase {
String line1 = "";
- if (MainApp.getConfigBuilder().getActiveProfileInterface() == null || !MainApp.getConfigBuilder().isProfileValid("Notificiation"))
+ if (MainApp.getConfigBuilder().getActiveProfileInterface() == null || !ProfileFunctions.getInstance().isProfileValid("Notificiation"))
return null;
- String units = MainApp.getConfigBuilder().getProfileUnits();
+ String units = ProfileFunctions.getInstance().getProfileUnits();
BgReading lastBG = DatabaseHelper.lastBg();
@@ -147,14 +148,14 @@ public class PersistentNotificationPlugin extends PluginBase {
String line3 = DecimalFormatter.to2Decimal(ConfigBuilderPlugin.getActivePump().getBaseBasalRate()) + " U/h";
- line3 += " - " + MainApp.getConfigBuilder().getProfileName();
+ line3 += " - " + ProfileFunctions.getInstance().getProfileName();
NotificationCompat.Builder builder = new NotificationCompat.Builder(ctx, CHANNEL_ID);
builder.setOngoing(true);
builder.setOnlyAlertOnce(true);
builder.setCategory(NotificationCompat.CATEGORY_STATUS);
- if (Config.NSCLIENT || Config.G5UPLOADER){
+ if (Config.NSCLIENT){
builder.setSmallIcon(R.drawable.nsclient_smallicon);
Bitmap largeIcon = BitmapFactory.decodeResource(ctx.getResources(), R.mipmap.yellowowl);
builder.setLargeIcon(largeIcon);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileLocal/LocalProfileFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileLocal/LocalProfileFragment.java
index 18060ba1ec..3fab80855a 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileLocal/LocalProfileFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileLocal/LocalProfileFragment.java
@@ -25,20 +25,18 @@ import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.ProfileStore;
import info.nightscout.androidaps.events.EventInitializationChanged;
import info.nightscout.androidaps.interfaces.PumpDescription;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Careportal.CareportalFragment;
import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialog;
import info.nightscout.androidaps.plugins.Careportal.OptionsToShow;
import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.utils.DecimalFormatter;
-import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.NumberPicker;
import info.nightscout.utils.SafeParse;
import info.nightscout.utils.TimeListEdit;
public class LocalProfileFragment extends SubscriberFragment {
- private static Logger log = LoggerFactory.getLogger(LocalProfileFragment.class);
-
NumberPicker diaView;
RadioButton mgdlView;
RadioButton mmolView;
@@ -81,80 +79,72 @@ public class LocalProfileFragment extends SubscriberFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
- try {
+ PumpDescription pumpDescription = ConfigBuilderPlugin.getActivePump().getPumpDescription();
+ View layout = inflater.inflate(R.layout.localprofile_fragment, container, false);
+ diaView = (NumberPicker) layout.findViewById(R.id.localprofile_dia);
+ diaView.setParams(LocalProfilePlugin.getPlugin().dia, 2d, 48d, 0.1d, new DecimalFormat("0.0"), false, textWatch);
+ mgdlView = (RadioButton) layout.findViewById(R.id.localprofile_mgdl);
+ mmolView = (RadioButton) layout.findViewById(R.id.localprofile_mmol);
+ icView = new TimeListEdit(getContext(), layout, R.id.localprofile_ic, MainApp.gs(R.string.nsprofileview_ic_label) + ":", LocalProfilePlugin.getPlugin().ic, null, 0.5, 50d, 0.1d, new DecimalFormat("0.0"), save);
+ isfView = new TimeListEdit(getContext(), layout, R.id.localprofile_isf, MainApp.gs(R.string.nsprofileview_isf_label) + ":", LocalProfilePlugin.getPlugin().isf, null, 0.5, 500d, 0.1d, new DecimalFormat("0.0"), save);
+ basalView = new TimeListEdit(getContext(), layout, R.id.localprofile_basal, MainApp.gs(R.string.nsprofileview_basal_label) + ": " + getSumLabel(), LocalProfilePlugin.getPlugin().basal, null, pumpDescription.basalMinimumRate, 10, 0.01d, new DecimalFormat("0.00"), save);
+ targetView = new TimeListEdit(getContext(), layout, R.id.localprofile_target, MainApp.gs(R.string.nsprofileview_target_label) + ":", LocalProfilePlugin.getPlugin().targetLow, LocalProfilePlugin.getPlugin().targetHigh, 3d, 200, 0.1d, new DecimalFormat("0.0"), save);
+ profileswitchButton = (Button) layout.findViewById(R.id.localprofile_profileswitch);
+ resetButton = (Button) layout.findViewById(R.id.localprofile_reset);
+ saveButton = (Button) layout.findViewById(R.id.localprofile_save);
- PumpDescription pumpDescription = ConfigBuilderPlugin.getActivePump().getPumpDescription();
- View layout = inflater.inflate(R.layout.localprofile_fragment, container, false);
- diaView = (NumberPicker) layout.findViewById(R.id.localprofile_dia);
- diaView.setParams(LocalProfilePlugin.getPlugin().dia, 2d, 48d, 0.1d, new DecimalFormat("0.0"), false, textWatch);
- mgdlView = (RadioButton) layout.findViewById(R.id.localprofile_mgdl);
- mmolView = (RadioButton) layout.findViewById(R.id.localprofile_mmol);
+
+ invalidProfile = (TextView) layout.findViewById(R.id.invalidprofile);
+
+ if (!ConfigBuilderPlugin.getActivePump().getPumpDescription().isTempBasalCapable) {
+ layout.findViewById(R.id.localprofile_basal).setVisibility(View.GONE);
+ }
+
+ mgdlView.setChecked(LocalProfilePlugin.getPlugin().mgdl);
+ mmolView.setChecked(LocalProfilePlugin.getPlugin().mmol);
+
+ mgdlView.setOnClickListener(v -> {
+ LocalProfilePlugin.getPlugin().mgdl = mgdlView.isChecked();
+ LocalProfilePlugin.getPlugin().mmol = !LocalProfilePlugin.getPlugin().mgdl;
+ mmolView.setChecked(LocalProfilePlugin.getPlugin().mmol);
+ doEdit();
+ });
+ mmolView.setOnClickListener(v -> {
+ LocalProfilePlugin.getPlugin().mmol = mmolView.isChecked();
+ LocalProfilePlugin.getPlugin().mgdl = !LocalProfilePlugin.getPlugin().mmol;
+ mgdlView.setChecked(LocalProfilePlugin.getPlugin().mgdl);
+ doEdit();
+ });
+
+ profileswitchButton.setOnClickListener(view -> {
+ NewNSTreatmentDialog newDialog = new NewNSTreatmentDialog();
+ final OptionsToShow profileswitch = CareportalFragment.PROFILESWITCHDIRECT;
+ profileswitch.executeProfileSwitch = true;
+ newDialog.setOptions(profileswitch, R.string.careportal_profileswitch);
+ newDialog.show(getFragmentManager(), "NewNSTreatmentDialog");
+ });
+
+ resetButton.setOnClickListener(view -> {
+ LocalProfilePlugin.getPlugin().loadSettings();
+ mgdlView.setChecked(LocalProfilePlugin.getPlugin().mgdl);
+ mmolView.setChecked(LocalProfilePlugin.getPlugin().mmol);
+ diaView.setParams(LocalProfilePlugin.getPlugin().dia, 5d, 12d, 0.1d, new DecimalFormat("0.0"), false, textWatch);
icView = new TimeListEdit(getContext(), layout, R.id.localprofile_ic, MainApp.gs(R.string.nsprofileview_ic_label) + ":", LocalProfilePlugin.getPlugin().ic, null, 0.5, 50d, 0.1d, new DecimalFormat("0.0"), save);
isfView = new TimeListEdit(getContext(), layout, R.id.localprofile_isf, MainApp.gs(R.string.nsprofileview_isf_label) + ":", LocalProfilePlugin.getPlugin().isf, null, 0.5, 500d, 0.1d, new DecimalFormat("0.0"), save);
basalView = new TimeListEdit(getContext(), layout, R.id.localprofile_basal, MainApp.gs(R.string.nsprofileview_basal_label) + ": " + getSumLabel(), LocalProfilePlugin.getPlugin().basal, null, pumpDescription.basalMinimumRate, 10, 0.01d, new DecimalFormat("0.00"), save);
targetView = new TimeListEdit(getContext(), layout, R.id.localprofile_target, MainApp.gs(R.string.nsprofileview_target_label) + ":", LocalProfilePlugin.getPlugin().targetLow, LocalProfilePlugin.getPlugin().targetHigh, 3d, 200, 0.1d, new DecimalFormat("0.0"), save);
- profileswitchButton = (Button) layout.findViewById(R.id.localprofile_profileswitch);
- resetButton = (Button) layout.findViewById(R.id.localprofile_reset);
- saveButton = (Button) layout.findViewById(R.id.localprofile_save);
+ updateGUI();
+ });
-
- invalidProfile = (TextView) layout.findViewById(R.id.invalidprofile);
-
- if (!ConfigBuilderPlugin.getActivePump().getPumpDescription().isTempBasalCapable) {
- layout.findViewById(R.id.localprofile_basal).setVisibility(View.GONE);
+ saveButton.setOnClickListener(view -> {
+ if (!LocalProfilePlugin.getPlugin().isValidEditState()) {
+ return; //Should not happen as saveButton should not be visible if not valid
}
+ LocalProfilePlugin.getPlugin().storeSettings();
+ updateGUI();
+ });
- mgdlView.setChecked(LocalProfilePlugin.getPlugin().mgdl);
- mmolView.setChecked(LocalProfilePlugin.getPlugin().mmol);
-
- mgdlView.setOnClickListener(v -> {
- LocalProfilePlugin.getPlugin().mgdl = mgdlView.isChecked();
- LocalProfilePlugin.getPlugin().mmol = !LocalProfilePlugin.getPlugin().mgdl;
- mmolView.setChecked(LocalProfilePlugin.getPlugin().mmol);
- doEdit();
- });
- mmolView.setOnClickListener(v -> {
- LocalProfilePlugin.getPlugin().mmol = mmolView.isChecked();
- LocalProfilePlugin.getPlugin().mgdl = !LocalProfilePlugin.getPlugin().mmol;
- mgdlView.setChecked(LocalProfilePlugin.getPlugin().mgdl);
- doEdit();
- });
-
- profileswitchButton.setOnClickListener(view -> {
- NewNSTreatmentDialog newDialog = new NewNSTreatmentDialog();
- final OptionsToShow profileswitch = CareportalFragment.PROFILESWITCHDIRECT;
- profileswitch.executeProfileSwitch = true;
- newDialog.setOptions(profileswitch, R.string.careportal_profileswitch);
- newDialog.show(getFragmentManager(), "NewNSTreatmentDialog");
- });
-
- resetButton.setOnClickListener(view -> {
- LocalProfilePlugin.getPlugin().loadSettings();
- mgdlView.setChecked(LocalProfilePlugin.getPlugin().mgdl);
- mmolView.setChecked(LocalProfilePlugin.getPlugin().mmol);
- diaView.setParams(LocalProfilePlugin.getPlugin().dia, 5d, 12d, 0.1d, new DecimalFormat("0.0"), false, textWatch);
- icView = new TimeListEdit(getContext(), layout, R.id.localprofile_ic, MainApp.gs(R.string.nsprofileview_ic_label) + ":", LocalProfilePlugin.getPlugin().ic, null, 0.5, 50d, 0.1d, new DecimalFormat("0.0"), save);
- isfView = new TimeListEdit(getContext(), layout, R.id.localprofile_isf, MainApp.gs(R.string.nsprofileview_isf_label) + ":", LocalProfilePlugin.getPlugin().isf, null, 0.5, 500d, 0.1d, new DecimalFormat("0.0"), save);
- basalView = new TimeListEdit(getContext(), layout, R.id.localprofile_basal, MainApp.gs(R.string.nsprofileview_basal_label) + ": " + getSumLabel(), LocalProfilePlugin.getPlugin().basal, null, pumpDescription.basalMinimumRate, 10, 0.01d, new DecimalFormat("0.00"), save);
- targetView = new TimeListEdit(getContext(), layout, R.id.localprofile_target, MainApp.gs(R.string.nsprofileview_target_label) + ":", LocalProfilePlugin.getPlugin().targetLow, LocalProfilePlugin.getPlugin().targetHigh, 3d, 200, 0.1d, new DecimalFormat("0.0"), save);
- updateGUI();
- });
-
- saveButton.setOnClickListener(view -> {
- if(!LocalProfilePlugin.getPlugin().isValidEditState()){
- return; //Should not happen as saveButton should not be visible if not valid
- }
- LocalProfilePlugin.getPlugin().storeSettings();
- updateGUI();
- });
-
- return layout;
- } catch (Exception e) {
- log.error("Unhandled exception: ", e);
- FabricPrivacy.logException(e);
- }
-
- return null;
+ return layout;
}
public void doEdit() {
@@ -203,7 +193,7 @@ public class LocalProfileFragment extends SubscriberFragment {
}
//Show reset button iff data was edited
- if(isEdited) {
+ if (isEdited) {
resetButton.setVisibility(View.VISIBLE);
} else {
resetButton.setVisibility(View.GONE);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileLocal/LocalProfilePlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileLocal/LocalProfilePlugin.java
index 8d4e2d6a36..7a06860327 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileLocal/LocalProfilePlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileLocal/LocalProfilePlugin.java
@@ -8,7 +8,6 @@ import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
@@ -18,6 +17,7 @@ import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.interfaces.ProfileInterface;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.utils.DecimalFormatter;
import info.nightscout.utils.SP;
@@ -26,7 +26,7 @@ import info.nightscout.utils.SP;
*/
public class LocalProfilePlugin extends PluginBase implements ProfileInterface {
public static final String LOCAL_PROFILE = "LocalProfile";
- private static Logger log = LoggerFactory.getLogger(LocalProfilePlugin.class);
+ private static Logger log = LoggerFactory.getLogger(L.PROFILE);
private static LocalProfilePlugin localProfilePlugin;
@@ -81,13 +81,13 @@ public class LocalProfilePlugin extends PluginBase implements ProfileInterface {
createAndStoreConvertedProfile();
edited = false;
- if (Config.logPrefsChange)
+ if (L.isEnabled(L.PROFILE))
log.debug("Storing settings: " + getRawProfile().getData().toString());
MainApp.bus().post(new EventProfileStoreChanged());
}
public synchronized void loadSettings() {
- if (Config.logPrefsChange)
+ if (L.isEnabled(L.PROFILE))
log.debug("Loading stored settings");
mgdl = SP.getBoolean(LOCAL_PROFILE + "mgdl", false);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileNS/NSProfileFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileNS/NSProfileFragment.java
index 6cc9fdf98e..e3aeca0c45 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileNS/NSProfileFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileNS/NSProfileFragment.java
@@ -24,10 +24,10 @@ import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.data.ProfileStore;
import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialog;
import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.ProfileNS.events.EventNSProfileUpdateGUI;
import info.nightscout.androidaps.plugins.Treatments.fragments.ProfileGraph;
import info.nightscout.utils.DecimalFormatter;
-import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.OKDialog;
import static butterknife.OnItemSelected.Callback.NOTHING_SELECTED;
@@ -62,24 +62,22 @@ public class NSProfileFragment extends SubscriberFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
- try {
- View view = inflater.inflate(R.layout.nsprofile_fragment, container, false);
+ View view = inflater.inflate(R.layout.nsprofile_fragment, container, false);
- unbinder = ButterKnife.bind(this, view);
- updateGUI();
- return view;
- } catch (Exception e) {
- FabricPrivacy.logException(e);
- }
-
- return null;
+ unbinder = ButterKnife.bind(this, view);
+ updateGUI();
+ return view;
}
@Subscribe
public void onStatusEvent(final EventNSProfileUpdateGUI ev) {
Activity activity = getActivity();
if (activity != null)
- activity.runOnUiThread(() -> { synchronized (NSProfileFragment.this) { updateGUI(); } });
+ activity.runOnUiThread(() -> {
+ synchronized (NSProfileFragment.this) {
+ updateGUI();
+ }
+ });
}
@Override
@@ -95,7 +93,7 @@ public class NSProfileFragment extends SubscriberFragment {
profileSpinner.setAdapter(adapter);
// set selected to actual profile
for (int p = 0; p < profileList.size(); p++) {
- if (profileList.get(p).equals(MainApp.getConfigBuilder().getProfileName()))
+ if (profileList.get(p).equals(ProfileFunctions.getInstance().getProfileName()))
profileSpinner.setSelection(p);
}
noProfile.setVisibility(View.GONE);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileNS/NSProfilePlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileNS/NSProfilePlugin.java
index 404aff0608..99e4ad9115 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileNS/NSProfilePlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileNS/NSProfilePlugin.java
@@ -1,10 +1,9 @@
package info.nightscout.androidaps.plugins.ProfileNS;
import android.content.Intent;
+import android.os.Bundle;
import android.support.annotation.Nullable;
-import com.squareup.otto.Subscribe;
-
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
@@ -14,7 +13,8 @@ import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.Services.Intents;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.services.Intents;
import info.nightscout.androidaps.data.ProfileStore;
import info.nightscout.androidaps.events.EventProfileStoreChanged;
import info.nightscout.androidaps.interfaces.PluginBase;
@@ -28,7 +28,7 @@ import info.nightscout.utils.SP;
* Created by mike on 05.08.2016.
*/
public class NSProfilePlugin extends PluginBase implements ProfileInterface {
- private static Logger log = LoggerFactory.getLogger(NSProfilePlugin.class);
+ private static Logger log = LoggerFactory.getLogger(L.PROFILE);
private static NSProfilePlugin nsProfilePlugin;
@@ -65,41 +65,51 @@ public class NSProfilePlugin extends PluginBase implements ProfileInterface {
MainApp.bus().unregister(this);
}
- @Subscribe
- public void storeNewProfile(ProfileStore newProfile) {
- profile = new ProfileStore(newProfile.getData());
- storeNSProfile();
- MainApp.bus().post(new EventNSProfileUpdateGUI());
- MainApp.bus().post(new EventProfileStoreChanged());
+ public void handleNewData(Intent intent) {
+ try {
+ Bundle bundles = intent.getExtras();
+ if (bundles == null) return;
+
+ String activeProfile = bundles.getString("activeprofile");
+ String profileString = bundles.getString("profile");
+ profile = new ProfileStore(new JSONObject(profileString));
+ storeNSProfile();
+ if (isEnabled(PluginType.PROFILE)) {
+ MainApp.bus().post(new EventProfileStoreChanged());
+ MainApp.bus().post(new EventNSProfileUpdateGUI());
+ }
+ if (L.isEnabled(L.PROFILE))
+ log.debug("Received profileStore: " + activeProfile + " " + profile);
+ } catch (JSONException e) {
+ log.error("Unhandled exception", e);
+ }
}
private void storeNSProfile() {
SP.putString("profile", profile.getData().toString());
- if (Config.logPrefsChange)
+ if (L.isEnabled(L.PROFILE))
log.debug("Storing profile");
}
private void loadNSProfile() {
- if (Config.logPrefsChange)
+ if (L.isEnabled(L.PROFILE))
log.debug("Loading stored profile");
String profileString = SP.getString("profile", null);
if (profileString != null) {
- if (Config.logPrefsChange) {
+ if (L.isEnabled(L.PROFILE))
log.debug("Loaded profile: " + profileString);
- try {
- profile = new ProfileStore(new JSONObject(profileString));
- } catch (JSONException e) {
- log.error("Unhandled exception", e);
- profile = null;
- }
+ try {
+ profile = new ProfileStore(new JSONObject(profileString));
+ } catch (JSONException e) {
+ log.error("Unhandled exception", e);
+ profile = null;
}
} else {
- if (Config.logPrefsChange) {
+ if (L.isEnabled(L.PROFILE))
log.debug("Stored profile not found");
- // force restart of nsclient to fetch profile
- Intent restartNSClient = new Intent(Intents.ACTION_RESTART);
- MainApp.instance().getApplicationContext().sendBroadcast(restartNSClient);
- }
+ // force restart of nsclient to fetch profile
+ Intent restartNSClient = new Intent(Intents.ACTION_RESTART);
+ MainApp.instance().getApplicationContext().sendBroadcast(restartNSClient);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileSimple/SimpleProfileFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileSimple/SimpleProfileFragment.java
index 1315413e38..5e090cd9ba 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileSimple/SimpleProfileFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileSimple/SimpleProfileFragment.java
@@ -26,12 +26,9 @@ import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialo
import info.nightscout.androidaps.plugins.Careportal.OptionsToShow;
import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
-import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.SafeParse;
public class SimpleProfileFragment extends SubscriberFragment {
- private static Logger log = LoggerFactory.getLogger(SimpleProfileFragment.class);
-
EditText diaView;
RadioButton mgdlView;
RadioButton mmolView;
@@ -46,92 +43,86 @@ public class SimpleProfileFragment extends SubscriberFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
- try {
- View layout = inflater.inflate(R.layout.simpleprofile_fragment, container, false);
- diaView = (EditText) layout.findViewById(R.id.simpleprofile_dia);
- mgdlView = (RadioButton) layout.findViewById(R.id.simpleprofile_mgdl);
- mmolView = (RadioButton) layout.findViewById(R.id.simpleprofile_mmol);
- icView = (EditText) layout.findViewById(R.id.simpleprofile_ic);
- isfView = (EditText) layout.findViewById(R.id.simpleprofile_isf);
- basalView = (EditText) layout.findViewById(R.id.simpleprofile_basalrate);
- targetlowView = (EditText) layout.findViewById(R.id.simpleprofile_targetlow);
- targethighView = (EditText) layout.findViewById(R.id.simpleprofile_targethigh);
- profileswitchButton = (Button) layout.findViewById(R.id.simpleprofile_profileswitch);
- invalidProfile = (TextView) layout.findViewById(R.id.invalidprofile);
+ View layout = inflater.inflate(R.layout.simpleprofile_fragment, container, false);
+ diaView = (EditText) layout.findViewById(R.id.simpleprofile_dia);
+ mgdlView = (RadioButton) layout.findViewById(R.id.simpleprofile_mgdl);
+ mmolView = (RadioButton) layout.findViewById(R.id.simpleprofile_mmol);
+ icView = (EditText) layout.findViewById(R.id.simpleprofile_ic);
+ isfView = (EditText) layout.findViewById(R.id.simpleprofile_isf);
+ basalView = (EditText) layout.findViewById(R.id.simpleprofile_basalrate);
+ targetlowView = (EditText) layout.findViewById(R.id.simpleprofile_targetlow);
+ targethighView = (EditText) layout.findViewById(R.id.simpleprofile_targethigh);
+ profileswitchButton = (Button) layout.findViewById(R.id.simpleprofile_profileswitch);
+ invalidProfile = (TextView) layout.findViewById(R.id.invalidprofile);
- if (!ConfigBuilderPlugin.getActivePump().getPumpDescription().isTempBasalCapable) {
- layout.findViewById(R.id.simpleprofile_basalrate).setVisibility(View.GONE);
- layout.findViewById(R.id.simpleprofile_basalrate_label).setVisibility(View.GONE);
- }
-
- mgdlView.setChecked(SimpleProfilePlugin.getPlugin().mgdl);
- mmolView.setChecked(SimpleProfilePlugin.getPlugin().mmol);
- diaView.setText(SimpleProfilePlugin.getPlugin().dia.toString());
- icView.setText(SimpleProfilePlugin.getPlugin().ic.toString());
- isfView.setText(SimpleProfilePlugin.getPlugin().isf.toString());
- basalView.setText(SimpleProfilePlugin.getPlugin().basal.toString());
- targetlowView.setText(SimpleProfilePlugin.getPlugin().targetLow.toString());
- targethighView.setText(SimpleProfilePlugin.getPlugin().targetHigh.toString());
-
- mgdlView.setOnClickListener(v -> {
- SimpleProfilePlugin.getPlugin().mgdl = mgdlView.isChecked();
- SimpleProfilePlugin.getPlugin().mmol = !SimpleProfilePlugin.getPlugin().mgdl;
- mmolView.setChecked(SimpleProfilePlugin.getPlugin().mmol);
- SimpleProfilePlugin.getPlugin().storeSettings();
- });
- mmolView.setOnClickListener(v -> {
- SimpleProfilePlugin.getPlugin().mmol = mmolView.isChecked();
- SimpleProfilePlugin.getPlugin().mgdl = !SimpleProfilePlugin.getPlugin().mmol;
- mgdlView.setChecked(SimpleProfilePlugin.getPlugin().mgdl);
- SimpleProfilePlugin.getPlugin().storeSettings();
- });
-
- profileswitchButton.setOnClickListener(view -> {
- NewNSTreatmentDialog newDialog = new NewNSTreatmentDialog();
- final OptionsToShow profileswitch = CareportalFragment.PROFILESWITCH;
- profileswitch.executeProfileSwitch = true;
- newDialog.setOptions(profileswitch, R.string.careportal_profileswitch);
- newDialog.show(getFragmentManager(), "NewNSTreatmentDialog");
- });
-
- TextWatcher textWatch = new TextWatcher() {
-
- @Override
- public void afterTextChanged(Editable s) {
- }
-
- @Override
- public void beforeTextChanged(CharSequence s, int start,
- int count, int after) {
- }
-
- @Override
- public void onTextChanged(CharSequence s, int start,
- int before, int count) {
- SimpleProfilePlugin.getPlugin().dia = SafeParse.stringToDouble(diaView.getText().toString());
- SimpleProfilePlugin.getPlugin().ic = SafeParse.stringToDouble(icView.getText().toString());
- SimpleProfilePlugin.getPlugin().isf = SafeParse.stringToDouble(isfView.getText().toString());
- SimpleProfilePlugin.getPlugin().basal = SafeParse.stringToDouble(basalView.getText().toString());
- SimpleProfilePlugin.getPlugin().targetLow = SafeParse.stringToDouble(targetlowView.getText().toString());
- SimpleProfilePlugin.getPlugin().targetHigh = SafeParse.stringToDouble(targethighView.getText().toString());
- SimpleProfilePlugin.getPlugin().storeSettings();
- updateGUI();
- }
- };
-
- diaView.addTextChangedListener(textWatch);
- icView.addTextChangedListener(textWatch);
- isfView.addTextChangedListener(textWatch);
- basalView.addTextChangedListener(textWatch);
- targetlowView.addTextChangedListener(textWatch);
- targethighView.addTextChangedListener(textWatch);
-
- return layout;
- } catch (Exception e) {
- FabricPrivacy.logException(e);
+ if (!ConfigBuilderPlugin.getActivePump().getPumpDescription().isTempBasalCapable) {
+ layout.findViewById(R.id.simpleprofile_basalrate).setVisibility(View.GONE);
+ layout.findViewById(R.id.simpleprofile_basalrate_label).setVisibility(View.GONE);
}
- return null;
+ mgdlView.setChecked(SimpleProfilePlugin.getPlugin().mgdl);
+ mmolView.setChecked(SimpleProfilePlugin.getPlugin().mmol);
+ diaView.setText(SimpleProfilePlugin.getPlugin().dia.toString());
+ icView.setText(SimpleProfilePlugin.getPlugin().ic.toString());
+ isfView.setText(SimpleProfilePlugin.getPlugin().isf.toString());
+ basalView.setText(SimpleProfilePlugin.getPlugin().basal.toString());
+ targetlowView.setText(SimpleProfilePlugin.getPlugin().targetLow.toString());
+ targethighView.setText(SimpleProfilePlugin.getPlugin().targetHigh.toString());
+
+ mgdlView.setOnClickListener(v -> {
+ SimpleProfilePlugin.getPlugin().mgdl = mgdlView.isChecked();
+ SimpleProfilePlugin.getPlugin().mmol = !SimpleProfilePlugin.getPlugin().mgdl;
+ mmolView.setChecked(SimpleProfilePlugin.getPlugin().mmol);
+ SimpleProfilePlugin.getPlugin().storeSettings();
+ });
+ mmolView.setOnClickListener(v -> {
+ SimpleProfilePlugin.getPlugin().mmol = mmolView.isChecked();
+ SimpleProfilePlugin.getPlugin().mgdl = !SimpleProfilePlugin.getPlugin().mmol;
+ mgdlView.setChecked(SimpleProfilePlugin.getPlugin().mgdl);
+ SimpleProfilePlugin.getPlugin().storeSettings();
+ });
+
+ profileswitchButton.setOnClickListener(view -> {
+ NewNSTreatmentDialog newDialog = new NewNSTreatmentDialog();
+ final OptionsToShow profileswitch = CareportalFragment.PROFILESWITCH;
+ profileswitch.executeProfileSwitch = true;
+ newDialog.setOptions(profileswitch, R.string.careportal_profileswitch);
+ newDialog.show(getFragmentManager(), "NewNSTreatmentDialog");
+ });
+
+ TextWatcher textWatch = new TextWatcher() {
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ }
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start,
+ int count, int after) {
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start,
+ int before, int count) {
+ SimpleProfilePlugin.getPlugin().dia = SafeParse.stringToDouble(diaView.getText().toString());
+ SimpleProfilePlugin.getPlugin().ic = SafeParse.stringToDouble(icView.getText().toString());
+ SimpleProfilePlugin.getPlugin().isf = SafeParse.stringToDouble(isfView.getText().toString());
+ SimpleProfilePlugin.getPlugin().basal = SafeParse.stringToDouble(basalView.getText().toString());
+ SimpleProfilePlugin.getPlugin().targetLow = SafeParse.stringToDouble(targetlowView.getText().toString());
+ SimpleProfilePlugin.getPlugin().targetHigh = SafeParse.stringToDouble(targethighView.getText().toString());
+ SimpleProfilePlugin.getPlugin().storeSettings();
+ updateGUI();
+ }
+ };
+
+ diaView.addTextChangedListener(textWatch);
+ icView.addTextChangedListener(textWatch);
+ isfView.addTextChangedListener(textWatch);
+ basalView.addTextChangedListener(textWatch);
+ targetlowView.addTextChangedListener(textWatch);
+ targethighView.addTextChangedListener(textWatch);
+
+ return layout;
}
@Subscribe
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileSimple/SimpleProfilePlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileSimple/SimpleProfilePlugin.java
index bb669289ee..09742bd3f9 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileSimple/SimpleProfilePlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileSimple/SimpleProfilePlugin.java
@@ -9,7 +9,6 @@ import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
@@ -19,13 +18,14 @@ import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.interfaces.ProfileInterface;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.utils.SP;
/**
* Created by mike on 05.08.2016.
*/
public class SimpleProfilePlugin extends PluginBase implements ProfileInterface {
- private static Logger log = LoggerFactory.getLogger(SimpleProfilePlugin.class);
+ private static Logger log = LoggerFactory.getLogger(L.PROFILE);
private static SimpleProfilePlugin simpleProfilePlugin;
@@ -58,7 +58,7 @@ public class SimpleProfilePlugin extends PluginBase implements ProfileInterface
}
public void storeSettings() {
- if (Config.logPrefsChange)
+ if (L.isEnabled(L.PROFILE))
log.debug("Storing settings");
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
SharedPreferences.Editor editor = settings.edit();
@@ -73,13 +73,13 @@ public class SimpleProfilePlugin extends PluginBase implements ProfileInterface
editor.apply();
createConvertedProfile();
- if (Config.logPrefsChange)
+ if (L.isEnabled(L.PROFILE))
log.debug("Storing settings: " + getRawProfile().getData().toString());
MainApp.bus().post(new EventProfileStoreChanged());
}
private void loadSettings() {
- if (Config.logPrefsChange)
+ if (L.isEnabled(L.PROFILE))
log.debug("Loading stored settings");
mgdl = SP.getBoolean("SimpleProfile" + "mgdl", true);
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 a16ffbda05..f6f1de2ad0 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java
@@ -7,8 +7,6 @@ import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
import android.support.v7.app.AlertDialog;
-import com.crashlytics.android.answers.CustomEvent;
-
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -31,8 +29,6 @@ import info.nightscout.androidaps.db.CareportalEvent;
import info.nightscout.androidaps.db.Source;
import info.nightscout.androidaps.db.TDD;
import info.nightscout.androidaps.db.TemporaryBasal;
-import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
-import info.nightscout.androidaps.plugins.Treatments.Treatment;
import info.nightscout.androidaps.events.EventInitializationChanged;
import info.nightscout.androidaps.events.EventRefreshOverview;
import info.nightscout.androidaps.interfaces.Constraint;
@@ -42,7 +38,10 @@ import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.interfaces.PumpDescription;
import info.nightscout.androidaps.interfaces.PumpInterface;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress;
@@ -60,16 +59,17 @@ import info.nightscout.androidaps.plugins.PumpCombo.ruffyscripter.history.Bolus;
import info.nightscout.androidaps.plugins.PumpCombo.ruffyscripter.history.PumpHistory;
import info.nightscout.androidaps.plugins.PumpCombo.ruffyscripter.history.PumpHistoryRequest;
import info.nightscout.androidaps.plugins.PumpCombo.ruffyscripter.history.Tdd;
+import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpType;
+import info.nightscout.androidaps.plugins.Treatments.Treatment;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.utils.DateUtil;
-import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.SP;
/**
* Created by mike on 05.08.2016.
*/
public class ComboPlugin extends PluginBase implements PumpInterface, ConstraintsInterface {
- private static final Logger log = LoggerFactory.getLogger(ComboPlugin.class);
+ private static final Logger log = LoggerFactory.getLogger(L.PUMP);
static final String COMBO_TBRS_SET = "combo_tbrs_set";
static final String COMBO_BOLUSES_DELIVERED = "combo_boluses_delivered";
@@ -83,42 +83,6 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
private final static PumpDescription pumpDescription = new PumpDescription();
- static {
- // these properties can't be changed on the pump, some via desktop configuration software
- pumpDescription.isBolusCapable = true;
- pumpDescription.bolusStep = 0.1d;
-
- pumpDescription.isExtendedBolusCapable = false;
- pumpDescription.extendedBolusStep = 0.1d;
- pumpDescription.extendedBolusDurationStep = 15;
- pumpDescription.extendedBolusMaxDuration = 12 * 60;
-
- pumpDescription.isTempBasalCapable = true;
- pumpDescription.tempBasalStyle = PumpDescription.PERCENT;
-
- pumpDescription.maxTempPercent = 500;
- pumpDescription.tempPercentStep = 10;
-
- pumpDescription.tempDurationStep = 15;
- pumpDescription.tempDurationStep15mAllowed = true;
- pumpDescription.tempDurationStep30mAllowed = true;
- pumpDescription.tempMaxDuration = 24 * 60;
-
-
- pumpDescription.isSetBasalProfileCapable = true;
- pumpDescription.basalStep = 0.01d;
- pumpDescription.basalMinimumRate = 0.05d;
-
- pumpDescription.isRefillingCapable = true;
-
- pumpDescription.storesCarbInfo = false;
-
- pumpDescription.is30minBasalRatesCapable = false;
-
- pumpDescription.supportsTDDs = true;
- pumpDescription.needsManualTDDLoad = true;
- }
-
@NonNull
private final RuffyCommands ruffyScripter;
@@ -171,6 +135,7 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
.description(R.string.description_pump_combo)
);
ruffyScripter = new RuffyScripter(MainApp.instance().getApplicationContext());
+ pumpDescription.setPumpDescription(PumpType.AccuChekCombo);
}
public ComboPump getPump() {
@@ -198,7 +163,7 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
@Override
public void switchAllowed(ConfigBuilderFragment.PluginViewHolder.PluginSwitcher pluginSwitcher, FragmentActivity context) {
boolean allowHardwarePump = SP.getBoolean("allow_hardware_pump", false);
- if (allowHardwarePump || context == null){
+ if (allowHardwarePump || context == null) {
pluginSwitcher.invoke();
} else {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
@@ -207,13 +172,15 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
public void onClick(DialogInterface dialog, int id) {
pluginSwitcher.invoke();
SP.putBoolean("allow_hardware_pump", true);
- log.debug("First time HW pump allowed!");
+ if (L.isEnabled(L.PUMP))
+ log.debug("First time HW pump allowed!");
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
pluginSwitcher.cancel();
- log.debug("User does not allow switching to HW pump!");
+ if (L.isEnabled(L.PUMP))
+ log.debug("User does not allow switching to HW pump!");
}
});
builder.create().show();
@@ -246,6 +213,15 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
return false;
}
+ @Override
+ public boolean isHandshakeInProgress() {
+ return false;
+ }
+
+ @Override
+ public void finishHandshaking() {
+ }
+
@Override
public void connect(String reason) {
// ruffyscripter establishes a connection as needed.
@@ -260,7 +236,8 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
@Override
public void disconnect(String reason) {
- log.debug("Disconnect called with reason: " + reason);
+ if (L.isEnabled(L.PUMP))
+ log.debug("Disconnect called with reason: " + reason);
ruffyScripter.disconnect();
}
@@ -348,10 +325,9 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
return basalProfile;
}
- @NonNull
@Override
- public Date lastDataTime() {
- return new Date(pump.lastSuccessfulCmdTime);
+ public long lastDataTime() {
+ return pump.lastSuccessfulCmdTime;
}
/**
@@ -359,7 +335,8 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
*/
@Override
public synchronized void getPumpStatus() {
- log.debug("getPumpStatus called");
+ if (L.isEnabled(L.PUMP))
+ log.debug("getPumpStatus called");
if (!pump.initialized) {
initializePump();
} else {
@@ -371,10 +348,12 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
private synchronized void initializePump() {
long maxWait = System.currentTimeMillis() + 15 * 1000;
while (!ruffyScripter.isPumpAvailable()) {
- log.debug("Waiting for ruffy service to come up ...");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Waiting for ruffy service to come up ...");
SystemClock.sleep(100);
if (System.currentTimeMillis() > maxWait) {
- log.debug("ruffy service unavailable, wtf");
+ if (L.isEnabled(L.PUMP))
+ log.debug("ruffy service unavailable, wtf");
return;
}
}
@@ -393,7 +372,8 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
// note that since the history is checked upon every connect, the above already updated
// the DB with any changed history records
if (pumpHistoryChanged) {
- log.debug("Pump history has changed and was imported");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Pump history has changed and was imported");
pumpHistoryChanged = false;
}
@@ -542,7 +522,8 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
// within the last 1-2 minutes
if (Math.abs(previousBolus.amount - detailedBolusInfo.insulin) < 0.01
&& previousBolus.timestamp + 60 * 1000 > System.currentTimeMillis()) {
- log.debug("Bolu request rejected, same bolus was successfully delivered very recently");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Bolus request rejected, same bolus was successfully delivered very recently");
return new PumpEnactResult().success(false).enacted(false)
.comment(MainApp.gs(R.string.bolus_frequency_exceeded));
}
@@ -562,18 +543,16 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
return new PumpEnactResult().success(false).enacted(false)
.comment(MainApp.gs(R.string.combo_error_no_connection_no_bolus_delivered));
}
- log.debug("Waiting for pump clock to advance for the next unused bolus record timestamp");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Waiting for pump clock to advance for the next unused bolus record timestamp");
SystemClock.sleep(2000);
timeCheckResult = runCommand(null, 0, ruffyScripter::readPumpState);
waitLoops++;
}
if (waitLoops > 0) {
long waitDuration = (System.currentTimeMillis() - waitStartTime) / 1000;
- FabricPrivacy.getInstance().logCustom(new CustomEvent("ComboBolusTimestampWait")
- .putCustomAttribute("buildversion", BuildConfig.BUILDVERSION)
- .putCustomAttribute("version", BuildConfig.VERSION)
- .putCustomAttribute("waitTimeSecs", String.valueOf(waitDuration)));
- log.debug("Waited " + waitDuration + "s for pump to switch to a fresh minute before bolusing");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Waited " + waitDuration + "s for pump to switch to a fresh minute before bolusing");
}
if (cancelBolus) {
@@ -693,11 +672,6 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
Notification notification = new Notification(Notification.COMBO_PUMP_ALARM, MainApp.gs(R.string.combo_error_updating_treatment_record), Notification.URGENT);
MainApp.bus().post(new EventNewNotification(notification));
}
- FabricPrivacy.getInstance().logCustom(new CustomEvent("ComboBolusToDbError")
- .putCustomAttribute("buildversion", BuildConfig.BUILDVERSION)
- .putCustomAttribute("version", BuildConfig.VERSION)
- .putCustomAttribute("bolus", String.valueOf(lastPumpBolus.amount))
- .putCustomAttribute("issue", "record with same timestamp existed and was overridden"));
return false;
}
} catch (Exception e) {
@@ -705,11 +679,6 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
if (dbi.isSMB) {
Notification notification = new Notification(Notification.COMBO_PUMP_ALARM, MainApp.gs(R.string.combo_error_updating_treatment_record), Notification.URGENT);
MainApp.bus().post(new EventNewNotification(notification));
- FabricPrivacy.getInstance().logCustom(new CustomEvent("ComboBolusToDbError")
- .putCustomAttribute("buildversion", BuildConfig.BUILDVERSION)
- .putCustomAttribute("version", BuildConfig.VERSION)
- .putCustomAttribute("bolus", String.valueOf(lastPumpBolus.amount))
- .putCustomAttribute("issue", "adding record caused exception"));
}
return false;
}
@@ -735,11 +704,13 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
*/
@Override
public PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes, Profile profile, boolean force) {
- log.debug("setTempBasalAbsolute called with a rate of " + absoluteRate + " for " + durationInMinutes + " min.");
+ if (L.isEnabled(L.PUMP))
+ log.debug("setTempBasalAbsolute called with a rate of " + absoluteRate + " for " + durationInMinutes + " min.");
int unroundedPercentage = Double.valueOf(absoluteRate / getBaseBasalRate() * 100).intValue();
int roundedPercentage = (int) (Math.round(absoluteRate / getBaseBasalRate() * 10) * 10);
if (unroundedPercentage != roundedPercentage) {
- log.debug("Rounded requested rate " + unroundedPercentage + "% -> " + roundedPercentage + "%");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Rounded requested rate " + unroundedPercentage + "% -> " + roundedPercentage + "%");
}
return setTempBasalPercent(roundedPercentage, durationInMinutes);
@@ -757,7 +728,8 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
}
private PumpEnactResult setTempBasalPercent(Integer percent, final Integer durationInMinutes) {
- log.debug("setTempBasalPercent called with " + percent + "% for " + durationInMinutes + "min");
+ if (L.isEnabled(L.PUMP))
+ log.debug("setTempBasalPercent called with " + percent + "% for " + durationInMinutes + "min");
if (pumpHistoryChanged && percent > 110) {
return new PumpEnactResult().success(false).enacted(false)
@@ -767,13 +739,15 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
int adjustedPercent = percent;
if (adjustedPercent > pumpDescription.maxTempPercent) {
- log.debug("Reducing requested TBR to the maximum support by the pump: " + percent + " -> " + pumpDescription.maxTempPercent);
+ if (L.isEnabled(L.PUMP))
+ log.debug("Reducing requested TBR to the maximum support by the pump: " + percent + " -> " + pumpDescription.maxTempPercent);
adjustedPercent = pumpDescription.maxTempPercent;
}
if (adjustedPercent % 10 != 0) {
Long rounded = Math.round(adjustedPercent / 10d) * 10;
- log.debug("Rounded requested percentage:" + adjustedPercent + " -> " + rounded);
+ if (L.isEnabled(L.PUMP))
+ log.debug("Rounded requested percentage:" + adjustedPercent + " -> " + rounded);
adjustedPercent = rounded.intValue();
}
@@ -822,7 +796,8 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
*/
@Override
public PumpEnactResult cancelTempBasal(boolean enforceNew) {
- log.debug("cancelTempBasal called");
+ if (L.isEnabled(L.PUMP))
+ log.debug("cancelTempBasal called");
final TemporaryBasal activeTemp = TreatmentsPlugin.getPlugin().getTempBasalFromHistory(System.currentTimeMillis());
if (enforceNew) {
CommandResult stateResult = runCommand(MainApp.gs(R.string.combo_pump_action_refreshing), 2, ruffyScripter::readPumpState);
@@ -832,7 +807,8 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
if (!stateResult.state.tbrActive) {
return new PumpEnactResult().success(true).enacted(false);
}
- log.debug("cancelTempBasal: hard-cancelling TBR since force requested");
+ if (L.isEnabled(L.PUMP))
+ log.debug("cancelTempBasal: hard-cancelling TBR since force requested");
CommandResult cancelResult = runCommand(MainApp.gs(R.string.combo_pump_action_cancelling_tbr), 2, ruffyScripter::cancelTbr);
if (!cancelResult.success) {
return new PumpEnactResult().success(false).enacted(false);
@@ -853,7 +829,8 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
// Let fake neutral temp keep run (see below)
// Note that since this runs on the queue a connection is opened regardless, but this
// case doesn't occur all that often, so it's not worth optimizing (1.3k SetTBR vs 4 cancelTBR).
- log.debug("cancelTempBasal: skipping changing tbr since it already is at " + activeTemp.percentRate + "% and running for another " + activeTemp.getPlannedRemainingMinutes() + " mins.");
+ if (L.isEnabled(L.PUMP))
+ log.debug("cancelTempBasal: skipping changing tbr since it already is at " + activeTemp.percentRate + "% and running for another " + activeTemp.getPlannedRemainingMinutes() + " mins.");
return new PumpEnactResult().success(true).enacted(true)
.comment("cancelTempBasal skipping changing tbr since it already is at "
+ activeTemp.percentRate + "% and running for another "
@@ -862,7 +839,8 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
// Set a fake neutral temp to avoid TBR cancel alert. Decide 90% vs 110% based on
// on whether the TBR we're cancelling is above or below 100%.
final int percentage = (activeTemp.percentRate > 100) ? 110 : 90;
- log.debug("cancelTempBasal: changing TBR to " + percentage + "% for 15 mins.");
+ if (L.isEnabled(L.PUMP))
+ log.debug("cancelTempBasal: changing TBR to " + percentage + "% for 15 mins.");
return setTempBasalPercent(percentage, 15);
}
}
@@ -901,7 +879,8 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
if (!commandResult.success && retries > 0) {
for (int retryAttempts = 1; !commandResult.success && retryAttempts <= retries; retryAttempts++) {
- log.debug("Command was not successful, retries requested, doing retry #" + retryAttempts);
+ if (L.isEnabled(L.PUMP))
+ log.debug("Command was not successful, retries requested, doing retry #" + retryAttempts);
commandResult = commandExecution.execute();
}
}
@@ -982,7 +961,8 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
long now = System.currentTimeMillis();
TemporaryBasal aapsTbr = TreatmentsPlugin.getPlugin().getTempBasalFromHistory(now);
if (aapsTbr == null || aapsTbr.percentRate != 0) {
- log.debug("Creating 15m zero temp since pump is suspended");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Creating 15m zero temp since pump is suspended");
TemporaryBasal newTempBasal = new TemporaryBasal()
.date(now)
.percent(0)
@@ -1042,11 +1022,13 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
if (state.pumpTime == 0) {
// time couldn't be read (e.g. a warning is displayed on the menu , hiding the time field)
} else if (Math.abs(state.pumpTime - System.currentTimeMillis()) >= 10 * 60 * 1000) {
- log.debug("Pump clock needs update, pump time: " + state.pumpTime + " (" + new Date(state.pumpTime) + ")");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Pump clock needs update, pump time: " + state.pumpTime + " (" + new Date(state.pumpTime) + ")");
Notification notification = new Notification(Notification.COMBO_PUMP_ALARM, MainApp.gs(R.string.combo_notification_check_time_date), Notification.URGENT);
MainApp.bus().post(new EventNewNotification(notification));
} else if (Math.abs(state.pumpTime - System.currentTimeMillis()) >= 3 * 60 * 1000) {
- log.debug("Pump clock needs update, pump time: " + state.pumpTime + " (" + new Date(state.pumpTime) + ")");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Pump clock needs update, pump time: " + state.pumpTime + " (" + new Date(state.pumpTime) + ")");
Notification notification = new Notification(Notification.COMBO_PUMP_ALARM, MainApp.gs(R.string.combo_notification_check_time_date), Notification.NORMAL);
MainApp.bus().post(new EventNewNotification(notification));
}
@@ -1108,11 +1090,8 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
long now = System.currentTimeMillis();
TemporaryBasal aapsTbr = TreatmentsPlugin.getPlugin().getTempBasalFromHistory(now);
if (aapsTbr == null && state.tbrActive && state.tbrRemainingDuration > 2) {
- log.debug("Creating temp basal from pump TBR");
- FabricPrivacy.getInstance().logCustom(new CustomEvent("ComboTbrMismatch")
- .putCustomAttribute("buildversion", BuildConfig.BUILDVERSION)
- .putCustomAttribute("version", BuildConfig.VERSION)
- .putCustomAttribute("type", "new TBR on pump"));
+ if (L.isEnabled(L.PUMP))
+ log.debug("Creating temp basal from pump TBR");
TemporaryBasal newTempBasal = new TemporaryBasal()
.date(now)
.percent(state.tbrPercent)
@@ -1120,11 +1099,8 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
.source(Source.USER);
TreatmentsPlugin.getPlugin().addToHistoryTempBasal(newTempBasal);
} else if (aapsTbr != null && aapsTbr.getPlannedRemainingMinutes() > 2 && !state.tbrActive) {
- log.debug("Ending AAPS-TBR since pump has no TBR active");
- FabricPrivacy.getInstance().logCustom(new CustomEvent("ComboTbrMismatch")
- .putCustomAttribute("buildversion", BuildConfig.BUILDVERSION)
- .putCustomAttribute("version", BuildConfig.VERSION)
- .putCustomAttribute("type", "TBR cancelled on pump"));
+ if (L.isEnabled(L.PUMP))
+ log.debug("Ending AAPS-TBR since pump has no TBR active");
TemporaryBasal tempStop = new TemporaryBasal()
.date(now)
.duration(0)
@@ -1133,11 +1109,8 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
} else if (aapsTbr != null && state.tbrActive
&& (aapsTbr.percentRate != state.tbrPercent ||
Math.abs(aapsTbr.getPlannedRemainingMinutes() - state.tbrRemainingDuration) > 2)) {
- log.debug("AAPSs and pump-TBR differ; ending AAPS-TBR and creating new TBR based on pump TBR");
- FabricPrivacy.getInstance().logCustom(new CustomEvent("ComboTbrMismatch")
- .putCustomAttribute("buildversion", BuildConfig.BUILDVERSION)
- .putCustomAttribute("version", BuildConfig.VERSION)
- .putCustomAttribute("type", "TBR on pump differs from AAPS TBR"));
+ if (L.isEnabled(L.PUMP))
+ log.debug("AAPSs and pump-TBR differ; ending AAPS-TBR and creating new TBR based on pump TBR");
TemporaryBasal tempStop = new TemporaryBasal()
.date(now - 1000)
.duration(0)
@@ -1218,7 +1191,8 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
// no history, nothing to check or complain about
if (quickInfoResult.history == null || quickInfoResult.history.bolusHistory.isEmpty()) {
- log.debug("Setting 'pumpHistoryChanged' false");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Setting 'pumpHistoryChanged' false");
pumpHistoryChanged = false;
return null;
}
@@ -1227,13 +1201,15 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
List initialPumpBolusHistory = quickInfoResult.history.bolusHistory;
if (recentBoluses.size() == 1 && initialPumpBolusHistory.size() >= 1
&& recentBoluses.get(0).equals(quickInfoResult.history.bolusHistory.get(0))) {
- log.debug("Setting 'pumpHistoryChanged' false");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Setting 'pumpHistoryChanged' false");
pumpHistoryChanged = false;
return null;
} else if (recentBoluses.size() == 2 && initialPumpBolusHistory.size() >= 2
&& recentBoluses.get(0).equals(quickInfoResult.history.bolusHistory.get(0))
&& recentBoluses.get(1).equals(quickInfoResult.history.bolusHistory.get(1))) {
- log.debug("Setting 'pumpHistoryChanged' false");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Setting 'pumpHistoryChanged' false");
pumpHistoryChanged = false;
return null;
}
@@ -1253,19 +1229,15 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
// for.
HashSet bolusSet = new HashSet<>(historyResult.history.bolusHistory);
if (bolusSet.size() != historyResult.history.bolusHistory.size()) {
- log.debug("Bolus with same amount within the same minute imported. Only one will make it to the DB.");
- FabricPrivacy.getInstance().logCustom(new CustomEvent("ComboBolusToDbError")
- .putCustomAttribute("buildversion", BuildConfig.BUILDVERSION)
- .putCustomAttribute("version", BuildConfig.VERSION)
- .putCustomAttribute("bolus", "")
- .putCustomAttribute("issue", "multiple pump history records with the same time and amount"));
+ if (L.isEnabled(L.PUMP))
+ log.debug("Bolus with same amount within the same minute imported. Only one will make it to the DB.");
Notification notification = new Notification(Notification.COMBO_PUMP_ALARM, MainApp.gs(R.string.
combo_error_multiple_boluses_with_identical_timestamp), Notification.URGENT);
MainApp.bus().post(new EventNewNotification(notification));
}
pumpHistoryChanged = updateDbFromPumpHistory(historyResult.history);
- if (pumpHistoryChanged) {
+ if (L.isEnabled(L.PUMP) && pumpHistoryChanged) {
log.debug("Setting 'pumpHistoryChanged' true");
}
@@ -1306,7 +1278,7 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint
JSONObject extendedJson = new JSONObject();
extendedJson.put("Version", BuildConfig.VERSION_NAME + "-" + BuildConfig.BUILDVERSION);
- extendedJson.put("ActiveProfile", MainApp.getConfigBuilder().getProfileName());
+ extendedJson.put("ActiveProfile", ProfileFunctions.getInstance().getProfileName());
PumpState ps = pump.state;
if (ps.tbrActive) {
extendedJson.put("TempBasalAbsoluteRate", ps.basalRate);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ruffyscripter/RuffyScripter.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ruffyscripter/RuffyScripter.java
index 5b569e479e..e69cf3b462 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ruffyscripter/RuffyScripter.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ruffyscripter/RuffyScripter.java
@@ -10,7 +10,6 @@ import android.os.SystemClock;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
-import com.crashlytics.android.answers.CustomEvent;
import com.google.common.base.Joiner;
import org.monkey.d.ruffy.ruffy.driver.IRTHandler;
@@ -39,8 +38,6 @@ import info.nightscout.androidaps.plugins.PumpCombo.ruffyscripter.commands.ReadH
import info.nightscout.androidaps.plugins.PumpCombo.ruffyscripter.commands.ReadPumpStateCommand;
import info.nightscout.androidaps.plugins.PumpCombo.ruffyscripter.commands.SetBasalProfileCommand;
import info.nightscout.androidaps.plugins.PumpCombo.ruffyscripter.commands.SetTbrCommand;
-import info.nightscout.androidaps.BuildConfig;
-import info.nightscout.utils.FabricPrivacy;
/**
* Provides scripting 'runtime' and operations. consider moving operations into a separate
@@ -57,8 +54,6 @@ public class RuffyScripter implements RuffyCommands {
private volatile long menuLastUpdated = 0;
private volatile boolean unparsableMenuEncountered;
-
- private String previousCommand = "";
private volatile Command activeCmd = null;
private boolean started = false;
@@ -67,51 +62,43 @@ public class RuffyScripter implements RuffyCommands {
private IRTHandler mHandler = new IRTHandler.Stub() {
@Override
- public void log(String message) throws RemoteException {
+ public void log(String message) {
if (log.isTraceEnabled()) {
log.trace("Ruffy says: " + message);
}
}
@Override
- public void fail(String message) throws RemoteException {
+ public void fail(String message) {
log.warn("Ruffy warns: " + message);
- if (message.startsWith("no connection possible"))
- FabricPrivacy.getInstance().logCustom(new CustomEvent("ComboRuffyWarning").putCustomAttribute("message", "no connection possible"));
- else if (message.startsWith("Error sending keep alive while rtModeRunning is still true"))
- FabricPrivacy.getInstance().logCustom(new CustomEvent("ComboRuffyWarning").putCustomAttribute("message", "Error sending keep alive while rtModeRunning is still true"));
- else if (message.startsWith("Error sending keep alive. rtModeRunning is false, so this is most likely a race condition during disconnect"))
- FabricPrivacy.getInstance().logCustom(new CustomEvent("ComboRuffyWarning").putCustomAttribute("message", "Error sending keep alive. rtModeRunning is false, so this is most likely a race condition during disconnect"));
- else
- FabricPrivacy.getInstance().logCustom(new CustomEvent("ComboRuffyWarning").putCustomAttribute("message", message.substring(0, 98)));
}
@Override
- public void requestBluetooth() throws RemoteException {
+ public void requestBluetooth() {
log.trace("Ruffy invoked requestBluetooth callback");
}
@Override
- public void rtStopped() throws RemoteException {
+ public void rtStopped() {
log.debug("rtStopped callback invoked");
currentMenu = null;
}
@Override
- public void rtStarted() throws RemoteException {
+ public void rtStarted() {
log.debug("rtStarted callback invoked");
}
@Override
- public void rtClearDisplay() throws RemoteException {
+ public void rtClearDisplay() {
}
@Override
- public void rtUpdateDisplay(byte[] quarter, int which) throws RemoteException {
+ public void rtUpdateDisplay(byte[] quarter, int which) {
}
@Override
- public void rtDisplayHandleMenu(Menu menu) throws RemoteException {
+ public void rtDisplayHandleMenu(Menu menu) {
// method is called every ~500ms
log.debug("rtDisplayHandleMenu: " + menu);
@@ -124,7 +111,7 @@ public class RuffyScripter implements RuffyCommands {
}
@Override
- public void rtDisplayHandleNoMenu() throws RemoteException {
+ public void rtDisplayHandleNoMenu() {
log.warn("rtDisplayHandleNoMenu callback invoked");
unparsableMenuEncountered = true;
}
@@ -173,10 +160,6 @@ public class RuffyScripter implements RuffyCommands {
if (!boundSucceeded) {
log.error("No connection to ruffy. Pump control unavailable.");
- } else {
- FabricPrivacy.getInstance().logCustom(new CustomEvent("ComboScripterInit")
- .putCustomAttribute("buildversion", BuildConfig.BUILDVERSION)
- .putCustomAttribute("version", BuildConfig.VERSION));
}
}
@@ -227,9 +210,6 @@ public class RuffyScripter implements RuffyCommands {
@Override
public CommandResult readQuickInfo(int numberOfBolusRecordsToRetrieve) {
- FabricPrivacy.getInstance().logCustom(new CustomEvent("ComboReadQuickInfoCmd")
- .putCustomAttribute("buildversion", BuildConfig.BUILDVERSION)
- .putCustomAttribute("version", BuildConfig.VERSION));
return runCommand(new ReadQuickInfoCommand(numberOfBolusRecordsToRetrieve));
}
@@ -366,7 +346,6 @@ public class RuffyScripter implements RuffyCommands {
// ignore
}
}
- previousCommand = "" + activeCmd;
activeCmd = null;
}
}
@@ -435,11 +414,6 @@ public class RuffyScripter implements RuffyCommands {
}
}
log.debug("Recovery from connection loss " + (connected ? "succeeded" : "failed"));
- FabricPrivacy.getInstance().logCustom(new CustomEvent("ComboRecoveryFromConnectionLoss")
- .putCustomAttribute("buildversion", BuildConfig.BUILDVERSION)
- .putCustomAttribute("version", BuildConfig.VERSION)
- .putCustomAttribute("activeCommand", "" + (activeCmd != null ? activeCmd.getClass().getSimpleName() : ""))
- .putCustomAttribute("success", connected ? "true" : "else"));
return connected;
}
@@ -450,12 +424,6 @@ public class RuffyScripter implements RuffyCommands {
private PumpState recoverFromCommandFailure() {
Menu menu = this.currentMenu;
if (menu == null) {
- FabricPrivacy.getInstance().logCustom(new CustomEvent("ComboRecoveryFromCommandFailure")
- .putCustomAttribute("buildversion", BuildConfig.BUILDVERSION)
- .putCustomAttribute("version", BuildConfig.VERSION)
- .putCustomAttribute("activeCommand", "" + (activeCmd != null ? activeCmd.getClass().getSimpleName() : ""))
- .putCustomAttribute("exit", "1")
- .putCustomAttribute("success", "false"));
return new PumpState();
}
MenuType type = menu.getType();
@@ -469,21 +437,8 @@ public class RuffyScripter implements RuffyCommands {
}
try {
PumpState pumpState = readPumpStateInternal();
- FabricPrivacy.getInstance().logCustom(new CustomEvent("ComboRecoveryFromCommandFailure")
- .putCustomAttribute("buildversion", BuildConfig.BUILDVERSION)
- .putCustomAttribute("version", BuildConfig.VERSION)
- .putCustomAttribute("activeCommand", "" + (activeCmd != null ? activeCmd.getClass().getSimpleName() : ""))
- .putCustomAttribute("exit", "2")
- .putCustomAttribute("success", "true"));
return pumpState;
} catch (Exception e) {
- FabricPrivacy.getInstance().logCustom(new CustomEvent("ComboRecoveryFromCommandFailure")
- .putCustomAttribute("buildversion", BuildConfig.BUILDVERSION)
- .putCustomAttribute("version", BuildConfig.VERSION)
- .putCustomAttribute("exit", "3")
- .putCustomAttribute("activeCommand", "" + (activeCmd != null ? activeCmd.getClass().getSimpleName() : ""))
- .putCustomAttribute("success", "false"));
-
log.debug("Reading pump state during recovery failed", e);
return new PumpState();
}
@@ -505,11 +460,6 @@ public class RuffyScripter implements RuffyCommands {
long initialUpdateTime = menuLastUpdated;
while (initialUpdateTime == menuLastUpdated) {
if (System.currentTimeMillis() > timeoutExpired) {
- FabricPrivacy.getInstance().logCustom(new CustomEvent("ComboConnectTimeout")
- .putCustomAttribute("buildversion", BuildConfig.BUILDVERSION)
- .putCustomAttribute("version", BuildConfig.VERSION)
- .putCustomAttribute("activeCommand", "" + (activeCmd != null ? activeCmd.getClass().getSimpleName() : ""))
- .putCustomAttribute("previousCommand", previousCommand));
throw new CommandException("Timeout connecting to pump");
}
SystemClock.sleep(50);
@@ -818,18 +768,12 @@ public class RuffyScripter implements RuffyCommands {
@Override
public CommandResult deliverBolus(double amount, BolusProgressReporter bolusProgressReporter) {
- FabricPrivacy.getInstance().logCustom(new CustomEvent("ComboBolusCmd")
- .putCustomAttribute("buildversion", BuildConfig.BUILDVERSION)
- .putCustomAttribute("version", BuildConfig.VERSION));
return runCommand(new BolusCommand(amount, bolusProgressReporter));
}
@Override
public void cancelBolus() {
if (activeCmd instanceof BolusCommand) {
- FabricPrivacy.getInstance().logCustom(new CustomEvent("ComboBolusCmdCancel")
- .putCustomAttribute("buildversion", BuildConfig.BUILDVERSION)
- .putCustomAttribute("version", BuildConfig.VERSION));
((BolusCommand) activeCmd).requestCancellation();
} else {
log.error("cancelBolus called, but active command is not a bolus:" + activeCmd);
@@ -838,49 +782,31 @@ public class RuffyScripter implements RuffyCommands {
@Override
public CommandResult setTbr(int percent, int duration) {
- FabricPrivacy.getInstance().logCustom(new CustomEvent("ComboSetTbrCmd")
- .putCustomAttribute("buildversion", BuildConfig.BUILDVERSION)
- .putCustomAttribute("version", BuildConfig.VERSION));
return runCommand(new SetTbrCommand(percent, duration));
}
@Override
public CommandResult cancelTbr() {
- FabricPrivacy.getInstance().logCustom(new CustomEvent("ComboCancelTbrCmd")
- .putCustomAttribute("buildversion", BuildConfig.BUILDVERSION)
- .putCustomAttribute("version", BuildConfig.VERSION));
return runCommand(new CancelTbrCommand());
}
@Override
public CommandResult confirmAlert(int warningCode) {
- FabricPrivacy.getInstance().logCustom(new CustomEvent("ComboConfirmAlertCmd")
- .putCustomAttribute("buildversion", BuildConfig.BUILDVERSION)
- .putCustomAttribute("version", BuildConfig.VERSION));
return runCommand(new ConfirmAlertCommand(warningCode));
}
@Override
public CommandResult readHistory(PumpHistoryRequest request) {
- FabricPrivacy.getInstance().logCustom(new CustomEvent("ComboReadHistoryCmd")
- .putCustomAttribute("buildversion", BuildConfig.BUILDVERSION)
- .putCustomAttribute("version", BuildConfig.VERSION));
return runCommand(new ReadHistoryCommand(request));
}
@Override
public CommandResult readBasalProfile() {
- FabricPrivacy.getInstance().logCustom(new CustomEvent("ComboReadBasalProfileCmd")
- .putCustomAttribute("buildversion", BuildConfig.BUILDVERSION)
- .putCustomAttribute("version", BuildConfig.VERSION));
return runCommand(new ReadBasalProfileCommand());
}
@Override
public CommandResult setBasalProfile(BasalProfile basalProfile) {
- FabricPrivacy.getInstance().logCustom(new CustomEvent("ComboSetBasalProfileCmd")
- .putCustomAttribute("buildversion", BuildConfig.BUILDVERSION)
- .putCustomAttribute("version", BuildConfig.VERSION));
return runCommand(new SetBasalProfileCommand(basalProfile));
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/PumpPluginAbstract.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/PumpPluginAbstract.java
index 1f44f08c1e..e5e0a18bc5 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/PumpPluginAbstract.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/PumpPluginAbstract.java
@@ -27,11 +27,11 @@ import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PumpDescription;
import info.nightscout.androidaps.interfaces.PumpInterface;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress;
import info.nightscout.androidaps.plugins.PumpCommon.data.PumpStatus;
import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpType;
import info.nightscout.androidaps.plugins.PumpCommon.driver.PumpDriverInterface;
-import info.nightscout.androidaps.plugins.PumpCommon.utils.PumpUtil;
import info.nightscout.androidaps.plugins.Treatments.Treatment;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.utils.DateUtil;
@@ -90,7 +90,7 @@ public abstract class PumpPluginAbstract extends PluginBase implements PumpInter
LOG.error("Before Init Pump Statis Data called.");
- PumpUtil.setPumpDescription(getPumpDescription(), pumpType);
+ pumpDescription.setPumpDescription(pumpType);
initPumpStatusData();
@@ -217,7 +217,7 @@ public abstract class PumpPluginAbstract extends PluginBase implements PumpInter
}
- public Date lastDataTime() {
+ public long lastDataTime() {
return pumpDriver.lastDataTime();
}
@@ -376,7 +376,7 @@ public abstract class PumpPluginAbstract extends PluginBase implements PumpInter
status.put("status", pumpStatus.pumpStatusType != null ? pumpStatus.pumpStatusType.getStatus() : "normal");
extended.put("Version", BuildConfig.VERSION_NAME + "-" + BuildConfig.BUILDVERSION);
try {
- extended.put("ActiveProfile", MainApp.getConfigBuilder().getProfileName());
+ extended.put("ActiveProfile", profileName);
} catch (Exception e) {
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/data/DoseSettings.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/data/DoseSettings.java
index 9f98127d3b..21a893e943 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/data/DoseSettings.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/data/DoseSettings.java
@@ -6,14 +6,14 @@ package info.nightscout.androidaps.plugins.PumpCommon.data;
public class DoseSettings {
- private float step;
+ private double step;
private int durationStep;
private int maxDuration;
- private float minDose;
- private Float maxDose;
+ private double minDose;
+ private Double maxDose;
-
- public DoseSettings(float step, int durationStep, int maxDuration, float minDose, Float maxDose) {
+ public DoseSettings(double step, int durationStep, int maxDuration, double minDose, Double maxDose)
+ {
this.step = step;
this.durationStep = durationStep;
this.maxDuration = maxDuration;
@@ -21,33 +21,29 @@ public class DoseSettings {
this.maxDose = maxDose;
}
-
- public DoseSettings(float step, int durationStep, int maxDuration, float minDose) {
- this(step, durationStep, maxDuration, minDose, null);
+ public DoseSettings(double step, int durationStep, int maxDuration, double minDose)
+ {
+ this(step, durationStep, maxDuration, minDose, Double.MAX_VALUE);
}
- public float getStep() {
+ public double getStep() {
return step;
}
-
public int getDurationStep() {
return durationStep;
}
-
public int getMaxDuration() {
return maxDuration;
}
-
- public float getMinDose() {
+ public double getMinDose() {
return minDose;
}
-
- public Float getMaxDose() {
+ public Double getMaxDose() {
return maxDose;
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/defs/DoseStepSize.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/defs/DoseStepSize.java
index d54eeba669..db5ff8714b 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/defs/DoseStepSize.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/defs/DoseStepSize.java
@@ -4,36 +4,46 @@ package info.nightscout.androidaps.plugins.PumpCommon.defs;
* Created by andy on 02/05/2018.
*/
-public enum DoseStepSize {
+public enum DoseStepSize
+{
ComboBasal( //
- new DoseStepSizeEntry(0f, 1f, 0.01f), //
- new DoseStepSizeEntry(1f, 10f, 0.05f), //
- new DoseStepSizeEntry(10f, Float.MAX_VALUE, 0.1f)), //
+ new DoseStepSizeEntry(0f, 1f, 0.01f), //
+ new DoseStepSizeEntry(1f, 10f, 0.05f), //
+ new DoseStepSizeEntry(10f, Double.MAX_VALUE, 0.1f)), //
+
+ InsightBolus(
+ new DoseStepSizeEntry(0f, 2f, 0.05f), //
+ new DoseStepSizeEntry(2f, 5f, 0.1f), //
+ new DoseStepSizeEntry(5f, 10f, 0.2f), //
+ new DoseStepSizeEntry(10f, Double.MAX_VALUE, 0.5f)),
MedtronicVeoBasal( //
- new DoseStepSizeEntry(0f, 1f, 0.025f), //
- new DoseStepSizeEntry(1f, 10f, 0.05f), //
- new DoseStepSizeEntry(10f, Float.MAX_VALUE, 0.1f)), //
+ new DoseStepSizeEntry(0f, 1f, 0.025f), //
+ new DoseStepSizeEntry(1f, 10f, 0.05f), //
+ new DoseStepSizeEntry(10f, Double.MAX_VALUE, 0.1f)), //
;
+
DoseStepSizeEntry[] entries;
- DoseStepSize(DoseStepSizeEntry... entries) {
+ DoseStepSize(DoseStepSizeEntry...entries)
+ {
this.entries = entries;
}
- public float getStepSizeForAmount(float amount) {
+ public double getStepSizeForAmount(double amount)
+ {
for (DoseStepSizeEntry entry : entries) {
if (entry.from <= amount && entry.to > amount)
return entry.value;
}
// should never come to this
- return entries[entries.length - 1].value;
+ return entries[entries.length-1].value;
}
@@ -47,9 +57,12 @@ public enum DoseStepSize {
sb.append(entry.from);
sb.append("-");
- if (entry.to == Float.MAX_VALUE) {
+ if (entry.to == Double.MAX_VALUE)
+ {
sb.append("~}");
- } else {
+ }
+ else
+ {
sb.append(entry.to);
sb.append("}, ");
}
@@ -58,16 +71,16 @@ public enum DoseStepSize {
return sb.toString();
}
- static class DoseStepSizeEntry {
- float from;
- float to;
- float value;
+ static class DoseStepSizeEntry
+ {
+ double from;
+ double to;
+ double value;
-
- // to = this value is not included, but would actually mean <, so for rates between 0.025-0.975 u/h, we would
- // have [from=0, to=10]
- DoseStepSizeEntry(float from, float to, float value) {
+ // to = this value is not included, but would actually mean <, so for rates between 0.025-0.975 u/h, we would have [from=0, to=10]
+ DoseStepSizeEntry(double from, double to, double value)
+ {
this.from = from;
this.to = to;
this.value = value;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/defs/PumpCapability.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/defs/PumpCapability.java
index 865eda6a5a..042cf87598 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/defs/PumpCapability.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/defs/PumpCapability.java
@@ -6,35 +6,47 @@ package info.nightscout.androidaps.plugins.PumpCommon.defs;
public enum PumpCapability {
- Bolus, //
- ExtendedBolus, //
- TBR, //
- BasalProfileSet, //
- Refill, //
- StoreCarbInfo, //
+ Bolus, // isBolusCapable
+ ExtendedBolus, // isExtendedBolusCapable
+ TempBasal, // isTempBasalCapable
+ BasalProfileSet, // isSetBasalProfileCapable
+ Refill, // isRefillingCapable
+ StoreCarbInfo, // storesCarbInfo
+ TDD, // supportsTDDs
+ ManualTDDLoad, // needsManualTDDLoad
+ BasalRate30min, // is30minBasalRatesCapable
- // grouped
- VirtualPump(Bolus, ExtendedBolus, TBR, BasalProfileSet, StoreCarbInfo), //
+ // grouped by pump
+ VirtualPumpCapabilities(Bolus, ExtendedBolus, TempBasal, BasalProfileSet, Refill), //
+ ComboCapabilities(Bolus, TempBasal, BasalProfileSet, Refill, TDD, ManualTDDLoad), //
+ DanaCapabilities(Bolus, ExtendedBolus, TempBasal, BasalProfileSet, Refill, TDD, ManualTDDLoad), //
+ DanaWithHistoryCapabilities(Bolus, ExtendedBolus, TempBasal, BasalProfileSet, Refill, StoreCarbInfo, TDD, ManualTDDLoad), //
+ InsightCapabilities(Bolus, ExtendedBolus, TempBasal, BasalProfileSet, Refill,TDD,BasalRate30min), //
- Bolus_TBR_Basal_Refill_Carb(Bolus, TBR, BasalProfileSet, Refill, StoreCarbInfo), //
- Bolus_Extended_TBR_Basal_Carb(Bolus, ExtendedBolus, TBR, BasalProfileSet, StoreCarbInfo), //
- Bolus_Extended_TBR_Basal_Refill_Carb(Bolus, ExtendedBolus, TBR, BasalProfileSet, Refill, StoreCarbInfo), //
- None;
+ // BasalRates (separately grouped)
+ BasalRate_Duration15minAllowed, //
+ BasalRate_Duration30minAllowed, //
+ BasalRate_Duration15and30minAllowed(BasalRate_Duration15minAllowed, BasalRate_Duration30minAllowed), //
+ BasalRate_Duration15and30minNotAllowed, //
+ ;
PumpCapability[] children;
- PumpCapability() {
+ PumpCapability()
+ {
}
- PumpCapability(PumpCapability... children) {
+ PumpCapability(PumpCapability...children)
+ {
this.children = children;
}
- public boolean hasCapability(PumpCapability capability) {
+ public boolean hasCapability(PumpCapability capability)
+ {
// we can only check presense of simple capabilities
if (capability.children != null)
return false;
@@ -42,15 +54,18 @@ public enum PumpCapability {
if (this == capability)
return true;
- if (this.children != null) {
+ if (this.children!=null) {
for (PumpCapability child : children) {
if (child == capability)
return true;
}
return false;
- } else
+ }
+ else
return false;
}
+
+
}
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 299525e02f..aaf3cdcf6c 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
@@ -1,118 +1,149 @@
package info.nightscout.androidaps.plugins.PumpCommon.defs;
+
import java.util.HashMap;
import java.util.Map;
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.R;
import info.nightscout.androidaps.plugins.PumpCommon.data.DoseSettings;
+
+
/**
* Created by andy on 02/05/2018.
- *
+ *
* Most of this defintions is intended for VirtualPump only, but they can be used by other plugins.
*/
public enum PumpType {
- Unknown("Unknown Pump", 0.1f, null, //
- new DoseSettings(0.05f, 30, 8 * 60, 0.05f), //
- PumpTempBasalType.Percent, //
- new DoseSettings(10, 30, 24 * 60, 0f, 200f), //
- 0.01f, 0.01f, null, PumpCapability.None),
-
- GenericAAPS("Generic AAPS", 0.1f, null, //
- new DoseSettings(0.05f, 30, 8 * 60, 0.05f), //
- PumpTempBasalType.Percent, //
- new DoseSettings(10, 30, 24 * 60, 0f, 500f), //
- 0.01f, 0.01f, null, PumpCapability.VirtualPump), //
+ GenericAAPS("Generic AAPS", 0.1d, null, //
+ new DoseSettings(0.05d, 30, 8*60, 0.05d), //
+ PumpTempBasalType.Percent, //
+ new DoseSettings(10,30, 24*60, 0d, 500d), PumpCapability.BasalRate_Duration15and30minAllowed, //
+ 0.01d, 0.01d, null, PumpCapability.VirtualPumpCapabilities), //
// Cellnovo
- Cellnovo1("Cellnovo", 0.05f, null, //
- new DoseSettings(0.05f, 30, 24 * 60, 1f, null), PumpTempBasalType.Percent, new DoseSettings(5, 30, 24 * 60, 0f,
- 200f), //
- 0.05f, 0.05f, null, PumpCapability.VirtualPump), //
+ Cellnovo1("Cellnovo", 0.05d, null, //
+ new DoseSettings(0.05d, 30, 24*60, 1d, null),
+ PumpTempBasalType.Percent,
+ new DoseSettings(5,30, 24*60, 0d, 200d), PumpCapability.BasalRate_Duration30minAllowed, //
+ 0.05d, 0.05d, null, PumpCapability.VirtualPumpCapabilities), //
// Accu-Chek
- AccuChekCombo("Accu-Chek Combo", 0.1f, null, //
- new DoseSettings(0.1f, 15, 12 * 60, 0.1f), //
- PumpTempBasalType.Percent, new DoseSettings(10, 15, 12 * 60, 0f, 500f), //
- 0.01f, 0.1f, DoseStepSize.ComboBasal, PumpCapability.Bolus_TBR_Basal_Refill_Carb), //
+ AccuChekCombo("Accu-Chek Combo", 0.1d, null, //
+ new DoseSettings(0.1d, 15, 12*60, 0.1d), //
+ PumpTempBasalType.Percent,
+ new DoseSettings(10, 15, 12*60,0d, 500d), PumpCapability.BasalRate_Duration15and30minAllowed, //
+ 0.01d, 0.1d, DoseStepSize.ComboBasal, PumpCapability.ComboCapabilities), //
- AccuChekSpirit("Accu-Chek Spirit", 0.1f, null, //
- new DoseSettings(0.1f, 15, 12 * 60, 0.1f), //
- PumpTempBasalType.Percent, new DoseSettings(10, 15, 12 * 60, 0f, 500f), //
- 0.01f, 0.1f, null, PumpCapability.VirtualPump), //
+ AccuChekSpirit("Accu-Chek Spirit", 0.1d, null, //
+ new DoseSettings(0.1d, 15, 12*60, 0.1d), //
+ PumpTempBasalType.Percent,
+ new DoseSettings(10, 15, 12*60,0d, 500d), PumpCapability.BasalRate_Duration15and30minAllowed, //
+ 0.01d, 0.1d, null, PumpCapability.VirtualPumpCapabilities), //
+
+ AccuChekInsight("Accu-Chek Insight", 0.05d, DoseStepSize.InsightBolus, //
+ new DoseSettings(0.05d, 15, 24*60, 0.05d), //
+ PumpTempBasalType.Percent,
+ new DoseSettings(10, 15, 12*60,0d, 250d), PumpCapability.BasalRate_Duration15and30minAllowed, //
+ 0.02d, 0.1d, null, PumpCapability.InsightCapabilities), //
// Animas
- AnimasVibe("Animas Vibe", 0.05f, null, // AnimasBolus?
- new DoseSettings(0.05f, 30, 12 * 60, 0.05f), //
- PumpTempBasalType.Percent, //
- new DoseSettings(10, 30, 24 * 60, 0f, 200f), //
- 0.025f, 5f, 0f, null, PumpCapability.VirtualPump), //
+ 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, //
+ 0.025d, 5d, 0d, null, PumpCapability.VirtualPumpCapabilities), //
AnimasPing("Animas Ping", AnimasVibe),
// Dana
- DanaR("DanaR", 0.05f, null, //
- new DoseSettings(0.05f, 30, 8 * 60, 0.05f), //
- PumpTempBasalType.Percent, //
- new DoseSettings(10f, 60, 24 * 60, 0f, 200f), //
- 0.04f, 0.01f, null, PumpCapability.Bolus_Extended_TBR_Basal_Refill_Carb),
+ DanaR("DanaR", 0.05d, null, //
+ new DoseSettings(0.05d, 30, 8*60, 0.05d), //
+ PumpTempBasalType.Percent, //
+ new DoseSettings(10d, 60, 24*60, 0d, 200d), PumpCapability.BasalRate_Duration15and30minNotAllowed, //
+ 0.04d, 0.01d, null, PumpCapability.DanaCapabilities),
- DanaRKorean("DanaR Korean", 0.05f, null, //
- new DoseSettings(0.05f, 30, 8 * 60, 0.05f), //
- PumpTempBasalType.Percent, //
- new DoseSettings(10f, 60, 24 * 60, 0f, 200f), //
- 0.1f, 0.01f, null, PumpCapability.Bolus_Extended_TBR_Basal_Refill_Carb),
+ DanaRKorean("DanaR Korean", 0.05d, null, //
+ new DoseSettings(0.05d, 30, 8*60, 0.05d), //
+ PumpTempBasalType.Percent, //
+ new DoseSettings(10d, 60, 24*60, 0d, 200d), PumpCapability.BasalRate_Duration15and30minNotAllowed, //
+ 0.1d, 0.01d, null, PumpCapability.DanaCapabilities),
+
+ DanaRS("DanaRS", 0.05d, null, //
+ new DoseSettings(0.05d, 30, 8*60, 0.05d), //
+ PumpTempBasalType.Percent, //
+ new DoseSettings(10d, 60, 24*60, 0d, 200d), PumpCapability.BasalRate_Duration15and30minAllowed, //
+ 0.04d, 0.01d, null, PumpCapability.DanaWithHistoryCapabilities),
+
+ DanaRv2("DanaRv2", DanaRS),
- DanaRS("DanaRS", DanaR),
- DanaRv2("DanaRv2", DanaR),
// Insulet
- Insulet_Omnipod("Insulet Omnipod", 0.05f, null, //
- new DoseSettings(0.05f, 30, 8 * 60, 0.05f), //
- PumpTempBasalType.Absolute, //
- new DoseSettings(0.05f, 30, 12 * 60, 0f, 5.0f), // cannot exceed max basal rate 30u/hr
- 0.05f, 0.05f, null, PumpCapability.VirtualPump),
+ Insulet_Omnipod("Insulet Omnipod", 0.05d, null, //
+ new DoseSettings(0.05d, 30, 8*60, 0.05d), //
+ PumpTempBasalType.Absolute, //
+ new DoseSettings(0.05d, 30, 12*60, 0d, 30.0d), PumpCapability.BasalRate_Duration30minAllowed, // cannot exceed max basal rate 30u/hr
+ 0.05d, 0.05d, null, PumpCapability.VirtualPumpCapabilities),
// Medtronic
- Medtronic_512_712("Medtronic 512/712", 0.05f, null, //
- new DoseSettings(0.05f, 30, 8 * 60, 0.05f), //
- PumpTempBasalType.Absolute, //
- new DoseSettings(0.05f, 30, 24 * 60, 0f, 35f), //
- 0.05f, 0.05f, null, PumpCapability.VirtualPump), // TODO
+ Medtronic_512_712("Medtronic 512/712", 0.05d, null, //
+ new DoseSettings(0.05d, 30, 8*60, 0.05d), //
+ PumpTempBasalType.Absolute, //
+ new DoseSettings(0.05d, 30, 24*60, 0d, 35d), PumpCapability.BasalRate_Duration30minAllowed, //
+ 0.05d, 0.05d, null, PumpCapability.VirtualPumpCapabilities), // TODO
Medtronic_515_715("Medtronic 515/715", Medtronic_512_712),
Medtronic_522_722("Medtronic 522/722", Medtronic_512_712),
- Medtronic_523_723_Revel("Medtronic 553/753 (Revel)", 0.05f, null, //
- new DoseSettings(0.05f, 30, 8 * 60, 0.05f), //
- PumpTempBasalType.Absolute, //
- new DoseSettings(0.05f, 30, 24 * 60, 0f, 35f), //
- 0.025f, 0.025f, DoseStepSize.MedtronicVeoBasal, PumpCapability.VirtualPump), //
+ Medtronic_523_723_Revel("Medtronic 523/723 (Revel)", 0.05d, null, //
+ new DoseSettings(0.05d, 30, 8*60, 0.05d), //
+ PumpTempBasalType.Absolute, //
+ new DoseSettings(0.05d, 30, 24*60, 0d, 35d), PumpCapability.BasalRate_Duration30minAllowed, //
+ 0.025d, 0.025d, DoseStepSize.MedtronicVeoBasal, PumpCapability.VirtualPumpCapabilities), //
Medtronic_554_754_Veo("Medtronic 554/754 (Veo)", Medtronic_523_723_Revel), // TODO
- Medtronic_640G("Medtronic 640G", 0.025f, null, //
- new DoseSettings(0.05f, 30, 8 * 60, 0.05f), //
- PumpTempBasalType.Absolute, //
- new DoseSettings(0.05f, 30, 24 * 60, 0f, 35f), //
- 0.025f, 0.025f, DoseStepSize.MedtronicVeoBasal, PumpCapability.VirtualPump), //
+ Medtronic_640G("Medtronic 640G", 0.025d, null, //
+ new DoseSettings(0.05d, 30, 8*60, 0.05d), //
+ PumpTempBasalType.Absolute, //
+ new DoseSettings(0.05d, 30, 24*60, 0d, 35d), PumpCapability.BasalRate_Duration30minAllowed, //
+ 0.025d, 0.025d, DoseStepSize.MedtronicVeoBasal, PumpCapability.VirtualPumpCapabilities), //
// Tandem
- TandemTSlim("Tandem t:slim", 0.01f, null, //
- new DoseSettings(0.01f, 15, 8 * 60, 0.4f), PumpTempBasalType.Percent, new DoseSettings(1, 15, 8 * 60, 0f, 250f), //
- 0.1f, 0.001f, null, PumpCapability.VirtualPump),
+ TandemTSlim("Tandem t:slim", 0.01d, null, //
+ new DoseSettings(0.01d,15, 8*60, 0.4d),
+ PumpTempBasalType.Percent,
+ new DoseSettings(1,15, 8*60, 0d, 250d), PumpCapability.BasalRate_Duration15and30minAllowed, //
+ 0.1d, 0.001d, null, PumpCapability.VirtualPumpCapabilities),
TandemTFlex("Tandem t:flex", TandemTSlim), //
TandemTSlimG4("Tandem t:slim G4", TandemTSlim), //
TandemTSlimX2("Tandem t:slim X2", TandemTSlim), //
;
- private static Map mapByDescription;
+ private String description;
+ private double bolusSize;
+ private DoseStepSize specialBolusSize;
+ private DoseSettings extendedBolusSettings;
+ private PumpTempBasalType pumpTempBasalType;
+ private DoseSettings tbrSettings;
+ private PumpCapability specialBasalDurations;
+ private double baseBasalMinValue; //
+ private Double baseBasalMaxValue;
+ private double baseBasalStep; //
+ private DoseStepSize baseBasalSpecialSteps; //
+ private PumpCapability pumpCapability;
- static {
+ private PumpType parent;
+ private static Map mapByDescription;
+
+ static
+ {
mapByDescription = new HashMap<>();
for (PumpType pumpType : values()) {
@@ -120,58 +151,40 @@ public enum PumpType {
}
}
- private String description;
- private float bolusSize;
- private DoseStepSize specialBolusSize;
- private DoseSettings extendedBolusSettings;
- private PumpTempBasalType pumpTempBasalType;
- private DoseSettings tbrSettings;
- private float baseBasalMinValue; //
- private Float baseBasalMaxValue;
- private float baseBasalStep; //
- private DoseStepSize baseBasalSpecialSteps; //
- private PumpCapability pumpCapability;
- private PumpType parent;
-
- PumpType(String description, PumpType parent) {
+ PumpType(String description, PumpType parent)
+ {
this.description = description;
this.parent = parent;
}
-
- PumpType(String description, PumpType parent, PumpCapability pumpCapability) {
+ PumpType(String description, PumpType parent, PumpCapability pumpCapability)
+ {
this.description = description;
this.parent = parent;
this.pumpCapability = pumpCapability;
}
-
- PumpType(String description, float bolusSize,
- DoseStepSize specialBolusSize, //
- DoseSettings extendedBolusSettings, //
- PumpTempBasalType pumpTempBasalType,
- DoseSettings tbrSettings, //
- float baseBasalMinValue, float baseBasalStep, DoseStepSize baseBasalSpecialSteps,
- PumpCapability pumpCapability) {
- this(description, bolusSize, specialBolusSize, extendedBolusSettings, pumpTempBasalType, tbrSettings,
- baseBasalMinValue, null, baseBasalStep, baseBasalSpecialSteps, pumpCapability);
+ PumpType(String description, double bolusSize, DoseStepSize specialBolusSize, //
+ DoseSettings extendedBolusSettings, //
+ PumpTempBasalType pumpTempBasalType, DoseSettings tbrSettings, PumpCapability specialBasalDurations, //
+ double baseBasalMinValue, double baseBasalStep, DoseStepSize baseBasalSpecialSteps, PumpCapability pumpCapability)
+ {
+ this(description, bolusSize, specialBolusSize, extendedBolusSettings, pumpTempBasalType, tbrSettings, specialBasalDurations, baseBasalMinValue, null, baseBasalStep, baseBasalSpecialSteps, pumpCapability);
}
-
- PumpType(String description, float bolusSize,
- DoseStepSize specialBolusSize, //
- DoseSettings extendedBolusSettings, //
- PumpTempBasalType pumpTempBasalType,
- DoseSettings tbrSettings, //
- float baseBasalMinValue, Float baseBasalMaxValue, float baseBasalStep, DoseStepSize baseBasalSpecialSteps,
- PumpCapability pumpCapability) {
+ PumpType(String description, double bolusSize, DoseStepSize specialBolusSize, //
+ DoseSettings extendedBolusSettings, //
+ PumpTempBasalType pumpTempBasalType, DoseSettings tbrSettings, PumpCapability specialBasalDurations, //
+ double baseBasalMinValue, Double baseBasalMaxValue, double baseBasalStep, DoseStepSize baseBasalSpecialSteps, PumpCapability pumpCapability)
+ {
this.description = description;
this.bolusSize = bolusSize;
this.specialBolusSize = specialBolusSize;
this.extendedBolusSettings = extendedBolusSettings;
this.pumpTempBasalType = pumpTempBasalType;
this.tbrSettings = tbrSettings;
+ this.specialBasalDurations = specialBasalDurations;
this.baseBasalMinValue = baseBasalMinValue;
this.baseBasalMaxValue = baseBasalMaxValue;
this.baseBasalStep = baseBasalStep;
@@ -180,15 +193,6 @@ public enum PumpType {
}
- public static PumpType getByDescription(String desc) {
- if (mapByDescription.containsKey(desc)) {
- return mapByDescription.get(desc);
- } else {
- return PumpType.GenericAAPS;
- }
- }
-
-
public String getDescription() {
return description;
}
@@ -202,8 +206,7 @@ public enum PumpType {
return this.pumpCapability;
}
-
- public float getBolusSize() {
+ public double getBolusSize() {
return isParentSet() ? parent.bolusSize : bolusSize;
}
@@ -228,17 +231,17 @@ public enum PumpType {
}
- public float getBaseBasalMinValue() {
+ public double getBaseBasalMinValue() {
return isParentSet() ? parent.baseBasalMinValue : baseBasalMinValue;
}
- public Float getBaseBasalMaxValue() {
+ public Double getBaseBasalMaxValue() {
return isParentSet() ? parent.baseBasalMaxValue : baseBasalMaxValue;
}
- public float getBaseBasalStep() {
+ public double getBaseBasalStep() {
return isParentSet() ? parent.baseBasalStep : baseBasalStep;
}
@@ -258,33 +261,44 @@ public enum PumpType {
}
- public String getFullDescription(String i18nTemplate) {
+ public static PumpType getByDescription(String desc) {
+ if (mapByDescription.containsKey(desc)) {
+ return mapByDescription.get(desc);
+ } else {
+ return PumpType.GenericAAPS;
+ }
+ }
- String unit = getPumpTempBasalType() == PumpTempBasalType.Percent ? "%" : "";
+
+ public String getFullDescription(String i18nTemplate, boolean hasExtendedBasals) {
+
+ String unit = getPumpTempBasalType()==PumpTempBasalType.Percent ? "%" : "";
DoseSettings eb = getExtendedBolusSettings();
DoseSettings tbr = getTbrSettings();
- return String.format(
- i18nTemplate, //
- getStep("" + getBolusSize(), getSpecialBolusSize()), //
- eb.getStep(), eb.getDurationStep(),
- eb.getMaxDuration() / 60, //
- getStep(getBaseBasalRange(), getBaseBasalSpecialSteps()), //
- tbr.getMinDose() + unit + "-" + tbr.getMaxDose() + unit, tbr.getStep() + unit, tbr.getDurationStep(),
- tbr.getMaxDuration() / 60);
+ String extendedNote = hasExtendedBasals ? MainApp.gs(R.string.virtualpump_pump_def_extended_note) : "";
+
+ return String.format(i18nTemplate, //
+ getStep("" + getBolusSize(), getSpecialBolusSize()), //
+ eb.getStep(), eb.getDurationStep(), eb.getMaxDuration()/60, //
+ getStep(getBaseBasalRange(), getBaseBasalSpecialSteps()), //
+ tbr.getMinDose() + unit + "-" + tbr.getMaxDose() + unit, tbr.getStep() + unit,
+ tbr.getDurationStep(), tbr.getMaxDuration()/60, extendedNote);
}
- private String getBaseBasalRange() {
- Float maxValue = getBaseBasalMaxValue();
+ private String getBaseBasalRange()
+ {
+ Double maxValue = getBaseBasalMaxValue();
- return maxValue == null ? "" + getBaseBasalMinValue() : getBaseBasalMinValue() + "-" + maxValue;
+ return maxValue==null ? "" + getBaseBasalMinValue() : getBaseBasalMinValue() + "-" + maxValue;
}
- private String getStep(String step, DoseStepSize stepSize) {
- if (stepSize != null)
+ private String getStep(String step, DoseStepSize stepSize)
+ {
+ if (stepSize!=null)
return step + " [" + stepSize.getDescription() + "] *";
else
return "" + step;
@@ -292,7 +306,84 @@ public enum PumpType {
public boolean hasExtendedBasals() {
- return ((getBaseBasalSpecialSteps() != null) || (getSpecialBolusSize() != null));
+ return ((getBaseBasalSpecialSteps() !=null) || (getSpecialBolusSize() != null));
}
+
+ public PumpCapability getSpecialBasalDurations() {
+
+ if (isParentSet())
+ {
+ return parent.getSpecialBasalDurations();
+ }
+ else
+ {
+ return specialBasalDurations == null ? //
+ PumpCapability.BasalRate_Duration15and30minNotAllowed : specialBasalDurations;
+ }
+ }
+
+ public double determineCorrectBolusSize(double bolusAmount) {
+ if (bolusAmount == 0.0d) {
+ return bolusAmount;
+ }
+
+ double bolusStepSize;
+
+ if (getSpecialBolusSize() == null) {
+ bolusStepSize = getBolusSize();
+ } else {
+ DoseStepSize specialBolusSize = getSpecialBolusSize();
+
+ bolusStepSize = specialBolusSize.getStepSizeForAmount((double)bolusAmount);
+ }
+
+ return Math.round(bolusAmount / bolusStepSize) * bolusStepSize;
+ }
+
+
+ public double determineCorrectExtendedBolusSize(double bolusAmount) {
+ if (bolusAmount == 0.0d) {
+ return bolusAmount;
+ }
+
+ double bolusStepSize;
+
+ if (getExtendedBolusSettings() == null) { // this should be never null
+ return 0.0d;
+ }
+
+ DoseSettings extendedBolusSettings = getExtendedBolusSettings();
+
+ bolusStepSize = extendedBolusSettings.getStep();
+
+ if (bolusAmount > extendedBolusSettings.getMaxDose()) {
+ bolusAmount = extendedBolusSettings.getMaxDose();
+ }
+
+ return Math.round(bolusAmount / bolusStepSize) * bolusStepSize;
+ }
+
+
+ public double determineCorrectBasalSize(double basalAmount) {
+ if (basalAmount == 0.0d) {
+ return basalAmount;
+ }
+
+ double basalStepSize;
+
+ if (getBaseBasalSpecialSteps() == null) {
+ basalStepSize = getBaseBasalStep();
+ } else {
+ DoseStepSize specialBolusSize = getBaseBasalSpecialSteps();
+
+ basalStepSize = specialBolusSize.getStepSizeForAmount((double) basalAmount);
+ }
+
+ if (basalAmount > getTbrSettings().getMaxDose())
+ basalAmount = getTbrSettings().getMaxDose().doubleValue();
+
+ return Math.round(basalAmount / basalStepSize) * basalStepSize;
+
+ }
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/driver/PumpDriverAbstract.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/driver/PumpDriverAbstract.java
index 1725534b3c..dd4ef0d01f 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/driver/PumpDriverAbstract.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/driver/PumpDriverAbstract.java
@@ -50,12 +50,12 @@ public abstract class PumpDriverAbstract implements PumpDriverInterface {
}
- @Override
- public Date lastDataTime() {
- if (this.pumpStatusData == null || this.pumpStatusData.lastDataTime == null) {
- return new Date();
- }
-
- return this.pumpStatusData.lastDataTime.toDate();
- }
+// @Override
+// public Date lastDataTime() {
+// if (this.pumpStatusData == null || this.pumpStatusData.lastDataTime == null) {
+// return new Date();
+// }
+//
+// return this.pumpStatusData.lastDataTime.toDate();
+// }
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/utils/PumpUtil.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/utils/PumpUtil.java
deleted file mode 100644
index 529b8bf1bd..0000000000
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCommon/utils/PumpUtil.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package info.nightscout.androidaps.plugins.PumpCommon.utils;
-
-import info.nightscout.androidaps.interfaces.PumpDescription;
-import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpCapability;
-import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpTempBasalType;
-import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpType;
-
-/**
- * Created by andy on 02/05/2018.
- */
-
-public class PumpUtil {
-
- public static void setPumpDescription(PumpDescription pumpDescription, PumpType pumpType) {
- setPumpDescription(pumpDescription, pumpType, false);
- }
-
-
- public static void setPumpDescription(PumpDescription pumpDescription, PumpType pumpType, boolean isVirtualPump) {
- PumpCapability pumpCapability = isVirtualPump ? PumpCapability.VirtualPump : pumpType.getPumpCapability();
-
- pumpDescription.isBolusCapable = pumpCapability.hasCapability(PumpCapability.Bolus);
- pumpDescription.bolusStep = pumpType.getBolusSize();
-
- pumpDescription.isExtendedBolusCapable = pumpCapability.hasCapability(PumpCapability.ExtendedBolus);
- pumpDescription.extendedBolusStep = pumpType.getExtendedBolusSettings().getStep();
- pumpDescription.extendedBolusDurationStep = pumpType.getExtendedBolusSettings().getDurationStep();
- pumpDescription.extendedBolusMaxDuration = pumpType.getExtendedBolusSettings().getMaxDuration();
-
- pumpDescription.isTempBasalCapable = pumpCapability.hasCapability(PumpCapability.TBR);
-
- if (pumpType.getPumpTempBasalType() == PumpTempBasalType.Percent) {
- pumpDescription.tempBasalStyle = PumpDescription.PERCENT;
- pumpDescription.maxTempPercent = pumpType.getTbrSettings().getMaxDose().intValue();
- pumpDescription.tempPercentStep = (int)pumpType.getTbrSettings().getStep();
- } else {
- pumpDescription.tempBasalStyle = PumpDescription.ABSOLUTE;
- pumpDescription.maxTempAbsolute = pumpType.getTbrSettings().getMaxDose();
- pumpDescription.tempAbsoluteStep = pumpType.getTbrSettings().getStep();
- }
-
- pumpDescription.tempDurationStep = pumpType.getTbrSettings().getDurationStep();
- pumpDescription.tempMaxDuration = pumpType.getTbrSettings().getMaxDuration();
-
- pumpDescription.isSetBasalProfileCapable = pumpCapability.hasCapability(PumpCapability.BasalProfileSet);
- pumpDescription.basalStep = pumpType.getBaseBasalStep();
- pumpDescription.basalMinimumRate = pumpType.getBaseBasalMinValue();
-
- pumpDescription.isRefillingCapable = pumpCapability.hasCapability(PumpCapability.Refill);
- pumpDescription.storesCarbInfo = pumpCapability.hasCapability(PumpCapability.StoreCarbInfo);
- }
-
-}
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..c50e635eb8 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/AbstractDanaRPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/AbstractDanaRPlugin.java
@@ -5,11 +5,11 @@ import android.support.annotation.Nullable;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.util.Date;
import info.nightscout.androidaps.BuildConfig;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.Profile;
@@ -26,6 +26,7 @@ import info.nightscout.androidaps.interfaces.PluginType;
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.Overview.events.EventDismissNotification;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
@@ -43,11 +44,10 @@ import info.nightscout.utils.SP;
*/
public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInterface, DanaRInterface, ConstraintsInterface, ProfileInterface {
- protected Logger log;
+ protected Logger log = LoggerFactory.getLogger(L.PUMP);
protected AbstractDanaRExecutionService sExecutionService;
- protected DanaRPump pump = DanaRPump.getInstance();
protected boolean useExtendedBoluses = false;
public PumpDescription pumpDescription = new PumpDescription();
@@ -66,7 +66,7 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte
@Override
public void onStateChange(PluginType type, State oldState, State newState) {
// if pump profile was enabled need to switch to another too
- if (type == PluginType.PUMP && newState == State.ENABLED && newState == State.DISABLED && isProfileInterfaceEnabled) {
+ if (type == PluginType.PUMP && newState == State.DISABLED && isProfileInterfaceEnabled) {
setPluginEnabled(PluginType.PROFILE, false);
NSProfilePlugin.getPlugin().setPluginEnabled(PluginType.PROFILE, true);
NSProfilePlugin.getPlugin().setFragmentVisible(PluginType.PROFILE, true);
@@ -75,7 +75,7 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte
@Override
public boolean isSuspended() {
- return pump.pumpSuspended;
+ return DanaRPump.getInstance().pumpSuspended;
}
@Override
@@ -124,6 +124,7 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte
public boolean isThisProfileSet(Profile profile) {
if (!isInitialized())
return true; // TODO: not sure what's better. so far TRUE to prevent too many SMS
+ DanaRPump pump = DanaRPump.getInstance();
if (pump.pumpProfiles == null)
return true; // TODO: not sure what's better. so far TRUE to prevent too many SMS
int basalValues = pump.basal48Enable ? 48 : 24;
@@ -133,7 +134,8 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte
Double profileValue = profile.getBasalTimeFromMidnight(h * basalIncrement);
if (profileValue == null) return true;
if (Math.abs(pumpValue - profileValue) > getPumpDescription().basalStep) {
- log.debug("Diff found. Hour: " + h + " Pump: " + pumpValue + " Profile: " + profileValue);
+ if (L.isEnabled(L.PUMP))
+ log.debug("Diff found. Hour: " + h + " Pump: " + pumpValue + " Profile: " + profileValue);
return false;
}
}
@@ -141,13 +143,13 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte
}
@Override
- public Date lastDataTime() {
- return new Date(pump.lastConnection);
+ public long lastDataTime() {
+ return DanaRPump.getInstance().lastConnection;
}
@Override
public double getBaseBasalRate() {
- return pump.currentBasal;
+ return DanaRPump.getInstance().currentBasal;
}
@Override
@@ -161,6 +163,7 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte
@Override
public PumpEnactResult setTempBasalPercent(Integer percent, Integer durationInMinutes, Profile profile, boolean enforceNew) {
+ DanaRPump pump = DanaRPump.getInstance();
PumpEnactResult result = new PumpEnactResult();
percent = MainApp.getConstraintChecker().applyBasalPercentConstraints(new Constraint<>(percent), profile).value();
if (percent < 0) {
@@ -183,7 +186,7 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte
result.duration = pump.tempBasalRemainingMin;
result.percent = pump.tempBasalPercent;
result.isPercent = true;
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalPercent: Correct value already set");
return result;
}
@@ -197,7 +200,7 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte
result.duration = pump.tempBasalRemainingMin;
result.percent = pump.tempBasalPercent;
result.isPercent = true;
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalPercent: OK");
return result;
}
@@ -210,7 +213,8 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte
@Override
public PumpEnactResult setExtendedBolus(Double insulin, Integer durationInMinutes) {
- insulin = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(insulin)).value();
+ DanaRPump pump = DanaRPump.getInstance();
+ insulin = MainApp.getConstraintChecker().applyExtendedBolusConstraints(new Constraint<>(insulin)).value();
// needs to be rounded
int durationInHalfHours = Math.max(durationInMinutes / 30, 1);
insulin = Round.roundTo(insulin, getPumpDescription().extendedBolusStep);
@@ -225,7 +229,7 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte
result.absolute = pump.extendedBolusAbsoluteRate;
result.isPercent = false;
result.isTempCancel = false;
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setExtendedBolus: Correct extended bolus already set. Current: " + pump.extendedBolusAmount + " Asked: " + insulin);
return result;
}
@@ -240,7 +244,7 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte
if (!SP.getBoolean("danar_useextended", false))
result.bolusDelivered = pump.extendedBolusAmount;
result.isPercent = false;
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setExtendedBolus: OK");
return result;
}
@@ -260,10 +264,10 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte
result.enacted = true;
result.isTempCancel = true;
}
- if (!pump.isExtendedInProgress) {
+ if (!DanaRPump.getInstance().isExtendedInProgress) {
result.success = true;
result.comment = MainApp.gs(R.string.virtualpump_resultok);
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("cancelExtendedBolus: OK");
return result;
} else {
@@ -278,8 +282,8 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte
public void connect(String from) {
if (sExecutionService != null) {
sExecutionService.connect();
- pumpDescription.basalStep = pump.basalStep;
- pumpDescription.bolusStep = pump.bolusStep;
+ pumpDescription.basalStep = DanaRPump.getInstance().basalStep;
+ pumpDescription.bolusStep = DanaRPump.getInstance().bolusStep;
}
}
@@ -307,13 +311,14 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte
public void getPumpStatus() {
if (sExecutionService != null) {
sExecutionService.getPumpStatus();
- pumpDescription.basalStep = pump.basalStep;
- pumpDescription.bolusStep = pump.bolusStep;
+ pumpDescription.basalStep = DanaRPump.getInstance().basalStep;
+ pumpDescription.bolusStep = DanaRPump.getInstance().bolusStep;
}
}
@Override
public JSONObject getJSONStatus(Profile profile, String profilename) {
+ DanaRPump pump = DanaRPump.getInstance();
long now = System.currentTimeMillis();
if (pump.lastConnection + 5 * 60 * 1000L < System.currentTimeMillis()) {
return null;
@@ -328,8 +333,8 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte
status.put("timestamp", DateUtil.toISOString(pump.lastConnection));
extended.put("Version", BuildConfig.VERSION_NAME + "-" + BuildConfig.BUILDVERSION);
extended.put("PumpIOB", pump.iob);
- if (pump.lastBolusTime.getTime() != 0) {
- extended.put("LastBolus", pump.lastBolusTime.toLocaleString());
+ if (pump.lastBolusTime != 0) {
+ extended.put("LastBolus", DateUtil.dateAndTimeFullString(pump.lastBolusTime));
extended.put("LastBolusAmount", pump.lastBolusAmount);
}
TemporaryBasal tb = TreatmentsPlugin.getPlugin().getRealTempBasalFromHistory(now);
@@ -363,7 +368,7 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte
@Override
public String deviceID() {
- return pump.serialNumber;
+ return DanaRPump.getInstance().serialNumber;
}
@Override
@@ -386,8 +391,7 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte
@Override
public Constraint applyBasalConstraints(Constraint absoluteRate, Profile profile) {
- if (pump != null)
- absoluteRate.setIfSmaller(pump.maxBasal, String.format(MainApp.gs(R.string.limitingbasalratio), pump.maxBasal, MainApp.gs(R.string.pumplimit)), this);
+ absoluteRate.setIfSmaller(DanaRPump.getInstance().maxBasal, String.format(MainApp.gs(R.string.limitingbasalratio), DanaRPump.getInstance().maxBasal, MainApp.gs(R.string.pumplimit)), this);
return absoluteRate;
}
@@ -401,27 +405,31 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte
@Override
public Constraint applyBolusConstraints(Constraint insulin) {
- if (pump != null)
- insulin.setIfSmaller(pump.maxBolus, String.format(MainApp.gs(R.string.limitingbolus), pump.maxBolus, MainApp.gs(R.string.pumplimit)), this);
+ insulin.setIfSmaller(DanaRPump.getInstance().maxBolus, String.format(MainApp.gs(R.string.limitingbolus), DanaRPump.getInstance().maxBolus, MainApp.gs(R.string.pumplimit)), this);
return insulin;
}
+ @Override
+ public Constraint applyExtendedBolusConstraints(Constraint insulin) {
+ return applyBolusConstraints(insulin);
+ }
+
@Nullable
@Override
public ProfileStore getProfile() {
- if (pump.lastSettingsRead == 0)
+ if (DanaRPump.getInstance().lastSettingsRead == 0)
return null; // no info now
- return pump.createConvertedProfile();
+ return DanaRPump.getInstance().createConvertedProfile();
}
@Override
public String getUnits() {
- return pump.getUnits();
+ return DanaRPump.getInstance().getUnits();
}
@Override
public String getProfileName() {
- return pump.createConvertedProfileName();
+ return DanaRPump.getInstance().createConvertedProfileName();
}
@Override
@@ -431,13 +439,14 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte
// Reply for sms communicator
public String shortStatus(boolean veryShort) {
+ DanaRPump pump = DanaRPump.getInstance();
String ret = "";
if (pump.lastConnection != 0) {
Long agoMsec = System.currentTimeMillis() - pump.lastConnection;
int agoMin = (int) (agoMsec / 60d / 1000d);
ret += "LastConn: " + agoMin + " minago\n";
}
- if (pump.lastBolusTime.getTime() != 0) {
+ if (pump.lastBolusTime != 0) {
ret += "LastBolus: " + DecimalFormatter.to2Decimal(pump.lastBolusAmount) + "U @" + android.text.format.DateFormat.format("HH:mm", pump.lastBolusTime) + "\n";
}
TemporaryBasal activeTemp = TreatmentsPlugin.getPlugin().getRealTempBasalFromHistory(System.currentTimeMillis());
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRFragment.java
index 7288602d65..83e27806d1 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRFragment.java
@@ -1,7 +1,6 @@
package info.nightscout.androidaps.plugins.PumpDanaR;
-import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
@@ -25,12 +24,14 @@ import butterknife.ButterKnife;
import butterknife.OnClick;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.TDDStatsActivity;
+import info.nightscout.androidaps.activities.TDDStatsActivity;
import info.nightscout.androidaps.db.ExtendedBolus;
+import info.nightscout.androidaps.db.TemporaryBasal;
import info.nightscout.androidaps.events.EventExtendedBolusChange;
import info.nightscout.androidaps.events.EventPumpStatusChanged;
import info.nightscout.androidaps.events.EventTempBasalChange;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.PumpDanaR.Dialogs.ProfileViewDialog;
@@ -42,11 +43,10 @@ import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.androidaps.queue.events.EventQueueChanged;
import info.nightscout.utils.DateUtil;
import info.nightscout.utils.DecimalFormatter;
-import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.SetWarnColor;
public class DanaRFragment extends SubscriberFragment {
- private static Logger log = LoggerFactory.getLogger(DanaRFragment.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMP);
private Handler loopHandler = new Handler();
private Runnable refreshLoop = new Runnable() {
@@ -113,18 +113,12 @@ public class DanaRFragment extends SubscriberFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
- try {
- View view = inflater.inflate(R.layout.danar_fragment, container, false);
- unbinder = ButterKnife.bind(this, view);
+ View view = inflater.inflate(R.layout.danar_fragment, container, false);
+ unbinder = ButterKnife.bind(this, view);
- pumpStatusView.setBackgroundColor(MainApp.gc(R.color.colorInitializingBorder));
+ pumpStatusView.setBackgroundColor(MainApp.gc(R.color.colorInitializingBorder));
- return view;
- } catch (Exception e) {
- FabricPrivacy.logException(e);
- }
-
- return null;
+ return view;
}
@OnClick(R.id.danar_history)
@@ -145,11 +139,14 @@ public class DanaRFragment extends SubscriberFragment {
}
@OnClick(R.id.danar_user_options)
- void onUserOptionsClick() { startActivity(new Intent(getContext(), DanaRUserOptionsActivity.class)); }
+ void onUserOptionsClick() {
+ startActivity(new Intent(getContext(), DanaRUserOptionsActivity.class));
+ }
@OnClick(R.id.danar_btconnection)
void onBtConnectionClick() {
- log.debug("Clicked connect to pump");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Clicked connect to pump");
DanaRPump.getInstance().lastConnection = 0;
ConfigBuilderPlugin.getCommandQueue().readStatus("Clicked connect to pump", null);
}
@@ -160,26 +157,24 @@ public class DanaRFragment extends SubscriberFragment {
final String status = c.textStatus();
if (activity != null) {
activity.runOnUiThread(
- new Runnable() {
- @Override
- public void run() {
- synchronized(DanaRFragment.this){
+ () -> {
+ synchronized (DanaRFragment.this) {
- if(btConnectionView == null || pumpStatusView == null || pumpStatusLayout == null ) return;
+ if (btConnectionView == null || pumpStatusView == null || pumpStatusLayout == null)
+ return;
- if (c.sStatus == EventPumpStatusChanged.CONNECTING)
- btConnectionView.setText("{fa-bluetooth-b spin} " + c.sSecondsElapsed + "s");
- else if (c.sStatus == EventPumpStatusChanged.CONNECTED)
- btConnectionView.setText("{fa-bluetooth}");
- else if (c.sStatus == EventPumpStatusChanged.DISCONNECTED)
- btConnectionView.setText("{fa-bluetooth-b}");
+ if (c.sStatus == EventPumpStatusChanged.CONNECTING)
+ btConnectionView.setText("{fa-bluetooth-b spin} " + c.sSecondsElapsed + "s");
+ else if (c.sStatus == EventPumpStatusChanged.CONNECTED)
+ btConnectionView.setText("{fa-bluetooth}");
+ else if (c.sStatus == EventPumpStatusChanged.DISCONNECTED)
+ btConnectionView.setText("{fa-bluetooth-b}");
- if (!status.equals("")) {
- pumpStatusView.setText(status);
- pumpStatusLayout.setVisibility(View.VISIBLE);
- } else {
- pumpStatusLayout.setVisibility(View.GONE);
- }
+ if (!status.equals("")) {
+ pumpStatusView.setText(status);
+ pumpStatusLayout.setVisibility(View.VISIBLE);
+ } else {
+ pumpStatusLayout.setVisibility(View.GONE);
}
}
}
@@ -212,80 +207,78 @@ public class DanaRFragment extends SubscriberFragment {
protected void updateGUI() {
Activity activity = getActivity();
if (activity != null && basaBasalRateView != null)
- activity.runOnUiThread(new Runnable() {
- @SuppressLint("SetTextI18n")
- @Override
- public void run() {
- synchronized(DanaRFragment.this) {
- if (!isBound()) return;
+ activity.runOnUiThread(() -> {
+ synchronized (DanaRFragment.this) {
+ if (!isBound()) return;
- DanaRPump pump = DanaRPump.getInstance();
- if (pump.lastConnection != 0) {
- Long agoMsec = System.currentTimeMillis() - pump.lastConnection;
- int agoMin = (int) (agoMsec / 60d / 1000d);
- lastConnectionView.setText(DateUtil.timeString(pump.lastConnection) + " (" + String.format(MainApp.gs(R.string.minago), agoMin) + ")");
- SetWarnColor.setColor(lastConnectionView, agoMin, 16d, 31d);
- }
- if (pump.lastBolusTime.getTime() != 0) {
- Long agoMsec = System.currentTimeMillis() - pump.lastBolusTime.getTime();
- double agoHours = agoMsec / 60d / 60d / 1000d;
- if (agoHours < 6) // max 6h back
- lastBolusView.setText(DateUtil.timeString(pump.lastBolusTime) + " " + DateUtil.sinceString(pump.lastBolusTime.getTime()) + " " + DecimalFormatter.to2Decimal(DanaRPump.getInstance().lastBolusAmount) + " U");
- else lastBolusView.setText("");
- }
+ DanaRPump pump = DanaRPump.getInstance();
+ if (pump.lastConnection != 0) {
+ Long agoMsec = System.currentTimeMillis() - pump.lastConnection;
+ int agoMin = (int) (agoMsec / 60d / 1000d);
+ lastConnectionView.setText(DateUtil.timeString(pump.lastConnection) + " (" + String.format(MainApp.gs(R.string.minago), agoMin) + ")");
+ SetWarnColor.setColor(lastConnectionView, agoMin, 16d, 31d);
+ }
+ if (pump.lastBolusTime != 0) {
+ Long agoMsec = System.currentTimeMillis() - pump.lastBolusTime;
+ double agoHours = agoMsec / 60d / 60d / 1000d;
+ if (agoHours < 6) // max 6h back
+ lastBolusView.setText(DateUtil.timeString(pump.lastBolusTime) + " " + DateUtil.sinceString(pump.lastBolusTime) + " " + DecimalFormatter.to2Decimal(DanaRPump.getInstance().lastBolusAmount) + " U");
+ else lastBolusView.setText("");
+ }
- dailyUnitsView.setText(DecimalFormatter.to0Decimal(pump.dailyTotalUnits) + " / " + pump.maxDailyTotalUnits + " U");
- SetWarnColor.setColor(dailyUnitsView, pump.dailyTotalUnits, pump.maxDailyTotalUnits * 0.75d, pump.maxDailyTotalUnits * 0.9d);
- basaBasalRateView.setText("( " + (pump.activeProfile + 1) + " ) " + DecimalFormatter.to2Decimal(ConfigBuilderPlugin.getActivePump().getBaseBasalRate()) + " U/h");
- // DanaRPlugin, DanaRKoreanPlugin
- if (ConfigBuilderPlugin.getActivePump().isFakingTempsByExtendedBoluses()) {
- if (TreatmentsPlugin.getPlugin().isInHistoryRealTempBasalInProgress()) {
- tempBasalView.setText(TreatmentsPlugin.getPlugin().getRealTempBasalFromHistory(System.currentTimeMillis()).toStringFull());
- } else {
- tempBasalView.setText("");
- }
+ dailyUnitsView.setText(DecimalFormatter.to0Decimal(pump.dailyTotalUnits) + " / " + pump.maxDailyTotalUnits + " U");
+ SetWarnColor.setColor(dailyUnitsView, pump.dailyTotalUnits, pump.maxDailyTotalUnits * 0.75d, pump.maxDailyTotalUnits * 0.9d);
+ basaBasalRateView.setText("( " + (pump.activeProfile + 1) + " ) " + DecimalFormatter.to2Decimal(ConfigBuilderPlugin.getActivePump().getBaseBasalRate()) + " U/h");
+ // DanaRPlugin, DanaRKoreanPlugin
+ if (ConfigBuilderPlugin.getActivePump().isFakingTempsByExtendedBoluses()) {
+ if (TreatmentsPlugin.getPlugin().isInHistoryRealTempBasalInProgress()) {
+ tempBasalView.setText(TreatmentsPlugin.getPlugin().getRealTempBasalFromHistory(System.currentTimeMillis()).toStringFull());
} else {
- // v2 plugin
- if (TreatmentsPlugin.getPlugin().isTempBasalInProgress()) {
- tempBasalView.setText(TreatmentsPlugin.getPlugin().getTempBasalFromHistory(System.currentTimeMillis()).toStringFull());
- } else {
- tempBasalView.setText("");
- }
+ tempBasalView.setText("");
}
- ExtendedBolus activeExtendedBolus = TreatmentsPlugin.getPlugin().getExtendedBolusFromHistory(System.currentTimeMillis());
- if (activeExtendedBolus != null) {
- extendedBolusView.setText(activeExtendedBolus.toString());
+ } else {
+ // v2 plugin
+ TemporaryBasal tb = TreatmentsPlugin.getPlugin().getTempBasalFromHistory(System.currentTimeMillis());
+ if (tb != null) {
+ tempBasalView.setText(tb.toStringFull());
} else {
- extendedBolusView.setText("");
+ tempBasalView.setText("");
}
- reservoirView.setText(DecimalFormatter.to0Decimal(pump.reservoirRemainingUnits) + " / 300 U");
- SetWarnColor.setColorInverse(reservoirView, pump.reservoirRemainingUnits, 50d, 20d);
- batteryView.setText("{fa-battery-" + (pump.batteryRemaining / 25) + "}");
- SetWarnColor.setColorInverse(batteryView, pump.batteryRemaining, 51d, 26d);
- iobView.setText(pump.iob + " U");
- if (pump.model != 0 || pump.protocol != 0 || pump.productCode != 0) {
- firmwareView.setText(String.format(MainApp.gs(R.string.danar_model), pump.model, pump.protocol, pump.productCode));
+ }
+ ExtendedBolus activeExtendedBolus = TreatmentsPlugin.getPlugin().getExtendedBolusFromHistory(System.currentTimeMillis());
+ if (activeExtendedBolus != null) {
+ extendedBolusView.setText(activeExtendedBolus.toString());
+ } else {
+ extendedBolusView.setText("");
+ }
+ reservoirView.setText(DecimalFormatter.to0Decimal(pump.reservoirRemainingUnits) + " / 300 U");
+ SetWarnColor.setColorInverse(reservoirView, pump.reservoirRemainingUnits, 50d, 20d);
+ batteryView.setText("{fa-battery-" + (pump.batteryRemaining / 25) + "}");
+ SetWarnColor.setColorInverse(batteryView, pump.batteryRemaining, 51d, 26d);
+ iobView.setText(pump.iob + " U");
+ if (pump.model != 0 || pump.protocol != 0 || pump.productCode != 0) {
+ firmwareView.setText(String.format(MainApp.gs(R.string.danar_model), pump.model, pump.protocol, pump.productCode));
+ } else {
+ firmwareView.setText("OLD");
+ }
+ basalStepView.setText("" + pump.basalStep);
+ bolusStepView.setText("" + pump.bolusStep);
+ serialNumberView.setText("" + pump.serialNumber);
+ if (queueView != null) {
+ Spanned status = ConfigBuilderPlugin.getCommandQueue().spannedStatus();
+ if (status.toString().equals("")) {
+ queueView.setVisibility(View.GONE);
} else {
- firmwareView.setText("OLD");
- }
- basalStepView.setText("" + pump.basalStep);
- bolusStepView.setText("" + pump.bolusStep);
- serialNumberView.setText("" + pump.serialNumber);
- if (queueView != null) {
- Spanned status = ConfigBuilderPlugin.getCommandQueue().spannedStatus();
- if (status.toString().equals("")) {
- queueView.setVisibility(View.GONE);
- } else {
- queueView.setVisibility(View.VISIBLE);
- queueView.setText(status);
- }
- }
- //hide user options button if not an RS pump
- boolean isKorean = MainApp.getSpecificPlugin(DanaRKoreanPlugin.class) != null && MainApp.getSpecificPlugin(DanaRKoreanPlugin.class).isEnabled(PluginType.PUMP);
- if (isKorean) {
- danar_user_options.setVisibility(View.GONE);
+ queueView.setVisibility(View.VISIBLE);
+ queueView.setText(status);
}
}
+ //hide user options button if not an RS pump or old firmware
+ // also excludes pump with model 03 because of untested error
+ boolean isKorean = DanaRKoreanPlugin.getPlugin().isEnabled(PluginType.PUMP);
+ if (isKorean || firmwareView.getText() == "OLD" || pump.model == 3) {
+ danar_user_options.setVisibility(View.GONE);
+ }
}
});
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java
index 144107779d..dfdca746cb 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java
@@ -2,7 +2,6 @@ package info.nightscout.androidaps.plugins.PumpDanaR;
import android.content.ComponentName;
import android.content.Context;
-import android.content.DialogInterface;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
@@ -11,9 +10,6 @@ import android.support.v7.app.AlertDialog;
import com.squareup.otto.Subscribe;
-import org.slf4j.LoggerFactory;
-
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.DetailedBolusInfo;
@@ -21,15 +17,16 @@ import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.data.PumpEnactResult;
import info.nightscout.androidaps.db.ExtendedBolus;
import info.nightscout.androidaps.db.TemporaryBasal;
-import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
-import info.nightscout.androidaps.plugins.PumpDanaR.comm.MsgBolusStartWithSpeed;
-import info.nightscout.androidaps.plugins.Treatments.Treatment;
import info.nightscout.androidaps.events.EventAppExit;
import info.nightscout.androidaps.events.EventPreferenceChange;
import info.nightscout.androidaps.interfaces.Constraint;
import info.nightscout.androidaps.interfaces.PluginType;
-import info.nightscout.androidaps.interfaces.PumpDescription;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
+import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpType;
+import info.nightscout.androidaps.plugins.PumpDanaR.comm.MsgBolusStartWithSpeed;
import info.nightscout.androidaps.plugins.PumpDanaR.services.DanaRExecutionService;
+import info.nightscout.androidaps.plugins.Treatments.Treatment;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.utils.Round;
import info.nightscout.utils.SP;
@@ -49,59 +46,28 @@ public class DanaRPlugin extends AbstractDanaRPlugin {
public DanaRPlugin() {
super();
- log = LoggerFactory.getLogger(DanaRPlugin.class);
- useExtendedBoluses = SP.getBoolean("danar_useextended", false);
-
- pumpDescription.isBolusCapable = true;
- pumpDescription.bolusStep = 0.05d;
-
- pumpDescription.isExtendedBolusCapable = true;
- pumpDescription.extendedBolusStep = 0.05d;
- pumpDescription.extendedBolusDurationStep = 30;
- pumpDescription.extendedBolusMaxDuration = 8 * 60;
-
- pumpDescription.isTempBasalCapable = true;
- pumpDescription.tempBasalStyle = PumpDescription.PERCENT;
-
- pumpDescription.maxTempPercent = 200;
- pumpDescription.tempPercentStep = 10;
-
- pumpDescription.tempDurationStep = 60;
- pumpDescription.tempMaxDuration = 24 * 60;
-
-
- pumpDescription.isSetBasalProfileCapable = true;
- pumpDescription.basalStep = 0.01d;
- pumpDescription.basalMinimumRate = 0.04d;
-
- pumpDescription.isRefillingCapable = true;
-
- pumpDescription.storesCarbInfo = false;
-
- pumpDescription.supportsTDDs = true;
- pumpDescription.needsManualTDDLoad = true;
+ useExtendedBoluses = SP.getBoolean(R.string.key_danar_useextended, false);
+ pumpDescription.setPumpDescription(PumpType.DanaR);
}
@Override
public void switchAllowed(ConfigBuilderFragment.PluginViewHolder.PluginSwitcher pluginSwitcher, FragmentActivity context) {
boolean allowHardwarePump = SP.getBoolean("allow_hardware_pump", false);
- if (allowHardwarePump || context == null){
+ if (allowHardwarePump || context == null) {
pluginSwitcher.invoke();
} else {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage(R.string.allow_hardware_pump_text)
- .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- pluginSwitcher.invoke();
- SP.putBoolean("allow_hardware_pump", true);
+ .setPositiveButton(R.string.yes, (dialog, id) -> {
+ pluginSwitcher.invoke();
+ SP.putBoolean("allow_hardware_pump", true);
+ if (L.isEnabled(L.PUMP))
log.debug("First time HW pump allowed!");
- }
})
- .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- pluginSwitcher.cancel();
+ .setNegativeButton(R.string.cancel, (dialog, id) -> {
+ pluginSwitcher.cancel();
+ if (L.isEnabled(L.PUMP))
log.debug("User does not allow switching to HW pump!");
- }
});
builder.create().show();
}
@@ -127,12 +93,14 @@ public class DanaRPlugin extends AbstractDanaRPlugin {
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceDisconnected(ComponentName name) {
- log.debug("Service is disconnected");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Service is disconnected");
sExecutionService = null;
}
public void onServiceConnected(ComponentName name, IBinder service) {
- log.debug("Service is connected");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Service is connected");
DanaRExecutionService.LocalBinder mLocalBinder = (DanaRExecutionService.LocalBinder) service;
sExecutionService = mLocalBinder.getServiceInstance();
}
@@ -148,7 +116,7 @@ public class DanaRPlugin extends AbstractDanaRPlugin {
public void onStatusEvent(final EventPreferenceChange s) {
if (isEnabled(PluginType.PUMP)) {
boolean previousValue = useExtendedBoluses;
- useExtendedBoluses = SP.getBoolean("danar_useextended", false);
+ useExtendedBoluses = SP.getBoolean(R.string.key_danar_useextended, false);
if (useExtendedBoluses != previousValue && TreatmentsPlugin.getPlugin().isInHistoryExtendedBoluslInProgress()) {
sExecutionService.extendedBolusStop();
@@ -175,7 +143,18 @@ public class DanaRPlugin extends AbstractDanaRPlugin {
@Override
public boolean isInitialized() {
- return pump.lastConnection > 0 && pump.isExtendedBolusEnabled && pump.maxBasal > 0;
+ DanaRPump pump = DanaRPump.getInstance();
+ return pump.lastConnection > 0 && pump.isExtendedBolusEnabled && pump.maxBasal > 0 && pump.isPasswordOK();
+ }
+
+ @Override
+ public boolean isHandshakeInProgress() {
+ return sExecutionService != null && sExecutionService.isHandshakeInProgress();
+ }
+
+ @Override
+ public void finishHandshaking() {
+ sExecutionService.finishHandshaking();
}
@Override
@@ -195,7 +174,7 @@ public class DanaRPlugin extends AbstractDanaRPlugin {
result.comment = String.format(MainApp.gs(R.string.boluserrorcode), detailedBolusInfo.insulin, t.insulin, MsgBolusStartWithSpeed.errorCode);
else
result.comment = MainApp.gs(R.string.virtualpump_resultok);
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("deliverTreatment: OK. Asked: " + detailedBolusInfo.insulin + " Delivered: " + result.bolusDelivered);
detailedBolusInfo.insulin = t.insulin;
detailedBolusInfo.date = System.currentTimeMillis();
@@ -220,6 +199,7 @@ public class DanaRPlugin extends AbstractDanaRPlugin {
//if (pump.lastConnection.getTime() + 30 * 60 * 1000L < System.currentTimeMillis()) {
// connect("setTempBasalAbsolute old data");
//}
+ DanaRPump pump = DanaRPump.getInstance();
PumpEnactResult result = new PumpEnactResult();
@@ -237,13 +217,13 @@ public class DanaRPlugin extends AbstractDanaRPlugin {
if (doTempOff) {
// If extended in progress
if (activeExtended != null && useExtendedBoluses) {
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: Stopping extended bolus (doTempOff)");
return cancelExtendedBolus();
}
// If temp in progress
if (activeTemp != null) {
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: Stopping temp basal (doTempOff)");
return cancelRealTempBasal();
}
@@ -252,7 +232,7 @@ public class DanaRPlugin extends AbstractDanaRPlugin {
result.percent = 100;
result.isPercent = true;
result.isTempCancel = true;
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: doTempOff OK");
return result;
}
@@ -264,12 +244,12 @@ public class DanaRPlugin extends AbstractDanaRPlugin {
if (percentRate > getPumpDescription().maxTempPercent) {
percentRate = getPumpDescription().maxTempPercent;
}
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: Calculated percent rate: " + percentRate);
// If extended in progress
if (activeExtended != null && useExtendedBoluses) {
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: Stopping extended bolus (doLowTemp || doHighTemp)");
result = cancelExtendedBolus();
if (!result.success) {
@@ -280,7 +260,7 @@ public class DanaRPlugin extends AbstractDanaRPlugin {
// Check if some temp is already in progress
if (activeTemp != null) {
// Correct basal already set ?
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: currently running: " + activeTemp.toString());
if (activeTemp.percentRate == percentRate) {
if (enforceNew) {
@@ -292,21 +272,21 @@ public class DanaRPlugin extends AbstractDanaRPlugin {
result.duration = activeTemp.getPlannedRemainingMinutes();
result.isPercent = true;
result.isTempCancel = false;
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: Correct temp basal already set (doLowTemp || doHighTemp)");
return result;
}
}
}
// Convert duration from minutes to hours
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: Setting temp basal " + percentRate + "% for " + durationInMinutes + " mins (doLowTemp || doHighTemp)");
return setTempBasalPercent(percentRate, durationInMinutes, profile, false);
}
if (doExtendedTemp) {
// Check if some temp is already in progress
if (activeTemp != null) {
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: Stopping temp basal (doExtendedTemp)");
result = cancelRealTempBasal();
// Check for proper result
@@ -325,7 +305,7 @@ public class DanaRPlugin extends AbstractDanaRPlugin {
extendedRateToSet = Round.roundTo(extendedRateToSet, pumpDescription.extendedBolusStep * 2); // *2 because of halfhours
// What is current rate of extended bolusing in u/h?
- if (Config.logPumpActions) {
+ if (L.isEnabled(L.PUMP)) {
log.debug("setTempBasalAbsolute: Extended bolus in progress: " + (activeExtended != null) + " rate: " + pump.extendedBolusAbsoluteRate + "U/h duration remaining: " + pump.extendedBolusRemainingMinutes + "min");
log.debug("setTempBasalAbsolute: Rate to set: " + extendedRateToSet + "U/h");
}
@@ -339,21 +319,21 @@ public class DanaRPlugin extends AbstractDanaRPlugin {
result.duration = pump.extendedBolusRemainingMinutes;
result.isPercent = false;
result.isTempCancel = false;
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: Correct extended already set");
return result;
}
// Now set new extended, no need to to stop previous (if running) because it's replaced
Double extendedAmount = extendedRateToSet / 2 * durationInHalfHours;
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: Setting extended: " + extendedAmount + "U halfhours: " + durationInHalfHours);
result = setExtendedBolus(extendedAmount, durationInMinutes);
if (!result.success) {
log.error("setTempBasalAbsolute: Failed to set extended bolus");
return result;
}
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: Extended bolus set ok");
result.absolute = result.absolute + getBaseBasalRate();
return result;
@@ -380,7 +360,7 @@ public class DanaRPlugin extends AbstractDanaRPlugin {
return result;
}
- public PumpEnactResult cancelRealTempBasal() {
+ private PumpEnactResult cancelRealTempBasal() {
PumpEnactResult result = new PumpEnactResult();
TemporaryBasal runningTB = TreatmentsPlugin.getPlugin().getTempBasalFromHistory(System.currentTimeMillis());
if (runningTB != null) {
@@ -388,11 +368,11 @@ public class DanaRPlugin extends AbstractDanaRPlugin {
result.enacted = true;
result.isTempCancel = true;
}
- if (!pump.isTempBasalInProgress) {
+ if (!DanaRPump.getInstance().isTempBasalInProgress) {
result.success = true;
result.isTempCancel = true;
result.comment = MainApp.gs(R.string.virtualpump_resultok);
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("cancelRealTempBasal: OK");
return result;
} else {
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 d9bc947b84..3a6b3b5786 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
@@ -9,18 +9,18 @@ import org.slf4j.LoggerFactory;
import java.text.DecimalFormat;
import java.util.Date;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.data.ProfileStore;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.utils.SP;
/**
* Created by mike on 04.07.2016.
*/
public class DanaRPump {
- private static Logger log = LoggerFactory.getLogger(DanaRPump.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMP);
private static DanaRPump instance = null;
@@ -65,11 +65,11 @@ public class DanaRPump {
// Info
public String serialNumber = "";
- public Date shippingDate = new Date(0);
+ public long shippingDate = 0;
public String shippingCountry = "";
public boolean isNewPump = true;
public int password = -1;
- public Date pumpTime = new Date(0);
+ public long pumpTime = 0;
public static final int DOMESTIC_MODEL = 0x01;
public static final int EXPORT_MODEL = 0x03;
@@ -98,7 +98,7 @@ public class DanaRPump {
public int batteryRemaining;
public boolean bolusBlocked;
- public Date lastBolusTime = new Date(0);
+ public long lastBolusTime = 0;
public double lastBolusAmount;
public double currentBasal;
@@ -107,7 +107,7 @@ public class DanaRPump {
public int tempBasalPercent;
public int tempBasalRemainingMin;
public int tempBasalTotalSec;
- public Date tempBasalStart;
+ public long tempBasalStart;
public boolean isDualBolusInProgress;
public boolean isExtendedInProgress;
@@ -115,7 +115,7 @@ public class DanaRPump {
public double extendedBolusAmount;
public double extendedBolusAbsoluteRate;
public int extendedBolusSoFarInMinutes;
- public Date extendedBolusStart;
+ public long extendedBolusStart;
public int extendedBolusRemainingMinutes;
public double extendedBolusDeliveredSoFar; //RS only
@@ -236,17 +236,23 @@ public class DanaRPump {
return PROFILE_PREFIX + (activeProfile + 1);
}
- public static double[] buildDanaRProfileRecord(Profile nsProfile) {
+ public double[] buildDanaRProfileRecord(Profile nsProfile) {
double[] record = new double[24];
for (Integer hour = 0; hour < 24; hour++) {
//Some values get truncated to the next lower one.
// -> round them to two decimals and make sure we are a small delta larger (that will get truncated)
double value = Math.round(100d * nsProfile.getBasalTimeFromMidnight((Integer) (hour * 60 * 60)))/100d + 0.00001;
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMP))
log.debug("NS basal value for " + hour + ":00 is " + value);
record[hour] = value;
}
return record;
}
+ public boolean isPasswordOK() {
+ if (password != -1 && password != SP.getInt(R.string.key_danar_password, -1)) {
+ return false;
+ }
+ return true;
+ }
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/Dialogs/ProfileViewDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/Dialogs/ProfileViewDialog.java
index d8157281bd..e44ffd8c57 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/Dialogs/ProfileViewDialog.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/Dialogs/ProfileViewDialog.java
@@ -1,8 +1,6 @@
package info.nightscout.androidaps.plugins.PumpDanaR.Dialogs;
import android.os.Bundle;
-import android.os.Handler;
-import android.os.HandlerThread;
import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
@@ -10,22 +8,12 @@ import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Date;
-
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.data.ProfileStore;
-import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.data.Profile;
+import info.nightscout.androidaps.data.ProfileStore;
import info.nightscout.androidaps.interfaces.ProfileInterface;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
-import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin;
-import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
-import info.nightscout.androidaps.plugins.PumpDanaRKorean.DanaRKoreanPlugin;
-import info.nightscout.androidaps.plugins.PumpDanaRv2.DanaRv2Plugin;
import info.nightscout.androidaps.plugins.Treatments.fragments.ProfileGraph;
import info.nightscout.utils.DecimalFormatter;
@@ -33,8 +21,6 @@ import info.nightscout.utils.DecimalFormatter;
* Created by mike on 10.07.2016.
*/
public class ProfileViewDialog extends DialogFragment {
- private static Logger log = LoggerFactory.getLogger(ProfileViewDialog.class);
-
private TextView noProfile;
private TextView units;
private TextView dia;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/SerialIOThread.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/SerialIOThread.java
index 2f377a566a..a319353d63 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/SerialIOThread.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/SerialIOThread.java
@@ -10,7 +10,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageHashTable;
import info.nightscout.androidaps.plugins.PumpDanaR.services.AbstractSerialIOThread;
@@ -20,7 +20,7 @@ import info.nightscout.utils.CRC;
* Created by mike on 17.07.2016.
*/
public class SerialIOThread extends AbstractSerialIOThread {
- private static Logger log = LoggerFactory.getLogger(SerialIOThread.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPBTCOMM);
private InputStream mInputStream = null;
private OutputStream mOutputStream = null;
@@ -71,7 +71,7 @@ public class SerialIOThread extends AbstractSerialIOThread {
message = MessageHashTable.findMessage(command);
}
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPBTCOMM))
log.debug("<<<<< " + message.getMessageName() + " " + message.toHexString(extractedBuff));
// process the message content
@@ -83,7 +83,7 @@ public class SerialIOThread extends AbstractSerialIOThread {
}
}
} catch (Exception e) {
- if (Config.logDanaSerialEngine && e.getMessage().indexOf("bt socket closed") < 0)
+ if (e.getMessage().indexOf("bt socket closed") < 0)
log.error("Thread exception: ", e);
mKeepRunning = false;
}
@@ -147,7 +147,7 @@ public class SerialIOThread extends AbstractSerialIOThread {
processedMessage = message;
byte[] messageBytes = message.getRawMessageBytes();
- if (Config.logDanaSerialEngine)
+ if (L.isEnabled(L.PUMPBTCOMM))
log.debug(">>>>> " + message.getMessageName() + " " + message.toHexString(messageBytes));
try {
@@ -169,7 +169,8 @@ public class SerialIOThread extends AbstractSerialIOThread {
log.warn("Reply not received " + message.getMessageName());
if (message.getCommand() == 0xF0F1) {
DanaRPump.getInstance().isNewPump = false;
- log.debug("Old firmware detected");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Old firmware detected");
}
}
}
@@ -180,24 +181,29 @@ public class SerialIOThread extends AbstractSerialIOThread {
try {
mInputStream.close();
} catch (Exception e) {
- if (Config.logDanaSerialEngine) log.debug(e.getMessage());
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug(e.getMessage());
}
try {
mOutputStream.close();
} catch (Exception e) {
- if (Config.logDanaSerialEngine) log.debug(e.getMessage());
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug(e.getMessage());
}
try {
mRfCommSocket.close();
} catch (Exception e) {
- if (Config.logDanaSerialEngine) log.debug(e.getMessage());
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug(e.getMessage());
}
try {
System.runFinalization();
} catch (Exception e) {
- if (Config.logDanaSerialEngine) log.debug(e.getMessage());
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug(e.getMessage());
}
- if (Config.logDanaSerialEngine) log.debug("Disconnected: " + reason);
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("Disconnected: " + reason);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRHistoryActivity.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRHistoryActivity.java
index 97c5569b4b..6398c41a09 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRHistoryActivity.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRHistoryActivity.java
@@ -31,7 +31,9 @@ import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.db.DanaRHistoryRecord;
import info.nightscout.androidaps.events.EventPumpStatusChanged;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.RecordTypes;
import info.nightscout.androidaps.plugins.PumpDanaR.events.EventDanaRSyncStatus;
import info.nightscout.androidaps.plugins.PumpDanaRKorean.DanaRKoreanPlugin;
@@ -42,12 +44,9 @@ import info.nightscout.utils.DecimalFormatter;
import info.nightscout.utils.ToastUtils;
public class DanaRHistoryActivity extends Activity {
- private static Logger log = LoggerFactory.getLogger(DanaRHistoryActivity.class);
-
- private boolean mBounded;
+ private static Logger log = LoggerFactory.getLogger(L.PUMP);
private Handler mHandler;
- private static HandlerThread mHandlerThread;
static Profile profile = null;
@@ -65,7 +64,7 @@ public class DanaRHistoryActivity extends Activity {
public byte type;
String name;
- public TypeList(byte type, String name) {
+ TypeList(byte type, String name) {
this.type = type;
this.name = name;
}
@@ -78,7 +77,7 @@ public class DanaRHistoryActivity extends Activity {
public DanaRHistoryActivity() {
super();
- mHandlerThread = new HandlerThread(DanaRHistoryActivity.class.getSimpleName());
+ HandlerThread mHandlerThread = new HandlerThread(DanaRHistoryActivity.class.getSimpleName());
mHandlerThread.start();
this.mHandler = new Handler(mHandlerThread.getLooper());
}
@@ -116,8 +115,8 @@ public class DanaRHistoryActivity extends Activity {
statusView.setVisibility(View.GONE);
- boolean isKorean = MainApp.getSpecificPlugin(DanaRKoreanPlugin.class) != null && MainApp.getSpecificPlugin(DanaRKoreanPlugin.class).isEnabled(PluginType.PUMP);
- boolean isRS = MainApp.getSpecificPlugin(DanaRSPlugin.class) != null && MainApp.getSpecificPlugin(DanaRSPlugin.class).isEnabled(PluginType.PUMP);
+ boolean isKorean = DanaRKoreanPlugin.getPlugin().isEnabled(PluginType.PUMP);
+ boolean isRS = DanaRSPlugin.getPlugin().isEnabled(PluginType.PUMP);
// Types
@@ -141,10 +140,30 @@ public class DanaRHistoryActivity extends Activity {
R.layout.spinner_centered, typeList);
historyTypeSpinner.setAdapter(spinnerAdapter);
- reloadButton.setOnClickListener(new View.OnClickListener() {
+ reloadButton.setOnClickListener(v -> {
+ final TypeList selected = (TypeList) historyTypeSpinner.getSelectedItem();
+ runOnUiThread(() -> {
+ reloadButton.setVisibility(View.GONE);
+ syncButton.setVisibility(View.GONE);
+ statusView.setVisibility(View.VISIBLE);
+ });
+ clearCardView();
+ ConfigBuilderPlugin.getCommandQueue().loadHistory(selected.type, new Callback() {
+ @Override
+ public void run() {
+ loadDataFromDB(selected.type);
+ runOnUiThread(() -> {
+ reloadButton.setVisibility(View.VISIBLE);
+ syncButton.setVisibility(View.VISIBLE);
+ statusView.setVisibility(View.GONE);
+ });
+ }
+ });
+ });
+
+ syncButton.setOnClickListener(v -> mHandler.post(new Runnable() {
@Override
- public void onClick(View v) {
- final TypeList selected = (TypeList) historyTypeSpinner.getSelectedItem();
+ public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
@@ -153,52 +172,18 @@ public class DanaRHistoryActivity extends Activity {
statusView.setVisibility(View.VISIBLE);
}
});
- clearCardView();
- ConfigBuilderPlugin.getCommandQueue().loadHistory(selected.type, new Callback() {
+ DanaRNSHistorySync sync = new DanaRNSHistorySync(historyList);
+ sync.sync(DanaRNSHistorySync.SYNC_ALL);
+ runOnUiThread(new Runnable() {
@Override
public void run() {
- loadDataFromDB(selected.type);
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- reloadButton.setVisibility(View.VISIBLE);
- syncButton.setVisibility(View.VISIBLE);
- statusView.setVisibility(View.GONE);
- }
- });
+ reloadButton.setVisibility(View.VISIBLE);
+ syncButton.setVisibility(View.VISIBLE);
+ statusView.setVisibility(View.GONE);
}
});
}
- });
-
- syncButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- reloadButton.setVisibility(View.GONE);
- syncButton.setVisibility(View.GONE);
- statusView.setVisibility(View.VISIBLE);
- }
- });
- DanaRNSHistorySync sync = new DanaRNSHistorySync(historyList);
- sync.sync(DanaRNSHistorySync.SYNC_ALL);
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- reloadButton.setVisibility(View.VISIBLE);
- syncButton.setVisibility(View.VISIBLE);
- statusView.setVisibility(View.GONE);
- }
- });
- }
- });
- }
- });
+ }));
historyTypeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
@@ -213,7 +198,7 @@ public class DanaRHistoryActivity extends Activity {
clearCardView();
}
});
- profile = MainApp.getConfigBuilder().getProfile();
+ profile = ProfileFunctions.getInstance().getProfile();
if (profile == null) {
ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.noprofile));
finish();
@@ -324,7 +309,7 @@ public class DanaRHistoryActivity extends Activity {
super.onAttachedToRecyclerView(recyclerView);
}
- public static class HistoryViewHolder extends RecyclerView.ViewHolder {
+ static class HistoryViewHolder extends RecyclerView.ViewHolder {
CardView cv;
TextView time;
TextView value;
@@ -355,45 +340,26 @@ public class DanaRHistoryActivity extends Activity {
private void loadDataFromDB(byte type) {
historyList = MainApp.getDbHelper().getDanaRHistoryRecordsByType(type);
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- recyclerView.swapAdapter(new RecyclerViewAdapter(historyList), false);
- }
- });
+ runOnUiThread(() -> recyclerView.swapAdapter(new RecyclerViewAdapter(historyList), false));
}
private void clearCardView() {
historyList = new ArrayList<>();
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- recyclerView.swapAdapter(new RecyclerViewAdapter(historyList), false);
- }
- });
+ runOnUiThread(() -> recyclerView.swapAdapter(new RecyclerViewAdapter(historyList), false));
}
@Subscribe
public void onStatusEvent(final EventDanaRSyncStatus s) {
- log.debug("EventDanaRSyncStatus: " + s.message);
+ if (L.isEnabled(L.PUMP))
+ log.debug("EventDanaRSyncStatus: " + s.message);
runOnUiThread(
- new Runnable() {
- @Override
- public void run() {
- statusView.setText(s.message);
- }
- });
+ () -> statusView.setText(s.message));
}
@Subscribe
public void onStatusEvent(final EventPumpStatusChanged s) {
runOnUiThread(
- new Runnable() {
- @Override
- public void run() {
- statusView.setText(s.textStatus());
- }
- }
+ () -> statusView.setText(s.textStatus())
);
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRNSHistorySync.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRNSHistorySync.java
index d505443c1d..eab9e8bc6e 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRNSHistorySync.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRNSHistorySync.java
@@ -10,22 +10,22 @@ import java.util.List;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.db.CareportalEvent;
import info.nightscout.androidaps.db.DanaRHistoryRecord;
-import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
-import info.nightscout.androidaps.data.Profile;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.RecordTypes;
import info.nightscout.androidaps.plugins.PumpDanaR.events.EventDanaRSyncStatus;
import info.nightscout.utils.DateUtil;
-import info.nightscout.utils.NSUpload;
-import info.nightscout.utils.ToastUtils;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
/**
* Created by mike on 20.07.2016.
*/
public class DanaRNSHistorySync {
- private static Logger log = LoggerFactory.getLogger(DanaRNSHistorySync.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMP);
private List historyRecords;
public final static int SYNC_BOLUS = 0b00000001;
@@ -50,7 +50,8 @@ public class DanaRNSHistorySync {
long records = historyRecords.size();
long processing = 0;
long uploaded = 0;
- log.debug("Database contains " + records + " records");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Database contains " + records + " records");
EventDanaRSyncStatus ev = new EventDanaRSyncStatus();
for (DanaRHistoryRecord record : historyRecords) {
processing++;
@@ -63,7 +64,8 @@ public class DanaRNSHistorySync {
if ((what & SYNC_BOLUS) == 0) break;
switch (record.bolusType) {
case "S":
- log.debug("Syncing standard bolus record " + record.recordValue + "U " + DateUtil.toISOString(record.recordDate));
+ if (L.isEnabled(L.PUMP))
+ log.debug("Syncing standard bolus record " + record.recordValue + "U " + DateUtil.toISOString(record.recordDate));
nsrec.put(DANARSIGNATURE, record.bytes);
nsrec.put("eventType", "Meal Bolus");
nsrec.put("insulin", record.recordValue);
@@ -75,7 +77,8 @@ public class DanaRNSHistorySync {
break;
case "E":
if (record.recordDuration > 0) {
- log.debug("Syncing extended bolus record " + record.recordValue + "U " + DateUtil.toISOString(record.recordDate));
+ if (L.isEnabled(L.PUMP))
+ log.debug("Syncing extended bolus record " + record.recordValue + "U " + DateUtil.toISOString(record.recordDate));
nsrec.put(DANARSIGNATURE, record.bytes);
nsrec.put("eventType", CareportalEvent.COMBOBOLUS);
nsrec.put("insulin", 0);
@@ -91,11 +94,13 @@ public class DanaRNSHistorySync {
uploaded++;
ev.message += MainApp.gs(R.string.danar_ebolus);
} else {
- log.debug("NOT Syncing extended bolus record " + record.recordValue + "U " + DateUtil.toISOString(record.recordDate) + " zero duration");
+ if (L.isEnabled(L.PUMP))
+ log.debug("NOT Syncing extended bolus record " + record.recordValue + "U " + DateUtil.toISOString(record.recordDate) + " zero duration");
}
break;
case "DS":
- log.debug("Syncing dual(S) bolus record " + record.recordValue + "U " + DateUtil.toISOString(record.recordDate));
+ if (L.isEnabled(L.PUMP))
+ log.debug("Syncing dual(S) bolus record " + record.recordValue + "U " + DateUtil.toISOString(record.recordDate));
nsrec.put(DANARSIGNATURE, record.bytes);
nsrec.put("eventType", CareportalEvent.COMBOBOLUS);
nsrec.put("insulin", record.recordValue);
@@ -108,7 +113,8 @@ public class DanaRNSHistorySync {
ev.message += MainApp.gs(R.string.danar_dsbolus);
break;
case "DE":
- log.debug("Syncing dual(E) bolus record " + record.recordValue + "U " + DateUtil.toISOString(record.recordDate));
+ if (L.isEnabled(L.PUMP))
+ log.debug("Syncing dual(E) bolus record " + record.recordValue + "U " + DateUtil.toISOString(record.recordDate));
nsrec.put(DANARSIGNATURE, record.bytes);
nsrec.put("eventType", CareportalEvent.COMBOBOLUS);
nsrec.put("duration", record.recordDuration);
@@ -124,13 +130,14 @@ public class DanaRNSHistorySync {
ev.message += MainApp.gs(R.string.danar_debolus);
break;
default:
- log.debug("Unknown bolus record");
+ log.error("Unknown bolus record");
break;
}
break;
case RecordTypes.RECORD_TYPE_ERROR:
if ((what & SYNC_ERROR) == 0) break;
- log.debug("Syncing error record " + DateUtil.toISOString(record.recordDate));
+ if (L.isEnabled(L.PUMP))
+ log.debug("Syncing error record " + DateUtil.toISOString(record.recordDate));
nsrec.put(DANARSIGNATURE, record.bytes);
nsrec.put("eventType", "Note");
nsrec.put("notes", "Error");
@@ -142,7 +149,8 @@ public class DanaRNSHistorySync {
break;
case RecordTypes.RECORD_TYPE_REFILL:
if ((what & SYNC_REFILL) == 0) break;
- log.debug("Syncing refill record " + record.recordValue + " " + DateUtil.toISOString(record.recordDate));
+ if (L.isEnabled(L.PUMP))
+ log.debug("Syncing refill record " + record.recordValue + " " + DateUtil.toISOString(record.recordDate));
nsrec.put(DANARSIGNATURE, record.bytes);
nsrec.put("eventType", "Insulin Change");
nsrec.put("notes", "Refill " + record.recordValue + "U");
@@ -154,7 +162,8 @@ public class DanaRNSHistorySync {
break;
case RecordTypes.RECORD_TYPE_BASALHOUR:
if ((what & SYNC_BASALHOURS) == 0) break;
- log.debug("Syncing basal hour record " + record.recordValue + " " + DateUtil.toISOString(record.recordDate));
+ if (L.isEnabled(L.PUMP))
+ log.debug("Syncing basal hour record " + record.recordValue + " " + DateUtil.toISOString(record.recordDate));
nsrec.put(DANARSIGNATURE, record.bytes);
nsrec.put("eventType", CareportalEvent.TEMPBASAL);
nsrec.put("absolute", record.recordValue);
@@ -170,10 +179,11 @@ public class DanaRNSHistorySync {
break;
case RecordTypes.RECORD_TYPE_GLUCOSE:
if ((what & SYNC_GLUCOSE) == 0) break;
- log.debug("Syncing glucose record " + record.recordValue + " " + DateUtil.toISOString(record.recordDate));
+ if (L.isEnabled(L.PUMP))
+ log.debug("Syncing glucose record " + record.recordValue + " " + DateUtil.toISOString(record.recordDate));
nsrec.put(DANARSIGNATURE, record.bytes);
nsrec.put("eventType", "BG Check");
- nsrec.put("glucose", Profile.fromMgdlToUnits(record.recordValue, MainApp.getConfigBuilder().getProfileUnits()));
+ nsrec.put("glucose", Profile.fromMgdlToUnits(record.recordValue, ProfileFunctions.getInstance().getProfileUnits()));
nsrec.put("glucoseType", "Finger");
nsrec.put("created_at", DateUtil.toISOString(record.recordDate));
nsrec.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name));
@@ -183,7 +193,8 @@ public class DanaRNSHistorySync {
break;
case RecordTypes.RECORD_TYPE_CARBO:
if ((what & SYNC_CARBO) == 0) break;
- log.debug("Syncing carbo record " + record.recordValue + "g " + DateUtil.toISOString(record.recordDate));
+ if (L.isEnabled(L.PUMP))
+ log.debug("Syncing carbo record " + record.recordValue + "g " + DateUtil.toISOString(record.recordDate));
nsrec.put(DANARSIGNATURE, record.bytes);
nsrec.put("eventType", "Meal Bolus");
nsrec.put("carbs", record.recordValue);
@@ -195,7 +206,8 @@ public class DanaRNSHistorySync {
break;
case RecordTypes.RECORD_TYPE_ALARM:
if ((what & SYNC_ALARM) == 0) break;
- log.debug("Syncing alarm record " + record.recordAlarm + " " + DateUtil.toISOString(record.recordDate));
+ if (L.isEnabled(L.PUMP))
+ log.debug("Syncing alarm record " + record.recordAlarm + " " + DateUtil.toISOString(record.recordDate));
nsrec.put(DANARSIGNATURE, record.bytes);
nsrec.put("eventType", "Note");
nsrec.put("notes", "Alarm: " + record.recordAlarm);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRUserOptionsActivity.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRUserOptionsActivity.java
index b4930a2a1a..336c526d82 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRUserOptionsActivity.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRUserOptionsActivity.java
@@ -19,6 +19,7 @@ import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.events.EventInitializationChanged;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
import info.nightscout.androidaps.plugins.PumpDanaRS.DanaRSPlugin;
@@ -30,7 +31,7 @@ import info.nightscout.utils.NumberPicker;
*/
public class DanaRUserOptionsActivity extends Activity {
- private static Logger log = LoggerFactory.getLogger(DanaRUserOptionsActivity.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMP);
Switch timeFormat;
Switch buttonScroll;
@@ -45,6 +46,10 @@ public class DanaRUserOptionsActivity extends Activity {
NumberPicker shutdown;
NumberPicker lowReservoir;
Button saveToPumpButton;
+ // This is for Dana pumps only
+ boolean isRS = MainApp.getSpecificPlugin(DanaRSPlugin.class) != null && MainApp.getSpecificPlugin(DanaRSPlugin.class).isEnabled(PluginType.PUMP);
+ boolean isDanaR = MainApp.getSpecificPlugin(DanaRPlugin.class) != null && MainApp.getSpecificPlugin(DanaRPlugin.class).isEnabled(PluginType.PUMP);
+ boolean isDanaRv2 = MainApp.getSpecificPlugin(DanaRv2Plugin.class) != null && MainApp.getSpecificPlugin(DanaRv2Plugin.class).isEnabled(PluginType.PUMP);
@Override
protected void onResume() {
@@ -81,14 +86,15 @@ public class DanaRUserOptionsActivity extends Activity {
DanaRPump pump = DanaRPump.getInstance();
//used for debugging
- log.debug("UserOptionsLoaded:" + (System.currentTimeMillis() - pump.lastConnection) / 1000 + " s ago"
- + "\ntimeDisplayType:" + pump.timeDisplayType
- + "\nbuttonScroll:" + pump.buttonScrollOnOff
- + "\ntimeDisplayType:" + pump.timeDisplayType
- + "\nlcdOnTimeSec:" + pump.lcdOnTimeSec
- + "\nbacklight:" + pump.backlightOnTimeSec
- + "\npumpUnits:" + pump.units
- + "\nlowReservoir:" + pump.lowReservoirRate);
+ if (L.isEnabled(L.PUMP))
+ log.debug("UserOptionsLoaded:" + (System.currentTimeMillis() - pump.lastConnection) / 1000 + " s ago"
+ + "\ntimeDisplayType:" + pump.timeDisplayType
+ + "\nbuttonScroll:" + pump.buttonScrollOnOff
+ + "\ntimeDisplayType:" + pump.timeDisplayType
+ + "\nlcdOnTimeSec:" + pump.lcdOnTimeSec
+ + "\nbacklight:" + pump.backlightOnTimeSec
+ + "\npumpUnits:" + pump.units
+ + "\nlowReservoir:" + pump.lowReservoirRate);
screenTimeout.setParams((double) pump.lcdOnTimeSec, 5d, 240d, 5d, new DecimalFormat("1"), false);
backlightTimeout.setParams((double) pump.backlightOnTimeSec, 1d, 60d, 1d, new DecimalFormat("1"), false);
@@ -118,15 +124,15 @@ public class DanaRUserOptionsActivity extends Activity {
break;
}
if (pump.lastSettingsRead == 0)
- log.debug("No settings loaded from pump!");
+ log.error("No settings loaded from pump!");
else
setData();
}
public void setData() {
DanaRPump pump = DanaRPump.getInstance();
-
- timeFormat.setChecked(pump.timeDisplayType != 0);
+ // in DanaRS timeDisplay values are reversed
+ timeFormat.setChecked((!isRS && pump.timeDisplayType != 0) || (isRS && pump.timeDisplayType == 0));
buttonScroll.setChecked(pump.buttonScrollOnOff != 0);
beep.setChecked(pump.beepAndAlarm > 4);
screenTimeout.setValue((double) pump.lcdOnTimeSec);
@@ -142,19 +148,22 @@ public class DanaRUserOptionsActivity extends Activity {
}
public void onSaveClick() {
- boolean isRS = MainApp.getSpecificPlugin(DanaRSPlugin.class) != null && MainApp.getSpecificPlugin(DanaRSPlugin.class).isEnabled(PluginType.PUMP);
- boolean isDanaR = MainApp.getSpecificPlugin(DanaRPlugin.class) != null && MainApp.getSpecificPlugin(DanaRPlugin.class).isEnabled(PluginType.PUMP);
- boolean isDanaRv2 = MainApp.getSpecificPlugin(DanaRv2Plugin.class) != null && MainApp.getSpecificPlugin(DanaRv2Plugin.class).isEnabled(PluginType.PUMP);
if (!isRS && !isDanaR && !isDanaRv2) {
//exit if pump is not DanaRS, Dana!, or DanaR with upgraded firmware
return;
}
DanaRPump pump = DanaRPump.getInstance();
-
if (timeFormat.isChecked())
pump.timeDisplayType = 1;
else
pump.timeDisplayType = 0;
+ // displayTime on RS is reversed
+ if (isRS) {
+ if (timeFormat.isChecked())
+ pump.timeDisplayType = 0;
+ else
+ pump.timeDisplayType = 1;
+ }
if (buttonScroll.isChecked())
pump.buttonScrollOnOff = 1;
else
@@ -168,13 +177,13 @@ public class DanaRUserOptionsActivity extends Activity {
// step is 5 seconds
- int screenTimeoutValue = !screenTimeout.getText().isEmpty() ? (Integer.parseInt(screenTimeout.getText().toString()) / 5) * 5: 5;
+ int screenTimeoutValue = !screenTimeout.getText().isEmpty() ? (Integer.parseInt(screenTimeout.getText().toString()) / 5) * 5 : 5;
if (screenTimeoutValue > 4 && screenTimeoutValue < 241) {
pump.lcdOnTimeSec = screenTimeoutValue;
} else {
pump.lcdOnTimeSec = 5;
}
- int backlightTimeoutValue = !backlightTimeout.getText().isEmpty() ? Integer.parseInt(backlightTimeout.getText().toString()): 1;
+ int backlightTimeoutValue = !backlightTimeout.getText().isEmpty() ? Integer.parseInt(backlightTimeout.getText().toString()) : 1;
if (backlightTimeoutValue > 0 && backlightTimeoutValue < 61) {
pump.backlightOnTimeSec = backlightTimeoutValue;
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MessageBase.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MessageBase.java
index 2e6c02458e..0fd444412f 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MessageBase.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MessageBase.java
@@ -12,7 +12,7 @@ import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.utils.CRC;
/*
@@ -22,7 +22,7 @@ import info.nightscout.utils.CRC;
*/
public class MessageBase {
- private static Logger log = LoggerFactory.getLogger(MessageBase.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
protected byte[] buffer = new byte[512];
private int position = 6;
@@ -95,7 +95,7 @@ public class MessageBase {
}
public void handleMessage(byte[] bytes) {
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
if (bytes.length > 6) {
int command = (bytes[5] & 0xFF) | ((bytes[4] << 8) & 0xFF00);
log.debug("UNPROCESSED MSG: " + getMessageName() + " Command: " + String.format("%04X", command) + " Data: " + toHexString(bytes));
@@ -129,8 +129,8 @@ public class MessageBase {
return 0;
}
- public static Date dateTimeFromBuff(byte[] buff, int offset) {
- Date date =
+ public static long dateTimeFromBuff(byte[] buff, int offset) {
+ return
new Date(
100 + intFromBuff(buff, offset, 1),
intFromBuff(buff, offset + 1, 1) - 1,
@@ -138,12 +138,11 @@ public class MessageBase {
intFromBuff(buff, offset + 3, 1),
intFromBuff(buff, offset + 4, 1),
0
- );
- return date;
+ ).getTime();
}
- public static Date dateTimeSecFromBuff(byte[] buff, int offset) {
- Date date =
+ public static synchronized long dateTimeSecFromBuff(byte[] buff, int offset) {
+ return
new Date(
100 + intFromBuff(buff, offset, 1),
intFromBuff(buff, offset + 1, 1) - 1,
@@ -151,18 +150,16 @@ public class MessageBase {
intFromBuff(buff, offset + 3, 1),
intFromBuff(buff, offset + 4, 1),
intFromBuff(buff, offset + 5, 1)
- );
- return date;
+ ).getTime();
}
- public static Date dateFromBuff(byte[] buff, int offset) {
- Date date =
+ public static long dateFromBuff(byte[] buff, int offset) {
+ return
new Date(
100 + intFromBuff(buff, offset, 1),
intFromBuff(buff, offset + 1, 1) - 1,
intFromBuff(buff, offset + 2, 1)
- );
- return date;
+ ).getTime();
}
@TargetApi(Build.VERSION_CODES.KITKAT)
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MessageHashTable.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MessageHashTable.java
index 4b90b8f02d..e7f1adca07 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MessageHashTable.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MessageHashTable.java
@@ -9,8 +9,6 @@ import java.util.HashMap;
* Created by mike on 28.05.2016.
*/
public class MessageHashTable {
- private static Logger log = LoggerFactory.getLogger(MessageHashTable.class);
-
public static HashMap messages = null;
static {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MessageOriginalNames.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MessageOriginalNames.java
index 3712945094..a285ce5120 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MessageOriginalNames.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MessageOriginalNames.java
@@ -5,13 +5,15 @@ import org.slf4j.LoggerFactory;
import java.util.HashMap;
+import info.nightscout.androidaps.logging.L;
+
/**
* Created by mike on 28.05.2016.
*/
public class MessageOriginalNames {
- private static Logger log = LoggerFactory.getLogger(MessageOriginalNames.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
- public static HashMap messageNames;
+ private static HashMap messageNames;
static {
messageNames = new HashMap<>();
@@ -162,7 +164,7 @@ public class MessageOriginalNames {
if (messageNames.containsKey(command))
return messageNames.get(command);
else {
- log.debug("Unknown command: " + String.format("%04X", command));
+ log.error("Unknown command: " + String.format("%04X", command));
return "UNKNOWN_COMMAND";
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusProgress.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusProgress.java
index cb01a7d901..873824f966 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusProgress.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusProgress.java
@@ -3,14 +3,14 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.plugins.Treatments.Treatment;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress;
+import info.nightscout.androidaps.plugins.Treatments.Treatment;
public class MsgBolusProgress extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgBolusProgress.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
private static Treatment t;
private static double amount;
@@ -27,6 +27,8 @@ public class MsgBolusProgress extends MessageBase {
this.amount = amount;
this.t = t;
lastReceive = System.currentTimeMillis();
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message: amount: " + amount + " treatment: " + t.toString());
}
@Override
@@ -40,7 +42,7 @@ public class MsgBolusProgress extends MessageBase {
bolusingEvent.t = t;
bolusingEvent.percent = Math.min((int) (done / amount * 100), 100);
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Bolus remaining: " + progress + " delivered: " + done);
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStart.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStart.java
index 7586edf825..06200d1f0c 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStart.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStart.java
@@ -3,13 +3,12 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.interfaces.Constraint;
-import info.nightscout.utils.HardLimits;
+import info.nightscout.androidaps.logging.L;
public class MsgBolusStart extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgBolusStart.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public static int errorCode;
@@ -25,7 +24,7 @@ public class MsgBolusStart extends MessageBase {
AddParamInt((int) (amount * 100));
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Bolus start : " + amount);
}
@@ -34,9 +33,10 @@ public class MsgBolusStart extends MessageBase {
errorCode = intFromBuff(bytes, 0, 1);
if (errorCode != 2) {
failed = true;
- log.debug("Messsage response: " + errorCode + " FAILED!!");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Messsage response: " + errorCode + " FAILED!!");
} else {
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Messsage response: " + errorCode + " OK");
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStartWithSpeed.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStartWithSpeed.java
index dd4251a350..a3160ff887 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStartWithSpeed.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStartWithSpeed.java
@@ -3,13 +3,12 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.interfaces.Constraint;
-import info.nightscout.utils.HardLimits;
+import info.nightscout.androidaps.logging.L;
public class MsgBolusStartWithSpeed extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgBolusStartWithSpeed.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public static int errorCode;
@@ -26,7 +25,7 @@ public class MsgBolusStartWithSpeed extends MessageBase {
AddParamInt((int) (amount * 100));
AddParamByte((byte) speed);
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Bolus start : " + amount + " speed: " + speed);
}
@@ -35,9 +34,10 @@ public class MsgBolusStartWithSpeed extends MessageBase {
errorCode = intFromBuff(bytes, 0, 1);
if (errorCode != 2) {
failed = true;
- log.debug("Messsage response: " + errorCode + " FAILED!!");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Messsage response: " + errorCode + " FAILED!!");
} else {
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Messsage response: " + errorCode + " OK");
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStop.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStop.java
index 5c677b813e..fe5d47c131 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStop.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStop.java
@@ -5,11 +5,12 @@ import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.plugins.Treatments.Treatment;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress;
+import info.nightscout.androidaps.plugins.Treatments.Treatment;
public class MsgBolusStop extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgBolusStop.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
private static Treatment t;
private static Double amount;
@@ -26,10 +27,14 @@ public class MsgBolusStop extends MessageBase {
this.t = t;
this.amount = amount;
forced = false;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Bolus stop: amount: " + amount + " treatment: " + t.toString());
}
@Override
public void handleMessage(byte[] bytes) {
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Messsage received");
EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance();
stopped = true;
if (!forced) {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgCheckValue.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgCheckValue.java
index 3f0c306940..e04d9243e7 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgCheckValue.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgCheckValue.java
@@ -3,21 +3,21 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
-import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
-import info.nightscout.utils.ToastUtils;
/**
* Created by mike on 30.06.2016.
*/
public class MsgCheckValue extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgCheckValue.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgCheckValue() {
SetCommand(0xF0F1);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -25,7 +25,8 @@ public class MsgCheckValue extends MessageBase {
DanaRPump pump = DanaRPump.getInstance();
pump.isNewPump = true;
- log.debug("New firmware confirmed");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New firmware confirmed");
pump.model = intFromBuff(bytes, 0, 1);
pump.protocol = intFromBuff(bytes, 1, 1);
@@ -35,7 +36,7 @@ public class MsgCheckValue extends MessageBase {
log.debug("Wrong model selected");
}
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Model: " + String.format("%02X ", pump.model));
log.debug("Protocol: " + String.format("%02X ", pump.protocol));
log.debug("Product Code: " + String.format("%02X ", pump.productCode));
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgError.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgError.java
index e42327c3b0..a8e67a98a0 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgError.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgError.java
@@ -3,17 +3,19 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress;
-import info.nightscout.utils.NSUpload;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
public class MsgError extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgError.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgError() {
SetCommand(0x0601);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -46,8 +48,9 @@ public class MsgError extends MessageBase {
MsgBolusStop.stopped = true;
bolusingEvent.status = errorString;
MainApp.bus().post(bolusingEvent);
+ failed=true;
}
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Error detected: " + errorString);
NSUpload.uploadError(errorString);
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryAlarm.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryAlarm.java
index 24ea6d0f37..7adb335e93 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryAlarm.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryAlarm.java
@@ -3,13 +3,17 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import info.nightscout.androidaps.logging.L;
+
/**
* Created by mike on 20.07.2016.
*/
public class MsgHistoryAlarm extends MsgHistoryAll {
- private static Logger log = LoggerFactory.getLogger(MsgHistoryAlarm.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgHistoryAlarm() {
SetCommand(0x3105);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
// Handle message taken from MsgHistoryAll
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryAll.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryAll.java
index 4e4bc759f5..0fe64a20f5 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryAll.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryAll.java
@@ -7,22 +7,25 @@ import java.util.Date;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.db.DanaRHistoryRecord;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.events.EventDanaRSyncStatus;
import info.nightscout.utils.DateUtil;
public class MsgHistoryAll extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgHistoryAll.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgHistoryAll() {
SetCommand(0x41F2);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
public void handleMessage(byte[] bytes) {
byte recordCode = (byte) intFromBuff(bytes, 0, 1);
- Date date = dateFromBuff(bytes, 1); // 3 bytes
- Date datetime = dateTimeFromBuff(bytes, 1); // 5 bytes
- Date datetimewihtsec = dateTimeSecFromBuff(bytes, 1); // 6 bytes
+ long date = dateFromBuff(bytes, 1); // 3 bytes
+ long datetime = dateTimeFromBuff(bytes, 1); // 5 bytes
+ long datetimewihtsec = dateTimeSecFromBuff(bytes, 1); // 6 bytes
double dailyBasal = intFromBuff(bytes, 4, 2) * 0.01d;
double dailyBolus = intFromBuff(bytes, 6, 2) * 0.01d;
@@ -43,7 +46,7 @@ public class MsgHistoryAll extends MessageBase {
switch (recordCode) {
case RecordTypes.RECORD_TYPE_BOLUS:
- danaRHistoryRecord.recordDate = datetime.getTime();
+ danaRHistoryRecord.recordDate = datetime;
switch (0xF0 & paramByte8) {
case 0xA0:
danaRHistoryRecord.bolusType = "DS";
@@ -70,48 +73,48 @@ public class MsgHistoryAll extends MessageBase {
break;
case RecordTypes.RECORD_TYPE_DAILY:
messageType += "dailyinsulin";
- danaRHistoryRecord.recordDate = date.getTime();
+ danaRHistoryRecord.recordDate = date;
danaRHistoryRecord.recordDailyBasal = dailyBasal;
danaRHistoryRecord.recordDailyBolus = dailyBolus;
break;
case RecordTypes.RECORD_TYPE_PRIME:
messageType += "prime";
- danaRHistoryRecord.recordDate = datetimewihtsec.getTime();
+ danaRHistoryRecord.recordDate = datetimewihtsec;
danaRHistoryRecord.recordValue = value * 0.01;
break;
case RecordTypes.RECORD_TYPE_ERROR:
messageType += "error";
- danaRHistoryRecord.recordDate = datetimewihtsec.getTime();
+ danaRHistoryRecord.recordDate = datetimewihtsec;
danaRHistoryRecord.recordValue = value * 0.01;
break;
case RecordTypes.RECORD_TYPE_REFILL:
messageType += "refill";
- danaRHistoryRecord.recordDate = datetimewihtsec.getTime();
+ danaRHistoryRecord.recordDate = datetimewihtsec;
danaRHistoryRecord.recordValue = value * 0.01;
break;
case RecordTypes.RECORD_TYPE_BASALHOUR:
messageType += "basal hour";
- danaRHistoryRecord.recordDate = datetimewihtsec.getTime();
+ danaRHistoryRecord.recordDate = datetimewihtsec;
danaRHistoryRecord.recordValue = value * 0.01;
break;
case RecordTypes.RECORD_TYPE_TB:
messageType += "tb";
- danaRHistoryRecord.recordDate = datetimewihtsec.getTime();
+ danaRHistoryRecord.recordDate = datetimewihtsec;
danaRHistoryRecord.recordValue = value * 0.01;
break;
case RecordTypes.RECORD_TYPE_GLUCOSE:
messageType += "glucose";
- danaRHistoryRecord.recordDate = datetimewihtsec.getTime();
+ danaRHistoryRecord.recordDate = datetimewihtsec;
danaRHistoryRecord.recordValue = value;
break;
case RecordTypes.RECORD_TYPE_CARBO:
messageType += "carbo";
- danaRHistoryRecord.recordDate = datetimewihtsec.getTime();
+ danaRHistoryRecord.recordDate = datetimewihtsec;
danaRHistoryRecord.recordValue = value;
break;
case RecordTypes.RECORD_TYPE_ALARM:
messageType += "alarm";
- danaRHistoryRecord.recordDate = datetimewihtsec.getTime();
+ danaRHistoryRecord.recordDate = datetimewihtsec;
String strAlarm = "None";
switch ((int) paramByte8) {
case 67:
@@ -132,12 +135,15 @@ public class MsgHistoryAll extends MessageBase {
break;
case RecordTypes.RECORD_TYPE_SUSPEND:
messageType += "suspend";
- danaRHistoryRecord.recordDate = datetimewihtsec.getTime();
+ danaRHistoryRecord.recordDate = datetimewihtsec;
String strRecordValue = "Off";
if ((int) paramByte8 == 79)
strRecordValue = "On";
danaRHistoryRecord.stringRecordValue = strRecordValue;
break;
+ case 17:
+ failed = true;
+ break;
}
MainApp.getDbHelper().createOrUpdate(danaRHistoryRecord);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryAllDone.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryAllDone.java
index 6ce3325715..e78771f99d 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryAllDone.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryAllDone.java
@@ -3,21 +3,23 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
public class MsgHistoryAllDone extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgHistoryAllDone.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public static boolean received = false;
public MsgHistoryAllDone() {
SetCommand(0x41F1);
received = false;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
public void handleMessage(byte[] bytes) {
received = true;
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("History all done received");
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryBasalHour.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryBasalHour.java
index 3fd97135f0..f56e2af273 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryBasalHour.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryBasalHour.java
@@ -3,13 +3,17 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import info.nightscout.androidaps.logging.L;
+
/**
* Created by mike on 20.07.2016.
*/
public class MsgHistoryBasalHour extends MsgHistoryAll {
- private static Logger log = LoggerFactory.getLogger(MsgHistoryBasalHour.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgHistoryBasalHour() {
SetCommand(0x310A);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
// Handle message taken from MsgHistoryAll
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryBolus.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryBolus.java
index b213ba52fd..d675ddc488 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryBolus.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryBolus.java
@@ -3,13 +3,18 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import info.nightscout.androidaps.logging.L;
+
/**
* Created by mike on 20.07.2016.
*/
public class MsgHistoryBolus extends MsgHistoryAll {
- private static Logger log = LoggerFactory.getLogger(MsgHistoryBolus.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
+
public MsgHistoryBolus() {
SetCommand(0x3101);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
// Handle message taken from MsgHistoryAll
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryCarbo.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryCarbo.java
index 115dc73e02..6755800bba 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryCarbo.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryCarbo.java
@@ -3,13 +3,17 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import info.nightscout.androidaps.logging.L;
+
/**
* Created by mike on 20.07.2016.
*/
public class MsgHistoryCarbo extends MsgHistoryAll {
- private static Logger log = LoggerFactory.getLogger(MsgHistoryCarbo.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgHistoryCarbo() {
SetCommand(0x3107);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
// Handle message taken from MsgHistoryAll
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryDailyInsulin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryDailyInsulin.java
index 77933c40da..68d46f0d20 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryDailyInsulin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryDailyInsulin.java
@@ -3,13 +3,17 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import info.nightscout.androidaps.logging.L;
+
/**
* Created by mike on 20.07.2016.
*/
public class MsgHistoryDailyInsulin extends MsgHistoryAll {
- private static Logger log = LoggerFactory.getLogger(MsgHistoryDailyInsulin.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgHistoryDailyInsulin() {
SetCommand(0x3102);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
// Handle message taken from MsgHistoryAll
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryDone.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryDone.java
index 04d3cb3faf..63e51e24ba 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryDone.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryDone.java
@@ -3,24 +3,26 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
/**
* Created by mike on 20.07.2016.
*/
public class MsgHistoryDone extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgHistoryDone.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public static boolean received = false;
public MsgHistoryDone() {
SetCommand(0x31F1);
received = false;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
public void handleMessage(byte[] bytes) {
received = true;
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("History done received");
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryError.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryError.java
index 3358a88fea..8d6d0615d4 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryError.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryError.java
@@ -3,13 +3,18 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import info.nightscout.androidaps.logging.L;
+
/**
* Created by mike on 20.07.2016.
*/
public class MsgHistoryError extends MsgHistoryAll {
- private static Logger log = LoggerFactory.getLogger(MsgHistoryError.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
+
public MsgHistoryError() {
SetCommand(0x3106);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
// Handle message taken from MsgHistoryAll
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryGlucose.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryGlucose.java
index f07b91e9d8..10fd68e3ab 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryGlucose.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryGlucose.java
@@ -3,13 +3,18 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import info.nightscout.androidaps.logging.L;
+
/**
* Created by mike on 20.07.2016.
*/
public class MsgHistoryGlucose extends MsgHistoryAll {
- private static Logger log = LoggerFactory.getLogger(MsgHistoryGlucose.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
+
public MsgHistoryGlucose() {
SetCommand(0x3104);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
// Handle message taken from MsgHistoryAll
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryNew.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryNew.java
index 5de685f65b..01f7197434 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryNew.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryNew.java
@@ -3,13 +3,18 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import info.nightscout.androidaps.logging.L;
+
/**
* Created by mike on 20.07.2016.
*/
public class MsgHistoryNew extends MsgHistoryAll {
- private static Logger log = LoggerFactory.getLogger(MsgHistoryNew.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
+
public MsgHistoryNew() {
SetCommand(0x42F2);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
// Handle message taken from MsgHistoryAll
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryNewDone.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryNewDone.java
index 2cde92bf9a..fb9118e629 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryNewDone.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryNewDone.java
@@ -3,24 +3,26 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
/**
* Created by mike on 20.07.2016.
*/
public class MsgHistoryNewDone extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgHistoryNewDone.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public static boolean received = false;
public MsgHistoryNewDone() {
SetCommand(0x42F1);
received = false;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
public void handleMessage(byte[] bytes) {
received = true;
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("History new done received");
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryRefill.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryRefill.java
index daaed79023..238a606cfb 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryRefill.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistoryRefill.java
@@ -3,13 +3,18 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import info.nightscout.androidaps.logging.L;
+
/**
* Created by mike on 20.07.2016.
*/
public class MsgHistoryRefill extends MsgHistoryAll {
- private static Logger log = LoggerFactory.getLogger(MsgHistoryRefill.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
+
public MsgHistoryRefill() {
SetCommand(0x3108);
- }
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
+ }
// Handle message taken from MsgHistoryAll
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistorySuspend.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistorySuspend.java
index db807a31b5..7182722f97 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistorySuspend.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgHistorySuspend.java
@@ -3,13 +3,18 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import info.nightscout.androidaps.logging.L;
+
/**
* Created by mike on 20.07.2016.
*/
public class MsgHistorySuspend extends MsgHistoryAll {
- private static Logger log = LoggerFactory.getLogger(MsgHistorySuspend.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
+
public MsgHistorySuspend() {
SetCommand(0x3109);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
// Handle message taken from MsgHistoryAll
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusBasic.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusBasic.java
index e7f6032c00..61150079cd 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusBasic.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusBasic.java
@@ -3,14 +3,16 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
public class MsgInitConnStatusBasic extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgInitConnStatusBasic.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgInitConnStatusBasic() {
SetCommand(0x0303);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -39,14 +41,17 @@ public class MsgInitConnStatusBasic extends MessageBase {
boolean deliveryStepBolus = (bolusConfig & DanaRPump.DELIVERY_STEP_BOLUS) != 0;
boolean deliveryBasal = (bolusConfig & DanaRPump.DELIVERY_BASAL) != 0;
boolean deliveryExtBolus = (bolusConfig & DanaRPump.DELIVERY_EXT_BOLUS) != 0;
- log.debug("Delivery prime: " + deliveryPrime);
- log.debug("Delivery step bolus: " + deliveryStepBolus);
- log.debug("Delivery basal: " + deliveryBasal);
- log.debug("Delivery ext bolus: " + deliveryExtBolus);
+ if (L.isEnabled(L.PUMPCOMM)) {
+ log.debug("Delivery prime: " + deliveryPrime);
+ log.debug("Delivery step bolus: " + deliveryStepBolus);
+ log.debug("Delivery basal: " + deliveryBasal);
+ log.debug("Delivery ext bolus: " + deliveryExtBolus);
+ }
} catch (Exception e) {
+ log.error("Unhadled exception", e);
}
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Pump suspended: " + pump.pumpSuspended);
log.debug("Calculator enabled: " + pump.calculatorEnabled);
log.debug("Daily total units: " + pump.dailyTotalUnits);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusBolus.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusBolus.java
index 4fc9844b0d..df9447cc45 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusBolus.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusBolus.java
@@ -3,27 +3,30 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
-import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
+import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
+import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
/**
* Created by mike on 28.05.2016.
*/
public class MsgInitConnStatusBolus extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgInitConnStatusBolus.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgInitConnStatusBolus() {
SetCommand(0x0302);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
public void handleMessage(byte[] bytes) {
if (bytes.length - 10 > 12) {
+ failed = true;
return;
}
DanaRPump pump = DanaRPump.getInstance();
@@ -34,7 +37,7 @@ public class MsgInitConnStatusBolus extends MessageBase {
pump.maxBolus = intFromBuff(bytes, 2, 2) / 100d;
//int bolusRate = intFromBuff(bytes, 4, 8);
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Is Extended bolus enabled: " + pump.isExtendedBolusEnabled);
log.debug("Bolus increment: " + pump.bolusStep);
log.debug("Bolus max: " + pump.maxBolus);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusOption.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusOption.java
index 560ed8b332..f8f82e16d0 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusOption.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusOption.java
@@ -3,17 +3,25 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification;
+import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
+import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
/**
* Created by mike on 28.05.2016.
*/
public class MsgInitConnStatusOption extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgInitConnStatusOption.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgInitConnStatusOption() {
SetCommand(0x0304);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -29,9 +37,22 @@ public class MsgInitConnStatusOption extends MessageBase {
//int none = intFromBuff(bytes, 8, 1);
if (bytes.length >= 21) {
DanaRPump.getInstance().password = intFromBuff(bytes, 9, 2) ^ 0x3463;
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Pump password: " + DanaRPump.getInstance().password);
+ } else {
+ failed = true;
}
+
+ if (!DanaRPump.getInstance().isPasswordOK()) {
+ Notification notification = new Notification(Notification.WRONG_PUMP_PASSWORD, MainApp.gs(R.string.wrongpumppassword), Notification.URGENT);
+ MainApp.bus().post(new EventNewNotification(notification));
+ } else {
+ MainApp.bus().post(new EventDismissNotification(Notification.WRONG_PUMP_PASSWORD));
+ }
+
+ // This is last message of initial sequence
+ if (ConfigBuilderPlugin.getPlugin().getActivePump() != null )
+ ConfigBuilderPlugin.getPlugin().getActivePump().finishHandshaking();
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusTime.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusTime.java
index 84d9c413bf..e424c5dbda 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusTime.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusTime.java
@@ -5,32 +5,35 @@ import org.slf4j.LoggerFactory;
import java.util.Date;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.events.EventRefreshGui;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
import info.nightscout.androidaps.plugins.PumpDanaRKorean.DanaRKoreanPlugin;
+import info.nightscout.utils.DateUtil;
public class MsgInitConnStatusTime extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgInitConnStatusTime.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgInitConnStatusTime() {
SetCommand(0x0301);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
public void handleMessage(byte[] bytes) {
if (bytes.length - 10 > 7) {
- Notification notification = new Notification(Notification.WRONG_DRIVER, MainApp.gs(R.string.pumpdrivercorrected), Notification.NORMAL);
+ Notification notification = new Notification(Notification.WRONG_DRIVER, MainApp.gs(R.string.pumpdrivercorrected), Notification.NORMAL);
MainApp.bus().post(new EventNewNotification(notification));
MainApp.getSpecificPlugin(DanaRPlugin.class).disconnect("Wrong Model");
- log.debug("Wrong model selected. Switching to Korean DanaR");
+ log.error("Wrong model selected. Switching to Korean DanaR");
MainApp.getSpecificPlugin(DanaRKoreanPlugin.class).setPluginEnabled(PluginType.PUMP, true);
MainApp.getSpecificPlugin(DanaRKoreanPlugin.class).setFragmentVisible(PluginType.PUMP, true);
MainApp.getSpecificPlugin(DanaRPlugin.class).setPluginEnabled(PluginType.PUMP, false);
@@ -39,7 +42,7 @@ public class MsgInitConnStatusTime extends MessageBase {
DanaRPump.reset(); // mark not initialized
//If profile coming from pump, switch it as well
- if(MainApp.getSpecificPlugin(DanaRPlugin.class).isEnabled(PluginType.PROFILE)){
+ if (MainApp.getSpecificPlugin(DanaRPlugin.class).isEnabled(PluginType.PROFILE)) {
(MainApp.getSpecificPlugin(DanaRPlugin.class)).setPluginEnabled(PluginType.PROFILE, false);
(MainApp.getSpecificPlugin(DanaRKoreanPlugin.class)).setPluginEnabled(PluginType.PROFILE, true);
}
@@ -47,14 +50,17 @@ public class MsgInitConnStatusTime extends MessageBase {
MainApp.getConfigBuilder().storeSettings("ChangingDanaDriver");
MainApp.bus().post(new EventRefreshGui());
ConfigBuilderPlugin.getCommandQueue().readStatus("PumpDriverChange", null); // force new connection
+ failed = false;
return;
+ } else {
+ failed = true;
}
- Date time = dateTimeSecFromBuff(bytes, 0);
+ long time = dateTimeSecFromBuff(bytes, 0);
int versionCode = intFromBuff(bytes, 6, 1);
- if (Config.logDanaMessageDetail) {
- log.debug("Pump time: " + time);
+ if (L.isEnabled(L.PUMPCOMM)) {
+ log.debug("Pump time: " + DateUtil.dateAndTimeFullString(time));
log.debug("Version code: " + versionCode);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgPCCommStart.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgPCCommStart.java
index 619bbd9461..6f92c3241c 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgPCCommStart.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgPCCommStart.java
@@ -3,17 +3,20 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
public class MsgPCCommStart extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgPCCommStart.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
+
public MsgPCCommStart() {
SetCommand(0x3001);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
public void handleMessage(byte[] bytes) {
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("PC comm start received");
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgPCCommStop.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgPCCommStop.java
index 20dd4e060f..255bb17532 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgPCCommStop.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgPCCommStop.java
@@ -3,17 +3,19 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
public class MsgPCCommStop extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgPCCommStop.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgPCCommStop() {
SetCommand(0x3002);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
public void handleMessage(byte[] bytes) {
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("PC comm stop received");
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetActivateBasalProfile.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetActivateBasalProfile.java
index 64ed0488a4..2d222f9601 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetActivateBasalProfile.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetActivateBasalProfile.java
@@ -3,20 +3,22 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
public class MsgSetActivateBasalProfile extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgSetActivateBasalProfile.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgSetActivateBasalProfile() {
SetCommand(0x330C);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
// index 0-3
public MsgSetActivateBasalProfile(byte index) {
this();
AddParamByte(index);
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Activate basal profile: " + index);
}
@@ -25,9 +27,10 @@ public class MsgSetActivateBasalProfile extends MessageBase {
int result = intFromBuff(bytes, 0, 1);
if (result != 1) {
failed = true;
- log.debug("Activate basal profile result: " + result + " FAILED!!!");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Activate basal profile result: " + result + " FAILED!!!");
} else {
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Activate basal profile result: " + result);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetBasalProfile.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetBasalProfile.java
index 9f945e8b26..3e87e4bf41 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetBasalProfile.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetBasalProfile.java
@@ -3,17 +3,19 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
+import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
public class MsgSetBasalProfile extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgSetBasalProfile.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgSetBasalProfile() {
SetCommand(0x3306);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
// index 0-3
@@ -23,7 +25,7 @@ public class MsgSetBasalProfile extends MessageBase {
for (Integer i = 0; i < 24; i++) {
AddParamInt((int) (values[i] * 100));
}
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Set basal profile: " + index);
}
@@ -32,11 +34,12 @@ public class MsgSetBasalProfile extends MessageBase {
int result = intFromBuff(bytes, 0, 1);
if (result != 1) {
failed = true;
- log.debug("Set basal profile result: " + result + " FAILED!!!");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Set basal profile result: " + result + " FAILED!!!");
Notification reportFail = new Notification(Notification.PROFILE_SET_FAILED, MainApp.gs(R.string.profile_set_failed), Notification.URGENT);
MainApp.bus().post(new EventNewNotification(reportFail));
} else {
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Set basal profile result: " + result);
Notification reportOK = new Notification(Notification.PROFILE_SET_OK, MainApp.gs(R.string.profile_set_ok), Notification.INFO, 60);
MainApp.bus().post(new EventNewNotification(reportOK));
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetCarbsEntry.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetCarbsEntry.java
index 4fcd6dee9c..59cbcdafa0 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetCarbsEntry.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetCarbsEntry.java
@@ -5,13 +5,15 @@ import org.slf4j.LoggerFactory;
import java.util.Calendar;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
public class MsgSetCarbsEntry extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgSetCarbsEntry.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgSetCarbsEntry() {
SetCommand(0x0402);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
public MsgSetCarbsEntry(long time, int amount) {
@@ -27,7 +29,7 @@ public class MsgSetCarbsEntry extends MessageBase {
AddParamByte((byte) (calendar.get(Calendar.SECOND)));
AddParamByte((byte) 0x43); //??
AddParamInt(amount);
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Set carb entry: " + amount + " date " + calendar.getTime().toString());
}
@@ -36,9 +38,10 @@ public class MsgSetCarbsEntry extends MessageBase {
int result = intFromBuff(bytes, 0, 1);
if (result != 1) {
failed = true;
- log.debug("Set carb entry result: " + result + " FAILED!!!");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Set carb entry result: " + result + " FAILED!!!");
} else {
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Set carb entry result: " + result);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetExtendedBolusStart.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetExtendedBolusStart.java
index 420f0ccbf9..2577435e11 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetExtendedBolusStart.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetExtendedBolusStart.java
@@ -3,16 +3,17 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.interfaces.Constraint;
-import info.nightscout.utils.HardLimits;
+import info.nightscout.androidaps.logging.L;
public class MsgSetExtendedBolusStart extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgSetExtendedBolusStart.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgSetExtendedBolusStart() {
SetCommand(0x0407);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
public MsgSetExtendedBolusStart(double amount, byte halfhours) {
@@ -21,11 +22,15 @@ public class MsgSetExtendedBolusStart extends MessageBase {
// HARDCODED LIMITS
if (halfhours < 1) halfhours = 1;
if (halfhours > 16) halfhours = 16;
- amount = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(amount)).value();
-
- AddParamInt((int) (amount * 100));
+ Constraint constrainedAmount = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(amount));
+ if (constrainedAmount != null) {
+ AddParamInt((int) (constrainedAmount.value() * 100));
+ } else {
+ log.error("constrainedAmount of insulin is null!!");
+ AddParamInt(0);
+ }
AddParamByte(halfhours);
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Set extended bolus start: " + (((int) (amount * 100)) / 100d) + "U halfhours: " + (int) halfhours);
}
@@ -34,9 +39,10 @@ public class MsgSetExtendedBolusStart extends MessageBase {
int result = intFromBuff(bytes, 0, 1);
if (result != 1) {
failed = true;
- log.debug("Set extended bolus start result: " + result + " FAILED!!!");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Set extended bolus start result: " + result + " FAILED!!!");
} else {
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Set extended bolus start result: " + result);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetExtendedBolusStop.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetExtendedBolusStop.java
index 7084949daa..504db719ea 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetExtendedBolusStop.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetExtendedBolusStop.java
@@ -3,15 +3,15 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
public class MsgSetExtendedBolusStop extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgSetExtendedBolusStop.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgSetExtendedBolusStop() {
SetCommand(0x0406);
- if (Config.logDanaMessageDetail)
- log.debug("Set extended bolus stop");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -19,9 +19,10 @@ public class MsgSetExtendedBolusStop extends MessageBase {
int result = intFromBuff(bytes, 0, 1);
if (result != 1) {
failed = true;
- log.debug("Set extended bolus stop result: " + result + " FAILED!!!");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Set extended bolus stop result: " + result + " FAILED!!!");
} else {
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Set extended bolus stop result: " + result);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetSingleBasalProfile.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetSingleBasalProfile.java
index 7dd9ca522b..eabf383b94 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetSingleBasalProfile.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetSingleBasalProfile.java
@@ -3,14 +3,14 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
public class MsgSetSingleBasalProfile extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgSetSingleBasalProfile.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgSetSingleBasalProfile() {
SetCommand(0x3302);
@@ -22,8 +22,8 @@ public class MsgSetSingleBasalProfile extends MessageBase {
for (Integer i = 0; i < 24; i++) {
AddParamInt((int) (values[i] * 100));
}
- if (Config.logDanaMessageDetail)
- log.debug("Set basal profile");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -31,11 +31,12 @@ public class MsgSetSingleBasalProfile extends MessageBase {
int result = intFromBuff(bytes, 0, 1);
if (result != 1) {
failed = true;
- log.debug("Set basal profile result: " + result + " FAILED!!!");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Set basal profile result: " + result + " FAILED!!!");
Notification reportFail = new Notification(Notification.PROFILE_SET_FAILED, MainApp.gs(R.string.profile_set_failed), Notification.URGENT);
MainApp.bus().post(new EventNewNotification(reportFail));
} else {
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Set basal profile result: " + result);
Notification reportOK = new Notification(Notification.PROFILE_SET_OK, MainApp.gs(R.string.profile_set_ok), Notification.INFO, 60);
MainApp.bus().post(new EventNewNotification(reportOK));
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetTempBasalStart.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetTempBasalStart.java
index 2b72c35749..c756af3491 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetTempBasalStart.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetTempBasalStart.java
@@ -3,10 +3,10 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
public class MsgSetTempBasalStart extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgSetTempBasalStart.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgSetTempBasalStart() {
SetCommand(0x0401);
@@ -24,7 +24,7 @@ public class MsgSetTempBasalStart extends MessageBase {
AddParamByte((byte) (percent & 255));
AddParamByte((byte) (durationInHours & 255));
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Temp basal start percent: " + percent + " duration hours: " + durationInHours);
}
@@ -32,9 +32,10 @@ public class MsgSetTempBasalStart extends MessageBase {
int result = intFromBuff(bytes, 0, 1);
if (result != 1) {
failed = true;
- log.debug("Set temp basal start result: " + result + " FAILED!!!");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Set temp basal start result: " + result + " FAILED!!!");
} else {
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Set temp basal start result: " + result);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetTempBasalStop.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetTempBasalStop.java
index 39582ac399..7b14e8e3e3 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetTempBasalStop.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetTempBasalStop.java
@@ -3,14 +3,14 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
public class MsgSetTempBasalStop extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgSetTempBasalStop.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgSetTempBasalStop() {
SetCommand(0x0403);
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Temp basal stop");
}
@@ -18,9 +18,10 @@ public class MsgSetTempBasalStop extends MessageBase {
int result = intFromBuff(bytes, 0, 1);
if (result != 1) {
failed = true;
- log.debug("Set temp basal stop result: " + result + " FAILED!!!");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Set temp basal stop result: " + result + " FAILED!!!");
} else {
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Set temp basal stop result: " + result);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetTime.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetTime.java
index 3910d52c97..6842344959 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetTime.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetTime.java
@@ -5,26 +5,32 @@ import org.slf4j.LoggerFactory;
import java.util.Date;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.utils.DateUtil;
/**
* Created by mike on 09.12.2016.
*/
public class MsgSetTime extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgSetTime.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
private static Date time;
public MsgSetTime(Date time) {
SetCommand(0x330a);
this.time = time;
AddParamDateTime(time);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message: time:" + DateUtil.dateAndTimeString(time));
}
public void handleMessage(byte[] bytes) {
int result = intFromBuff(bytes, 0, 1);
+ if (result != 1) {
+ failed = true;
+ }
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Result of setting time: " + time + " is " + result);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetUserOptions.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetUserOptions.java
index 407b19da8d..7484966dba 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetUserOptions.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetUserOptions.java
@@ -2,9 +2,8 @@ package info.nightscout.androidaps.plugins.PumpDanaR.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import android.support.v4.internal.view.SupportMenu;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
/**
@@ -12,7 +11,7 @@ import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
*/
public class MsgSetUserOptions extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgSetUserOptions.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public boolean done;
@@ -21,7 +20,7 @@ public class MsgSetUserOptions extends MessageBase {
DanaRPump pump = DanaRPump.getInstance();
if (pump.userOptionsFrompump == null) {
// No options set -> Exitting
- log.debug("NO USER OPTIONS LOADED EXITTING!");
+ log.error("NO USER OPTIONS LOADED EXITTING!");
return;
}
pump.userOptionsFrompump[0] = (byte) (pump.timeDisplayType == 1 ? 0 : 1);
@@ -33,18 +32,21 @@ public class MsgSetUserOptions extends MessageBase {
pump.userOptionsFrompump[8] = (byte) pump.units;
pump.userOptionsFrompump[9] = (byte) pump.shutdownHour;
pump.userOptionsFrompump[27] = (byte) pump.lowReservoirRate;
- for(int i=0; i>>>> @ " + (mBolusingTreatment == null ? "" : mBolusingTreatment.insulin));
MsgBolusStop stop = new MsgBolusStop();
stop.forced = true;
@@ -227,6 +237,4 @@ public abstract class AbstractDanaRExecutionService extends Service {
result.comment = "OK";
return result;
}
-
-
}
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 ea4dec25fb..1e13250db3 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
@@ -7,12 +7,9 @@ import android.os.SystemClock;
import com.squareup.otto.Subscribe;
-import org.slf4j.LoggerFactory;
-
import java.io.IOException;
import java.util.Date;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
@@ -24,7 +21,10 @@ import info.nightscout.androidaps.events.EventPreferenceChange;
import info.nightscout.androidaps.events.EventProfileSwitchChange;
import info.nightscout.androidaps.events.EventPumpStatusChanged;
import info.nightscout.androidaps.interfaces.PumpInterface;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.androidaps.plugins.Overview.Dialogs.BolusProgressDialog;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress;
@@ -64,13 +64,12 @@ import info.nightscout.androidaps.plugins.PumpDanaR.events.EventDanaRNewStatus;
import info.nightscout.androidaps.plugins.Treatments.Treatment;
import info.nightscout.androidaps.queue.Callback;
import info.nightscout.androidaps.queue.commands.Command;
-import info.nightscout.utils.NSUpload;
+import info.nightscout.utils.DateUtil;
import info.nightscout.utils.SP;
-public class DanaRExecutionService extends AbstractDanaRExecutionService{
+public class DanaRExecutionService extends AbstractDanaRExecutionService {
public DanaRExecutionService() {
- log = LoggerFactory.getLogger(DanaRExecutionService.class);
mBinder = new LocalBinder();
registerBus();
@@ -99,47 +98,37 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{
}
public void connect() {
- if (mDanaRPump.password != -1 && mDanaRPump.password != SP.getInt(R.string.key_danar_password, -1)) {
- if(System.currentTimeMillis() > lastWrongPumpPassword + 30 * 1000) {
- Notification notification = new Notification(Notification.WRONG_PUMP_PASSWORD, MainApp.gs(R.string.wrongpumppassword), Notification.URGENT);
- notification.soundId = R.raw.error;
- lastWrongPumpPassword = System.currentTimeMillis();
- }
- return;
- }
-
if (mConnectionInProgress)
return;
- new Thread(new Runnable() {
- @Override
- public void run() {
- mConnectionInProgress = true;
- getBTSocketForSelectedPump();
- if (mRfcommSocket == null || mBTDevice == null) {
- mConnectionInProgress = false;
- return; // Device not found
- }
-
- try {
- mRfcommSocket.connect();
- } catch (IOException e) {
- //log.error("Unhandled exception", e);
- if (e.getMessage().contains("socket closed")) {
- log.error("Unhandled exception", e);
- }
- }
-
- if (isConnected()) {
- if (mSerialIOThread != null) {
- mSerialIOThread.disconnect("Recreate SerialIOThread");
- }
- mSerialIOThread = new SerialIOThread(mRfcommSocket);
- MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.CONNECTED, 0));
- }
-
+ new Thread(() -> {
+ mHandshakeInProgress = false;
+ mConnectionInProgress = true;
+ getBTSocketForSelectedPump();
+ if (mRfcommSocket == null || mBTDevice == null) {
mConnectionInProgress = false;
+ return; // Device not found
}
+
+ try {
+ mRfcommSocket.connect();
+ } catch (IOException e) {
+ //log.error("Unhandled exception", e);
+ if (e.getMessage().contains("socket closed")) {
+ log.error("Unhandled exception", e);
+ }
+ }
+
+ if (isConnected()) {
+ if (mSerialIOThread != null) {
+ mSerialIOThread.disconnect("Recreate SerialIOThread");
+ }
+ mSerialIOThread = new SerialIOThread(mRfcommSocket);
+ mHandshakeInProgress = true;
+ MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.HANDSHAKING, 0));
+ }
+
+ mConnectionInProgress = false;
}).start();
}
@@ -170,7 +159,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{
long now = System.currentTimeMillis();
mDanaRPump.lastConnection = now;
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
if (profile != null && Math.abs(mDanaRPump.currentBasal - profile.getBasal()) >= pump.getPumpDescription().basalStep) {
MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpsettings)));
@@ -195,13 +184,15 @@ 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.getTime() - System.currentTimeMillis()) / 1000L;
- log.debug("Pump time difference: " + timeDiff + " seconds");
+ long timeDiff = (mDanaRPump.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.getTime() - System.currentTimeMillis()) / 1000L;
- log.debug("Pump time difference: " + timeDiff + " seconds");
+ timeDiff = (mDanaRPump.pumpTime - System.currentTimeMillis()) / 1000L;
+ if (L.isEnabled(L.PUMP))
+ log.debug("Pump time difference: " + timeDiff + " seconds");
}
mDanaRPump.lastSettingsRead = now;
}
@@ -210,8 +201,9 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{
MainApp.bus().post(new EventInitializationChanged());
NSUpload.uploadDeviceStatus();
if (mDanaRPump.dailyTotalUnits > mDanaRPump.maxDailyTotalUnits * Constants.dailyLimitWarning) {
- log.debug("Approaching daily limit: " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.maxDailyTotalUnits);
- if(System.currentTimeMillis() > lastApproachingDailyLimit + 30 * 60 * 1000) {
+ if (L.isEnabled(L.PUMP))
+ log.debug("Approaching daily limit: " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.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");
@@ -301,7 +293,8 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{
if ((System.currentTimeMillis() - progress.lastReceive) > 15 * 1000L) { // if i didn't receive status for more than 15 sec expecting broken comm
stop.stopped = true;
stop.forced = true;
- log.debug("Communication stopped");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Communication stopped");
}
}
SystemClock.sleep(300);
@@ -342,11 +335,13 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{
ConfigBuilderPlugin.getCommandQueue().independentConnect("bolusingInterrupted", new Callback() {
@Override
public void run() {
- if (mDanaRPump.lastBolusTime.getTime() > System.currentTimeMillis() - 60 * 1000L) { // last bolus max 1 min old
+ if (mDanaRPump.lastBolusTime > System.currentTimeMillis() - 60 * 1000L) { // last bolus max 1 min old
t.insulin = mDanaRPump.lastBolusAmount;
- log.debug("Used bolus amount from history: " + mDanaRPump.lastBolusAmount);
+ if (L.isEnabled(L.PUMP))
+ log.debug("Used bolus amount from history: " + mDanaRPump.lastBolusAmount);
} else {
- log.debug("Bolus amount in history too old: " + mDanaRPump.lastBolusTime.toLocaleString());
+ if (L.isEnabled(L.PUMP))
+ log.debug("Bolus amount in history too old: " + DateUtil.dateAndTimeFullString(mDanaRPump.lastBolusTime));
}
synchronized (o) {
o.notify();
@@ -386,7 +381,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{
public boolean updateBasalsInPump(final Profile profile) {
if (!isConnected()) return false;
MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.updatingbasalrates)));
- double[] basal = DanaRPump.buildDanaRProfileRecord(profile);
+ double[] basal = DanaRPump.getInstance().buildDanaRProfileRecord(profile);
MsgSetBasalProfile msgSet = new MsgSetBasalProfile((byte) 0, basal);
mSerialIOThread.sendMessage(msgSet);
MsgSetActivateBasalProfile msgActivate = new MsgSetActivateBasalProfile((byte) 0);
@@ -399,7 +394,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{
@Subscribe
public void onStatusEvent(EventAppExit event) {
- if (Config.logFunctionCalls)
+ if (L.isEnabled(L.PUMP))
log.debug("EventAppExit received");
if (mSerialIOThread != null)
@@ -408,8 +403,6 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{
MainApp.instance().getApplicationContext().unregisterReceiver(receiver);
stopSelf();
- if (Config.logFunctionCalls)
- log.debug("EventAppExit finished");
}
public PumpEnactResult setUserOptions() {
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 49edb6b096..54f0beb89b 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java
@@ -2,7 +2,6 @@ package info.nightscout.androidaps.plugins.PumpDanaRKorean;
import android.content.ComponentName;
import android.content.Context;
-import android.content.DialogInterface;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
@@ -11,9 +10,6 @@ import android.support.v7.app.AlertDialog;
import com.squareup.otto.Subscribe;
-import org.slf4j.LoggerFactory;
-
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.DetailedBolusInfo;
@@ -25,9 +21,11 @@ import info.nightscout.androidaps.events.EventAppExit;
import info.nightscout.androidaps.events.EventPreferenceChange;
import info.nightscout.androidaps.interfaces.Constraint;
import info.nightscout.androidaps.interfaces.PluginType;
-import info.nightscout.androidaps.interfaces.PumpDescription;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
+import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpType;
import info.nightscout.androidaps.plugins.PumpDanaR.AbstractDanaRPlugin;
+import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MsgBolusStart;
import info.nightscout.androidaps.plugins.PumpDanaRKorean.services.DanaRKoreanExecutionService;
import info.nightscout.androidaps.plugins.Treatments.Treatment;
@@ -51,59 +49,28 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin {
public DanaRKoreanPlugin() {
pluginDescription.description(R.string.description_pump_dana_r_korean);
- log = LoggerFactory.getLogger(DanaRKoreanPlugin.class);
- useExtendedBoluses = SP.getBoolean("danar_useextended", false);
-
- pumpDescription.isBolusCapable = true;
- pumpDescription.bolusStep = 0.1d;
-
- pumpDescription.isExtendedBolusCapable = true;
- pumpDescription.extendedBolusStep = 0.05d;
- pumpDescription.extendedBolusDurationStep = 30;
- pumpDescription.extendedBolusMaxDuration = 8 * 60;
-
- pumpDescription.isTempBasalCapable = true;
- pumpDescription.tempBasalStyle = PumpDescription.PERCENT;
-
- pumpDescription.maxTempPercent = 200;
- pumpDescription.tempPercentStep = 10;
-
- pumpDescription.tempDurationStep = 60;
- pumpDescription.tempMaxDuration = 24 * 60;
-
-
- pumpDescription.isSetBasalProfileCapable = true;
- pumpDescription.basalStep = 0.01d;
- pumpDescription.basalMinimumRate = 0.1d;
-
- pumpDescription.isRefillingCapable = true;
-
- pumpDescription.storesCarbInfo = false;
-
- pumpDescription.supportsTDDs = true;
- pumpDescription.needsManualTDDLoad = true;
+ useExtendedBoluses = SP.getBoolean(R.string.key_danar_useextended, false);
+ pumpDescription.setPumpDescription(PumpType.DanaRKorean);
}
@Override
public void switchAllowed(ConfigBuilderFragment.PluginViewHolder.PluginSwitcher pluginSwitcher, FragmentActivity context) {
boolean allowHardwarePump = SP.getBoolean("allow_hardware_pump", false);
- if (allowHardwarePump || context == null){
+ if (allowHardwarePump || context == null) {
pluginSwitcher.invoke();
} else {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage(R.string.allow_hardware_pump_text)
- .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- pluginSwitcher.invoke();
- SP.putBoolean("allow_hardware_pump", true);
+ .setPositiveButton(R.string.yes, (dialog, id) -> {
+ pluginSwitcher.invoke();
+ SP.putBoolean("allow_hardware_pump", true);
+ if (L.isEnabled(L.PUMP))
log.debug("First time HW pump allowed!");
- }
})
- .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- pluginSwitcher.cancel();
+ .setNegativeButton(R.string.cancel, (dialog, id) -> {
+ pluginSwitcher.cancel();
+ if (L.isEnabled(L.PUMP))
log.debug("User does not allow switching to HW pump!");
- }
});
builder.create().show();
}
@@ -130,12 +97,14 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin {
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceDisconnected(ComponentName name) {
- log.debug("Service is disconnected");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Service is disconnected");
sExecutionService = null;
}
public void onServiceConnected(ComponentName name, IBinder service) {
- log.debug("Service is connected");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Service is connected");
DanaRKoreanExecutionService.LocalBinder mLocalBinder = (DanaRKoreanExecutionService.LocalBinder) service;
sExecutionService = mLocalBinder.getServiceInstance();
}
@@ -151,7 +120,7 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin {
public void onStatusEvent(final EventPreferenceChange s) {
if (isEnabled(PluginType.PUMP)) {
boolean previousValue = useExtendedBoluses;
- useExtendedBoluses = SP.getBoolean("danar_useextended", false);
+ useExtendedBoluses = SP.getBoolean(R.string.key_danar_useextended, false);
if (useExtendedBoluses != previousValue && TreatmentsPlugin.getPlugin().isInHistoryExtendedBoluslInProgress()) {
sExecutionService.extendedBolusStop();
@@ -178,7 +147,18 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin {
@Override
public boolean isInitialized() {
- return pump.lastConnection > 0 && pump.maxBasal > 0 && !pump.isConfigUD && !pump.isEasyModeEnabled && pump.isExtendedBolusEnabled;
+ DanaRPump pump = DanaRPump.getInstance();
+ return pump.lastConnection > 0 && pump.maxBasal > 0 && !pump.isConfigUD && !pump.isEasyModeEnabled && pump.isExtendedBolusEnabled && pump.isPasswordOK();
+ }
+
+ @Override
+ public boolean isHandshakeInProgress() {
+ return sExecutionService != null && sExecutionService.isHandshakeInProgress();
+ }
+
+ @Override
+ public void finishHandshaking() {
+ sExecutionService.finishHandshaking();
}
@Override
@@ -198,7 +178,7 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin {
result.comment = String.format(MainApp.gs(R.string.boluserrorcode), detailedBolusInfo.insulin, t.insulin, MsgBolusStart.errorCode);
else
result.comment = MainApp.gs(R.string.virtualpump_resultok);
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("deliverTreatment: OK. Asked: " + detailedBolusInfo.insulin + " Delivered: " + result.bolusDelivered);
detailedBolusInfo.insulin = t.insulin;
detailedBolusInfo.date = System.currentTimeMillis();
@@ -223,6 +203,7 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin {
//if (pump.lastConnection.getTime() + 30 * 60 * 1000L < System.currentTimeMillis()) {
// connect("setTempBasalAbsolute old data");
//}
+ DanaRPump pump = DanaRPump.getInstance();
PumpEnactResult result = new PumpEnactResult();
@@ -240,13 +221,13 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin {
if (doTempOff) {
// If extended in progress
if (activeExtended != null && useExtendedBoluses) {
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: Stopping extended bolus (doTempOff)");
return cancelExtendedBolus();
}
// If temp in progress
if (activeTemp != null) {
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: Stopping temp basal (doTempOff)");
return cancelRealTempBasal();
}
@@ -255,7 +236,7 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin {
result.percent = 100;
result.isPercent = true;
result.isTempCancel = true;
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: doTempOff OK");
return result;
}
@@ -267,12 +248,12 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin {
if (percentRate > getPumpDescription().maxTempPercent) {
percentRate = getPumpDescription().maxTempPercent;
}
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: Calculated percent rate: " + percentRate);
// If extended in progress
if (activeExtended != null && useExtendedBoluses) {
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: Stopping extended bolus (doLowTemp || doHighTemp)");
result = cancelExtendedBolus();
if (!result.success) {
@@ -283,7 +264,7 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin {
// Check if some temp is already in progress
if (activeTemp != null) {
// Correct basal already set ?
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: currently running: " + activeTemp.toString());
if (activeTemp.percentRate == percentRate) {
if (enforceNew) {
@@ -295,21 +276,21 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin {
result.duration = activeTemp.getPlannedRemainingMinutes();
result.isPercent = true;
result.isTempCancel = false;
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: Correct temp basal already set (doLowTemp || doHighTemp)");
return result;
}
}
}
// Convert duration from minutes to hours
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: Setting temp basal " + percentRate + "% for " + durationInMinutes + " mins (doLowTemp || doHighTemp)");
return setTempBasalPercent(percentRate, durationInMinutes, profile, false);
}
if (doExtendedTemp) {
// Check if some temp is already in progress
if (activeTemp != null) {
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: Stopping temp basal (doExtendedTemp)");
result = cancelRealTempBasal();
// Check for proper result
@@ -328,7 +309,7 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin {
extendedRateToSet = Round.roundTo(extendedRateToSet, pumpDescription.extendedBolusStep * 2); // *2 because of halfhours
// What is current rate of extended bolusing in u/h?
- if (Config.logPumpActions) {
+ if (L.isEnabled(L.PUMP)) {
log.debug("setTempBasalAbsolute: Extended bolus in progress: " + (activeExtended != null) + " rate: " + pump.extendedBolusAbsoluteRate + "U/h duration remaining: " + pump.extendedBolusRemainingMinutes + "min");
log.debug("setTempBasalAbsolute: Rate to set: " + extendedRateToSet + "U/h");
}
@@ -342,21 +323,21 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin {
result.duration = pump.extendedBolusRemainingMinutes;
result.isPercent = false;
result.isTempCancel = false;
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: Correct extended already set");
return result;
}
// Now set new extended, no need to to stop previous (if running) because it's replaced
Double extendedAmount = extendedRateToSet / 2 * durationInHalfHours;
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: Setting extended: " + extendedAmount + "U halfhours: " + durationInHalfHours);
result = setExtendedBolus(extendedAmount, durationInMinutes);
if (!result.success) {
log.error("setTempBasalAbsolute: Failed to set extended bolus");
return result;
}
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: Extended bolus set ok");
result.absolute = result.absolute + getBaseBasalRate();
return result;
@@ -383,7 +364,7 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin {
return result;
}
- public PumpEnactResult cancelRealTempBasal() {
+ private PumpEnactResult cancelRealTempBasal() {
PumpEnactResult result = new PumpEnactResult();
TemporaryBasal runningTB = TreatmentsPlugin.getPlugin().getTempBasalFromHistory(System.currentTimeMillis());
if (runningTB != null) {
@@ -391,11 +372,11 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin {
result.enacted = true;
result.isTempCancel = true;
}
- if (!pump.isTempBasalInProgress) {
+ if (!DanaRPump.getInstance().isTempBasalInProgress) {
result.success = true;
result.isTempCancel = true;
result.comment = MainApp.gs(R.string.virtualpump_resultok);
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("cancelRealTempBasal: OK");
return result;
} else {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/SerialIOThread.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/SerialIOThread.java
index 9a8f3edb05..ea12b2b9c4 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/SerialIOThread.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/SerialIOThread.java
@@ -10,7 +10,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase;
import info.nightscout.androidaps.plugins.PumpDanaR.services.AbstractSerialIOThread;
@@ -21,7 +21,7 @@ import info.nightscout.utils.CRC;
* Created by mike on 17.07.2016.
*/
public class SerialIOThread extends AbstractSerialIOThread {
- private static Logger log = LoggerFactory.getLogger(SerialIOThread.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPBTCOMM);
private InputStream mInputStream = null;
private OutputStream mOutputStream = null;
@@ -72,7 +72,7 @@ public class SerialIOThread extends AbstractSerialIOThread {
message = MessageHashTable_k.findMessage(command);
}
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPBTCOMM))
log.debug("<<<<< " + message.getMessageName() + " " + message.toHexString(extractedBuff));
// process the message content
@@ -84,7 +84,7 @@ public class SerialIOThread extends AbstractSerialIOThread {
}
}
} catch (Exception e) {
- if (Config.logDanaSerialEngine && e.getMessage().indexOf("bt socket closed") < 0)
+ if (e.getMessage().indexOf("bt socket closed") < 0)
log.error("Thread exception: ", e);
mKeepRunning = false;
}
@@ -148,7 +148,7 @@ public class SerialIOThread extends AbstractSerialIOThread {
processedMessage = message;
byte[] messageBytes = message.getRawMessageBytes();
- if (Config.logDanaSerialEngine)
+ if (L.isEnabled(L.PUMPBTCOMM))
log.debug(">>>>> " + message.getMessageName() + " " + message.toHexString(messageBytes));
try {
@@ -167,10 +167,11 @@ public class SerialIOThread extends AbstractSerialIOThread {
SystemClock.sleep(200);
if (!message.received) {
- log.warn("Reply not received " + message.getMessageName());
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.warn("Reply not received " + message.getMessageName());
if (message.getCommand() == 0xF0F1) {
DanaRPump.getInstance().isNewPump = false;
- log.debug("Old firmware detected");
+ log.error("Old firmware detected");
}
}
}
@@ -181,24 +182,29 @@ public class SerialIOThread extends AbstractSerialIOThread {
try {
mInputStream.close();
} catch (Exception e) {
- if (Config.logDanaSerialEngine) log.debug(e.getMessage());
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug(e.getMessage());
}
try {
mOutputStream.close();
} catch (Exception e) {
- if (Config.logDanaSerialEngine) log.debug(e.getMessage());
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug(e.getMessage());
}
try {
mRfCommSocket.close();
} catch (Exception e) {
- if (Config.logDanaSerialEngine) log.debug(e.getMessage());
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug(e.getMessage());
}
try {
System.runFinalization();
} catch (Exception e) {
- if (Config.logDanaSerialEngine) log.debug(e.getMessage());
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug(e.getMessage());
}
- if (Config.logDanaSerialEngine) log.debug("Disconnected: " + reason);
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("Disconnected: " + reason);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgCheckValue_k.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgCheckValue_k.java
index 684fa30997..7bde73d5a1 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgCheckValue_k.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgCheckValue_k.java
@@ -3,22 +3,21 @@ package info.nightscout.androidaps.plugins.PumpDanaRKorean.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-import info.nightscout.androidaps.MainApp;
-import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase;
import info.nightscout.androidaps.plugins.PumpDanaRKorean.DanaRKoreanPlugin;
-import info.nightscout.utils.ToastUtils;
/**
* Created by mike on 30.06.2016.
*/
public class MsgCheckValue_k extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgCheckValue_k.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgCheckValue_k() {
SetCommand(0xF0F1);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -26,17 +25,18 @@ public class MsgCheckValue_k extends MessageBase {
DanaRPump pump = DanaRPump.getInstance();
pump.isNewPump = true;
- log.debug("New firmware confirmed");
+ if (L.isEnabled(L.PUMP))
+ log.debug("New firmware confirmed");
pump.model = intFromBuff(bytes, 0, 1);
pump.protocol = intFromBuff(bytes, 1, 1);
pump.productCode = intFromBuff(bytes, 2, 1);
if (pump.model != DanaRPump.DOMESTIC_MODEL) {
DanaRKoreanPlugin.getPlugin().disconnect("Wrong Model");
- log.debug("Wrong model selected");
+ log.error("Wrong model selected");
}
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMP)) {
log.debug("Model: " + String.format("%02X ", pump.model));
log.debug("Protocol: " + String.format("%02X ", pump.protocol));
log.debug("Product Code: " + String.format("%02X ", pump.productCode));
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusBasic_k.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusBasic_k.java
index fa28e664ed..32253b0007 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusBasic_k.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusBasic_k.java
@@ -3,20 +3,22 @@ package info.nightscout.androidaps.plugins.PumpDanaRKorean.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
+import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase;
public class MsgInitConnStatusBasic_k extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgInitConnStatusBasic_k.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgInitConnStatusBasic_k() {
SetCommand(0x0303);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -30,7 +32,7 @@ public class MsgInitConnStatusBasic_k extends MessageBase {
pump.isEasyModeEnabled = intFromBuff(bytes, 2, 1) == 1;
int easyUIMode = intFromBuff(bytes, 3, 1);
pump.password = intFromBuff(bytes, 4, 2) ^ 0x3463;
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("isStatusSuspendOn: " + pump.pumpSuspended);
log.debug("isUtilityEnable: " + isUtilityEnable);
log.debug("Is EasyUI Enabled: " + pump.isEasyModeEnabled);
@@ -44,5 +46,12 @@ public class MsgInitConnStatusBasic_k extends MessageBase {
} else {
MainApp.bus().post(new EventDismissNotification(Notification.EASYMODE_ENABLED));
}
+
+ if (!DanaRPump.getInstance().isPasswordOK()) {
+ Notification notification = new Notification(Notification.WRONG_PUMP_PASSWORD, MainApp.gs(R.string.wrongpumppassword), Notification.URGENT);
+ MainApp.bus().post(new EventNewNotification(notification));
+ } else {
+ MainApp.bus().post(new EventDismissNotification(Notification.WRONG_PUMP_PASSWORD));
+ }
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusBolus_k.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusBolus_k.java
index 552511cf7c..4be04f538f 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusBolus_k.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusBolus_k.java
@@ -3,23 +3,25 @@ package info.nightscout.androidaps.plugins.PumpDanaRKorean.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
-import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase;
-import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
+import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
+import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
+import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase;
/**
* Created by mike on 28.05.2016.
*/
public class MsgInitConnStatusBolus_k extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgInitConnStatusBolus_k.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgInitConnStatusBolus_k() {
SetCommand(0x0302);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -36,7 +38,7 @@ public class MsgInitConnStatusBolus_k extends MessageBase {
//int bolusRate = intFromBuff(bytes, 4, 8);
int deliveryStatus = intFromBuff(bytes, 12, 1);
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Is Extended bolus enabled: " + pump.isExtendedBolusEnabled);
log.debug("Bolus increment: " + pump.bolusStep);
log.debug("Bolus max: " + pump.maxBolus);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusTime_k.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusTime_k.java
index 7553b0cc37..ac0e856d90 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusTime_k.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusTime_k.java
@@ -3,13 +3,11 @@ package info.nightscout.androidaps.plugins.PumpDanaRKorean.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.Date;
-
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.events.EventRefreshGui;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
@@ -17,12 +15,15 @@ import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase;
import info.nightscout.androidaps.plugins.PumpDanaRKorean.DanaRKoreanPlugin;
+import info.nightscout.utils.DateUtil;
public class MsgInitConnStatusTime_k extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgInitConnStatusTime_k.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgInitConnStatusTime_k() {
SetCommand(0x0301);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -32,7 +33,7 @@ public class MsgInitConnStatusTime_k extends MessageBase {
Notification notification = new Notification(Notification.WRONG_DRIVER, MainApp.gs(R.string.pumpdrivercorrected), Notification.NORMAL);
MainApp.bus().post(new EventNewNotification(notification));
DanaRKoreanPlugin.getPlugin().disconnect("Wrong Model");
- log.debug("Wrong model selected. Switching to export DanaR");
+ log.error("Wrong model selected. Switching to export DanaR");
MainApp.getSpecificPlugin(DanaRKoreanPlugin.class).setPluginEnabled(PluginType.PUMP, false);
MainApp.getSpecificPlugin(DanaRKoreanPlugin.class).setFragmentVisible(PluginType.PUMP, false);
MainApp.getSpecificPlugin(DanaRPlugin.class).setPluginEnabled(PluginType.PUMP, true);
@@ -52,14 +53,14 @@ public class MsgInitConnStatusTime_k extends MessageBase {
return;
}
- Date time = dateTimeSecFromBuff(bytes, 0);
+ long time = dateTimeSecFromBuff(bytes, 0);
int versionCode1 = intFromBuff(bytes, 6, 1);
int versionCode2 = intFromBuff(bytes, 7, 1);
int versionCode3 = intFromBuff(bytes, 8, 1);
int versionCode4 = intFromBuff(bytes, 9, 1);
- if (Config.logDanaMessageDetail) {
- log.debug("Pump time: " + time);
+ if (L.isEnabled(L.PUMPCOMM)) {
+ log.debug("Pump time: " + DateUtil.dateAndTimeFullString(time));
log.debug("Version code1: " + versionCode1);
log.debug("Version code2: " + versionCode2);
log.debug("Version code3: " + versionCode3);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgSettingBasalProfileAll_k.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgSettingBasalProfileAll_k.java
index 304ec9fc37..2455f59e14 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgSettingBasalProfileAll_k.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgSettingBasalProfileAll_k.java
@@ -3,7 +3,7 @@ package info.nightscout.androidaps.plugins.PumpDanaRKorean.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase;
@@ -15,10 +15,12 @@ import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase;
* THIS IS BROKEN IN PUMP... SENDING ONLY 1 PROFILE
*/
public class MsgSettingBasalProfileAll_k extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgSettingBasalProfileAll_k.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgSettingBasalProfileAll_k() {
SetCommand(0x3206);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
public void handleMessage(byte[] bytes) {
@@ -49,7 +51,7 @@ public class MsgSettingBasalProfileAll_k extends MessageBase {
}
}
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
if (pump.basal48Enable) {
for (int profile = 0; profile < 4; profile++) {
for (int index = 0; index < 24; index++) {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgSettingBasal_k.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgSettingBasal_k.java
index 5c8b40b959..b149ceb2ad 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgSettingBasal_k.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgSettingBasal_k.java
@@ -3,7 +3,7 @@ package info.nightscout.androidaps.plugins.PumpDanaRKorean.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase;
import info.nightscout.androidaps.plugins.PumpDanaRKorean.DanaRKoreanPlugin;
@@ -12,10 +12,12 @@ import info.nightscout.androidaps.plugins.PumpDanaRKorean.DanaRKoreanPlugin;
* Created by mike on 05.07.2016.
*/
public class MsgSettingBasal_k extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgSettingBasal_k.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgSettingBasal_k() {
SetCommand(0x3202);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
public void handleMessage(byte[] bytes) {
@@ -28,7 +30,7 @@ public class MsgSettingBasal_k extends MessageBase {
pump.pumpProfiles[pump.activeProfile][index] = basal / 100d;
}
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
for (int index = 0; index < 24; index++) {
log.debug("Basal " + String.format("%02d", index) + "h: " + pump.pumpProfiles[pump.activeProfile][index]);
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgStatusBasic_k.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgStatusBasic_k.java
index 0fcaf17d83..d22c6e376a 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgStatusBasic_k.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgStatusBasic_k.java
@@ -3,16 +3,18 @@ package info.nightscout.androidaps.plugins.PumpDanaRKorean.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase;
public class MsgStatusBasic_k extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgStatusBasic_k.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgStatusBasic_k() {
SetCommand(0x020A);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
public void handleMessage(byte[] bytes) {
@@ -29,7 +31,7 @@ public class MsgStatusBasic_k extends MessageBase {
pump.currentBasal = currentBasal;
pump.batteryRemaining = batteryRemaining;
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Daily total units: " + dailyTotalUnits);
log.debug("Max daily total units: " + maxDailyTotalUnits);
log.debug("Reservoir remaining units: " + reservoirRemainingUnits);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgStatus_k.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgStatus_k.java
index 1fdcf26917..4d8b012244 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgStatus_k.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgStatus_k.java
@@ -3,15 +3,17 @@ package info.nightscout.androidaps.plugins.PumpDanaRKorean.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase;
public class MsgStatus_k extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgStatus_k.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgStatus_k() {
SetCommand(0x020B);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
public void handleMessage(byte[] bytes) {
@@ -27,7 +29,7 @@ public class MsgStatus_k extends MessageBase {
// }
pump.iob = intFromBuff(bytes, 15, 2) / 100d;
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Daily total: " + pump.dailyTotalUnits);
log.debug("Is extended bolus running: " + pump.isExtendedInProgress);
log.debug("Extended bolus min: " + pump.extendedBolusMinutes);
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 0f4afa4314..8adc954aa4 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
@@ -7,12 +7,9 @@ import android.os.SystemClock;
import com.squareup.otto.Subscribe;
-import org.slf4j.LoggerFactory;
-
import java.io.IOException;
import java.util.Date;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
@@ -24,7 +21,9 @@ import info.nightscout.androidaps.events.EventPreferenceChange;
import info.nightscout.androidaps.events.EventProfileSwitchChange;
import info.nightscout.androidaps.events.EventPumpStatusChanged;
import info.nightscout.androidaps.interfaces.PumpInterface;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.Overview.Dialogs.BolusProgressDialog;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
@@ -50,20 +49,18 @@ import info.nightscout.androidaps.plugins.PumpDanaR.comm.MsgStatusBolusExtended;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MsgStatusTempBasal;
import info.nightscout.androidaps.plugins.PumpDanaR.events.EventDanaRNewStatus;
import info.nightscout.androidaps.plugins.PumpDanaR.services.AbstractDanaRExecutionService;
-import info.nightscout.androidaps.plugins.PumpDanaRKorean.DanaRKoreanPlugin;
import info.nightscout.androidaps.plugins.PumpDanaRKorean.SerialIOThread;
import info.nightscout.androidaps.plugins.PumpDanaRKorean.comm.MsgCheckValue_k;
import info.nightscout.androidaps.plugins.PumpDanaRKorean.comm.MsgSettingBasal_k;
import info.nightscout.androidaps.plugins.PumpDanaRKorean.comm.MsgStatusBasic_k;
import info.nightscout.androidaps.plugins.Treatments.Treatment;
import info.nightscout.androidaps.queue.commands.Command;
-import info.nightscout.utils.NSUpload;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.utils.SP;
public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService {
public DanaRKoreanExecutionService() {
- log = LoggerFactory.getLogger(DanaRKoreanExecutionService.class);
mBinder = new LocalBinder();
registerBus();
@@ -87,7 +84,7 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService {
@Subscribe
public void onStatusEvent(EventAppExit event) {
- if (Config.logFunctionCalls)
+ if (L.isEnabled(L.PUMP))
log.debug("EventAppExit received");
if (mSerialIOThread != null)
@@ -96,8 +93,6 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService {
MainApp.instance().getApplicationContext().unregisterReceiver(receiver);
stopSelf();
- if (Config.logFunctionCalls)
- log.debug("EventAppExit finished");
}
@Subscribe
@@ -107,47 +102,37 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService {
}
public void connect() {
- if (mDanaRPump.password != -1 && mDanaRPump.password != SP.getInt(R.string.key_danar_password, -1)) {
- if(System.currentTimeMillis() > lastWrongPumpPassword + 30 * 1000) {
- Notification notification = new Notification(Notification.WRONG_PUMP_PASSWORD, MainApp.gs(R.string.wrongpumppassword), Notification.URGENT);
- notification.soundId = R.raw.error;
- lastWrongPumpPassword = System.currentTimeMillis();
- }
- return;
- }
-
if (mConnectionInProgress)
return;
- new Thread(new Runnable() {
- @Override
- public void run() {
- mConnectionInProgress = true;
- getBTSocketForSelectedPump();
- if (mRfcommSocket == null || mBTDevice == null) {
- mConnectionInProgress = false;
- return; // Device not found
- }
-
- try {
- mRfcommSocket.connect();
- } catch (IOException e) {
- //log.error("Unhandled exception", e);
- if (e.getMessage().contains("socket closed")) {
- log.error("Unhandled exception", e);
- }
- }
-
- if (isConnected()) {
- if (mSerialIOThread != null) {
- mSerialIOThread.disconnect("Recreate SerialIOThread");
- }
- mSerialIOThread = new SerialIOThread(mRfcommSocket);
- MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.CONNECTED, 0));
- }
-
+ new Thread(() -> {
+ mHandshakeInProgress = false;
+ mConnectionInProgress = true;
+ getBTSocketForSelectedPump();
+ if (mRfcommSocket == null || mBTDevice == null) {
mConnectionInProgress = false;
+ return; // Device not found
}
+
+ try {
+ mRfcommSocket.connect();
+ } catch (IOException e) {
+ //log.error("Unhandled exception", e);
+ if (e.getMessage().contains("socket closed")) {
+ log.error("Unhandled exception", e);
+ }
+ }
+
+ if (isConnected()) {
+ if (mSerialIOThread != null) {
+ mSerialIOThread.disconnect("Recreate SerialIOThread");
+ }
+ mSerialIOThread = new SerialIOThread(mRfcommSocket);
+ mHandshakeInProgress = true;
+ MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.HANDSHAKING, 0));
+ }
+
+ mConnectionInProgress = false;
}).start();
}
@@ -178,7 +163,7 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService {
long now = System.currentTimeMillis();
mDanaRPump.lastConnection = now;
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
if (profile != null && Math.abs(mDanaRPump.currentBasal - profile.getBasal()) >= pump.getPumpDescription().basalStep) {
MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpsettings)));
@@ -199,13 +184,15 @@ 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.getTime() - System.currentTimeMillis()) / 1000L;
- log.debug("Pump time difference: " + timeDiff + " seconds");
+ long timeDiff = (mDanaRPump.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.getTime() - System.currentTimeMillis()) / 1000L;
- log.debug("Pump time difference: " + timeDiff + " seconds");
+ timeDiff = (mDanaRPump.pumpTime - System.currentTimeMillis()) / 1000L;
+ if (L.isEnabled(L.PUMP))
+ log.debug("Pump time difference: " + timeDiff + " seconds");
}
mDanaRPump.lastSettingsRead = now;
}
@@ -214,8 +201,9 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService {
MainApp.bus().post(new EventInitializationChanged());
NSUpload.uploadDeviceStatus();
if (mDanaRPump.dailyTotalUnits > mDanaRPump.maxDailyTotalUnits * Constants.dailyLimitWarning) {
- log.debug("Approaching daily limit: " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.maxDailyTotalUnits);
- if(System.currentTimeMillis() > lastApproachingDailyLimit + 30 * 60 * 1000) {
+ if (L.isEnabled(L.PUMP))
+ log.debug("Approaching daily limit: " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.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");
@@ -287,7 +275,6 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService {
if (amount > 0) {
MsgBolusProgress progress = new MsgBolusProgress(amount, t); // initialize static variables
- long bolusStart = System.currentTimeMillis();
if (!stop.stopped) {
mSerialIOThread.sendMessage(start);
@@ -300,7 +287,8 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService {
if ((System.currentTimeMillis() - progress.lastReceive) > 15 * 1000L) { // if i didn't receive status for more than 15 sec expecting broken comm
stop.stopped = true;
stop.forced = true;
- log.debug("Communication stopped");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Communication stopped");
}
}
SystemClock.sleep(300);
@@ -332,7 +320,7 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService {
public boolean updateBasalsInPump(final Profile profile) {
if (!isConnected()) return false;
MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.updatingbasalrates)));
- double[] basal = DanaRPump.buildDanaRProfileRecord(profile);
+ double[] basal = DanaRPump.getInstance().buildDanaRProfileRecord(profile);
MsgSetSingleBasalProfile msgSet = new MsgSetSingleBasalProfile(basal);
mSerialIOThread.sendMessage(msgSet);
mDanaRPump.lastSettingsRead = 0; // force read full settings
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 36edf1e94f..e3c8f9de94 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
@@ -2,7 +2,6 @@ package info.nightscout.androidaps.plugins.PumpDanaRS;
import android.content.ComponentName;
import android.content.Context;
-import android.content.DialogInterface;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
@@ -17,10 +16,7 @@ import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.Date;
-
import info.nightscout.androidaps.BuildConfig;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.DetailedBolusInfo;
@@ -39,12 +35,15 @@ import info.nightscout.androidaps.interfaces.PluginType;
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.ConfigBuilder.ConfigBuilderFragment;
import info.nightscout.androidaps.plugins.ConfigBuilder.DetailedBolusInfoStorage;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
import info.nightscout.androidaps.plugins.ProfileNS.NSProfilePlugin;
+import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpType;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRFragment;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.RecordTypes;
@@ -64,7 +63,7 @@ import info.nightscout.utils.T;
*/
public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInterface, ConstraintsInterface, ProfileInterface {
- private static Logger log = LoggerFactory.getLogger(DanaRSPlugin.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMP);
private static DanaRSPlugin plugin = null;
public static DanaRSPlugin getPlugin() {
@@ -73,15 +72,14 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
return plugin;
}
- public static DanaRSService danaRSService;
+ private static DanaRSService danaRSService;
- public static String mDeviceAddress = "";
+ private static String mDeviceAddress = "";
public static String mDeviceName = "";
- private static DanaRPump pump = DanaRPump.getInstance();
public static PumpDescription pumpDescription = new PumpDescription();
- DanaRSPlugin() {
+ private DanaRSPlugin() {
super(new PluginDescription()
.mainType(PluginType.PUMP)
.fragmentClass(DanaRFragment.class.getName())
@@ -91,36 +89,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
.description(R.string.description_pump_dana_rs)
);
- pumpDescription.isBolusCapable = true;
- pumpDescription.bolusStep = 0.05d;
-
- pumpDescription.isExtendedBolusCapable = true;
- pumpDescription.extendedBolusStep = 0.05d;
- pumpDescription.extendedBolusDurationStep = 30;
- pumpDescription.extendedBolusMaxDuration = 8 * 60;
-
- pumpDescription.isTempBasalCapable = true;
- pumpDescription.tempBasalStyle = PumpDescription.PERCENT;
-
- pumpDescription.maxTempPercent = 200;
- pumpDescription.tempPercentStep = 10;
-
- pumpDescription.tempDurationStep = 60;
- pumpDescription.tempDurationStep15mAllowed = true;
- pumpDescription.tempDurationStep30mAllowed = true;
- pumpDescription.tempMaxDuration = 24 * 60;
-
-
- pumpDescription.isSetBasalProfileCapable = true;
- pumpDescription.basalStep = 0.01d;
- pumpDescription.basalMinimumRate = 0.04d;
-
- pumpDescription.isRefillingCapable = true;
-
- pumpDescription.storesCarbInfo = true;
-
- pumpDescription.supportsTDDs = true;
- pumpDescription.needsManualTDDLoad = true;
+ pumpDescription.setPumpDescription(PumpType.DanaRS);
}
@Override
@@ -155,23 +124,21 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
@Override
public void switchAllowed(ConfigBuilderFragment.PluginViewHolder.PluginSwitcher pluginSwitcher, FragmentActivity context) {
boolean allowHardwarePump = SP.getBoolean("allow_hardware_pump", false);
- if (allowHardwarePump || context == null){
+ if (allowHardwarePump || context == null) {
pluginSwitcher.invoke();
} else {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage(R.string.allow_hardware_pump_text)
- .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- pluginSwitcher.invoke();
- SP.putBoolean("allow_hardware_pump", true);
+ .setPositiveButton(R.string.yes, (dialog, id) -> {
+ pluginSwitcher.invoke();
+ SP.putBoolean("allow_hardware_pump", true);
+ if (L.isEnabled(L.PUMP))
log.debug("First time HW pump allowed!");
- }
})
- .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- pluginSwitcher.cancel();
+ .setNegativeButton(R.string.cancel, (dialog, id) -> {
+ pluginSwitcher.cancel();
+ if (L.isEnabled(L.PUMP))
log.debug("User does not allow switching to HW pump!");
- }
});
builder.create().show();
}
@@ -180,12 +147,14 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceDisconnected(ComponentName name) {
- log.debug("Service is disconnected");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Service is disconnected");
danaRSService = null;
}
public void onServiceConnected(ComponentName name, IBinder service) {
- log.debug("Service is connected");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Service is connected");
DanaRSService.LocalBinder mLocalBinder = (DanaRSService.LocalBinder) service;
danaRSService = mLocalBinder.getServiceInstance();
}
@@ -205,7 +174,8 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
@Override
public void connect(String from) {
- log.debug("RS connect from: " + from);
+ if (L.isEnabled(L.PUMP))
+ log.debug("RS connect from: " + from);
if (danaRSService != null && !mDeviceAddress.equals("") && !mDeviceName.equals("")) {
final Object o = new Object();
@@ -223,8 +193,19 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
return danaRSService != null && danaRSService.isConnecting();
}
+ @Override
+ public boolean isHandshakeInProgress() {
+ return false;
+ }
+
+ @Override
+ public void finishHandshaking() {
+ }
+
@Override
public void disconnect(String from) {
+ if (L.isEnabled(L.PUMP))
+ log.debug("RS disconnect from: " + from);
if (danaRSService != null) danaRSService.disconnect(from);
}
@@ -237,8 +218,8 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
public void getPumpStatus() {
if (danaRSService != null) {
danaRSService.getPumpStatus();
- pumpDescription.basalStep = pump.basalStep;
- pumpDescription.bolusStep = pump.bolusStep;
+ pumpDescription.basalStep = DanaRPump.getInstance().basalStep;
+ pumpDescription.bolusStep = DanaRPump.getInstance().bolusStep;
}
}
@@ -263,8 +244,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
@Override
public Constraint applyBasalConstraints(Constraint absoluteRate, Profile profile) {
- if (pump != null)
- absoluteRate.setIfSmaller(pump.maxBasal, String.format(MainApp.gs(R.string.limitingbasalratio), pump.maxBasal, MainApp.gs(R.string.pumplimit)), this);
+ absoluteRate.setIfSmaller(DanaRPump.getInstance().maxBasal, String.format(MainApp.gs(R.string.limitingbasalratio), DanaRPump.getInstance().maxBasal, MainApp.gs(R.string.pumplimit)), this);
return absoluteRate;
}
@@ -279,41 +259,45 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
@Override
public Constraint applyBolusConstraints(Constraint insulin) {
- if (pump != null)
- insulin.setIfSmaller(pump.maxBolus, String.format(MainApp.gs(R.string.limitingbolus), pump.maxBolus, MainApp.gs(R.string.pumplimit)), this);
+ insulin.setIfSmaller(DanaRPump.getInstance().maxBolus, String.format(MainApp.gs(R.string.limitingbolus), DanaRPump.getInstance().maxBolus, MainApp.gs(R.string.pumplimit)), this);
return insulin;
}
+ @Override
+ public Constraint applyExtendedBolusConstraints(Constraint insulin) {
+ return applyBolusConstraints(insulin);
+ }
+
// Profile interface
@Nullable
@Override
public ProfileStore getProfile() {
- if (pump.lastSettingsRead == 0)
+ if (DanaRPump.getInstance().lastSettingsRead == 0)
return null; // no info now
- return pump.createConvertedProfile();
+ return DanaRPump.getInstance().createConvertedProfile();
}
@Override
public String getUnits() {
- return pump.getUnits();
+ return DanaRPump.getInstance().getUnits();
}
@Override
public String getProfileName() {
- return pump.createConvertedProfileName();
+ return DanaRPump.getInstance().createConvertedProfileName();
}
// Pump interface
@Override
public boolean isInitialized() {
- return pump.lastConnection > 0 && pump.maxBasal > 0;
+ return DanaRPump.getInstance().lastConnection > 0 && DanaRPump.getInstance().maxBasal > 0;
}
@Override
public boolean isSuspended() {
- return pump.pumpSuspended;
+ return DanaRPump.getInstance().pumpSuspended;
}
@Override
@@ -361,6 +345,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
public boolean isThisProfileSet(Profile profile) {
if (!isInitialized())
return true; // TODO: not sure what's better. so far TRUE to prevent too many SMS
+ DanaRPump pump = DanaRPump.getInstance();
if (pump.pumpProfiles == null)
return true; // TODO: not sure what's better. so far TRUE to prevent too many SMS
int basalValues = pump.basal48Enable ? 48 : 24;
@@ -370,7 +355,8 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
Double profileValue = profile.getBasalTimeFromMidnight((Integer) (h * basalIncrement));
if (profileValue == null) return true;
if (Math.abs(pumpValue - profileValue) > getPumpDescription().basalStep) {
- log.debug("Diff found. Hour: " + h + " Pump: " + pumpValue + " Profile: " + profileValue);
+ if (L.isEnabled(L.PUMP))
+ log.debug("Diff found. Hour: " + h + " Pump: " + pumpValue + " Profile: " + profileValue);
return false;
}
}
@@ -378,13 +364,13 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
}
@Override
- public Date lastDataTime() {
- return new Date(pump.lastConnection);
+ public long lastDataTime() {
+ return DanaRPump.getInstance().lastConnection;
}
@Override
public double getBaseBasalRate() {
- return pump.currentBasal;
+ return DanaRPump.getInstance().currentBasal;
}
@Override
@@ -426,11 +412,26 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
result.success = connectionOK && Math.abs(detailedBolusInfo.insulin - t.insulin) < pumpDescription.bolusStep;
result.bolusDelivered = t.insulin;
result.carbsDelivered = detailedBolusInfo.carbs;
- if (!result.success)
- result.comment = String.format(MainApp.gs(R.string.boluserrorcode), detailedBolusInfo.insulin, t.insulin, DanaRS_Packet_Bolus_Set_Step_Bolus_Start.errorCode);
- else
+ if (!result.success) {
+ String error = "" + DanaRS_Packet_Bolus_Set_Step_Bolus_Start.errorCode;
+ switch (DanaRS_Packet_Bolus_Set_Step_Bolus_Start.errorCode) {
+ case 0x10:
+ error = MainApp.gs(R.string.maxbolusviolation);
+ break;
+ case 0x20:
+ error = MainApp.gs(R.string.commanderror);
+ break;
+ case 0x40:
+ error = MainApp.gs(R.string.speederror);
+ break;
+ case 0x80:
+ error = MainApp.gs(R.string.insulinlimitviolation);
+ break;
+ }
+ result.comment = String.format(MainApp.gs(R.string.boluserrorcode), detailedBolusInfo.insulin, t.insulin, error);
+ } else
result.comment = MainApp.gs(R.string.virtualpump_resultok);
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("deliverTreatment: OK. Asked: " + detailedBolusInfo.insulin + " Delivered: " + result.bolusDelivered);
return result;
} else {
@@ -474,7 +475,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
if (doTempOff) {
// If temp in progress
if (TreatmentsPlugin.getPlugin().isTempBasalInProgress()) {
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: Stopping temp basal (doTempOff)");
return cancelTempBasal(false);
}
@@ -483,7 +484,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
result.percent = 100;
result.isPercent = true;
result.isTempCancel = true;
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: doTempOff OK");
return result;
}
@@ -497,7 +498,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
// Check if some temp is already in progress
TemporaryBasal activeTemp = TreatmentsPlugin.getPlugin().getTempBasalFromHistory(System.currentTimeMillis());
if (activeTemp != null) {
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: currently running: " + activeTemp.toString());
// Correct basal already set ?
if (activeTemp.percentRate == percentRate) {
@@ -508,14 +509,14 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
result.duration = activeTemp.getPlannedRemainingMinutes();
result.isPercent = true;
result.isTempCancel = false;
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: Correct temp basal already set (doLowTemp || doHighTemp)");
return result;
}
}
}
// Convert duration from minutes to hours
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: Setting temp basal " + percentRate + "% for " + durationInMinutes + " mins (doLowTemp || doHighTemp)");
if (percentRate == 0 && durationInMinutes > 30) {
result = setTempBasalPercent(percentRate, durationInMinutes, profile, false);
@@ -527,7 +528,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
log.error("setTempBasalAbsolute: Failed to set hightemp basal");
return result;
}
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: hightemp basal set ok");
return result;
}
@@ -540,6 +541,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
@Override
public synchronized PumpEnactResult setTempBasalPercent(Integer percent, Integer durationInMinutes, Profile profile, boolean enforceNew) {
+ DanaRPump pump = DanaRPump.getInstance();
PumpEnactResult result = new PumpEnactResult();
percent = MainApp.getConstraintChecker().applyBasalPercentConstraints(new Constraint<>(percent), profile).value();
if (percent < 0) {
@@ -562,7 +564,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
result.duration = pump.tempBasalRemainingMin;
result.percent = pump.tempBasalPercent;
result.isPercent = true;
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalPercent: Correct value already set");
return result;
}
@@ -581,7 +583,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
result.duration = pump.tempBasalRemainingMin;
result.percent = pump.tempBasalPercent;
result.isPercent = true;
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalPercent: OK");
return result;
}
@@ -592,7 +594,8 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
return result;
}
- public synchronized PumpEnactResult setHighTempBasalPercent(Integer percent) {
+ private synchronized PumpEnactResult setHighTempBasalPercent(Integer percent) {
+ DanaRPump pump = DanaRPump.getInstance();
PumpEnactResult result = new PumpEnactResult();
boolean connectionOK = danaRSService.highTempBasal(percent);
if (connectionOK && pump.isTempBasalInProgress && pump.tempBasalPercent == percent) {
@@ -603,7 +606,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
result.duration = pump.tempBasalRemainingMin;
result.percent = pump.tempBasalPercent;
result.isPercent = true;
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setHighTempBasalPercent: OK");
return result;
}
@@ -616,7 +619,8 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
@Override
public synchronized PumpEnactResult setExtendedBolus(Double insulin, Integer durationInMinutes) {
- insulin = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(insulin)).value();
+ DanaRPump pump = DanaRPump.getInstance();
+ insulin = MainApp.getConstraintChecker().applyExtendedBolusConstraints(new Constraint<>(insulin)).value();
// needs to be rounded
int durationInHalfHours = Math.max(durationInMinutes / 30, 1);
insulin = Round.roundTo(insulin, getPumpDescription().extendedBolusStep);
@@ -630,7 +634,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
result.absolute = pump.extendedBolusAbsoluteRate;
result.isPercent = false;
result.isTempCancel = false;
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setExtendedBolus: Correct extended bolus already set. Current: " + pump.extendedBolusAmount + " Asked: " + insulin);
return result;
}
@@ -644,7 +648,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
result.absolute = pump.extendedBolusAbsoluteRate;
result.bolusDelivered = pump.extendedBolusAmount;
result.isPercent = false;
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setExtendedBolus: OK");
return result;
}
@@ -664,11 +668,11 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
result.enacted = true;
result.isTempCancel = true;
}
- if (!pump.isTempBasalInProgress) {
+ if (!DanaRPump.getInstance().isTempBasalInProgress) {
result.success = true;
result.isTempCancel = true;
result.comment = MainApp.gs(R.string.virtualpump_resultok);
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("cancelRealTempBasal: OK");
return result;
} else {
@@ -689,10 +693,10 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
result.enacted = true;
result.isTempCancel = true;
}
- if (!pump.isExtendedInProgress) {
+ if (!DanaRPump.getInstance().isExtendedInProgress) {
result.success = true;
result.comment = MainApp.gs(R.string.virtualpump_resultok);
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("cancelExtendedBolus: OK");
return result;
} else {
@@ -705,6 +709,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
@Override
public JSONObject getJSONStatus(Profile profile, String profileName) {
+ DanaRPump pump = DanaRPump.getInstance();
long now = System.currentTimeMillis();
if (pump.lastConnection + 5 * 60 * 1000L < System.currentTimeMillis()) {
return null;
@@ -719,8 +724,8 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
status.put("timestamp", DateUtil.toISOString(pump.lastConnection));
extended.put("Version", BuildConfig.VERSION_NAME + "-" + BuildConfig.BUILDVERSION);
extended.put("PumpIOB", pump.iob);
- if (pump.lastBolusTime.getTime() != 0) {
- extended.put("LastBolus", pump.lastBolusTime.toLocaleString());
+ if (pump.lastBolusTime != 0) {
+ extended.put("LastBolus", DateUtil.dateAndTimeFullString(pump.lastBolusTime));
extended.put("LastBolusAmount", pump.lastBolusAmount);
}
TemporaryBasal tb = TreatmentsPlugin.getPlugin().getTempBasalFromHistory(now);
@@ -737,7 +742,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
}
extended.put("BaseBasalRate", getBaseBasalRate());
try {
- extended.put("ActiveProfile", MainApp.getConfigBuilder().getProfileName());
+ extended.put("ActiveProfile", ProfileFunctions.getInstance().getProfileName());
} catch (Exception e) {
}
@@ -754,7 +759,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
@Override
public String deviceID() {
- return pump.serialNumber;
+ return DanaRPump.getInstance().serialNumber;
}
@Override
@@ -764,13 +769,14 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte
@Override
public String shortStatus(boolean veryShort) {
+ DanaRPump pump = DanaRPump.getInstance();
String ret = "";
if (pump.lastConnection != 0) {
Long agoMsec = System.currentTimeMillis() - pump.lastConnection;
int agoMin = (int) (agoMsec / 60d / 1000d);
ret += "LastConn: " + agoMin + " minago\n";
}
- if (pump.lastBolusTime.getTime() != 0) {
+ if (pump.lastBolusTime != 0) {
ret += "LastBolus: " + DecimalFormatter.to2Decimal(pump.lastBolusAmount) + "U @" + android.text.format.DateFormat.format("HH:mm", pump.lastBolusTime) + "\n";
}
TemporaryBasal activeTemp = TreatmentsPlugin.getPlugin().getRealTempBasalFromHistory(System.currentTimeMillis());
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/activities/BLEScanActivity.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/activities/BLEScanActivity.java
index 3b6bcaf099..7594e917c5 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/activities/BLEScanActivity.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/activities/BLEScanActivity.java
@@ -31,9 +31,6 @@ import info.nightscout.androidaps.plugins.PumpDanaRS.events.EventDanaRSDeviceCha
import info.nightscout.utils.SP;
public class BLEScanActivity extends AppCompatActivity {
- private static Logger log = LoggerFactory.getLogger(BLEScanActivity.class);
-
-
private ListView listView = null;
private ListAdapter mListAdapter = null;
private ArrayList mDevices = new ArrayList<>();
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/activities/PairingProgressDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/activities/PairingProgressDialog.java
index 9f72e1d08f..5f339cd528 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/activities/PairingProgressDialog.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/activities/PairingProgressDialog.java
@@ -9,7 +9,6 @@ import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.view.Window;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
@@ -63,46 +62,37 @@ public class PairingProgressDialog extends DialogFragment implements View.OnClic
button.setOnClickListener(this);
setCancelable(false);
- sHandler.post(new Runnable() {
- @Override
- public void run() {
- for (int i = 0; i < 20; i++) {
- if (pairingEnded) {
- Activity activity = getActivity();
- if (activity != null) {
- activity.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- progressBar.setProgress(100);
- statusView.setText(R.string.pairingok);
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- }
- dismiss();
- }
- });
- } else
- dismiss();
- return;
- }
- progressBar.setProgress(i * 5);
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- }
- }
- Activity activity = getActivity();
- if (activity != null) {
- activity.runOnUiThread(new Runnable() {
- @Override
- public void run() {
+ sHandler.post(() -> {
+ for (int i = 0; i < 20; i++) {
+ if (pairingEnded) {
+ Activity activity = getActivity();
+ if (activity != null) {
+ activity.runOnUiThread(() -> {
progressBar.setProgress(100);
- statusView.setText(R.string.pairingtimedout);
- button.setVisibility(View.VISIBLE);
- }
- });
+ statusView.setText(R.string.pairingok);
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException ignored) {
+ }
+ dismiss();
+ });
+ } else
+ dismiss();
+ return;
}
+ progressBar.setProgress(i * 5);
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException ignored) {
+ }
+ }
+ Activity activity = getActivity();
+ if (activity != null) {
+ activity.runOnUiThread(() -> {
+ progressBar.setProgress(100);
+ statusView.setText(R.string.pairingtimedout);
+ button.setVisibility(View.VISIBLE);
+ });
}
});
return view;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRSMessageHashTable.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRSMessageHashTable.java
index 5457bb4155..bda5d42207 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRSMessageHashTable.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRSMessageHashTable.java
@@ -1,25 +1,17 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import java.util.HashMap;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
/**
* Created by mike on 28.05.2016.
*/
public class DanaRSMessageHashTable {
- private static Logger log = LoggerFactory.getLogger(DanaRSMessageHashTable.class);
-
public static HashMap messages = null;
static {
if (messages == null) {
- boolean savedState = Config.logDanaMessageDetail;
- Config.logDanaMessageDetail = false;
-
messages = new HashMap<>();
put(new DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal());
put(new DanaRS_Packet_Basal_Get_Basal_Rate());
@@ -89,7 +81,6 @@ public class DanaRSMessageHashTable {
put(new DanaRS_Packet_APS_History_Events());
put(new DanaRS_Packet_APS_Set_Event_History());
- Config.logDanaMessageDetail = savedState;
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet.java
index 8ac5bfac13..d913f50b94 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet.java
@@ -100,8 +100,8 @@ public class DanaRS_Packet {
return ret;
}
- public static Date dateTimeSecFromBuff(byte[] buff, int offset) {
- Date date =
+ public static synchronized long dateTimeSecFromBuff(byte[] buff, int offset) {
+ return
new Date(
100 + intFromBuff(buff, offset, 1),
intFromBuff(buff, offset + 1, 1) - 1,
@@ -109,8 +109,7 @@ public class DanaRS_Packet {
intFromBuff(buff, offset + 3, 1),
intFromBuff(buff, offset + 4, 1),
intFromBuff(buff, offset + 5, 1)
- );
- return date;
+ ).getTime();
}
protected static int intFromBuff(byte[] b, int srcStart, int srcLength) {
@@ -143,14 +142,13 @@ public class DanaRS_Packet {
return new String(strbuff, StandardCharsets.UTF_8);
}
- public static Date dateFromBuff(byte[] buff, int offset) {
- Date date =
+ public static long dateFromBuff(byte[] buff, int offset) {
+ return
new Date(
100 + byteArrayToInt(getBytes(buff, offset, 1)),
byteArrayToInt(getBytes(buff, offset + 1, 1)) - 1,
byteArrayToInt(getBytes(buff, offset + 2, 1))
- );
- return date;
+ ).getTime();
}
@TargetApi(Build.VERSION_CODES.KITKAT)
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_Basal_Set_Temporary_Basal.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_Basal_Set_Temporary_Basal.java
index 5da3655ceb..c33cd7b405 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_Basal_Set_Temporary_Basal.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_Basal_Set_Temporary_Basal.java
@@ -5,10 +5,10 @@ import com.cozmo.danar.util.BleCommandUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
public class DanaRS_Packet_APS_Basal_Set_Temporary_Basal extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_APS_Basal_Set_Temporary_Basal.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
int temporaryBasalRatio;
int temporaryBasalDuration;
@@ -25,6 +25,8 @@ public class DanaRS_Packet_APS_Basal_Set_Temporary_Basal extends DanaRS_Packet {
public DanaRS_Packet_APS_Basal_Set_Temporary_Basal(int percent) {
this();
setParams(percent);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message: percent: " + percent);
}
protected void setParams(int percent) {
@@ -35,16 +37,16 @@ public class DanaRS_Packet_APS_Basal_Set_Temporary_Basal extends DanaRS_Packet {
temporaryBasalRatio = percent;
if (percent < 100) {
temporaryBasalDuration = PARAM30MIN;
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("APS Temp basal start percent: " + percent + " duration 30 min");
} else {
temporaryBasalDuration = PARAM15MIN;
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("APS Temp basal start percent: " + percent + " duration 15 min");
}
}
- public DanaRS_Packet_APS_Basal_Set_Temporary_Basal(int percent, boolean fifteenMinutes, boolean thirtyMinutes ) {
+ public DanaRS_Packet_APS_Basal_Set_Temporary_Basal(int percent, boolean fifteenMinutes, boolean thirtyMinutes) {
this();
setParams(percent, fifteenMinutes, thirtyMinutes);
}
@@ -57,11 +59,11 @@ public class DanaRS_Packet_APS_Basal_Set_Temporary_Basal extends DanaRS_Packet {
temporaryBasalRatio = percent;
if (thirtyMinutes && percent <= 200) { // 30 min is allowed up to 200%
temporaryBasalDuration = PARAM30MIN;
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("APS Temp basal start percent: " + percent + " duration 30 min");
} else {
temporaryBasalDuration = PARAM15MIN;
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("APS Temp basal start percent: " + percent + " duration 15 min");
}
}
@@ -80,10 +82,11 @@ public class DanaRS_Packet_APS_Basal_Set_Temporary_Basal extends DanaRS_Packet {
int result = byteArrayToInt(getBytes(data, DATA_START, 1));
if (result != 0) {
failed = true;
- log.error("Set APS temp basal start result: " + result + " FAILED!!!");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Set APS temp basal start result: " + result + " FAILED!!!");
} else {
failed = false;
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Set APS temp basal start result: " + result);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_History_Events.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_History_Events.java
index b8c8aaf2b4..dd3e5398c9 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_History_Events.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_History_Events.java
@@ -16,13 +16,14 @@ import info.nightscout.androidaps.db.ExtendedBolus;
import info.nightscout.androidaps.db.Source;
import info.nightscout.androidaps.db.TemporaryBasal;
import info.nightscout.androidaps.events.EventPumpStatusChanged;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.DetailedBolusInfoStorage;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.utils.DateUtil;
public class DanaRS_Packet_APS_History_Events extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_APS_History_Events.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
private int year = 0;
private int month = 0;
@@ -32,7 +33,6 @@ public class DanaRS_Packet_APS_History_Events extends DanaRS_Packet {
private int sec = 0;
public static boolean done;
- private static int totalCount;
public static long lastEventTimeLoaded = 0;
@@ -40,7 +40,6 @@ public class DanaRS_Packet_APS_History_Events extends DanaRS_Packet {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE__APS_HISTORY_EVENTS;
done = false;
- totalCount = 0;
}
public DanaRS_Packet_APS_History_Events(long from) {
@@ -56,7 +55,8 @@ public class DanaRS_Packet_APS_History_Events extends DanaRS_Packet {
hour = cal.get(Calendar.HOUR_OF_DAY);
min = cal.get(Calendar.MINUTE);
sec = cal.get(Calendar.SECOND);
- log.debug("Loading event history from: " + new Date(cal.getTimeInMillis()).toLocaleString());
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Loading event history from: " + new Date(cal.getTimeInMillis()).toLocaleString());
}
@Override
@@ -78,127 +78,144 @@ public class DanaRS_Packet_APS_History_Events extends DanaRS_Packet {
// Last record
if (recordCode == (byte) 0xFF) {
done = true;
- log.debug("Last record received");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Last record received");
return;
}
- Date datetime = dateTimeSecFromBuff(data, 1); // 6 bytes
+ long datetime = dateTimeSecFromBuff(data, 1); // 6 bytes
int param1 = ((intFromBuff(data, 7, 1) << 8) & 0xFF00) + (intFromBuff(data, 8, 1) & 0xFF);
int param2 = ((intFromBuff(data, 9, 1) << 8) & 0xFF00) + (intFromBuff(data, 10, 1) & 0xFF);
- TemporaryBasal temporaryBasal = new TemporaryBasal().date(datetime.getTime()).source(Source.PUMP).pumpId(datetime.getTime());
+ TemporaryBasal temporaryBasal = new TemporaryBasal().date(datetime).source(Source.PUMP).pumpId(datetime);
- ExtendedBolus extendedBolus = new ExtendedBolus();
- extendedBolus.date = datetime.getTime();
- extendedBolus.source = Source.PUMP;
- extendedBolus.pumpId = datetime.getTime();
-
- DetailedBolusInfo detailedBolusInfo = DetailedBolusInfoStorage.findDetailedBolusInfo(datetime.getTime());
- if (detailedBolusInfo == null) {
- log.debug("Detailed bolus info not found for " + datetime.toLocaleString());
- detailedBolusInfo = new DetailedBolusInfo();
- } else {
- log.debug("Detailed bolus info found: " + detailedBolusInfo);
- }
- detailedBolusInfo.date = datetime.getTime();
- detailedBolusInfo.source = Source.PUMP;
- detailedBolusInfo.pumpId = datetime.getTime();
+ ExtendedBolus extendedBolus = new ExtendedBolus().date(datetime).source(Source.PUMP).pumpId(datetime);
String status;
switch (recordCode) {
case DanaRPump.TEMPSTART:
- log.debug("EVENT TEMPSTART (" + recordCode + ") " + datetime.toLocaleString() + " Ratio: " + param1 + "% Duration: " + param2 + "min");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("EVENT TEMPSTART (" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")" + " Ratio: " + param1 + "% Duration: " + param2 + "min");
temporaryBasal.percentRate = param1;
temporaryBasal.durationInMinutes = param2;
TreatmentsPlugin.getPlugin().addToHistoryTempBasal(temporaryBasal);
status = "TEMPSTART " + DateUtil.timeString(datetime);
break;
case DanaRPump.TEMPSTOP:
- log.debug("EVENT TEMPSTOP (" + recordCode + ") " + datetime.toLocaleString());
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("EVENT TEMPSTOP (" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime));
TreatmentsPlugin.getPlugin().addToHistoryTempBasal(temporaryBasal);
status = "TEMPSTOP " + DateUtil.timeString(datetime);
break;
case DanaRPump.EXTENDEDSTART:
- log.debug("EVENT EXTENDEDSTART (" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + (param1 / 100d) + "U Duration: " + param2 + "min");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("EVENT EXTENDEDSTART (" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")" + " Amount: " + (param1 / 100d) + "U Duration: " + param2 + "min");
extendedBolus.insulin = param1 / 100d;
extendedBolus.durationInMinutes = param2;
TreatmentsPlugin.getPlugin().addToHistoryExtendedBolus(extendedBolus);
status = "EXTENDEDSTART " + DateUtil.timeString(datetime);
break;
case DanaRPump.EXTENDEDSTOP:
- log.debug("EVENT EXTENDEDSTOP (" + recordCode + ") " + datetime.toLocaleString() + " Delivered: " + (param1 / 100d) + "U RealDuration: " + param2 + "min");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("EVENT EXTENDEDSTOP (" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")" + " Delivered: " + (param1 / 100d) + "U RealDuration: " + param2 + "min");
TreatmentsPlugin.getPlugin().addToHistoryExtendedBolus(extendedBolus);
status = "EXTENDEDSTOP " + DateUtil.timeString(datetime);
break;
case DanaRPump.BOLUS:
+ DetailedBolusInfo detailedBolusInfo = DetailedBolusInfoStorage.findDetailedBolusInfo(datetime);
+ if (detailedBolusInfo == null) {
+ detailedBolusInfo = new DetailedBolusInfo();
+ }
+ detailedBolusInfo.date = datetime;
+ detailedBolusInfo.source = Source.PUMP;
+ detailedBolusInfo.pumpId = datetime;
+
detailedBolusInfo.insulin = param1 / 100d;
boolean newRecord = TreatmentsPlugin.getPlugin().addToHistoryTreatment(detailedBolusInfo, false);
- log.debug((newRecord ? "**NEW** " : "") + "EVENT BOLUS (" + recordCode + ") " + datetime.toLocaleString() + " Bolus: " + (param1 / 100d) + "U Duration: " + param2 + "min");
- DetailedBolusInfoStorage.remove(detailedBolusInfo.date);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug((newRecord ? "**NEW** " : "") + "EVENT BOLUS (" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")" + " Bolus: " + (param1 / 100d) + "U Duration: " + param2 + "min");
status = "BOLUS " + DateUtil.timeString(datetime);
break;
case DanaRPump.DUALBOLUS:
+ detailedBolusInfo = DetailedBolusInfoStorage.findDetailedBolusInfo(datetime);
+ if (detailedBolusInfo == null) {
+ detailedBolusInfo = new DetailedBolusInfo();
+ }
+ detailedBolusInfo.date = datetime;
+ detailedBolusInfo.source = Source.PUMP;
+ detailedBolusInfo.pumpId = datetime;
+
detailedBolusInfo.insulin = param1 / 100d;
newRecord = TreatmentsPlugin.getPlugin().addToHistoryTreatment(detailedBolusInfo, false);
- log.debug((newRecord ? "**NEW** " : "") + "EVENT DUALBOLUS (" + recordCode + ") " + datetime.toLocaleString() + " Bolus: " + (param1 / 100d) + "U Duration: " + param2 + "min");
- DetailedBolusInfoStorage.remove(detailedBolusInfo.date);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug((newRecord ? "**NEW** " : "") + "EVENT DUALBOLUS (" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")" + " Bolus: " + (param1 / 100d) + "U Duration: " + param2 + "min");
status = "DUALBOLUS " + DateUtil.timeString(datetime);
break;
case DanaRPump.DUALEXTENDEDSTART:
- log.debug("EVENT DUALEXTENDEDSTART (" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + (param1 / 100d) + "U Duration: " + param2 + "min");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("EVENT DUALEXTENDEDSTART (" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")" + " Amount: " + (param1 / 100d) + "U Duration: " + param2 + "min");
extendedBolus.insulin = param1 / 100d;
extendedBolus.durationInMinutes = param2;
TreatmentsPlugin.getPlugin().addToHistoryExtendedBolus(extendedBolus);
status = "DUALEXTENDEDSTART " + DateUtil.timeString(datetime);
break;
case DanaRPump.DUALEXTENDEDSTOP:
- log.debug("EVENT DUALEXTENDEDSTOP (" + recordCode + ") " + datetime.toLocaleString() + " Delivered: " + (param1 / 100d) + "U RealDuration: " + param2 + "min");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("EVENT DUALEXTENDEDSTOP (" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")" + " Delivered: " + (param1 / 100d) + "U RealDuration: " + param2 + "min");
TreatmentsPlugin.getPlugin().addToHistoryExtendedBolus(extendedBolus);
status = "DUALEXTENDEDSTOP " + DateUtil.timeString(datetime);
break;
case DanaRPump.SUSPENDON:
- log.debug("EVENT SUSPENDON (" + recordCode + ") " + datetime.toLocaleString());
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("EVENT SUSPENDON (" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")");
status = "SUSPENDON " + DateUtil.timeString(datetime);
break;
case DanaRPump.SUSPENDOFF:
- log.debug("EVENT SUSPENDOFF (" + recordCode + ") " + datetime.toLocaleString());
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("EVENT SUSPENDOFF (" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")");
status = "SUSPENDOFF " + DateUtil.timeString(datetime);
break;
case DanaRPump.REFILL:
- log.debug("EVENT REFILL (" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + param1 / 100d + "U");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("EVENT REFILL (" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")" + " Amount: " + param1 / 100d + "U");
status = "REFILL " + DateUtil.timeString(datetime);
break;
case DanaRPump.PRIME:
- log.debug("EVENT PRIME (" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + param1 / 100d + "U");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("EVENT PRIME (" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")" + " Amount: " + param1 / 100d + "U");
status = "PRIME " + DateUtil.timeString(datetime);
break;
case DanaRPump.PROFILECHANGE:
- log.debug("EVENT PROFILECHANGE (" + recordCode + ") " + datetime.toLocaleString() + " No: " + param1 + " CurrentRate: " + (param2 / 100d) + "U/h");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("EVENT PROFILECHANGE (" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")" + " No: " + param1 + " CurrentRate: " + (param2 / 100d) + "U/h");
status = "PROFILECHANGE " + DateUtil.timeString(datetime);
break;
case DanaRPump.CARBS:
DetailedBolusInfo emptyCarbsInfo = new DetailedBolusInfo();
emptyCarbsInfo.carbs = param1;
- emptyCarbsInfo.date = datetime.getTime();
+ emptyCarbsInfo.date = datetime;
emptyCarbsInfo.source = Source.PUMP;
- emptyCarbsInfo.pumpId = datetime.getTime();
+ emptyCarbsInfo.pumpId = datetime;
newRecord = TreatmentsPlugin.getPlugin().addToHistoryTreatment(emptyCarbsInfo, false);
- log.debug((newRecord ? "**NEW** " : "") + "EVENT CARBS (" + recordCode + ") " + datetime.toLocaleString() + " Carbs: " + param1 + "g");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug((newRecord ? "**NEW** " : "") + "EVENT CARBS (" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")" + " Carbs: " + param1 + "g");
status = "CARBS " + DateUtil.timeString(datetime);
break;
case DanaRPump.PRIMECANNULA:
- log.debug("EVENT PRIMECANNULA(" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + param1 / 100d + "U");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("EVENT PRIMECANNULA(" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")" + " Amount: " + param1 / 100d + "U");
status = "PRIMECANNULA " + DateUtil.timeString(datetime);
break;
default:
- log.debug("Event: " + recordCode + " " + datetime.toLocaleString() + " Param1: " + param1 + " Param2: " + param2);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Event: " + recordCode + " " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")" + " Param1: " + param1 + " Param2: " + param2);
status = "UNKNOWN " + DateUtil.timeString(datetime);
break;
}
- if (datetime.getTime() > lastEventTimeLoaded)
- lastEventTimeLoaded = datetime.getTime();
+ if (datetime > lastEventTimeLoaded)
+ lastEventTimeLoaded = datetime;
MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.processinghistory) + ": " + status));
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_Set_Event_History.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_Set_Event_History.java
index 84ead83665..f31bdf66e2 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_Set_Event_History.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_Set_Event_History.java
@@ -8,16 +8,17 @@ import org.slf4j.LoggerFactory;
import java.util.Calendar;
import java.util.GregorianCalendar;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
import info.nightscout.utils.DateUtil;
public class DanaRS_Packet_APS_Set_Event_History extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_APS_Set_Event_History.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
private int type;
private long time;
- public int param1;
- public int param2;
+ private int param1;
+ private int param2;
public DanaRS_Packet_APS_Set_Event_History() {
super();
@@ -31,7 +32,9 @@ public class DanaRS_Packet_APS_Set_Event_History extends DanaRS_Packet {
this.time = time;
this.param1 = param1;
this.param2 = param2;
- if (Config.logDanaMessageDetail)
+ if ((type == DanaRPump.CARBS || type == DanaRPump.BOLUS) && param1 <= 0)
+ this.param1 = 0;
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Set history entry: " + DateUtil.dateAndTimeString(time) + " type: " + type + " param1: " + param1 + " param2: " + param2);
}
@@ -66,9 +69,10 @@ public class DanaRS_Packet_APS_Set_Event_History extends DanaRS_Packet {
int result = intFromBuff(data, 0, 1);
if (result != 0) {
failed = true;
- log.error("Set history entry result: " + result + " FAILED!!!");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.error("Set history entry result: " + result + " FAILED!!!");
} else {
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Set history entry result: " + result);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Get_Basal_Rate.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Get_Basal_Rate.java
index f3fef0d49d..3cb5523dfc 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Get_Basal_Rate.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Get_Basal_Rate.java
@@ -1,30 +1,30 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
+import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
-import com.cozmo.danar.util.BleCommandUtil;
-
public class DanaRS_Packet_Basal_Get_Basal_Rate extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
- public DanaRS_Packet_Basal_Get_Basal_Rate() {
- super();
- opCode = BleCommandUtil.DANAR_PACKET__OPCODE_BASAL__GET_BASAL_RATE;
- if (Config.logDanaMessageDetail) {
- log.debug("Requesting basal rates");
- }
- }
+ public DanaRS_Packet_Basal_Get_Basal_Rate() {
+ super();
+ opCode = BleCommandUtil.DANAR_PACKET__OPCODE_BASAL__GET_BASAL_RATE;
+ if (L.isEnabled(L.PUMPCOMM)) {
+ log.debug("Requesting basal rates");
+ }
+ }
@Override
public void handleMessage(byte[] data) {
@@ -45,7 +45,7 @@ public class DanaRS_Packet_Basal_Get_Basal_Rate extends DanaRS_Packet {
dataSize = 2;
pump.pumpProfiles[pump.activeProfile][i] = byteArrayToInt(getBytes(data, dataIndex, dataSize)) / 100d;
}
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Max basal: " + pump.maxBasal + " U");
log.debug("Basal step: " + pump.basalStep + " U");
for (int index = 0; index < 24; index++)
@@ -53,6 +53,7 @@ public class DanaRS_Packet_Basal_Get_Basal_Rate extends DanaRS_Packet {
}
if (pump.basalStep != 0.01d) {
+ failed = true;
Notification notification = new Notification(Notification.WRONGBASALSTEP, MainApp.gs(R.string.danar_setbasalstep001), Notification.URGENT);
MainApp.bus().post(new EventNewNotification(notification));
} else {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Get_Profile_Basal_Rate.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Get_Profile_Basal_Rate.java
index 8eadb8298d..60b9f6da51 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Get_Profile_Basal_Rate.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Get_Profile_Basal_Rate.java
@@ -1,17 +1,20 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
public class DanaRS_Packet_Basal_Get_Profile_Basal_Rate extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Basal_Get_Profile_Basal_Rate.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
private int profileNumber;
+ DanaRPump pump = DanaRPump.getInstance();
+
public DanaRS_Packet_Basal_Get_Profile_Basal_Rate() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_BASAL__GET_PROFILE_BASAL_RATE;
@@ -21,7 +24,7 @@ public class DanaRS_Packet_Basal_Get_Profile_Basal_Rate extends DanaRS_Packet {
public DanaRS_Packet_Basal_Get_Profile_Basal_Rate(int profileNumber) {
this();
this.profileNumber = profileNumber;
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Requesting basal rates for profile " + profileNumber);
}
}
@@ -35,7 +38,6 @@ public class DanaRS_Packet_Basal_Get_Profile_Basal_Rate extends DanaRS_Packet {
@Override
public void handleMessage(byte[] data) {
- DanaRPump pump = DanaRPump.getInstance();
int dataIndex = DATA_START;
int dataSize = 2;
@@ -47,7 +49,7 @@ public class DanaRS_Packet_Basal_Get_Profile_Basal_Rate extends DanaRS_Packet {
dataIndex += dataSize;
dataSize = 2;
}
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
for (int index = 0; index < 24; index++)
log.debug("Basal " + String.format("%02d", index) + "h: " + pump.pumpProfiles[profileNumber][index]);
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Get_Profile_Number.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Get_Profile_Number.java
index 39e230a29e..1beadfd705 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Get_Profile_Number.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Get_Profile_Number.java
@@ -1,19 +1,20 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
public class DanaRS_Packet_Basal_Get_Profile_Number extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Basal_Get_Profile_Number.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_Basal_Get_Profile_Number() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_BASAL__GET_PROFILE_NUMBER;
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Requesting active profile");
}
}
@@ -25,7 +26,7 @@ public class DanaRS_Packet_Basal_Get_Profile_Number extends DanaRS_Packet {
int dataIndex = DATA_START;
int dataSize = 1;
pump.activeProfile = byteArrayToInt(getBytes(data, dataIndex, dataSize));
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Active profile: " + pump.activeProfile);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Get_Temporary_Basal_State.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Get_Temporary_Basal_State.java
index dbf917874d..748d88f242 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Get_Temporary_Basal_State.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Get_Temporary_Basal_State.java
@@ -2,22 +2,22 @@ package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
import android.support.annotation.NonNull;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.Date;
-
-import info.nightscout.androidaps.Config;
-import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
+import info.nightscout.utils.DateUtil;
public class DanaRS_Packet_Basal_Get_Temporary_Basal_State extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Basal_Get_Temporary_Basal_State.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_Basal_Get_Temporary_Basal_State() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_BASAL__TEMPORARY_BASAL_STATE;
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Requesting temporary basal status");
}
}
@@ -30,6 +30,9 @@ public class DanaRS_Packet_Basal_Get_Temporary_Basal_State extends DanaRS_Packet
int dataSize = 1;
int error = byteArrayToInt(getBytes(data, dataIndex, dataSize));
+ if (error == 1)
+ failed = true;
+
dataIndex += dataSize;
dataSize = 1;
pump.isTempBasalInProgress = byteArrayToInt(getBytes(data, dataIndex, dataSize)) == 0x01;
@@ -51,16 +54,16 @@ public class DanaRS_Packet_Basal_Get_Temporary_Basal_State extends DanaRS_Packet
dataSize = 2;
int runningMin = byteArrayToInt(getBytes(data, dataIndex, dataSize));
int tempBasalRemainingMin = (pump.tempBasalTotalSec - runningMin * 60) / 60;
- Date tempBasalStart = pump.isTempBasalInProgress ? getDateFromTempBasalSecAgo(runningMin * 60) : new Date(0);
+ long tempBasalStart = pump.isTempBasalInProgress ? getDateFromTempBasalSecAgo(runningMin * 60) : 0;
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Error code: " + error);
log.debug("Is temp basal running: " + pump.isTempBasalInProgress);
log.debug("Is APS temp basal running: " + isAPSTempBasalInProgress);
log.debug("Current temp basal percent: " + pump.tempBasalPercent);
log.debug("Current temp basal remaining min: " + tempBasalRemainingMin);
log.debug("Current temp basal total sec: " + pump.tempBasalTotalSec);
- log.debug("Current temp basal start: " + tempBasalStart);
+ log.debug("Current temp basal start: " + DateUtil.dateAndTimeFullString(tempBasalStart));
}
}
@@ -70,8 +73,8 @@ public class DanaRS_Packet_Basal_Get_Temporary_Basal_State extends DanaRS_Packet
}
@NonNull
- private Date getDateFromTempBasalSecAgo(int tempBasalAgoSecs) {
- return new Date((long) (Math.ceil(System.currentTimeMillis() / 1000d) - tempBasalAgoSecs) * 1000);
+ private long getDateFromTempBasalSecAgo(int tempBasalAgoSecs) {
+ return (long) (Math.ceil(System.currentTimeMillis() / 1000d) - tempBasalAgoSecs) * 1000;
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Basal_Rate.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Basal_Rate.java
index a64da24bf3..188c1df093 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Basal_Rate.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Basal_Rate.java
@@ -3,12 +3,12 @@ package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
import com.cozmo.danar.util.BleCommandUtil;
public class DanaRS_Packet_Basal_Set_Basal_Rate extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Basal_Set_Basal_Rate.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
private double[] profileBasalRate;
@@ -20,7 +20,7 @@ public class DanaRS_Packet_Basal_Set_Basal_Rate extends DanaRS_Packet {
public DanaRS_Packet_Basal_Set_Basal_Rate(double[] profileBasalRate) {
this();
this.profileBasalRate = profileBasalRate;
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Setting new basal rates");
}
}
@@ -39,7 +39,9 @@ public class DanaRS_Packet_Basal_Set_Basal_Rate extends DanaRS_Packet {
@Override
public void handleMessage(byte[] data) {
int result = intFromBuff(data, 0, 1);
- if (Config.logDanaMessageDetail) {
+ if(result != 0)
+ failed = true;
+ if (L.isEnabled(L.PUMPCOMM)) {
if (result == 0)
log.debug("Result OK");
else
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal.java
index 538750a45b..f0f2691315 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal.java
@@ -1,19 +1,19 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-
-import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.androidaps.logging.L;
public class DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_BASAL__CANCEL_TEMPORARY_BASAL;
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Canceling temp basal");
}
}
@@ -21,11 +21,13 @@ public class DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal extends DanaRS_Packe
@Override
public void handleMessage(byte[] data) {
int result = intFromBuff(data, 0, 1);
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
if (result == 0)
log.debug("Result OK");
- else
+ else {
log.error("Result Error: " + result);
+ failed = true;
+ }
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Profile_Basal_Rate.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Profile_Basal_Rate.java
index 66d0e7b4bb..a42176cc59 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Profile_Basal_Rate.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Profile_Basal_Rate.java
@@ -1,13 +1,14 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.androidaps.logging.L;
public class DanaRS_Packet_Basal_Set_Profile_Basal_Rate extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Basal_Set_Profile_Basal_Rate.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
private int profileNumber; // 0 - 4
private double[] profileBasalRate;
@@ -21,7 +22,7 @@ public class DanaRS_Packet_Basal_Set_Profile_Basal_Rate extends DanaRS_Packet {
this();
this.profileNumber = profileNumber;
this.profileBasalRate = profileBasalRate;
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Setting new basal rates for profile " + profileNumber);
}
}
@@ -41,7 +42,9 @@ public class DanaRS_Packet_Basal_Set_Profile_Basal_Rate extends DanaRS_Packet {
@Override
public void handleMessage(byte[] data) {
int result = intFromBuff(data, 0, 1);
- if (Config.logDanaMessageDetail) {
+ if (result != 0)
+ failed = true;
+ if (L.isEnabled(L.PUMPCOMM)) {
if (result == 0)
log.debug("Result OK");
else
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Profile_Number.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Profile_Number.java
index 69f7eae8dd..4f39fcfd2f 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Profile_Number.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Profile_Number.java
@@ -1,48 +1,51 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-
-import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.androidaps.logging.L;
public class DanaRS_Packet_Basal_Set_Profile_Number extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Basal_Set_Profile_Number.class);
- private int profileNumber;
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
+ private int profileNumber;
- public DanaRS_Packet_Basal_Set_Profile_Number() {
+ public DanaRS_Packet_Basal_Set_Profile_Number() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_BASAL__SET_PROFILE_NUMBER;
}
- public DanaRS_Packet_Basal_Set_Profile_Number(int profileNumber) {
- this();
- this.profileNumber = profileNumber;
- if (Config.logDanaMessageDetail) {
- log.debug("Setting profile number " + profileNumber);
- }
- }
- @Override
- public byte[] getRequestParams() {
- byte[] request = new byte[1];
- request[0] = (byte) (profileNumber & 0xff);
- return request;
- }
+ public DanaRS_Packet_Basal_Set_Profile_Number(int profileNumber) {
+ this();
+ this.profileNumber = profileNumber;
+ if (L.isEnabled(L.PUMPCOMM)) {
+ log.debug("Setting profile number " + profileNumber);
+ }
+ }
@Override
- public void handleMessage(byte[] data) {
- int result = intFromBuff(data, 0, 1);
- if (Config.logDanaMessageDetail) {
- if (result == 0)
- log.debug("Result OK");
- else
- log.error("Result Error: " + result);
- }
- }
+ public byte[] getRequestParams() {
+ byte[] request = new byte[1];
+ request[0] = (byte) (profileNumber & 0xff);
+ return request;
+ }
- @Override
- public String getFriendlyName() {
- return "BASAL__SET_PROFILE_NUMBER";
- }
+ @Override
+ public void handleMessage(byte[] data) {
+ int result = intFromBuff(data, 0, 1);
+ if (result != 0)
+ failed = true;
+ if (L.isEnabled(L.PUMPCOMM)) {
+ if (result == 0)
+ log.debug("Result OK");
+ else
+ log.error("Result Error: " + result);
+ }
+ }
+
+ @Override
+ public String getFriendlyName() {
+ return "BASAL__SET_PROFILE_NUMBER";
+ }
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Suspend_Off.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Suspend_Off.java
index 4c78038162..65ef6ae1b1 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Suspend_Off.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Suspend_Off.java
@@ -1,18 +1,19 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.androidaps.logging.L;
public class DanaRS_Packet_Basal_Set_Suspend_Off extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Basal_Set_Suspend_Off.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_Basal_Set_Suspend_Off() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_BASAL__SET_SUSPEND_OFF;
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Turning off suspend");
}
}
@@ -20,11 +21,13 @@ public class DanaRS_Packet_Basal_Set_Suspend_Off extends DanaRS_Packet {
@Override
public void handleMessage(byte[] data) {
int result = intFromBuff(data, 0, 1);
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
if (result == 0)
log.debug("Result OK");
- else
+ else {
log.error("Result Error: " + result);
+ failed = true;
+ }
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Suspend_On.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Suspend_On.java
index 75a2a5fada..bde3b622db 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Suspend_On.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Suspend_On.java
@@ -1,18 +1,19 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.androidaps.logging.L;
public class DanaRS_Packet_Basal_Set_Suspend_On extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Basal_Set_Suspend_On.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_Basal_Set_Suspend_On() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_BASAL__SET_SUSPEND_ON;
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Turning on suspend");
}
}
@@ -20,11 +21,13 @@ public class DanaRS_Packet_Basal_Set_Suspend_On extends DanaRS_Packet {
@Override
public void handleMessage(byte[] data) {
int result = intFromBuff(data, 0, 1);
- if (Config.logDanaMessageDetail) {
+ if(result != 0)
+ failed = true;
+ if (L.isEnabled(L.PUMPCOMM)) {
if (result == 0)
log.debug("Result OK");
else
- log.error("Result Error: " + result);
+ failed = true;
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Temporary_Basal.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Temporary_Basal.java
index d2f68ff864..1f6106ab83 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Temporary_Basal.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Temporary_Basal.java
@@ -1,13 +1,14 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.androidaps.logging.L;
public class DanaRS_Packet_Basal_Set_Temporary_Basal extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Basal_Set_Temporary_Basal.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
private int temporaryBasalRatio;
private int temporaryBasalDuration;
@@ -21,7 +22,7 @@ public class DanaRS_Packet_Basal_Set_Temporary_Basal extends DanaRS_Packet {
this();
this.temporaryBasalRatio = temporaryBasalRatio;
this.temporaryBasalDuration = temporaryBasalDuration;
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Setting temporary basal of " + temporaryBasalRatio + "% for " + temporaryBasalDuration + " hours");
}
}
@@ -37,7 +38,9 @@ public class DanaRS_Packet_Basal_Set_Temporary_Basal extends DanaRS_Packet {
@Override
public void handleMessage(byte[] data) {
int result = intFromBuff(data, 0, 1);
- if (Config.logDanaMessageDetail) {
+ if (result != 0)
+ failed = true;
+ if (L.isEnabled(L.PUMPCOMM)) {
if (result == 0)
log.debug("Result OK");
else
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Bolus_Option.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Bolus_Option.java
index 69c2f75ba6..0e5a3d79c4 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Bolus_Option.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Bolus_Option.java
@@ -1,24 +1,26 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-import com.cozmo.danar.util.BleCommandUtil;
-
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
+import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
public class DanaRS_Packet_Bolus_Get_Bolus_Option extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Bolus_Get_Bolus_Option.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_Bolus_Get_Bolus_Option() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_BOLUS__GET_BOLUS_OPTION;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -104,11 +106,12 @@ public class DanaRS_Packet_Bolus_Get_Bolus_Option extends DanaRS_Packet {
if (!pump.isExtendedBolusEnabled) {
Notification notification = new Notification(Notification.EXTENDED_BOLUS_DISABLED, MainApp.gs(R.string.danar_enableextendedbolus), Notification.URGENT);
MainApp.bus().post(new EventNewNotification(notification));
+ failed = true;
} else {
MainApp.bus().post(new EventDismissNotification(Notification.EXTENDED_BOLUS_DISABLED));
}
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Extended bolus enabled: " + pump.isExtendedBolusEnabled);
log.debug("Missed bolus config: " + pump.missedBolusConfig);
log.debug("missedBolus01StartHour: " + missedBolus01StartHour);
@@ -134,4 +137,6 @@ public class DanaRS_Packet_Bolus_Get_Bolus_Option extends DanaRS_Packet {
public String getFriendlyName() {
return "BOLUS__GET_BOLUS_OPTION";
}
+
+
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_CIR_CF_Array.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_CIR_CF_Array.java
index b8a86cc078..9b5636eaaf 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_CIR_CF_Array.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_CIR_CF_Array.java
@@ -1,21 +1,22 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-
-import com.cozmo.danar.util.BleCommandUtil;
-
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
public class DanaRS_Packet_Bolus_Get_CIR_CF_Array extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Bolus_Get_CIR_CF_Array.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_Bolus_Get_CIR_CF_Array() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_BOLUS__GET_CIR_CF_ARRAY;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -117,8 +118,9 @@ public class DanaRS_Packet_Bolus_Get_CIR_CF_Array extends DanaRS_Packet {
dataSize = 2;
pump.nightCF = byteArrayToInt(getBytes(data, dataIndex, dataSize)) / 100d;
}
-
- if (Config.logDanaMessageDetail) {
+ if (pump.units < 0 || pump.units > 1)
+ failed = true;
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Language: " + language);
log.debug("Pump units: " + (pump.units == DanaRPump.UNITS_MGDL ? "MGDL" : "MMOL"));
log.debug("Current pump morning CIR: " + pump.morningCIR);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Calculation_Information.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Calculation_Information.java
index f5acedf3ba..194edd5d55 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Calculation_Information.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Calculation_Information.java
@@ -1,20 +1,21 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-
-import com.cozmo.danar.util.BleCommandUtil;
-
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
public class DanaRS_Packet_Bolus_Get_Calculation_Information extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Bolus_Get_Calculation_Information.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_Bolus_Get_Calculation_Information() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_BOLUS__GET_CALCULATION_INFORMATION;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -58,7 +59,9 @@ public class DanaRS_Packet_Bolus_Get_Calculation_Information extends DanaRS_Pack
pump.currentTarget = pump.currentTarget / 100d;
currentBG = currentBG / 100d;
}
- if (Config.logDanaMessageDetail) {
+ if (error != 0)
+ failed = true;
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Result: " + error);
log.debug("Pump units: " + (pump.units == DanaRPump.UNITS_MGDL ? "MGDL" : "MMOL"));
log.debug("Current BG: " + currentBG);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Carbohydrate_Calculation_Information.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Carbohydrate_Calculation_Information.java
index c581320c54..476ae7167f 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Carbohydrate_Calculation_Information.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Carbohydrate_Calculation_Information.java
@@ -1,20 +1,21 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-
-import com.cozmo.danar.util.BleCommandUtil;
-
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
public class DanaRS_Packet_Bolus_Get_Carbohydrate_Calculation_Information extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Bolus_Get_Carbohydrate_Calculation_Information.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_Bolus_Get_Carbohydrate_Calculation_Information() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_BOLUS__GET_CARBOHYDRATE_CALCULATION_INFORMATION;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -32,8 +33,9 @@ public class DanaRS_Packet_Bolus_Get_Carbohydrate_Calculation_Information extend
dataIndex += dataSize;
dataSize = 2;
pump.currentCIR = byteArrayToInt(getBytes(data, dataIndex, dataSize));
-
- if (Config.logDanaMessageDetail) {
+ if (error != 0)
+ failed = true;
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Result: " + error);
log.debug("Carbs: " + carbs);
log.debug("Current CIR: " + pump.currentCIR);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Dual_Bolus.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Dual_Bolus.java
index bd7a0b9ee6..7d561bd679 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Dual_Bolus.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Dual_Bolus.java
@@ -1,18 +1,21 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
public class DanaRS_Packet_Bolus_Get_Dual_Bolus extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Bolus_Get_Dual_Bolus.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_Bolus_Get_Dual_Bolus() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_BOLUS__GET_DUAL_BOLUS;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -38,8 +41,9 @@ public class DanaRS_Packet_Bolus_Get_Dual_Bolus extends DanaRS_Packet {
dataIndex += dataSize;
dataSize = 1;
double bolusIncrement = byteArrayToInt(getBytes(data, dataIndex, dataSize)) / 100d;
-
- if (Config.logDanaMessageDetail) {
+ if (error != 0)
+ failed = true;
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Result: " + error);
log.debug("Bolus step: " + pump.bolusStep + " U");
log.debug("Extended bolus running: " + pump.extendedBolusAbsoluteRate + " U/h");
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Extended_Bolus.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Extended_Bolus.java
index 682d9b14bb..785d8d3fbe 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Extended_Bolus.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Extended_Bolus.java
@@ -1,20 +1,21 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-
-import com.cozmo.danar.util.BleCommandUtil;
-
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
public class DanaRS_Packet_Bolus_Get_Extended_Bolus extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Bolus_Get_Extended_Bolus.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_Bolus_Get_Extended_Bolus() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_BOLUS__GET_EXTENDED_BOLUS;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -36,8 +37,9 @@ public class DanaRS_Packet_Bolus_Get_Extended_Bolus extends DanaRS_Packet {
dataIndex += dataSize;
dataSize = 1;
pump.bolusStep = byteArrayToInt(getBytes(data, dataIndex, dataSize)) / 100d;
-
- if (Config.logDanaMessageDetail) {
+ if (error != 0)
+ failed = true;
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Result: " + error);
log.debug("Extended bolus running: " + pump.extendedBolusAbsoluteRate + " U/h");
log.debug("Max bolus: " + pump.maxBolus + " U");
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Extended_Bolus_State.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Extended_Bolus_State.java
index b22a9dfb47..a07652218f 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Extended_Bolus_State.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Extended_Bolus_State.java
@@ -1,20 +1,21 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-
-import com.cozmo.danar.util.BleCommandUtil;
-
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
public class DanaRS_Packet_Bolus_Get_Extended_Bolus_State extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Bolus_Get_Extended_Bolus_State.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_Bolus_Get_Extended_Bolus_State() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_BOLUS__GET_EXTENDED_BOLUS_STATE;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -44,8 +45,9 @@ public class DanaRS_Packet_Bolus_Get_Extended_Bolus_State extends DanaRS_Packet
dataIndex += dataSize;
dataSize = 2;
pump.extendedBolusDeliveredSoFar = byteArrayToInt(getBytes(data, dataIndex, dataSize)) / 100d;
-
- if (Config.logDanaMessageDetail) {
+ if (error != 0)
+ failed = true;
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Result: " + error);
log.debug("Is extended bolus running: " + pump.isExtendedInProgress);
log.debug("Extended bolus running: " + pump.extendedBolusAbsoluteRate + " U/h");
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Extended_Menu_Option_State.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Extended_Menu_Option_State.java
index 5a7ca55e30..fda8778d08 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Extended_Menu_Option_State.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Extended_Menu_Option_State.java
@@ -1,20 +1,21 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-
-import com.cozmo.danar.util.BleCommandUtil;
-
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
public class DanaRS_Packet_Bolus_Get_Extended_Menu_Option_State extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Bolus_Get_Extended_Menu_Option_State.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_Bolus_Get_Extended_Menu_Option_State() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_BOLUS__GET_EXTENDED_MENU_OPTION_STATE;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -29,7 +30,7 @@ public class DanaRS_Packet_Bolus_Get_Extended_Menu_Option_State extends DanaRS_P
dataSize = 1;
pump.isExtendedInProgress = byteArrayToInt(getBytes(data, dataIndex, dataSize)) == 0x01;
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("extendedMenuOption: " + extendedMenuOption);
log.debug("Is extended bolus running: " + pump.isExtendedInProgress);
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Initial_Bolus.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Initial_Bolus.java
index 58fa4674ad..15ad57d83a 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Initial_Bolus.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Initial_Bolus.java
@@ -1,37 +1,49 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.androidaps.logging.L;
public class DanaRS_Packet_Bolus_Get_Initial_Bolus extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Bolus_Get_Initial_Bolus.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
+ private double initialBolusValue01;
+ private double initialBolusValue02;
+ private double initialBolusValue03;
+ double initialBolusValue04;
public DanaRS_Packet_Bolus_Get_Initial_Bolus() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_BOLUS__GET_BOLUS_RATE;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
public void handleMessage(byte[] data) {
int dataIndex = DATA_START;
int dataSize = 2;
- double initialBolusValue01 = byteArrayToInt(getBytes(data, dataIndex, dataSize)) / 100d;
+ initialBolusValue01 = byteArrayToInt(getBytes(data, dataIndex, dataSize)) / 100d;
dataIndex += dataSize;
dataSize = 2;
- double initialBolusValue02 = byteArrayToInt(getBytes(data, dataIndex, dataSize)) / 100d;
+ initialBolusValue02 = byteArrayToInt(getBytes(data, dataIndex, dataSize)) / 100d;
dataIndex += dataSize;
dataSize = 2;
- double initialBolusValue03 = byteArrayToInt(getBytes(data, dataIndex, dataSize)) / 100d;
+ initialBolusValue03 = byteArrayToInt(getBytes(data, dataIndex, dataSize)) / 100d;
dataIndex += dataSize;
dataSize = 2;
- double initialBolusValue04 = byteArrayToInt(getBytes(data, dataIndex, dataSize)) / 100d;
- if (Config.logDanaMessageDetail) {
+ initialBolusValue04 = byteArrayToInt(getBytes(data, dataIndex, dataSize)) / 100d;
+ if (initialBolusValue01 == 0d && initialBolusValue02 == 0d && initialBolusValue03 == 0d && initialBolusValue04 == 0d)
+ failed = true;
+ else
+ failed = false;
+
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Initial bolus amount 01: " + initialBolusValue01);
log.debug("Initial bolus amount 02: " + initialBolusValue02);
log.debug("Initial bolus amount 03: " + initialBolusValue03);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Step_Bolus_Information.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Step_Bolus_Information.java
index 6166f7b0fb..a9968eb7eb 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Step_Bolus_Information.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Step_Bolus_Information.java
@@ -1,20 +1,24 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Date;
-import info.nightscout.androidaps.Config;
-import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
+import info.nightscout.utils.DateUtil;
public class DanaRS_Packet_Bolus_Get_Step_Bolus_Information extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Bolus_Get_Step_Bolus_Information.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_Bolus_Get_Step_Bolus_Information() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_BOLUS__GET_STEP_BOLUS_INFORMATION;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -33,14 +37,16 @@ public class DanaRS_Packet_Bolus_Get_Step_Bolus_Information extends DanaRS_Packe
dataSize = 2;
pump.initialBolusAmount = byteArrayToInt(getBytes(data, dataIndex, dataSize)) / 100d;
- pump.lastBolusTime = new Date(); // it doesn't provide day only hour+min, workaround: expecting today
+ Date lbt = new Date(); // it doesn't provide day only hour+min, workaround: expecting today
dataIndex += dataSize;
dataSize = 1;
- pump.lastBolusTime.setHours(byteArrayToInt(getBytes(data, dataIndex, dataSize)));
+ lbt.setHours(byteArrayToInt(getBytes(data, dataIndex, dataSize)));
dataIndex += dataSize;
dataSize = 1;
- pump.lastBolusTime.setMinutes(byteArrayToInt(getBytes(data, dataIndex, dataSize)));
+ lbt.setMinutes(byteArrayToInt(getBytes(data, dataIndex, dataSize)));
+
+ pump.lastBolusTime = lbt.getTime();
dataIndex += dataSize;
dataSize = 2;
@@ -53,12 +59,13 @@ public class DanaRS_Packet_Bolus_Get_Step_Bolus_Information extends DanaRS_Packe
dataIndex += dataSize;
dataSize = 1;
pump.bolusStep = byteArrayToInt(getBytes(data, dataIndex, dataSize)) / 100d;
-
- if (Config.logDanaMessageDetail) {
+ if (error != 0)
+ failed = true;
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Result: " + error);
log.debug("BolusType: " + bolusType);
log.debug("Initial bolus amount: " + pump.initialBolusAmount + " U");
- log.debug("Last bolus time: " + pump.lastBolusTime.toLocaleString());
+ log.debug("Last bolus time: " + DateUtil.dateAndTimeFullString(pump.lastBolusTime));
log.debug("Last bolus amount: " + pump.lastBolusAmount);
log.debug("Max bolus: " + pump.maxBolus + " U");
log.debug("Bolus step: " + pump.bolusStep + " U");
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Bolus_Option.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Bolus_Option.java
index 103bac3ecf..cc4a26f24f 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Bolus_Option.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Bolus_Option.java
@@ -1,13 +1,14 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.androidaps.logging.L;
public class DanaRS_Packet_Bolus_Set_Bolus_Option extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Bolus_Set_Bolus_Option.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
private int extendedBolusOptionOnOff;
private int bolusCalculationOption;
@@ -75,7 +76,7 @@ public class DanaRS_Packet_Bolus_Set_Bolus_Option extends DanaRS_Packet {
this.missedBolus04EndHour = missedBolus04EndHour;
this.missedBolus04EndMin = missedBolus04EndMin;
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Setting bolus options");
}
}
@@ -112,7 +113,9 @@ public class DanaRS_Packet_Bolus_Set_Bolus_Option extends DanaRS_Packet {
@Override
public void handleMessage(byte[] data) {
int result = intFromBuff(data, 0, 1);
- if (Config.logDanaMessageDetail) {
+ if ( result != 0)
+ failed = true;
+ if (L.isEnabled(L.PUMPCOMM)) {
if (result == 0)
log.debug("Result OK");
else
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_CIR_CF_Array.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_CIR_CF_Array.java
index 062ae00712..15bde78a76 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_CIR_CF_Array.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_CIR_CF_Array.java
@@ -1,13 +1,14 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.androidaps.logging.L;
public class DanaRS_Packet_Bolus_Set_CIR_CF_Array extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Bolus_Set_CIR_CF_Array.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
private int cir01;
private int cir02;
@@ -45,6 +46,8 @@ public class DanaRS_Packet_Bolus_Set_CIR_CF_Array extends DanaRS_Packet {
this.cf05 = cf05;
this.cf06 = cf06;
this.cf07 = cf07;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -84,7 +87,9 @@ public class DanaRS_Packet_Bolus_Set_CIR_CF_Array extends DanaRS_Packet {
@Override
public void handleMessage(byte[] data) {
int result = intFromBuff(data, 0, 1);
- if (Config.logDanaMessageDetail) {
+ if (result != 0)
+ failed = true;
+ if (L.isEnabled(L.PUMPCOMM)) {
if (result == 0)
log.debug("Result OK");
else
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Dual_Bolus.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Dual_Bolus.java
index e769bea195..023458e5dc 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Dual_Bolus.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Dual_Bolus.java
@@ -1,13 +1,14 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.androidaps.logging.L;
public class DanaRS_Packet_Bolus_Set_Dual_Bolus extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Bolus_Set_Dual_Bolus.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
private double amount;
private double extendedAmount;
@@ -24,7 +25,7 @@ public class DanaRS_Packet_Bolus_Set_Dual_Bolus extends DanaRS_Packet {
this.extendedAmount = extendedAmount;
this.extendedBolusDurationInHalfHours = extendedBolusDurationInHalfHours;
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Dual bolus start : " + amount + " U extended: " + extendedAmount + " U halfhours: " + extendedBolusDurationInHalfHours);
}
@@ -45,7 +46,9 @@ public class DanaRS_Packet_Bolus_Set_Dual_Bolus extends DanaRS_Packet {
@Override
public void handleMessage(byte[] data) {
int result = intFromBuff(data, 0, 1);
- if (Config.logDanaMessageDetail) {
+ if (result!=0)
+ failed = true;
+ if (L.isEnabled(L.PUMPCOMM)) {
if (result == 0)
log.debug("Result OK");
else
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Extended_Bolus.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Extended_Bolus.java
index 887a9d852a..504b21bbc9 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Extended_Bolus.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Extended_Bolus.java
@@ -1,14 +1,14 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-
-import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.androidaps.logging.L;
public class DanaRS_Packet_Bolus_Set_Extended_Bolus extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Bolus_Set_Extended_Bolus.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
private double extendedAmount;
private int extendedBolusDurationInHalfHours;
@@ -23,7 +23,7 @@ public class DanaRS_Packet_Bolus_Set_Extended_Bolus extends DanaRS_Packet {
this.extendedAmount = extendedAmount;
this.extendedBolusDurationInHalfHours = extendedBolusDurationInHalfHours;
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Extended bolus start : " + extendedAmount + " U halfhours: " + extendedBolusDurationInHalfHours);
}
@@ -41,7 +41,9 @@ public class DanaRS_Packet_Bolus_Set_Extended_Bolus extends DanaRS_Packet {
@Override
public void handleMessage(byte[] data) {
int result = intFromBuff(data, 0, 1);
- if (Config.logDanaMessageDetail) {
+ if (result!=0)
+ failed=true;
+ if (L.isEnabled(L.PUMPCOMM)) {
if (result == 0)
log.debug("Result OK");
else
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Extended_Bolus_Cancel.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Extended_Bolus_Cancel.java
index 132de649cf..587e87df9d 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Extended_Bolus_Cancel.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Extended_Bolus_Cancel.java
@@ -1,26 +1,29 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.androidaps.logging.L;
public class DanaRS_Packet_Bolus_Set_Extended_Bolus_Cancel extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Bolus_Set_Extended_Bolus_Cancel.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_Bolus_Set_Extended_Bolus_Cancel() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_BOLUS__SET_EXTENDED_BOLUS_CANCEL;
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Cancel extended bolus");
}
@Override
public void handleMessage(byte[] data) {
int result = intFromBuff(data, 0, 1);
- if (Config.logDanaMessageDetail) {
+ if (result != 0)
+ failed = true;
+ if (L.isEnabled(L.PUMPCOMM)) {
if (result == 0)
log.debug("Result OK");
else
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Initial_Bolus.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Initial_Bolus.java
index a174d39b53..2e7b9be1ff 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Initial_Bolus.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Initial_Bolus.java
@@ -1,14 +1,14 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-
-import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.androidaps.logging.L;
public class DanaRS_Packet_Bolus_Set_Initial_Bolus extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Bolus_Set_Initial_Bolus.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
private int bolusRate01;
private int bolusRate02;
@@ -26,6 +26,8 @@ public class DanaRS_Packet_Bolus_Set_Initial_Bolus extends DanaRS_Packet {
this.bolusRate02 = (int) (bolusRate02 / 100d);
this.bolusRate03 = (int) (bolusRate03 / 100d);
this.bolusRate04 = (int) (bolusRate04 / 100d);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -45,7 +47,9 @@ public class DanaRS_Packet_Bolus_Set_Initial_Bolus extends DanaRS_Packet {
@Override
public void handleMessage(byte[] data) {
int result = intFromBuff(data, 0, 1);
- if (Config.logDanaMessageDetail) {
+ if (result!=0)
+ failed = true;
+ if (L.isEnabled(L.PUMPCOMM)) {
if (result == 0)
log.debug("Result OK");
else
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Start.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Start.java
index 44e5d308dc..e50fbd70b5 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Start.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Start.java
@@ -5,14 +5,13 @@ import com.cozmo.danar.util.BleCommandUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
-import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.data.ConstraintChecker;
import info.nightscout.androidaps.interfaces.Constraint;
-import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
+import info.nightscout.androidaps.logging.L;
public class DanaRS_Packet_Bolus_Set_Step_Bolus_Start extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Bolus_Set_Step_Bolus_Start.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
private double amount;
private int speed;
@@ -29,13 +28,13 @@ public class DanaRS_Packet_Bolus_Set_Step_Bolus_Start extends DanaRS_Packet {
public DanaRS_Packet_Bolus_Set_Step_Bolus_Start(double amount, int speed) {
this();
- // HARDCODED LIMIT
+ // HARDCODED LIMIT - if there is one that could be created
amount = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(amount)).value();
this.amount = amount;
this.speed = speed;
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Bolus start : " + amount + " speed: " + speed);
}
@@ -52,12 +51,12 @@ public class DanaRS_Packet_Bolus_Set_Step_Bolus_Start extends DanaRS_Packet {
@Override
public void handleMessage(byte[] data) {
errorCode = intFromBuff(data, 0, 1);
- if (Config.logDanaMessageDetail) {
+ if (errorCode != 0)
+ failed = true;
+ if (L.isEnabled(L.PUMPCOMM)) {
if (errorCode == 0) {
log.debug("Result OK");
- failed = false;
} else {
- failed = true;
log.error("Result Error: " + errorCode);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Stop.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Stop.java
index 78548ecab3..e12b3db7f1 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Stop.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Stop.java
@@ -3,17 +3,17 @@ package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Treatments.Treatment;
import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress;
public class DanaRS_Packet_Bolus_Set_Step_Bolus_Stop extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Bolus_Set_Step_Bolus_Stop.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
private static Treatment t;
private static Double amount;
@@ -31,16 +31,20 @@ public class DanaRS_Packet_Bolus_Set_Step_Bolus_Stop extends DanaRS_Packet {
this.amount = amount;
forced = false;
stopped = false;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Stop bolus: amount: " + amount + " treatment: " + t.toString());
}
@Override
public void handleMessage(byte[] data) {
int result = intFromBuff(data, 0, 1);
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
if (result == 0)
log.debug("Result OK");
- else
+ else {
log.error("Result Error: " + result);
+ failed = true;
+ }
}
EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance();
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Etc_Keep_Connection.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Etc_Keep_Connection.java
index d30be3abf8..8adf46f742 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Etc_Keep_Connection.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Etc_Keep_Connection.java
@@ -3,16 +3,18 @@ package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
import com.cozmo.danar.util.BleCommandUtil;
public class DanaRS_Packet_Etc_Keep_Connection extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Etc_Keep_Connection.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_Etc_Keep_Connection() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_ETC__KEEP_CONNECTION;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -20,7 +22,9 @@ public class DanaRS_Packet_Etc_Keep_Connection extends DanaRS_Packet {
int dataIndex = DATA_START;
int dataSize = 1;
int error = byteArrayToInt(getBytes(data, dataIndex, dataSize));
- if (Config.logDanaMessageDetail) {
+ if (error!=0)
+ failed=true;
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Result: " + error);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Etc_Set_History_Save.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Etc_Set_History_Save.java
index 6538b77932..1c9af359e2 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Etc_Set_History_Save.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Etc_Set_History_Save.java
@@ -3,12 +3,12 @@ package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
import com.cozmo.danar.util.BleCommandUtil;
public class DanaRS_Packet_Etc_Set_History_Save extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Etc_Set_History_Save.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
private int historyType;
private int historyYear;
@@ -36,6 +36,8 @@ public class DanaRS_Packet_Etc_Set_History_Save extends DanaRS_Packet {
this.historySecond = historySecond;
this.historyCode = historyCode;
this.historyValue = historyValue;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -59,7 +61,9 @@ public class DanaRS_Packet_Etc_Set_History_Save extends DanaRS_Packet {
int dataIndex = DATA_START;
int dataSize = 1;
int error = byteArrayToInt(getBytes(data, dataIndex, dataSize));
- if (Config.logDanaMessageDetail) {
+ if (error != 0)
+ failed = true;
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Result: " + error);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Delivery_Status.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Delivery_Status.java
index d9e2599eb2..c64680379f 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Delivery_Status.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Delivery_Status.java
@@ -1,18 +1,20 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-
-import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.androidaps.logging.L;
public class DanaRS_Packet_General_Delivery_Status extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_General_Delivery_Status.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_General_Delivery_Status() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__DELIVERY_STATUS;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -20,7 +22,9 @@ public class DanaRS_Packet_General_Delivery_Status extends DanaRS_Packet {
int dataIndex = DATA_START;
int dataSize = 1;
int status = byteArrayToInt(getBytes(data, dataIndex, dataSize));
- if (Config.logDanaMessageDetail) {
+ if (status != 0)
+ failed = true;
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Status: " + status);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_More_Information.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_More_Information.java
index cd2de4094f..b1553a2c05 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_More_Information.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_More_Information.java
@@ -1,45 +1,52 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Date;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
-import com.cozmo.danar.util.BleCommandUtil;
public class DanaRS_Packet_General_Get_More_Information extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_General_Get_More_Information.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
- public DanaRS_Packet_General_Get_More_Information() {
- super();
- opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__GET_MORE_INFORMATION;
- }
+ public DanaRS_Packet_General_Get_More_Information() {
+ super();
+ opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__GET_MORE_INFORMATION;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
+ }
- @Override
- public void handleMessage(byte[] data) {
- DanaRPump pump = DanaRPump.getInstance();
+ @Override
+ public void handleMessage(byte[] data) {
+ if (data.length < 15){
+ failed = true;
+ return;
+ }
+ DanaRPump pump = DanaRPump.getInstance();
- int dataIndex = DATA_START;
- int dataSize = 2;
- pump.iob = byteArrayToInt(getBytes(data, dataIndex, dataSize));
+ int dataIndex = DATA_START;
+ int dataSize = 2;
+ pump.iob = byteArrayToInt(getBytes(data, dataIndex, dataSize));
- dataIndex += dataSize;
- dataSize = 2;
- pump.dailyTotalUnits = byteArrayToInt(getBytes(data, dataIndex, dataSize)) / 100d;
+ dataIndex += dataSize;
+ dataSize = 2;
+ pump.dailyTotalUnits = byteArrayToInt(getBytes(data, dataIndex, dataSize)) / 100d;
- dataIndex += dataSize;
- dataSize = 1;
- pump.isExtendedInProgress = byteArrayToInt(getBytes(data, dataIndex, dataSize)) == 0x01;
+ dataIndex += dataSize;
+ dataSize = 1;
+ pump.isExtendedInProgress = byteArrayToInt(getBytes(data, dataIndex, dataSize)) == 0x01;
- dataIndex += dataSize;
- dataSize = 2;
- pump.extendedBolusRemainingMinutes = byteArrayToInt(getBytes(data, dataIndex, dataSize));
+ dataIndex += dataSize;
+ dataSize = 2;
+ pump.extendedBolusRemainingMinutes = byteArrayToInt(getBytes(data, dataIndex, dataSize));
- dataIndex += dataSize;
- dataSize = 2;
- double remainRate = byteArrayToInt(getBytes(data, dataIndex, dataSize)) / 100d;
+ dataIndex += dataSize;
+ dataSize = 2;
+ double remainRate = byteArrayToInt(getBytes(data, dataIndex, dataSize)) / 100d;
Date lastBolusTime = new Date(); // it doesn't provide day only hour+min, workaround: expecting today
dataIndex += dataSize;
@@ -50,21 +57,23 @@ public class DanaRS_Packet_General_Get_More_Information extends DanaRS_Packet {
dataSize = 1;
lastBolusTime.setMinutes(byteArrayToInt(getBytes(data, dataIndex, dataSize)));
- dataIndex += dataSize;
- dataSize = 2;
- pump.lastBolusAmount = byteArrayToInt(getBytes(data, dataIndex, dataSize));
-
- if (Config.logDanaMessageDetail) {
+ dataIndex += dataSize;
+ dataSize = 2;
+ pump.lastBolusAmount = byteArrayToInt(getBytes(data, dataIndex, dataSize));
+ // On DanaRS DailyUnits can't be more than 160
+ if(pump.dailyTotalUnits > 160)
+ failed = true;
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Daily total units: " + pump.dailyTotalUnits + " U");
log.debug("Is extended in progress: " + pump.isExtendedInProgress);
log.debug("Extended bolus remaining minutes: " + pump.extendedBolusRemainingMinutes);
log.debug("Last bolus time: " + lastBolusTime.toLocaleString());
log.debug("Last bolus amount: " + pump.lastBolusAmount);
}
- }
+ }
- @Override
- public String getFriendlyName() {
- return "REVIEW__GET_MORE_INFORMATION";
- }
+ @Override
+ public String getFriendlyName() {
+ return "REVIEW__GET_MORE_INFORMATION";
+ }
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_Password.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_Password.java
index 0d250db919..dc5cbc59f0 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_Password.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_Password.java
@@ -1,30 +1,36 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-
-import com.cozmo.danar.util.BleCommandUtil;
-
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
public class DanaRS_Packet_General_Get_Password extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_General_Get_Password.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_General_Get_Password() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__GET_PASSWORD;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
public void handleMessage(byte[] data) {
+ if (data.length < 2){
+ // returned data size is too small
+ failed = true;
+ return;
+ }
DanaRPump pump = DanaRPump.getInstance();
int pass = ((data[DATA_START + 1] & 0x000000FF) << 8) + (data[DATA_START + 0] & 0x000000FF);
pass = pass ^ 3463;
pump.rs_password = Integer.toHexString(pass);
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Pump password: " + pump.rs_password);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_Pump_Check.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_Pump_Check.java
index bdc5ab8d9b..5c26e2ce74 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_Pump_Check.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_Pump_Check.java
@@ -5,23 +5,29 @@ import com.cozmo.danar.util.BleCommandUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
public class DanaRS_Packet_General_Get_Pump_Check extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_General_Get_Pump_Check.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_General_Get_Pump_Check() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__GET_PUMP_CHECK;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
public void handleMessage(byte[] data) {
+ if (data.length <5){
+ failed = true;
+ return;
+ }
DanaRPump pump = DanaRPump.getInstance();
int dataIndex = DATA_START;
@@ -36,7 +42,7 @@ public class DanaRS_Packet_General_Get_Pump_Check extends DanaRS_Packet {
dataSize = 1;
pump.productCode = byteArrayToInt(getBytes(data, dataIndex, dataSize));
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Model: " + String.format("%02X ", pump.model));
log.debug("Protocol: " + String.format("%02X ", pump.protocol));
log.debug("Product Code: " + String.format("%02X ", pump.productCode));
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_Shipping_Information.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_Shipping_Information.java
index 2cf9b1f124..f2cb14cf73 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_Shipping_Information.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_Shipping_Information.java
@@ -1,46 +1,53 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
-
-import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.utils.DateUtil;
public class DanaRS_Packet_General_Get_Shipping_Information extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Bolus_Set_Step_Bolus_Stop.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
- public DanaRS_Packet_General_Get_Shipping_Information() {
- super();
- opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__GET_SHIPPING_INFORMATION;
- }
+ public DanaRS_Packet_General_Get_Shipping_Information() {
+ super();
+ opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__GET_SHIPPING_INFORMATION;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
+ }
- @Override
- public void handleMessage(byte[] data) {
- DanaRPump pump = DanaRPump.getInstance();
+ @Override
+ public void handleMessage(byte[] data) {
+ if (data.length < 18) {
+ failed = true;
+ return;
+ }
+ DanaRPump pump = DanaRPump.getInstance();
- int dataIndex = DATA_START;
- int dataSize = 10;
- pump.serialNumber = stringFromBuff(data, dataIndex, dataSize);
+ int dataIndex = DATA_START;
+ int dataSize = 10;
+ pump.serialNumber = stringFromBuff(data, dataIndex, dataSize);
- dataIndex += dataSize;
- dataSize = 3;
- pump.shippingDate = dateFromBuff(data, dataIndex);
+ dataIndex += dataSize;
+ dataSize = 3;
+ pump.shippingDate = dateFromBuff(data, dataIndex);
- dataIndex += dataSize;
- dataSize = 3;
- pump.shippingCountry = asciiStringFromBuff(data, dataIndex, dataSize);
+ dataIndex += dataSize;
+ dataSize = 3;
+ pump.shippingCountry = asciiStringFromBuff(data, dataIndex, dataSize);
- if (Config.logDanaMessageDetail) {
- log.debug("Serial number: " + pump.serialNumber);
- log.debug("Shipping date: " + pump.shippingDate);
- log.debug("Shipping country: " + pump.shippingCountry);
- }
- }
+ if (L.isEnabled(L.PUMPCOMM)) {
+ log.debug("Serial number: " + pump.serialNumber);
+ log.debug("Shipping date: " + DateUtil.dateAndTimeString(pump.shippingDate));
+ log.debug("Shipping country: " + pump.shippingCountry);
+ }
+ }
- @Override
- public String getFriendlyName() {
- return "REVIEW__GET_SHIPPING_INFORMATION";
- }
+ @Override
+ public String getFriendlyName() {
+ return "REVIEW__GET_SHIPPING_INFORMATION";
+ }
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_Today_Delivery_Total.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_Today_Delivery_Total.java
index a40d572611..2a3b136279 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_Today_Delivery_Total.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_Today_Delivery_Total.java
@@ -1,47 +1,52 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-
-import com.cozmo.danar.util.BleCommandUtil;
-
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
public class DanaRS_Packet_General_Get_Today_Delivery_Total extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_General_Get_Today_Delivery_Total.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
- public DanaRS_Packet_General_Get_Today_Delivery_Total() {
- super();
- opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__GET_TODAY_DELIVERY_TOTAL;
- }
+ public DanaRS_Packet_General_Get_Today_Delivery_Total() {
+ super();
+ opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__GET_TODAY_DELIVERY_TOTAL;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
+ }
- @Override
- public void handleMessage(byte[] data) {
- DanaRPump pump = DanaRPump.getInstance();
+ @Override
+ public void handleMessage(byte[] data) {
+ if (data.length < 8){
+ failed = true;
+ return;
+ }
+ DanaRPump pump = DanaRPump.getInstance();
- int dataIndex = DATA_START;
- int dataSize = 2;
- pump.dailyTotalUnits = byteArrayToInt(getBytes(data, dataIndex, dataSize)) / 100d;
+ int dataIndex = DATA_START;
+ int dataSize = 2;
+ pump.dailyTotalUnits = byteArrayToInt(getBytes(data, dataIndex, dataSize)) / 100d;
- dataIndex += dataSize;
- dataSize = 2;
- pump.dailyTotalBasalUnits = byteArrayToInt(getBytes(data, dataIndex, dataSize)) / 100d;
+ dataIndex += dataSize;
+ dataSize = 2;
+ pump.dailyTotalBasalUnits = byteArrayToInt(getBytes(data, dataIndex, dataSize)) / 100d;
- dataIndex += dataSize;
- dataSize = 2;
- pump.dailyTotalBolusUnits = byteArrayToInt(getBytes(data, dataIndex, dataSize)) / 100d;
+ dataIndex += dataSize;
+ dataSize = 2;
+ pump.dailyTotalBolusUnits = byteArrayToInt(getBytes(data, dataIndex, dataSize)) / 100d;
- if (Config.logDanaMessageDetail) {
- log.debug("Daily total: " + pump.dailyTotalUnits + " U");
- log.debug("Daily total bolus: " + pump.dailyTotalBolusUnits + " U");
- log.debug("Daily total basal: " + pump.dailyTotalBasalUnits + " U");
- }
- }
+ if (L.isEnabled(L.PUMPCOMM)) {
+ log.debug("Daily total: " + pump.dailyTotalUnits + " U");
+ log.debug("Daily total bolus: " + pump.dailyTotalBolusUnits + " U");
+ log.debug("Daily total basal: " + pump.dailyTotalBasalUnits + " U");
+ }
+ }
- @Override
- public String getFriendlyName() {
- return "REVIEW__GET_TODAY_DELIVERY_TOTAL";
- }
+ @Override
+ public String getFriendlyName() {
+ return "REVIEW__GET_TODAY_DELIVERY_TOTAL";
+ }
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_User_Time_Change_Flag.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_User_Time_Change_Flag.java
index 695e3eace4..0d07ecc33d 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_User_Time_Change_Flag.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_User_Time_Change_Flag.java
@@ -1,26 +1,33 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.androidaps.logging.L;
public class DanaRS_Packet_General_Get_User_Time_Change_Flag extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_General_Get_User_Time_Change_Flag.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_General_Get_User_Time_Change_Flag() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__GET_USER_TIME_CHANGE_FLAG;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
public void handleMessage(byte[] data) {
+ if (data.length < 3){
+ failed = true;
+ return;
+ }
int dataIndex = DATA_START;
int dataSize = 1;
int userTimeChangeFlag = byteArrayToInt(getBytes(data, dataIndex, dataSize));
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("UserTimeChangeFlag: " + userTimeChangeFlag);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Initial_Screen_Information.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Initial_Screen_Information.java
index d05777d20d..d8e5b95c14 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Initial_Screen_Information.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Initial_Screen_Information.java
@@ -1,25 +1,30 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-
-import com.cozmo.danar.util.BleCommandUtil;
-
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
public class DanaRS_Packet_General_Initial_Screen_Information extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Bolus_Get_Step_Bolus_Information.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_General_Initial_Screen_Information() {
super();
type = BleCommandUtil.DANAR_PACKET__TYPE_RESPONSE;
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__INITIAL_SCREEN_INFORMATION;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
public void handleMessage(byte[] data) {
+ if (data.length < 17) {
+ failed = true;
+ return;
+ }
DanaRPump pump = DanaRPump.getInstance();
int dataIndex = DATA_START;
@@ -63,7 +68,7 @@ public class DanaRS_Packet_General_Initial_Screen_Information extends DanaRS_Pac
dataSize = 2;
pump.iob = byteArrayToInt(getBytes(data, dataIndex, dataSize)) / 100d;
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Pump suspended: " + pump.pumpSuspended);
log.debug("Temp basal in progress: " + pump.isTempBasalInProgress);
log.debug("Extended in progress: " + pump.isExtendedInProgress);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Set_History_Upload_Mode.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Set_History_Upload_Mode.java
index 878cfd64dd..f66c3c4afe 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Set_History_Upload_Mode.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Set_History_Upload_Mode.java
@@ -1,13 +1,14 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.androidaps.logging.L;
public class DanaRS_Packet_General_Set_History_Upload_Mode extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_General_Set_History_Upload_Mode.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
private int mode;
@@ -19,6 +20,8 @@ public class DanaRS_Packet_General_Set_History_Upload_Mode extends DanaRS_Packet
public DanaRS_Packet_General_Set_History_Upload_Mode(int mode) {
this();
this.mode = mode;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message: mode: " + mode);
}
@Override
@@ -32,7 +35,9 @@ public class DanaRS_Packet_General_Set_History_Upload_Mode extends DanaRS_Packet
@Override
public void handleMessage(byte[] data) {
int result = intFromBuff(data, 0, 1);
- if (Config.logDanaMessageDetail) {
+ if (result != 0)
+ failed = true;
+ if (L.isEnabled(L.PUMPCOMM)) {
if (result == 0)
log.debug("Result OK");
else
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Set_User_Time_Change_Flag_Clear.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Set_User_Time_Change_Flag_Clear.java
index 3917f31050..9f7570d4ce 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Set_User_Time_Change_Flag_Clear.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Set_User_Time_Change_Flag_Clear.java
@@ -1,24 +1,28 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-
-import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.androidaps.logging.L;
public class DanaRS_Packet_General_Set_User_Time_Change_Flag_Clear extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_General_Set_User_Time_Change_Flag_Clear.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_General_Set_User_Time_Change_Flag_Clear() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__SET_USER_TIME_CHANGE_FLAG_CLEAR;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
public void handleMessage(byte[] data) {
int result = intFromBuff(data, 0, 1);
- if (Config.logDanaMessageDetail) {
+ if (result != 0)
+ failed = true;
+ if (L.isEnabled(L.PUMPCOMM)) {
if (result == 0)
log.debug("Result OK");
else
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_.java
index 6bae4ab8c1..aab933e787 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_.java
@@ -1,7 +1,5 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
-import com.cozmo.danar.util.BleCommandUtil;
-
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -11,12 +9,13 @@ import java.util.GregorianCalendar;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.db.DanaRHistoryRecord;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.RecordTypes;
import info.nightscout.androidaps.plugins.PumpDanaR.events.EventDanaRSyncStatus;
import info.nightscout.utils.DateUtil;
public abstract class DanaRS_Packet_History_ extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_History_.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
private int year = 0;
private int month = 0;
@@ -34,11 +33,11 @@ public abstract class DanaRS_Packet_History_ extends DanaRS_Packet {
totalCount = 0;
}
- public DanaRS_Packet_History_(Date from) {
+ public DanaRS_Packet_History_(long from) {
this();
GregorianCalendar cal = new GregorianCalendar();
- if (from.getTime() != 0)
- cal.setTime(from);
+ if (from != 0)
+ cal.setTimeInMillis(from);
else
cal.set(2000, 0, 1, 0, 0, 0);
year = cal.get(Calendar.YEAR) - 1900 - 100;
@@ -47,7 +46,8 @@ public abstract class DanaRS_Packet_History_ extends DanaRS_Packet {
hour = cal.get(Calendar.HOUR_OF_DAY);
min = cal.get(Calendar.MINUTE);
sec = cal.get(Calendar.SECOND);
- log.debug("Loading event history from: " + new Date(cal.getTimeInMillis()).toLocaleString());
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Loading event history from: " + new Date(cal.getTimeInMillis()).toLocaleString());
}
@Override
@@ -71,7 +71,8 @@ public abstract class DanaRS_Packet_History_ extends DanaRS_Packet {
int dataSize = 1;
error = byteArrayToInt(getBytes(data, dataIndex, dataSize));
done = true;
- log.debug("History end. Code: " + error + " Success: " + (error == 0x00));
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("History end. Code: " + error + " Success: " + (error == 0x00));
} else if (data.length == 5) {
int dataIndex = DATA_START;
int dataSize = 1;
@@ -81,11 +82,12 @@ public abstract class DanaRS_Packet_History_ extends DanaRS_Packet {
dataIndex += dataSize;
dataSize = 2;
totalCount = byteArrayToInt(getBytes(data, dataIndex, dataSize));
- log.debug("History end. Code: " + error + " Success: " + (error == 0x00) + " Toatal count: " + totalCount);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("History end. Code: " + error + " Success: " + (error == 0x00) + " Toatal count: " + totalCount);
} else {
int recordCode = byteArrayToInt(getBytes(data, DATA_START, 1));
int historyYear = byteArrayToInt(getBytes(data, DATA_START + 1, 1));
- int historyMonth = byteArrayToInt(getBytes(data, DATA_START +2 , 1));
+ int historyMonth = byteArrayToInt(getBytes(data, DATA_START + 2, 1));
int historyDay = byteArrayToInt(getBytes(data, DATA_START + 3, 1));
int historyHour = byteArrayToInt(getBytes(data, DATA_START + 4, 1));
double dailyBasal = (((data[DATA_START + 4] & 0xFF) << 8) + (data[DATA_START + 5] & 0xFF)) * 0.01d;
@@ -103,7 +105,8 @@ public abstract class DanaRS_Packet_History_ extends DanaRS_Packet {
int value = ((data[DATA_START + 8] & 0xFF) << 8) + (data[DATA_START + 9] & 0xFF);
- log.debug("History packet: " + recordCode + " Date: " + datetimewihtsec.toLocaleString() + " Code: " + historyCode + " Value: " + value);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("History packet: " + recordCode + " Date: " + datetimewihtsec.toLocaleString() + " Code: " + historyCode + " Value: " + value);
EventDanaRSyncStatus ev = new EventDanaRSyncStatus();
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Alarm.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Alarm.java
index 5fe57fefe4..e586166783 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Alarm.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Alarm.java
@@ -1,19 +1,27 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
-import java.util.Date;
-
import com.cozmo.danar.util.BleCommandUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Date;
+
+import info.nightscout.androidaps.logging.L;
+
public class DanaRS_Packet_History_Alarm extends DanaRS_Packet_History_ {
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_History_Alarm() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__ALARM;
}
- public DanaRS_Packet_History_Alarm(Date from) {
+ public DanaRS_Packet_History_Alarm(long from) {
super(from);
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__ALARM;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_All_History.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_All_History.java
index a514d4eac7..f6411dca5f 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_All_History.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_All_History.java
@@ -1,19 +1,25 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
-import java.util.Date;
-
import com.cozmo.danar.util.BleCommandUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import info.nightscout.androidaps.logging.L;
+
public class DanaRS_Packet_History_All_History extends DanaRS_Packet_History_ {
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_History_All_History() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__ALL_HISTORY;
}
- public DanaRS_Packet_History_All_History(Date from) {
+ public DanaRS_Packet_History_All_History(long from) {
super(from);
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__ALL_HISTORY;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Basal.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Basal.java
index 4aec1d0352..76d485695c 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Basal.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Basal.java
@@ -1,19 +1,25 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
-import java.util.Date;
-
import com.cozmo.danar.util.BleCommandUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import info.nightscout.androidaps.logging.L;
+
public class DanaRS_Packet_History_Basal extends DanaRS_Packet_History_ {
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_History_Basal() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__BASAL;
}
- public DanaRS_Packet_History_Basal(Date from) {
+ public DanaRS_Packet_History_Basal(long from) {
super(from);
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__BASAL;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Blood_Glucose.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Blood_Glucose.java
index 22bb3b5c2e..e66db9bb78 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Blood_Glucose.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Blood_Glucose.java
@@ -1,19 +1,25 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
-import java.util.Date;
-
import com.cozmo.danar.util.BleCommandUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import info.nightscout.androidaps.logging.L;
+
public class DanaRS_Packet_History_Blood_Glucose extends DanaRS_Packet_History_ {
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_History_Blood_Glucose() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__BLOOD_GLUCOSE;
}
- public DanaRS_Packet_History_Blood_Glucose(Date from) {
+ public DanaRS_Packet_History_Blood_Glucose(long from) {
super(from);
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__BLOOD_GLUCOSE;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Bolus.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Bolus.java
index 7451f921be..41a2bd0995 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Bolus.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Bolus.java
@@ -1,23 +1,29 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
-import java.util.Date;
-
import com.cozmo.danar.util.BleCommandUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import info.nightscout.androidaps.logging.L;
+
public class DanaRS_Packet_History_Bolus extends DanaRS_Packet_History_ {
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
- public DanaRS_Packet_History_Bolus() {
- super();
- opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__BOLUS;
- }
+ public DanaRS_Packet_History_Bolus() {
+ super();
+ opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__BOLUS;
+ }
- public DanaRS_Packet_History_Bolus(Date from) {
- super(from);
- opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__BOLUS;
- }
+ public DanaRS_Packet_History_Bolus(long from) {
+ super(from);
+ opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__BOLUS;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
+ }
- @Override
- public String getFriendlyName() {
- return "REVIEW__BOLUS";
- }
+ @Override
+ public String getFriendlyName() {
+ return "REVIEW__BOLUS";
+ }
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Carbohydrate.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Carbohydrate.java
index df2f5c762d..58d9fac3dc 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Carbohydrate.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Carbohydrate.java
@@ -1,23 +1,29 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
-import java.util.Date;
-
import com.cozmo.danar.util.BleCommandUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import info.nightscout.androidaps.logging.L;
+
public class DanaRS_Packet_History_Carbohydrate extends DanaRS_Packet_History_ {
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
- public DanaRS_Packet_History_Carbohydrate() {
- super();
- opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__CARBOHYDRATE;
- }
+ public DanaRS_Packet_History_Carbohydrate() {
+ super();
+ opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__CARBOHYDRATE;
+ }
- public DanaRS_Packet_History_Carbohydrate(Date from) {
- super(from);
- opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__CARBOHYDRATE;
- }
+ public DanaRS_Packet_History_Carbohydrate(long from) {
+ super(from);
+ opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__CARBOHYDRATE;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
+ }
- @Override
- public String getFriendlyName() {
- return "REVIEW__CARBOHYDRATE";
- }
+ @Override
+ public String getFriendlyName() {
+ return "REVIEW__CARBOHYDRATE";
+ }
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Daily.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Daily.java
index b55754ba2f..b480f76258 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Daily.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Daily.java
@@ -1,19 +1,25 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
-import java.util.Date;
-
import com.cozmo.danar.util.BleCommandUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import info.nightscout.androidaps.logging.L;
+
public class DanaRS_Packet_History_Daily extends DanaRS_Packet_History_ {
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_History_Daily() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__DAILY;
}
- public DanaRS_Packet_History_Daily(Date from) {
+ public DanaRS_Packet_History_Daily(long from) {
super(from);
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__DAILY;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Prime.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Prime.java
index b5dbf7ff93..28ea4c30f0 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Prime.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Prime.java
@@ -1,19 +1,25 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
-import java.util.Date;
-
import com.cozmo.danar.util.BleCommandUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import info.nightscout.androidaps.logging.L;
+
public class DanaRS_Packet_History_Prime extends DanaRS_Packet_History_ {
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_History_Prime() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__PRIME;
}
- public DanaRS_Packet_History_Prime(Date from) {
+ public DanaRS_Packet_History_Prime(long from) {
super(from);
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__PRIME;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Refill.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Refill.java
index 66094e3fb6..685c8e519e 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Refill.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Refill.java
@@ -1,23 +1,29 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
-import java.util.Date;
-
import com.cozmo.danar.util.BleCommandUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import info.nightscout.androidaps.logging.L;
+
public class DanaRS_Packet_History_Refill extends DanaRS_Packet_History_ {
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
- public DanaRS_Packet_History_Refill() {
- super();
- opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__REFILL;
- }
+ public DanaRS_Packet_History_Refill() {
+ super();
+ opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__REFILL;
+ }
- public DanaRS_Packet_History_Refill(Date from) {
- super(from);
- opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__REFILL;
- }
+ public DanaRS_Packet_History_Refill(long from) {
+ super(from);
+ opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__REFILL;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
+ }
- @Override
- public String getFriendlyName() {
- return "REVIEW__REFILL";
- }
+ @Override
+ public String getFriendlyName() {
+ return "REVIEW__REFILL";
+ }
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Suspend.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Suspend.java
index 20f1c3d6ff..ef787746ce 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Suspend.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Suspend.java
@@ -1,19 +1,25 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
-import java.util.Date;
-
import com.cozmo.danar.util.BleCommandUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import info.nightscout.androidaps.logging.L;
+
public class DanaRS_Packet_History_Suspend extends DanaRS_Packet_History_ {
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_History_Suspend() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__SUSPEND;
}
- public DanaRS_Packet_History_Suspend(Date from) {
+ public DanaRS_Packet_History_Suspend(long from) {
super(from);
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__SUSPEND;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Temporary.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Temporary.java
index 7d63e1bfff..68526b5fb2 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Temporary.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_History_Temporary.java
@@ -1,19 +1,25 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
-import java.util.Date;
-
import com.cozmo.danar.util.BleCommandUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import info.nightscout.androidaps.logging.L;
+
public class DanaRS_Packet_History_Temporary extends DanaRS_Packet_History_ {
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_History_Temporary() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__TEMPORARY;
}
- public DanaRS_Packet_History_Temporary(Date from) {
+ public DanaRS_Packet_History_Temporary(long from) {
super(from);
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__TEMPORARY;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Alarm.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Alarm.java
index 04737f0bdc..799b3c248c 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Alarm.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Alarm.java
@@ -1,18 +1,17 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-
-import com.cozmo.danar.util.BleCommandUtil;
-
-import info.nightscout.utils.NSUpload;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
public class DanaRS_Packet_Notify_Alarm extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Notify_Alarm.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
private int alarmCode;
@@ -20,6 +19,8 @@ public class DanaRS_Packet_Notify_Alarm extends DanaRS_Packet {
super();
type = BleCommandUtil.DANAR_PACKET__TYPE_NOTIFY;
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_NOTIFY__ALARM;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -75,9 +76,14 @@ public class DanaRS_Packet_Notify_Alarm extends DanaRS_Packet {
errorString = "Blood sugar check miss alarm ???";
break;
}
+ // No error no need to upload anything
+ if(errorString == "") {
+ failed = true;
- if (Config.logDanaMessageDetail)
- log.debug("Error detected: " + errorString);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Error detected: " + errorString);
+ return;
+ }
NSUpload.uploadError(errorString);
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Complete.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Complete.java
index 2598c5efc9..836a52cb65 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Complete.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Complete.java
@@ -1,19 +1,18 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-
-import com.cozmo.danar.util.BleCommandUtil;
-
-import info.nightscout.androidaps.plugins.Treatments.Treatment;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress;
+import info.nightscout.androidaps.plugins.Treatments.Treatment;
public class DanaRS_Packet_Notify_Delivery_Complete extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Notify_Delivery_Complete.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
private static Treatment t;
private static double amount;
@@ -30,6 +29,8 @@ public class DanaRS_Packet_Notify_Delivery_Complete extends DanaRS_Packet {
this.amount = amount;
this.t = t;
done = false;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message: amount: " + amount + " treatment: " + t.toString());
}
@Override
@@ -46,7 +47,7 @@ public class DanaRS_Packet_Notify_Delivery_Complete extends DanaRS_Packet {
MainApp.bus().post(bolusingEvent);
}
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Delivered insulin: " + deliveredInsulin);
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Rate_Display.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Rate_Display.java
index 34621d07ee..c2eb232dac 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Rate_Display.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Rate_Display.java
@@ -1,18 +1,18 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import com.cozmo.danar.util.BleCommandUtil;
-import info.nightscout.androidaps.plugins.Treatments.Treatment;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress;
+import info.nightscout.androidaps.plugins.Treatments.Treatment;
public class DanaRS_Packet_Notify_Delivery_Rate_Display extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Notify_Delivery_Rate_Display.class);
-
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
private static Treatment t;
private static double amount;
@@ -29,6 +29,8 @@ public class DanaRS_Packet_Notify_Delivery_Rate_Display extends DanaRS_Packet {
this.amount = amount;
this.t = t;
lastReceive = System.currentTimeMillis();
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message: amount: " + amount + " treatment: " + t.toString());
}
@Override
@@ -42,10 +44,11 @@ public class DanaRS_Packet_Notify_Delivery_Rate_Display extends DanaRS_Packet {
bolusingEvent.status = String.format(MainApp.gs(R.string.bolusdelivering), deliveredInsulin);
bolusingEvent.t = t;
bolusingEvent.percent = Math.min((int) (deliveredInsulin / amount * 100), 100);
+ failed = bolusingEvent.percent < 100? true: false;
MainApp.bus().post(bolusingEvent);
}
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Delivered insulin so far: " + deliveredInsulin);
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Missed_Bolus_Alarm.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Missed_Bolus_Alarm.java
index 3af0c209b5..8239bb34b7 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Missed_Bolus_Alarm.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Missed_Bolus_Alarm.java
@@ -1,19 +1,21 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-
-import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.androidaps.logging.L;
public class DanaRS_Packet_Notify_Missed_Bolus_Alarm extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Notify_Missed_Bolus_Alarm.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_Notify_Missed_Bolus_Alarm() {
super();
type = BleCommandUtil.DANAR_PACKET__TYPE_NOTIFY;
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_NOTIFY__MISSED_BOLUS_ALARM;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -38,7 +40,11 @@ public class DanaRS_Packet_Notify_Missed_Bolus_Alarm extends DanaRS_Packet {
dataIndex += dataSize;
dataSize = 1;
endMin = byteArrayToInt(getBytes(data, dataIndex, dataSize));
- if (Config.logDanaMessageDetail) {
+
+ if(endMin == 1 && endMin == endHour && startHour == endHour &&startHour == startMin )
+ failed = true;
+
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Start hour: " + startHour);
log.debug("Start min: " + startMin);
log.debug("End hour: " + endHour);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Option_Get_Pump_Time.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Option_Get_Pump_Time.java
index 4bfebb5211..b4bcbaef98 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Option_Get_Pump_Time.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Option_Get_Pump_Time.java
@@ -1,21 +1,22 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Date;
-import info.nightscout.androidaps.Config;
-import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
public class DanaRS_Packet_Option_Get_Pump_Time extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Option_Get_Pump_Time.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_Option_Get_Pump_Time() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_OPTION__GET_PUMP_TIME;
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Requesting pump time");
}
}
@@ -47,9 +48,12 @@ public class DanaRS_Packet_Option_Get_Pump_Time extends DanaRS_Packet {
int sec = byteArrayToInt(getBytes(data, dataIndex, dataSize));
Date time = new Date(100 + year, month - 1, day, hour, min, sec);
- DanaRPump.getInstance().pumpTime = time;
+ DanaRPump.getInstance().pumpTime = time.getTime();
- if (Config.logDanaMessageDetail) {
+ if ( year == month && month == day && day == hour && hour == min && min == sec && sec == 1)
+ failed = true;
+
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Pump time " + time.toLocaleString());
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Option_Get_User_Option.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Option_Get_User_Option.java
index b4df373f9c..6c6d7d7185 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Option_Get_User_Option.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Option_Get_User_Option.java
@@ -1,114 +1,117 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
-import com.cozmo.danar.util.BleCommandUtil;
public class DanaRS_Packet_Option_Get_User_Option extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Option_Get_User_Option.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
- public DanaRS_Packet_Option_Get_User_Option() {
- super();
- opCode = BleCommandUtil.DANAR_PACKET__OPCODE_OPTION__GET_USER_OPTION;
- if (Config.logDanaMessageDetail) {
- log.debug("Requesting user settings");
- }
- }
+ public DanaRS_Packet_Option_Get_User_Option() {
+ super();
+ opCode = BleCommandUtil.DANAR_PACKET__OPCODE_OPTION__GET_USER_OPTION;
+ if (L.isEnabled(L.PUMPCOMM)) {
+ log.debug("Requesting user settings");
+ }
+ }
- @Override
- public void handleMessage(byte[] data) {
- DanaRPump pump = DanaRPump.getInstance();
+ @Override
+ public void handleMessage(byte[] data) {
+ DanaRPump pump = DanaRPump.getInstance();
- int dataIndex = DATA_START;
- int dataSize = 1;
- pump.timeDisplayType = byteArrayToInt(getBytes(data, dataIndex, dataSize));
+ int dataIndex = DATA_START;
+ int dataSize = 1;
+ pump.timeDisplayType = byteArrayToInt(getBytes(data, dataIndex, dataSize));
- dataIndex += dataSize;
- dataSize = 1;
- pump.buttonScrollOnOff = byteArrayToInt(getBytes(data, dataIndex, dataSize));
+ dataIndex += dataSize;
+ dataSize = 1;
+ pump.buttonScrollOnOff = byteArrayToInt(getBytes(data, dataIndex, dataSize));
- dataIndex += dataSize;
- dataSize = 1;
- pump.beepAndAlarm = byteArrayToInt(getBytes(data, dataIndex, dataSize));
+ dataIndex += dataSize;
+ dataSize = 1;
+ pump.beepAndAlarm = byteArrayToInt(getBytes(data, dataIndex, dataSize));
- dataIndex += dataSize;
- dataSize = 1;
- pump.lcdOnTimeSec = byteArrayToInt(getBytes(data, dataIndex, dataSize));
+ dataIndex += dataSize;
+ dataSize = 1;
+ pump.lcdOnTimeSec = byteArrayToInt(getBytes(data, dataIndex, dataSize));
- dataIndex += dataSize;
- dataSize = 1;
- pump.backlightOnTimeSec = byteArrayToInt(getBytes(data, dataIndex, dataSize));
+ dataIndex += dataSize;
+ dataSize = 1;
+ pump.backlightOnTimeSec = byteArrayToInt(getBytes(data, dataIndex, dataSize));
- dataIndex += dataSize;
- dataSize = 1;
- pump.selectedLanguage = byteArrayToInt(getBytes(data, dataIndex, dataSize));
+ dataIndex += dataSize;
+ dataSize = 1;
+ pump.selectedLanguage = byteArrayToInt(getBytes(data, dataIndex, dataSize));
- dataIndex += dataSize;
- dataSize = 1;
- pump.units = byteArrayToInt(getBytes(data, dataIndex, dataSize));
+ dataIndex += dataSize;
+ dataSize = 1;
+ pump.units = byteArrayToInt(getBytes(data, dataIndex, dataSize));
- dataIndex += dataSize;
- dataSize = 1;
- pump.shutdownHour = byteArrayToInt(getBytes(data, dataIndex, dataSize));
+ dataIndex += dataSize;
+ dataSize = 1;
+ pump.shutdownHour = byteArrayToInt(getBytes(data, dataIndex, dataSize));
- dataIndex += dataSize;
- dataSize = 1;
- pump.lowReservoirRate = byteArrayToInt(getBytes(data, dataIndex, dataSize));
+ dataIndex += dataSize;
+ dataSize = 1;
+ pump.lowReservoirRate = byteArrayToInt(getBytes(data, dataIndex, dataSize));
- dataIndex += dataSize;
- dataSize = 2;
- pump.cannulaVolume = byteArrayToInt(getBytes(data, dataIndex, dataSize));
+ dataIndex += dataSize;
+ dataSize = 2;
+ pump.cannulaVolume = byteArrayToInt(getBytes(data, dataIndex, dataSize));
- dataIndex += dataSize;
- dataSize = 2;
- pump.refillAmount = byteArrayToInt(getBytes(data, dataIndex, dataSize));
+ dataIndex += dataSize;
+ dataSize = 2;
+ pump.refillAmount = byteArrayToInt(getBytes(data, dataIndex, dataSize));
- dataIndex += dataSize;
- dataSize = 1;
- int selectableLanguage1 = byteArrayToInt(getBytes(data, dataIndex, dataSize));
+ dataIndex += dataSize;
+ dataSize = 1;
+ int selectableLanguage1 = byteArrayToInt(getBytes(data, dataIndex, dataSize));
- dataIndex += dataSize;
- dataSize = 1;
- int selectableLanguage2 = byteArrayToInt(getBytes(data, dataIndex, dataSize));
+ dataIndex += dataSize;
+ dataSize = 1;
+ int selectableLanguage2 = byteArrayToInt(getBytes(data, dataIndex, dataSize));
- dataIndex += dataSize;
- dataSize = 1;
- int selectableLanguage3 = byteArrayToInt(getBytes(data, dataIndex, dataSize));
+ dataIndex += dataSize;
+ dataSize = 1;
+ int selectableLanguage3 = byteArrayToInt(getBytes(data, dataIndex, dataSize));
- dataIndex += dataSize;
- dataSize = 1;
- int selectableLanguage4 = byteArrayToInt(getBytes(data, dataIndex, dataSize));
+ dataIndex += dataSize;
+ dataSize = 1;
+ int selectableLanguage4 = byteArrayToInt(getBytes(data, dataIndex, dataSize));
- dataIndex += dataSize;
- dataSize = 1;
- int selectableLanguage5 = byteArrayToInt(getBytes(data, dataIndex, dataSize));
+ dataIndex += dataSize;
+ dataSize = 1;
+ int selectableLanguage5 = byteArrayToInt(getBytes(data, dataIndex, dataSize));
+ // Pump's screen on time can't be less than 5
+ failed = pump.lcdOnTimeSec < 5 ? true : false;
- if (Config.logDanaMessageDetail) {
- log.debug("timeDisplayType: " + pump.timeDisplayType);
- log.debug("buttonScrollOnOff: " + pump.buttonScrollOnOff);
- log.debug("beepAndAlarm: " + pump.beepAndAlarm);
- log.debug("lcdOnTimeSec: " + pump.lcdOnTimeSec);
- log.debug("backlightOnTimeSec: " + pump.backlightOnTimeSec);
- log.debug("selectedLanguage: " + pump.selectedLanguage);
- log.debug("Pump units: " + (pump.units == DanaRPump.UNITS_MGDL ? "MGDL" : "MMOL"));
- log.debug("shutdownHour: " + pump.shutdownHour);
- log.debug("lowReservoirRate: " + pump.lowReservoirRate);
- log.debug("refillAmount: " + pump.refillAmount);
- log.debug("selectableLanguage1: " + selectableLanguage1);
- log.debug("selectableLanguage2: " + selectableLanguage2);
- log.debug("selectableLanguage3: " + selectableLanguage3);
- log.debug("selectableLanguage4: " + selectableLanguage4);
- log.debug("selectableLanguage5: " + selectableLanguage5);
- }
- }
+ if (L.isEnabled(L.PUMPCOMM)) {
+ log.debug("timeDisplayType: " + pump.timeDisplayType);
+ log.debug("buttonScrollOnOff: " + pump.buttonScrollOnOff);
+ log.debug("beepAndAlarm: " + pump.beepAndAlarm);
+ log.debug("lcdOnTimeSec: " + pump.lcdOnTimeSec);
+ log.debug("backlightOnTimeSec: " + pump.backlightOnTimeSec);
+ log.debug("selectedLanguage: " + pump.selectedLanguage);
+ log.debug("Pump units: " + (pump.units == DanaRPump.UNITS_MGDL ? "MGDL" : "MMOL"));
+ log.debug("shutdownHour: " + pump.shutdownHour);
+ log.debug("lowReservoirRate: " + pump.lowReservoirRate);
+ log.debug("refillAmount: " + pump.refillAmount);
+ log.debug("selectableLanguage1: " + selectableLanguage1);
+ log.debug("selectableLanguage2: " + selectableLanguage2);
+ log.debug("selectableLanguage3: " + selectableLanguage3);
+ log.debug("selectableLanguage4: " + selectableLanguage4);
+ log.debug("selectableLanguage5: " + selectableLanguage5);
+ }
+ }
- @Override
- public String getFriendlyName() {
- return "OPTION__GET_USER_OPTION";
- }
+ @Override
+ public String getFriendlyName() {
+ return "OPTION__GET_USER_OPTION";
+ }
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Option_Set_Pump_Time.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Option_Set_Pump_Time.java
index 007623afca..f43f82fb15 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Option_Set_Pump_Time.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Option_Set_Pump_Time.java
@@ -1,16 +1,16 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Date;
-import info.nightscout.androidaps.Config;
-
-import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.androidaps.logging.L;
public class DanaRS_Packet_Option_Set_Pump_Time extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Option_Set_Pump_Time.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
private Date date;
public int error;
@@ -22,7 +22,7 @@ public class DanaRS_Packet_Option_Set_Pump_Time extends DanaRS_Packet {
public DanaRS_Packet_Option_Set_Pump_Time(Date date) {
this();
this.date = date;
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Setting pump time " + date.toLocaleString());
}
}
@@ -44,7 +44,8 @@ public class DanaRS_Packet_Option_Set_Pump_Time extends DanaRS_Packet {
int dataIndex = DATA_START;
int dataSize = 1;
error = byteArrayToInt(getBytes(data, dataIndex, dataSize));
- if (Config.logDanaMessageDetail) {
+ failed = error != 0;
+ if (L.isEnabled(L.PUMPCOMM)) {
if (error == 0)
log.debug("Result OK");
else
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Option_Set_User_Option.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Option_Set_User_Option.java
index 40577aaa5d..a64e1e5142 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Option_Set_User_Option.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Option_Set_User_Option.java
@@ -1,21 +1,22 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
public class DanaRS_Packet_Option_Set_User_Option extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Option_Set_User_Option.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
private int error;
public DanaRS_Packet_Option_Set_User_Option() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_OPTION__SET_USER_OPTION;
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Setting user settings");
}
}
@@ -23,14 +24,15 @@ public class DanaRS_Packet_Option_Set_User_Option extends DanaRS_Packet {
@Override
public byte[] getRequestParams() {
DanaRPump pump = DanaRPump.getInstance();
- log.debug("UserOptions:"+(System.currentTimeMillis() - pump.lastConnection)/1000+" s ago"
- +"\ntimeDisplayType:"+pump.timeDisplayType
- +"\nbuttonScroll:"+pump.buttonScrollOnOff
- +"\ntimeDisplayType:"+pump.timeDisplayType
- +"\nlcdOnTimeSec:"+pump.lcdOnTimeSec
- +"\nbacklight:"+pump.backlightOnTimeSec
- +"\npumpUnits:"+pump.units
- +"\nlowReservoir:"+pump.lowReservoirRate);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("UserOptions:" + (System.currentTimeMillis() - pump.lastConnection) / 1000 + " s ago"
+ + "\ntimeDisplayType:" + pump.timeDisplayType
+ + "\nbuttonScroll:" + pump.buttonScrollOnOff
+ + "\ntimeDisplayType:" + pump.timeDisplayType
+ + "\nlcdOnTimeSec:" + pump.lcdOnTimeSec
+ + "\nbacklight:" + pump.backlightOnTimeSec
+ + "\npumpUnits:" + pump.units
+ + "\nlowReservoir:" + pump.lowReservoirRate);
byte[] request = new byte[13];
request[0] = (byte) (pump.timeDisplayType & 0xff);
request[1] = (byte) (pump.buttonScrollOnOff & 0xff);
@@ -53,7 +55,8 @@ public class DanaRS_Packet_Option_Set_User_Option extends DanaRS_Packet {
int dataIndex = DATA_START;
int dataSize = 1;
error = byteArrayToInt(getBytes(data, dataIndex, dataSize));
- if (Config.logDanaMessageDetail) {
+ failed = error != 0;
+ if (L.isEnabled(L.PUMPCOMM)) {
if (error == 0)
log.debug("Result OK");
else
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Review_Bolus_Avg.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Review_Bolus_Avg.java
index e8440b12d2..7a2421c310 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Review_Bolus_Avg.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Review_Bolus_Avg.java
@@ -1,18 +1,20 @@
package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+import com.cozmo.danar.util.BleCommandUtil;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-
-import com.cozmo.danar.util.BleCommandUtil;
+import info.nightscout.androidaps.logging.L;
public class DanaRS_Packet_Review_Bolus_Avg extends DanaRS_Packet {
- private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Review_Bolus_Avg.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public DanaRS_Packet_Review_Bolus_Avg() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_REVIEW__BOLUS_AVG;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -36,7 +38,11 @@ public class DanaRS_Packet_Review_Bolus_Avg extends DanaRS_Packet {
dataIndex += dataSize;
dataSize = 2;
double bolusAvg28 = byteArrayToInt(getBytes(data, dataIndex, dataSize)) / 100d;
- if (Config.logDanaMessageDetail) {
+ double required = (((1 & 0x000000FF) << 8) + (1 & 0x000000FF)) / 100d;
+ if ( bolusAvg03 == bolusAvg07 && bolusAvg07 == bolusAvg14 && bolusAvg14 == bolusAvg21 && bolusAvg21 == bolusAvg28 && bolusAvg28 == required )
+ failed = true;
+
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Bolus average 3d: " + bolusAvg03 + " U");
log.debug("Bolus average 7d: " + bolusAvg07 + " U");
log.debug("Bolus average 14d: " + bolusAvg14 + " U");
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/BLEComm.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/BLEComm.java
index 9df2ebc0a1..be241dbbfd 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/BLEComm.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/BLEComm.java
@@ -25,6 +25,7 @@ import java.util.concurrent.ScheduledFuture;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.events.EventPumpStatusChanged;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
@@ -34,7 +35,7 @@ import info.nightscout.androidaps.plugins.PumpDanaRS.comm.DanaRSMessageHashTable
import info.nightscout.androidaps.plugins.PumpDanaRS.comm.DanaRS_Packet;
import info.nightscout.androidaps.plugins.PumpDanaRS.events.EventDanaRSPacket;
import info.nightscout.androidaps.plugins.PumpDanaRS.events.EventDanaRSPairingSuccess;
-import info.nightscout.utils.NSUpload;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.utils.SP;
/**
@@ -42,12 +43,12 @@ import info.nightscout.utils.SP;
*/
public class BLEComm {
- private static Logger log = LoggerFactory.getLogger(BLEComm.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPBTCOMM);
- private static final long WRITE_DELAY_MILLIS = 50;
+ private final long WRITE_DELAY_MILLIS = 50;
- private static String UART_READ_UUID = "0000fff1-0000-1000-8000-00805f9b34fb";
- private static String UART_WRITE_UUID = "0000fff2-0000-1000-8000-00805f9b34fb";
+ private String UART_READ_UUID = "0000fff1-0000-1000-8000-00805f9b34fb";
+ private String UART_WRITE_UUID = "0000fff2-0000-1000-8000-00805f9b34fb";
private final byte PACKET_START_BYTE = (byte) 0xA5;
private final byte PACKET_END_BYTE = (byte) 0x5A;
@@ -83,19 +84,20 @@ public class BLEComm {
}
private boolean initialize() {
- log.debug("Initializing BLEComm.");
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("Initializing BLEComm.");
if (mBluetoothManager == null) {
mBluetoothManager = ((BluetoothManager) MainApp.instance().getApplicationContext().getSystemService(Context.BLUETOOTH_SERVICE));
if (mBluetoothManager == null) {
- log.debug("Unable to initialize BluetoothManager.");
+ log.error("Unable to initialize BluetoothManager.");
return false;
}
}
mBluetoothAdapter = mBluetoothManager.getAdapter();
if (mBluetoothAdapter == null) {
- log.debug("Unable to obtain a BluetoothAdapter.");
+ log.error("Unable to obtain a BluetoothAdapter.");
return false;
}
@@ -128,7 +130,7 @@ public class BLEComm {
}
if (address == null) {
- log.debug("unspecified address.");
+ log.error("unspecified address.");
return false;
}
@@ -136,11 +138,12 @@ public class BLEComm {
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
if (device == null) {
- log.debug("Device not found. Unable to connect from: " + from);
+ log.error("Device not found. Unable to connect from: " + from);
return false;
}
- log.debug("Trying to create a new connection from: " + from);
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("Trying to create a new connection from: " + from);
mBluetoothGatt = device.connectGatt(service.getApplicationContext(), false, mGattCallback);
setCharacteristicNotification(getUARTReadBTGattChar(), true);
mBluetoothDeviceName = device.getName();
@@ -151,8 +154,9 @@ public class BLEComm {
isConnecting = false;
}
- public void disconnect(String from) {
- log.debug("disconnect from: " + from);
+ public synchronized void disconnect(String from) {
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("disconnect from: " + from);
// cancel previous scheduled disconnection to prevent closing upcomming connection
if (scheduledDisconnection != null)
@@ -160,8 +164,8 @@ public class BLEComm {
scheduledDisconnection = null;
if ((mBluetoothAdapter == null) || (mBluetoothGatt == null)) {
- log.debug("disconnect not possible: (mBluetoothAdapter == null) " + (mBluetoothAdapter == null));
- log.debug("disconnect not possible: (mBluetoothGatt == null) " + (mBluetoothGatt == null));
+ log.error("disconnect not possible: (mBluetoothAdapter == null) " + (mBluetoothAdapter == null));
+ log.error("disconnect not possible: (mBluetoothGatt == null) " + (mBluetoothGatt == null));
return;
}
setCharacteristicNotification(getUARTReadBTGattChar(), false);
@@ -171,7 +175,8 @@ public class BLEComm {
}
public synchronized void close() {
- log.debug("BluetoothAdapter close");
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("BluetoothAdapter close");
if (mBluetoothGatt == null) {
return;
}
@@ -187,21 +192,12 @@ public class BLEComm {
private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
- log.debug("onConnectionStateChange");
-
- if (newState == BluetoothProfile.STATE_CONNECTED) {
- mBluetoothGatt.discoverServices();
- } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
- close();
- isConnected = false;
- isConnecting = false;
- MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTED));
- log.debug("Device was disconnected " + gatt.getDevice().getName());//Device was disconnected
- }
+ onConnectionStateChangeSynchronized(gatt, status, newState); // call it synchronized
}
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
- log.debug("onServicesDiscovered");
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("onServicesDiscovered");
if (status == BluetoothGatt.GATT_SUCCESS) {
findCharacteristic();
}
@@ -210,19 +206,22 @@ public class BLEComm {
}
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
- log.debug("onCharacteristicRead" + (characteristic != null ? ":" + DanaRS_Packet.toHexString(characteristic.getValue()) : ""));
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("onCharacteristicRead" + (characteristic != null ? ":" + DanaRS_Packet.toHexString(characteristic.getValue()) : ""));
addToReadBuffer(characteristic.getValue());
readDataParsing();
}
public void onCharacteristicChanged(BluetoothGatt gatt, final BluetoothGattCharacteristic characteristic) {
- log.debug("onCharacteristicChanged" + (characteristic != null ? ":" + DanaRS_Packet.toHexString(characteristic.getValue()) : ""));
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("onCharacteristicChanged" + (characteristic != null ? ":" + DanaRS_Packet.toHexString(characteristic.getValue()) : ""));
addToReadBuffer(characteristic.getValue());
new Thread(() -> readDataParsing()).start();
}
public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
- log.debug("onCharacteristicWrite" + (characteristic != null ? ":" + DanaRS_Packet.toHexString(characteristic.getValue()) : ""));
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("onCharacteristicWrite" + (characteristic != null ? ":" + DanaRS_Packet.toHexString(characteristic.getValue()) : ""));
new Thread(() -> {
synchronized (mSendQueue) {
// after message sent, check if there is the rest of the message waiting and send it
@@ -237,9 +236,10 @@ public class BLEComm {
};
private synchronized void setCharacteristicNotification(BluetoothGattCharacteristic characteristic, boolean enabled) {
- log.debug("setCharacteristicNotification");
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("setCharacteristicNotification");
if ((mBluetoothAdapter == null) || (mBluetoothGatt == null)) {
- log.debug("BluetoothAdapter not initialized_ERROR");
+ log.error("BluetoothAdapter not initialized_ERROR");
isConnecting = false;
isConnected = false;
return;
@@ -248,9 +248,10 @@ public class BLEComm {
}
public synchronized void readCharacteristic(BluetoothGattCharacteristic characteristic) {
- log.debug("readCharacteristic");
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("readCharacteristic");
if ((mBluetoothAdapter == null) || (mBluetoothGatt == null)) {
- log.debug("BluetoothAdapter not initialized_ERROR");
+ log.error("BluetoothAdapter not initialized_ERROR");
isConnecting = false;
isConnected = false;
return;
@@ -263,7 +264,7 @@ public class BLEComm {
SystemClock.sleep(WRITE_DELAY_MILLIS);
if ((mBluetoothAdapter == null) || (mBluetoothGatt == null)) {
- log.debug("BluetoothAdapter not initialized_ERROR");
+ log.error("BluetoothAdapter not initialized_ERROR");
isConnecting = false;
isConnected = false;
return;
@@ -271,7 +272,8 @@ public class BLEComm {
characteristic.setValue(data);
characteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE);
- log.debug("writeCharacteristic:" + DanaRS_Packet.toHexString(data));
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("writeCharacteristic:" + DanaRS_Packet.toHexString(data));
mBluetoothGatt.writeCharacteristic(characteristic);
}).start();
}
@@ -291,9 +293,10 @@ public class BLEComm {
}
private List getSupportedGattServices() {
- log.debug("getSupportedGattServices");
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("getSupportedGattServices");
if ((mBluetoothAdapter == null) || (mBluetoothGatt == null)) {
- log.debug("BluetoothAdapter not initialized_ERROR");
+ log.error("BluetoothAdapter not initialized_ERROR");
isConnecting = false;
isConnected = false;
return null;
@@ -325,6 +328,22 @@ public class BLEComm {
}
}
+ private synchronized void onConnectionStateChangeSynchronized(BluetoothGatt gatt, int status, int newState) {
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("onConnectionStateChange");
+
+ if (newState == BluetoothProfile.STATE_CONNECTED) {
+ mBluetoothGatt.discoverServices();
+ } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
+ close();
+ isConnected = false;
+ isConnecting = false;
+ MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTED));
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("Device was disconnected " + gatt.getDevice().getName());//Device was disconnected
+ }
+ }
+
private final byte[] readBuffer = new byte[1024];
private int bufferLength = 0;
@@ -356,7 +375,8 @@ public class BLEComm {
if ((readBuffer[idxStartByte] == PACKET_START_BYTE) && (readBuffer[idxStartByte + 1] == PACKET_START_BYTE)) {
if (idxStartByte > 0) {
// if buffer doesn't start with signature remove the leading trash
- log.debug("Shifting the input buffer by " + idxStartByte + " bytes");
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("Shifting the input buffer by " + idxStartByte + " bytes");
System.arraycopy(readBuffer, idxStartByte, readBuffer, 0, bufferLength - idxStartByte);
bufferLength -= idxStartByte;
}
@@ -386,7 +406,7 @@ public class BLEComm {
try {
System.arraycopy(readBuffer, length + 7, readBuffer, 0, bufferLength - (length + 7));
} catch (Exception e) {
- log.debug("length: " + length + "bufferLength: " + bufferLength);
+ log.error("length: " + length + "bufferLength: " + bufferLength);
throw e;
}
bufferLength -= (length + 7);
@@ -399,7 +419,7 @@ public class BLEComm {
inputBuffer = BleCommandUtil.getInstance().getDecryptedPacket(inputBuffer);
if (inputBuffer == null) {
- log.debug("Null decryptedInputBuffer");
+ log.error("Null decryptedInputBuffer");
return;
}
@@ -410,14 +430,17 @@ public class BLEComm {
// 1st packet
case (byte) BleCommandUtil.DANAR_PACKET__OPCODE_ENCRYPTION__PUMP_CHECK:
if (inputBuffer.length == 4 && inputBuffer[2] == 'O' && inputBuffer[3] == 'K') {
- log.debug("<<<<< " + "ENCRYPTION__PUMP_CHECK (OK)" + " " + DanaRS_Packet.toHexString(inputBuffer));
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("<<<<< " + "ENCRYPTION__PUMP_CHECK (OK)" + " " + DanaRS_Packet.toHexString(inputBuffer));
// Grab pairing key from preferences if exists
String pairingKey = SP.getString(MainApp.gs(R.string.key_danars_pairingkey) + DanaRSPlugin.mDeviceName, null);
- log.debug("Using stored pairing key: " + pairingKey);
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("Using stored pairing key: " + pairingKey);
if (pairingKey != null) {
byte[] encodedPairingKey = DanaRS_Packet.hexToBytes(pairingKey);
byte[] bytes = BleCommandUtil.getInstance().getEncryptedPacket(BleCommandUtil.DANAR_PACKET__OPCODE_ENCRYPTION__CHECK_PASSKEY, encodedPairingKey, null);
- log.debug(">>>>> " + "ENCRYPTION__CHECK_PASSKEY" + " " + DanaRS_Packet.toHexString(bytes));
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug(">>>>> " + "ENCRYPTION__CHECK_PASSKEY" + " " + DanaRS_Packet.toHexString(bytes));
writeCharacteristic_NO_RESPONSE(getUARTWriteBTGattChar(), bytes);
} else {
// Stored pairing key does not exists, request pairing
@@ -425,19 +448,22 @@ public class BLEComm {
}
} else if (inputBuffer.length == 6 && inputBuffer[2] == 'P' && inputBuffer[3] == 'U' && inputBuffer[4] == 'M' && inputBuffer[5] == 'P') {
- log.debug("<<<<< " + "ENCRYPTION__PUMP_CHECK (PUMP)" + " " + DanaRS_Packet.toHexString(inputBuffer));
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("<<<<< " + "ENCRYPTION__PUMP_CHECK (PUMP)" + " " + DanaRS_Packet.toHexString(inputBuffer));
mSendQueue.clear();
MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTED, MainApp.gs(R.string.pumperror)));
NSUpload.uploadError(MainApp.gs(R.string.pumperror));
Notification n = new Notification(Notification.PUMPERROR, MainApp.gs(R.string.pumperror), Notification.URGENT);
MainApp.bus().post(new EventNewNotification(n));
} else if (inputBuffer.length == 6 && inputBuffer[2] == 'B' && inputBuffer[3] == 'U' && inputBuffer[4] == 'S' && inputBuffer[5] == 'Y') {
- log.debug("<<<<< " + "ENCRYPTION__PUMP_CHECK (BUSY)" + " " + DanaRS_Packet.toHexString(inputBuffer));
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("<<<<< " + "ENCRYPTION__PUMP_CHECK (BUSY)" + " " + DanaRS_Packet.toHexString(inputBuffer));
mSendQueue.clear();
MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTED, MainApp.gs(R.string.pumpbusy)));
} else {
// ERROR in response, wrong serial number
- log.debug("<<<<< " + "ENCRYPTION__PUMP_CHECK (ERROR)" + " " + DanaRS_Packet.toHexString(inputBuffer));
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("<<<<< " + "ENCRYPTION__PUMP_CHECK (ERROR)" + " " + DanaRS_Packet.toHexString(inputBuffer));
mSendQueue.clear();
MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTED, MainApp.gs(R.string.connectionerror)));
SP.remove(MainApp.gs(R.string.key_danars_pairingkey) + DanaRSPlugin.mDeviceName);
@@ -447,7 +473,8 @@ public class BLEComm {
break;
// 2nd packet, pairing key
case (byte) BleCommandUtil.DANAR_PACKET__OPCODE_ENCRYPTION__CHECK_PASSKEY:
- log.debug("<<<<< " + "ENCRYPTION__CHECK_PASSKEY" + " " + DanaRS_Packet.toHexString(inputBuffer));
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("<<<<< " + "ENCRYPTION__CHECK_PASSKEY" + " " + DanaRS_Packet.toHexString(inputBuffer));
if (inputBuffer[2] == (byte) 0x00) {
// Paring is not requested, sending time info
SendTimeInfo();
@@ -457,35 +484,41 @@ public class BLEComm {
}
break;
case (byte) BleCommandUtil.DANAR_PACKET__OPCODE_ENCRYPTION__PASSKEY_REQUEST:
- log.debug("<<<<< " + "ENCRYPTION__PASSKEY_REQUEST " + DanaRS_Packet.toHexString(inputBuffer));
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("<<<<< " + "ENCRYPTION__PASSKEY_REQUEST " + DanaRS_Packet.toHexString(inputBuffer));
if (inputBuffer[2] != (byte) 0x00) {
disconnect("passkey request failed");
}
break;
// Paring response, OK button on pump pressed
case (byte) BleCommandUtil.DANAR_PACKET__OPCODE_ENCRYPTION__PASSKEY_RETURN:
- log.debug("<<<<< " + "ENCRYPTION__PASSKEY_RETURN " + DanaRS_Packet.toHexString(inputBuffer));
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("<<<<< " + "ENCRYPTION__PASSKEY_RETURN " + DanaRS_Packet.toHexString(inputBuffer));
// Paring is successfull, sending time info
MainApp.bus().post(new EventDanaRSPairingSuccess());
SendTimeInfo();
byte[] pairingKey = {inputBuffer[2], inputBuffer[3]};
// store pairing key to preferences
SP.putString(MainApp.gs(R.string.key_danars_pairingkey) + DanaRSPlugin.mDeviceName, DanaRS_Packet.bytesToHex(pairingKey));
- log.debug("Got pairing key: " + DanaRS_Packet.bytesToHex(pairingKey));
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("Got pairing key: " + DanaRS_Packet.bytesToHex(pairingKey));
break;
// time and user password information. last packet in handshake
case (byte) BleCommandUtil.DANAR_PACKET__OPCODE_ENCRYPTION__TIME_INFORMATION:
- log.debug("<<<<< " + "ENCRYPTION__TIME_INFORMATION " + /*message.getMessageName() + " " + */ DanaRS_Packet.toHexString(inputBuffer));
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("<<<<< " + "ENCRYPTION__TIME_INFORMATION " + /*message.getMessageName() + " " + */ DanaRS_Packet.toHexString(inputBuffer));
int size = inputBuffer.length;
int pass = ((inputBuffer[size - 1] & 0x000000FF) << 8) + ((inputBuffer[size - 2] & 0x000000FF));
pass = pass ^ 3463;
DanaRPump.getInstance().rs_password = Integer.toHexString(pass);
- log.debug("Pump user password: " + Integer.toHexString(pass));
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("Pump user password: " + Integer.toHexString(pass));
MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.CONNECTED));
isConnected = true;
isConnecting = false;
- log.debug("RS connected and status read");
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("RS connected and status read");
break;
}
break;
@@ -503,7 +536,8 @@ public class BLEComm {
message = DanaRSMessageHashTable.findMessage(receivedCommand);
}
if (message != null) {
- log.debug("<<<<< " + message.getFriendlyName() + " " + DanaRS_Packet.toHexString(inputBuffer));
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("<<<<< " + message.getFriendlyName() + " " + DanaRS_Packet.toHexString(inputBuffer));
// process received data
message.handleMessage(inputBuffer);
message.setReceived();
@@ -540,7 +574,8 @@ public class BLEComm {
byte[] command = {(byte) message.getType(), (byte) message.getOpCode()};
byte[] params = message.getRequestParams();
- log.debug(">>>>> " + message.getFriendlyName() + " " + DanaRS_Packet.toHexString(command) + " " + DanaRS_Packet.toHexString(params));
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug(">>>>> " + message.getFriendlyName() + " " + DanaRS_Packet.toHexString(command) + " " + DanaRS_Packet.toHexString(params));
byte[] bytes = BleCommandUtil.getInstance().getEncryptedPacket(message.getOpCode(), params, null);
// If there is another message not completely sent, add to queue only
if (mSendQueue.size() > 0) {
@@ -620,20 +655,23 @@ public class BLEComm {
MainApp.instance().startActivity(i);
byte[] bytes = BleCommandUtil.getInstance().getEncryptedPacket(BleCommandUtil.DANAR_PACKET__OPCODE_ENCRYPTION__PASSKEY_REQUEST, null, null);
- log.debug(">>>>> " + "ENCRYPTION__PASSKEY_REQUEST" + " " + DanaRS_Packet.toHexString(bytes));
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug(">>>>> " + "ENCRYPTION__PASSKEY_REQUEST" + " " + DanaRS_Packet.toHexString(bytes));
writeCharacteristic_NO_RESPONSE(getUARTWriteBTGattChar(), bytes);
}
private void SendPumpCheck() {
// 1st message sent to pump after connect
byte[] bytes = BleCommandUtil.getInstance().getEncryptedPacket(BleCommandUtil.DANAR_PACKET__OPCODE_ENCRYPTION__PUMP_CHECK, null, getConnectDeviceName());
- log.debug(">>>>> " + "ENCRYPTION__PUMP_CHECK (0x00)" + " " + DanaRS_Packet.toHexString(bytes));
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug(">>>>> " + "ENCRYPTION__PUMP_CHECK (0x00)" + " " + DanaRS_Packet.toHexString(bytes));
writeCharacteristic_NO_RESPONSE(getUARTWriteBTGattChar(), bytes);
}
private void SendTimeInfo() {
byte[] bytes = BleCommandUtil.getInstance().getEncryptedPacket(BleCommandUtil.DANAR_PACKET__OPCODE_ENCRYPTION__TIME_INFORMATION, null, null);
- log.debug(">>>>> " + "ENCRYPTION__TIME_INFORMATION" + " " + DanaRS_Packet.toHexString(bytes));
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug(">>>>> " + "ENCRYPTION__TIME_INFORMATION" + " " + DanaRS_Packet.toHexString(bytes));
writeCharacteristic_NO_RESPONSE(getUARTWriteBTGattChar(), bytes);
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java
index fae0430adc..ce63eb9859 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java
@@ -13,7 +13,6 @@ import org.slf4j.LoggerFactory;
import java.util.Date;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
@@ -24,7 +23,9 @@ import info.nightscout.androidaps.events.EventInitializationChanged;
import info.nightscout.androidaps.events.EventProfileSwitchChange;
import info.nightscout.androidaps.events.EventPumpStatusChanged;
import info.nightscout.androidaps.interfaces.PumpInterface;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.Overview.Dialogs.BolusProgressDialog;
import info.nightscout.androidaps.plugins.Overview.Dialogs.ErrorHelperActivity;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
@@ -78,18 +79,17 @@ import info.nightscout.androidaps.plugins.Treatments.Treatment;
import info.nightscout.androidaps.queue.Callback;
import info.nightscout.androidaps.queue.commands.Command;
import info.nightscout.utils.DateUtil;
-import info.nightscout.utils.NSUpload;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.utils.SP;
import info.nightscout.utils.T;
public class DanaRSService extends Service {
- private static Logger log = LoggerFactory.getLogger(DanaRSService.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
private BLEComm bleComm = BLEComm.getInstance(this);
private IBinder mBinder = new LocalBinder();
- private DanaRPump danaRPump = DanaRPump.getInstance();
private Treatment bolusingTreatment = null;
private long lastHistoryFetched = 0;
@@ -129,6 +129,7 @@ public class DanaRSService extends Service {
}
public void getPumpStatus() {
+ DanaRPump danaRPump = DanaRPump.getInstance();
try {
MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpstatus)));
@@ -142,7 +143,7 @@ public class DanaRSService extends Service {
danaRPump.lastConnection = System.currentTimeMillis();
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
if (profile != null && Math.abs(danaRPump.currentBasal - profile.getBasal()) >= pump.getPumpDescription().basalStep) {
MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpsettings)));
@@ -155,11 +156,13 @@ public class DanaRSService extends Service {
MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumptime)));
bleComm.sendMessage(new DanaRS_Packet_Option_Get_Pump_Time());
- long timeDiff = (danaRPump.pumpTime.getTime() - System.currentTimeMillis()) / 1000L;
- log.debug("Pump time difference: " + timeDiff + " seconds");
+ long timeDiff = (danaRPump.pumpTime - System.currentTimeMillis()) / 1000L;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Pump time difference: " + timeDiff + " seconds");
if (Math.abs(timeDiff) > 3) {
- if (Math.abs(timeDiff) > 60*60*1.5) {
- log.debug("Pump time difference: " + timeDiff + " seconds - large difference");
+ if (Math.abs(timeDiff) > 60 * 60 * 1.5) {
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Pump time difference: " + timeDiff + " seconds - large difference");
//If time-diff is very large, warn user until we can synchronize history readings properly
Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class);
i.putExtra("soundid", R.raw.error);
@@ -178,8 +181,9 @@ public class DanaRSService extends Service {
// add 10sec to be sure we are over minute (will be cutted off anyway)
bleComm.sendMessage(new DanaRS_Packet_Option_Set_Pump_Time(new Date(DateUtil.now() + T.secs(10).msecs())));
bleComm.sendMessage(new DanaRS_Packet_Option_Get_Pump_Time());
- timeDiff = (danaRPump.pumpTime.getTime() - System.currentTimeMillis()) / 1000L;
- log.debug("Pump time difference: " + timeDiff + " seconds");
+ timeDiff = (danaRPump.pumpTime - System.currentTimeMillis()) / 1000L;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Pump time difference: " + timeDiff + " seconds");
}
}
@@ -203,8 +207,9 @@ public class DanaRSService extends Service {
MainApp.bus().post(new EventInitializationChanged());
NSUpload.uploadDeviceStatus();
if (danaRPump.dailyTotalUnits > danaRPump.maxDailyTotalUnits * Constants.dailyLimitWarning) {
- log.debug("Approaching daily limit: " + danaRPump.dailyTotalUnits + "/" + danaRPump.maxDailyTotalUnits);
- if(System.currentTimeMillis() > lastApproachingDailyLimit + 30 * 60 * 1000) {
+ if (L.isEnabled(L.PUMPCOMM))
+ 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) + ": " + danaRPump.dailyTotalUnits + "/" + danaRPump.maxDailyTotalUnits + "U");
@@ -214,12 +219,13 @@ public class DanaRSService extends Service {
} catch (Exception e) {
log.error("Unhandled exception", e);
}
- log.debug("Pump status loaded");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Pump status loaded");
}
public PumpEnactResult loadEvents() {
- if(!MainApp.getSpecificPlugin(DanaRSPlugin.class).isInitialized()){
+ if (!MainApp.getSpecificPlugin(DanaRSPlugin.class).isInitialized()) {
PumpEnactResult result = new PumpEnactResult().success(false);
result.comment = "pump not initialized";
return result;
@@ -230,10 +236,12 @@ public class DanaRSService extends Service {
DanaRS_Packet_APS_History_Events msg;
if (lastHistoryFetched == 0) {
msg = new DanaRS_Packet_APS_History_Events(0);
- log.debug("Loading complete event history");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Loading complete event history");
} else {
msg = new DanaRS_Packet_APS_History_Events(lastHistoryFetched);
- log.debug("Loading event history from: " + new Date(lastHistoryFetched).toLocaleString());
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Loading event history from: " +DateUtil.dateAndTimeFullString(lastHistoryFetched));
}
bleComm.sendMessage(msg);
while (!msg.done && bleComm.isConnected()) {
@@ -243,8 +251,9 @@ public class DanaRSService extends Service {
lastHistoryFetched = DanaRS_Packet_APS_History_Events.lastEventTimeLoaded - T.mins(1).msecs();
else
lastHistoryFetched = 0;
- log.debug("Events loaded");
- danaRPump.lastConnection = System.currentTimeMillis();
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Events loaded");
+ DanaRPump.getInstance().lastConnection = System.currentTimeMillis();
return new PumpEnactResult().success(true);
}
@@ -290,7 +299,8 @@ public class DanaRSService extends Service {
if ((System.currentTimeMillis() - progress.lastReceive) > 15 * 1000L) { // if i didn't receive status for more than 20 sec expecting broken comm
stop.stopped = true;
stop.forced = true;
- log.debug("Communication stopped");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Communication stopped");
}
}
}
@@ -335,7 +345,7 @@ public class DanaRSService extends Service {
}
public void bolusStop() {
- if (Config.logDanaBTComm)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("bolusStop >>>>> @ " + (bolusingTreatment == null ? "" : bolusingTreatment.insulin));
DanaRS_Packet_Bolus_Set_Step_Bolus_Stop stop = new DanaRS_Packet_Bolus_Set_Step_Bolus_Stop();
stop.forced = true;
@@ -352,7 +362,7 @@ public class DanaRSService extends Service {
public boolean tempBasal(Integer percent, int durationInHours) {
if (!isConnected()) return false;
- if (danaRPump.isTempBasalInProgress) {
+ if (DanaRPump.getInstance().isTempBasalInProgress) {
MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal)));
bleComm.sendMessage(new DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal());
SystemClock.sleep(500);
@@ -367,7 +377,7 @@ public class DanaRSService extends Service {
}
public boolean highTempBasal(Integer percent) {
- if (danaRPump.isTempBasalInProgress) {
+ if (DanaRPump.getInstance().isTempBasalInProgress) {
MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal)));
bleComm.sendMessage(new DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal());
SystemClock.sleep(500);
@@ -386,7 +396,7 @@ public class DanaRSService extends Service {
return false;
}
- if (danaRPump.isTempBasalInProgress) {
+ if (DanaRPump.getInstance().isTempBasalInProgress) {
MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal)));
bleComm.sendMessage(new DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal());
SystemClock.sleep(500);
@@ -433,12 +443,12 @@ public class DanaRSService extends Service {
public boolean updateBasalsInPump(Profile profile) {
if (!isConnected()) return false;
MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.updatingbasalrates)));
- double[] basal = DanaRPump.buildDanaRProfileRecord(profile);
+ double[] basal = DanaRPump.getInstance().buildDanaRProfileRecord(profile);
DanaRS_Packet_Basal_Set_Profile_Basal_Rate msgSet = new DanaRS_Packet_Basal_Set_Profile_Basal_Rate(0, basal);
bleComm.sendMessage(msgSet);
DanaRS_Packet_Basal_Set_Profile_Number msgActivate = new DanaRS_Packet_Basal_Set_Profile_Number(0);
bleComm.sendMessage(msgActivate);
- danaRPump.lastSettingsRead = 0; // force read full settings
+ DanaRPump.getInstance().lastSettingsRead = 0; // force read full settings
getPumpStatus();
MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTING));
return true;
@@ -512,12 +522,10 @@ public class DanaRSService extends Service {
@Subscribe
public void onStatusEvent(EventAppExit event) {
- if (Config.logFunctionCalls)
+ if (L.isEnabled(L.PUMP))
log.debug("EventAppExit received");
stopSelf();
- if (Config.logFunctionCalls)
- log.debug("EventAppExit finished");
}
void waitForWholeMinute() {
@@ -526,7 +534,7 @@ public class DanaRSService extends Service {
long timeToWholeMinute = (60000 - time % 60000);
if (timeToWholeMinute > 59800 || timeToWholeMinute < 300)
break;
- MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.waitingfortimesynchronization, (int)(timeToWholeMinute / 1000))));
+ MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.waitingfortimesynchronization, (int) (timeToWholeMinute / 1000))));
SystemClock.sleep(Math.min(timeToWholeMinute, 100));
}
}
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 e83f9d9435..86c07b89ff 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java
@@ -2,7 +2,6 @@ package info.nightscout.androidaps.plugins.PumpDanaRv2;
import android.content.ComponentName;
import android.content.Context;
-import android.content.DialogInterface;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
@@ -11,9 +10,6 @@ import android.support.v7.app.AlertDialog;
import com.squareup.otto.Subscribe;
-import org.slf4j.LoggerFactory;
-
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.DetailedBolusInfo;
@@ -22,10 +18,12 @@ import info.nightscout.androidaps.data.PumpEnactResult;
import info.nightscout.androidaps.db.TemporaryBasal;
import info.nightscout.androidaps.events.EventAppExit;
import info.nightscout.androidaps.interfaces.Constraint;
-import info.nightscout.androidaps.interfaces.PumpDescription;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
import info.nightscout.androidaps.plugins.ConfigBuilder.DetailedBolusInfoStorage;
+import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpType;
import info.nightscout.androidaps.plugins.PumpDanaR.AbstractDanaRPlugin;
+import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MsgBolusStartWithSpeed;
import info.nightscout.androidaps.plugins.PumpDanaRv2.services.DanaRv2ExecutionService;
import info.nightscout.androidaps.plugins.Treatments.Treatment;
@@ -51,39 +49,8 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin {
private DanaRv2Plugin() {
pluginDescription.description(R.string.description_pump_dana_r_v2);
- log = LoggerFactory.getLogger(DanaRv2Plugin.class);
useExtendedBoluses = false;
-
- pumpDescription.isBolusCapable = true;
- pumpDescription.bolusStep = 0.05d;
-
- pumpDescription.isExtendedBolusCapable = true;
- pumpDescription.extendedBolusStep = 0.05d;
- pumpDescription.extendedBolusDurationStep = 30;
- pumpDescription.extendedBolusMaxDuration = 8 * 60;
-
- pumpDescription.isTempBasalCapable = true;
- pumpDescription.tempBasalStyle = PumpDescription.PERCENT;
-
- pumpDescription.maxTempPercent = 200;
- pumpDescription.tempPercentStep = 10;
-
- pumpDescription.tempDurationStep = 60;
- pumpDescription.tempDurationStep15mAllowed = true;
- pumpDescription.tempDurationStep30mAllowed = true;
- pumpDescription.tempMaxDuration = 24 * 60;
-
-
- pumpDescription.isSetBasalProfileCapable = true;
- pumpDescription.basalStep = 0.01d;
- pumpDescription.basalMinimumRate = 0.04d;
-
- pumpDescription.isRefillingCapable = true;
-
- pumpDescription.storesCarbInfo = true;
-
- pumpDescription.supportsTDDs = true;
- pumpDescription.needsManualTDDLoad = true;
+ pumpDescription.setPumpDescription(PumpType.DanaRv2);
}
@Override
@@ -107,12 +74,14 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin {
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceDisconnected(ComponentName name) {
- log.debug("Service is disconnected");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Service is disconnected");
sExecutionService = null;
}
public void onServiceConnected(ComponentName name, IBinder service) {
- log.debug("Service is connected");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Service is connected");
DanaRv2ExecutionService.LocalBinder mLocalBinder = (DanaRv2ExecutionService.LocalBinder) service;
sExecutionService = mLocalBinder.getServiceInstance();
}
@@ -142,29 +111,37 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin {
@Override
public boolean isInitialized() {
- return pump.lastConnection > 0 && pump.maxBasal > 0;
+ return DanaRPump.getInstance().lastConnection > 0 && DanaRPump.getInstance().maxBasal > 0 && DanaRPump.getInstance().isPasswordOK();
+ }
+
+ @Override
+ public boolean isHandshakeInProgress() {
+ return sExecutionService != null && sExecutionService.isHandshakeInProgress();
+ }
+
+ @Override
+ public void finishHandshaking() {
+ sExecutionService.finishHandshaking();
}
@Override
public void switchAllowed(ConfigBuilderFragment.PluginViewHolder.PluginSwitcher pluginSwitcher, FragmentActivity context) {
boolean allowHardwarePump = SP.getBoolean("allow_hardware_pump", false);
- if (allowHardwarePump || context == null){
+ if (allowHardwarePump || context == null) {
pluginSwitcher.invoke();
} else {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage(R.string.allow_hardware_pump_text)
- .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- pluginSwitcher.invoke();
- SP.putBoolean("allow_hardware_pump", true);
+ .setPositiveButton(R.string.yes, (dialog, id) -> {
+ pluginSwitcher.invoke();
+ SP.putBoolean("allow_hardware_pump", true);
+ if (L.isEnabled(L.PUMP))
log.debug("First time HW pump allowed!");
- }
})
- .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- pluginSwitcher.cancel();
+ .setNegativeButton(R.string.cancel, (dialog, id) -> {
+ pluginSwitcher.cancel();
+ if (L.isEnabled(L.PUMP))
log.debug("User does not allow switching to HW pump!");
- }
});
builder.create().show();
}
@@ -190,7 +167,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin {
speed = 60;
break;
}
- detailedBolusInfo.date = DateUtil.now() + (long)(speed * detailedBolusInfo.insulin * 1000);
+ detailedBolusInfo.date = DateUtil.now() + (long) (speed * detailedBolusInfo.insulin * 1000);
// clean carbs to prevent counting them as twice because they will picked up as another record
// I don't think it's necessary to copy DetailedBolusInfo right now for carbs records
double carbs = detailedBolusInfo.carbs;
@@ -214,7 +191,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin {
result.comment = String.format(MainApp.gs(R.string.boluserrorcode), detailedBolusInfo.insulin, t.insulin, MsgBolusStartWithSpeed.errorCode);
else
result.comment = MainApp.gs(R.string.virtualpump_resultok);
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("deliverTreatment: OK. Asked: " + detailedBolusInfo.insulin + " Delivered: " + result.bolusDelivered);
// remove carbs because it's get from history seprately
return result;
@@ -258,7 +235,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin {
if (doTempOff) {
// If temp in progress
if (TreatmentsPlugin.getPlugin().isTempBasalInProgress()) {
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: Stopping temp basal (doTempOff)");
return cancelTempBasal(false);
}
@@ -267,7 +244,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin {
result.percent = 100;
result.isPercent = true;
result.isTempCancel = true;
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: doTempOff OK");
return result;
}
@@ -290,14 +267,14 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin {
result.duration = activeTemp.getPlannedRemainingMinutes();
result.isPercent = true;
result.isTempCancel = false;
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: Correct temp basal already set (doLowTemp || doHighTemp)");
return result;
}
}
}
// Convert duration from minutes to hours
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: Setting temp basal " + percentRate + "% for " + durationInMinutes + " mins (doLowTemp || doHighTemp)");
if (percentRate == 0 && durationInMinutes > 30) {
result = setTempBasalPercent(percentRate, durationInMinutes, profile, false);
@@ -309,7 +286,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin {
log.error("setTempBasalAbsolute: Failed to set hightemp basal");
return result;
}
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalAbsolute: hightemp basal set ok");
return result;
}
@@ -322,6 +299,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin {
@Override
public PumpEnactResult setTempBasalPercent(Integer percent, Integer durationInMinutes, Profile profile, boolean enforceNew) {
+ DanaRPump pump = DanaRPump.getInstance();
PumpEnactResult result = new PumpEnactResult();
percent = MainApp.getConstraintChecker().applyBasalPercentConstraints(new Constraint<>(percent), profile).value();
if (percent < 0) {
@@ -344,7 +322,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin {
result.duration = pump.tempBasalRemainingMin;
result.percent = pump.tempBasalPercent;
result.isPercent = true;
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalPercent: Correct value already set");
return result;
}
@@ -363,7 +341,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin {
result.duration = pump.tempBasalRemainingMin;
result.percent = pump.tempBasalPercent;
result.isPercent = true;
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setTempBasalPercent: OK");
return result;
}
@@ -374,7 +352,8 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin {
return result;
}
- public PumpEnactResult setHighTempBasalPercent(Integer percent) {
+ private PumpEnactResult setHighTempBasalPercent(Integer percent) {
+ DanaRPump pump = DanaRPump.getInstance();
PumpEnactResult result = new PumpEnactResult();
boolean connectionOK = sExecutionService.highTempBasal(percent);
if (connectionOK && pump.isTempBasalInProgress && pump.tempBasalPercent == percent) {
@@ -385,7 +364,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin {
result.duration = pump.tempBasalRemainingMin;
result.percent = pump.tempBasalPercent;
result.isPercent = true;
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("setHighTempBasalPercent: OK");
return result;
}
@@ -405,11 +384,11 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin {
result.enacted = true;
result.isTempCancel = true;
}
- if (!pump.isTempBasalInProgress) {
+ if (!DanaRPump.getInstance().isTempBasalInProgress) {
result.success = true;
result.isTempCancel = true;
result.comment = MainApp.gs(R.string.virtualpump_resultok);
- if (Config.logPumpActions)
+ if (L.isEnabled(L.PUMP))
log.debug("cancelRealTempBasal: OK");
return result;
} else {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/SerialIOThread.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/SerialIOThread.java
index a12e2085aa..61047a8d5a 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/SerialIOThread.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/SerialIOThread.java
@@ -10,7 +10,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase;
import info.nightscout.androidaps.plugins.PumpDanaR.services.AbstractSerialIOThread;
@@ -21,7 +21,7 @@ import info.nightscout.utils.CRC;
* Created by mike on 17.07.2016.
*/
public class SerialIOThread extends AbstractSerialIOThread {
- private static Logger log = LoggerFactory.getLogger(SerialIOThread.class);
+ private static Logger log = LoggerFactory.getLogger(L.PUMPBTCOMM);
private InputStream mInputStream = null;
private OutputStream mOutputStream = null;
@@ -72,7 +72,7 @@ public class SerialIOThread extends AbstractSerialIOThread {
message = MessageHashTable_v2.findMessage(command);
}
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPBTCOMM))
log.debug("<<<<< " + message.getMessageName() + " " + message.toHexString(extractedBuff));
// process the message content
@@ -84,7 +84,7 @@ public class SerialIOThread extends AbstractSerialIOThread {
}
}
} catch (Exception e) {
- if (Config.logDanaSerialEngine && e.getMessage().indexOf("bt socket closed") < 0)
+ if (e.getMessage().indexOf("bt socket closed") < 0)
log.error("Thread exception: ", e);
mKeepRunning = false;
}
@@ -148,7 +148,7 @@ public class SerialIOThread extends AbstractSerialIOThread {
processedMessage = message;
byte[] messageBytes = message.getRawMessageBytes();
- if (Config.logDanaSerialEngine)
+ if (L.isEnabled(L.PUMPBTCOMM))
log.debug(">>>>> " + message.getMessageName() + " " + message.toHexString(messageBytes));
try {
@@ -167,10 +167,10 @@ public class SerialIOThread extends AbstractSerialIOThread {
SystemClock.sleep(200);
if (!message.received) {
- log.warn("Reply not received " + message.getMessageName());
+ log.error("Reply not received " + message.getMessageName());
if (message.getCommand() == 0xF0F1) {
DanaRPump.getInstance().isNewPump = false;
- log.debug("Old firmware detected");
+ log.error("Old firmware detected");
}
}
}
@@ -181,24 +181,29 @@ public class SerialIOThread extends AbstractSerialIOThread {
try {
mInputStream.close();
} catch (Exception e) {
- if (Config.logDanaSerialEngine) log.debug(e.getMessage());
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug(e.getMessage());
}
try {
mOutputStream.close();
} catch (Exception e) {
- if (Config.logDanaSerialEngine) log.debug(e.getMessage());
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug(e.getMessage());
}
try {
mRfCommSocket.close();
} catch (Exception e) {
- if (Config.logDanaSerialEngine) log.debug(e.getMessage());
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug(e.getMessage());
}
try {
System.runFinalization();
} catch (Exception e) {
- if (Config.logDanaSerialEngine) log.debug(e.getMessage());
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug(e.getMessage());
}
- if (Config.logDanaSerialEngine) log.debug("Disconnected: " + reason);
+ if (L.isEnabled(L.PUMPBTCOMM))
+ log.debug("Disconnected: " + reason);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MessageHashTable_v2.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MessageHashTable_v2.java
index 8d1cd12be1..c95a800128 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MessageHashTable_v2.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MessageHashTable_v2.java
@@ -1,8 +1,5 @@
package info.nightscout.androidaps.plugins.PumpDanaRv2.comm;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import java.util.HashMap;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase;
@@ -13,8 +10,6 @@ import info.nightscout.androidaps.plugins.PumpDanaR.comm.*;
* Created by mike on 28.05.2016.
*/
public class MessageHashTable_v2 {
- private static Logger log = LoggerFactory.getLogger(MessageHashTable_v2.class);
-
public static HashMap messages = null;
static {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgCheckValue_v2.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgCheckValue_v2.java
index 0869844a1c..8810edb815 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgCheckValue_v2.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgCheckValue_v2.java
@@ -3,11 +3,11 @@ package info.nightscout.androidaps.plugins.PumpDanaRv2.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.events.EventRefreshGui;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
@@ -21,10 +21,12 @@ import info.nightscout.androidaps.plugins.PumpDanaRv2.DanaRv2Plugin;
* Created by mike on 30.06.2016.
*/
public class MsgCheckValue_v2 extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgCheckValue_v2.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgCheckValue_v2() {
SetCommand(0xF0F1);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -32,7 +34,8 @@ public class MsgCheckValue_v2 extends MessageBase {
DanaRPump pump = DanaRPump.getInstance();
pump.isNewPump = true;
- log.debug("New firmware confirmed");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New firmware confirmed");
pump.model = intFromBuff(bytes, 0, 1);
pump.protocol = intFromBuff(bytes, 1, 1);
@@ -42,7 +45,7 @@ public class MsgCheckValue_v2 extends MessageBase {
Notification notification = new Notification(Notification.WRONG_DRIVER, MainApp.gs(R.string.pumpdrivercorrected), Notification.NORMAL);
MainApp.bus().post(new EventNewNotification(notification));
MainApp.getSpecificPlugin(DanaRPlugin.class).disconnect("Wrong Model");
- log.debug("Wrong model selected. Switching to Korean DanaR");
+ log.error("Wrong model selected. Switching to Korean DanaR");
MainApp.getSpecificPlugin(DanaRKoreanPlugin.class).setPluginEnabled(PluginType.PUMP, true);
MainApp.getSpecificPlugin(DanaRKoreanPlugin.class).setFragmentVisible(PluginType.PUMP, true);
MainApp.getSpecificPlugin(DanaRPlugin.class).setPluginEnabled(PluginType.PUMP, false);
@@ -67,7 +70,7 @@ public class MsgCheckValue_v2 extends MessageBase {
Notification notification = new Notification(Notification.WRONG_DRIVER, MainApp.gs(R.string.pumpdrivercorrected), Notification.NORMAL);
MainApp.bus().post(new EventNewNotification(notification));
DanaRKoreanPlugin.getPlugin().disconnect("Wrong Model");
- log.debug("Wrong model selected. Switching to non APS DanaR");
+ log.error("Wrong model selected. Switching to non APS DanaR");
(MainApp.getSpecificPlugin(DanaRv2Plugin.class)).setPluginEnabled(PluginType.PUMP, false);
(MainApp.getSpecificPlugin(DanaRv2Plugin.class)).setFragmentVisible(PluginType.PUMP, false);
(MainApp.getSpecificPlugin(DanaRPlugin.class)).setPluginEnabled(PluginType.PUMP, true);
@@ -84,7 +87,7 @@ public class MsgCheckValue_v2 extends MessageBase {
ConfigBuilderPlugin.getCommandQueue().readStatus("PumpDriverChange", null); // force new connection
return;
}
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Model: " + String.format("%02X ", pump.model));
log.debug("Protocol: " + String.format("%02X ", pump.protocol));
log.debug("Product Code: " + String.format("%02X ", pump.productCode));
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgHistoryEvents_v2.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgHistoryEvents_v2.java
index 91c01ba38c..b12116e1a0 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgHistoryEvents_v2.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgHistoryEvents_v2.java
@@ -13,6 +13,7 @@ import info.nightscout.androidaps.db.ExtendedBolus;
import info.nightscout.androidaps.db.Source;
import info.nightscout.androidaps.db.TemporaryBasal;
import info.nightscout.androidaps.events.EventPumpStatusChanged;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.DetailedBolusInfoStorage;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase;
@@ -20,7 +21,7 @@ import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.utils.DateUtil;
public class MsgHistoryEvents_v2 extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgHistoryEvents_v2.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public boolean done;
public static long lastEventTimeLoaded = 0;
@@ -31,6 +32,8 @@ public class MsgHistoryEvents_v2 extends MessageBase {
gfrom.setTimeInMillis(from);
AddParamDate(gfrom);
done = false;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
public MsgHistoryEvents_v2() {
@@ -41,6 +44,8 @@ public class MsgHistoryEvents_v2 extends MessageBase {
AddParamByte((byte) 0);
AddParamByte((byte) 0);
done = false;
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
@Override
@@ -53,122 +58,140 @@ public class MsgHistoryEvents_v2 extends MessageBase {
return;
}
- Date datetime = dateTimeSecFromBuff(bytes, 1); // 6 bytes
+ long datetime = dateTimeSecFromBuff(bytes, 1); // 6 bytes
int param1 = intFromBuff(bytes, 7, 2);
int param2 = intFromBuff(bytes, 9, 2);
TemporaryBasal temporaryBasal = new TemporaryBasal()
- .date(datetime.getTime())
+ .date(datetime)
.source(Source.PUMP)
- .pumpId(datetime.getTime());
+ .pumpId(datetime);
- ExtendedBolus extendedBolus = new ExtendedBolus();
- extendedBolus.date = datetime.getTime();
- extendedBolus.source = Source.PUMP;
- extendedBolus.pumpId = datetime.getTime();
-
- DetailedBolusInfo detailedBolusInfo = DetailedBolusInfoStorage.findDetailedBolusInfo(datetime.getTime());
- if (detailedBolusInfo == null) {
- log.debug("Detailed bolus info not found for " + datetime.toLocaleString());
- detailedBolusInfo = new DetailedBolusInfo();
- } else {
- log.debug("Detailed bolus info found: " + detailedBolusInfo);
- }
- detailedBolusInfo.date = datetime.getTime();
- detailedBolusInfo.source = Source.PUMP;
- detailedBolusInfo.pumpId = datetime.getTime();
+ ExtendedBolus extendedBolus = new ExtendedBolus()
+ .date(datetime)
+ .source(Source.PUMP)
+ .pumpId(datetime);
String status = "";
switch (recordCode) {
case DanaRPump.TEMPSTART:
- log.debug("EVENT TEMPSTART (" + recordCode + ") " + datetime.toLocaleString() + " Ratio: " + param1 + "% Duration: " + param2 + "min");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("EVENT TEMPSTART (" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")" + " Ratio: " + param1 + "% Duration: " + param2 + "min");
temporaryBasal.percentRate = param1;
temporaryBasal.durationInMinutes = param2;
TreatmentsPlugin.getPlugin().addToHistoryTempBasal(temporaryBasal);
status = "TEMPSTART " + DateUtil.timeString(datetime);
break;
case DanaRPump.TEMPSTOP:
- log.debug("EVENT TEMPSTOP (" + recordCode + ") " + datetime.toLocaleString());
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("EVENT TEMPSTOP (" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime));
TreatmentsPlugin.getPlugin().addToHistoryTempBasal(temporaryBasal);
status = "TEMPSTOP " + DateUtil.timeString(datetime);
break;
case DanaRPump.EXTENDEDSTART:
- log.debug("EVENT EXTENDEDSTART (" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + (param1 / 100d) + "U Duration: " + param2 + "min");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("EVENT EXTENDEDSTART (" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")" + " Amount: " + (param1 / 100d) + "U Duration: " + param2 + "min");
extendedBolus.insulin = param1 / 100d;
extendedBolus.durationInMinutes = param2;
TreatmentsPlugin.getPlugin().addToHistoryExtendedBolus(extendedBolus);
status = "EXTENDEDSTART " + DateUtil.timeString(datetime);
break;
case DanaRPump.EXTENDEDSTOP:
- log.debug("EVENT EXTENDEDSTOP (" + recordCode + ") " + datetime.toLocaleString() + " Delivered: " + (param1 / 100d) + "U RealDuration: " + param2 + "min");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("EVENT EXTENDEDSTOP (" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")" + " Delivered: " + (param1 / 100d) + "U RealDuration: " + param2 + "min");
TreatmentsPlugin.getPlugin().addToHistoryExtendedBolus(extendedBolus);
status = "EXTENDEDSTOP " + DateUtil.timeString(datetime);
break;
case DanaRPump.BOLUS:
+ DetailedBolusInfo detailedBolusInfo = DetailedBolusInfoStorage.findDetailedBolusInfo(datetime);
+ if (detailedBolusInfo == null) {
+ detailedBolusInfo = new DetailedBolusInfo();
+ }
+ detailedBolusInfo.date = datetime;
+ detailedBolusInfo.source = Source.PUMP;
+ detailedBolusInfo.pumpId = datetime;
+
detailedBolusInfo.insulin = param1 / 100d;
boolean newRecord = TreatmentsPlugin.getPlugin().addToHistoryTreatment(detailedBolusInfo, false);
- log.debug((newRecord ? "**NEW** " : "") + "EVENT BOLUS (" + recordCode + ") " + datetime.toLocaleString() + " Bolus: " + (param1 / 100d) + "U Duration: " + param2 + "min");
- DetailedBolusInfoStorage.remove(detailedBolusInfo.date);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug((newRecord ? "**NEW** " : "") + "EVENT BOLUS (" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")" + " Bolus: " + (param1 / 100d) + "U Duration: " + param2 + "min");
status = "BOLUS " + DateUtil.timeString(datetime);
break;
case DanaRPump.DUALBOLUS:
+ detailedBolusInfo = DetailedBolusInfoStorage.findDetailedBolusInfo(datetime);
+ if (detailedBolusInfo == null) {
+ detailedBolusInfo = new DetailedBolusInfo();
+ }
+ detailedBolusInfo.date = datetime;
+ detailedBolusInfo.source = Source.PUMP;
+ detailedBolusInfo.pumpId = datetime;
+
detailedBolusInfo.insulin = param1 / 100d;
newRecord = TreatmentsPlugin.getPlugin().addToHistoryTreatment(detailedBolusInfo, false);
- log.debug((newRecord ? "**NEW** " : "") + "EVENT DUALBOLUS (" + recordCode + ") " + datetime.toLocaleString() + " Bolus: " + (param1 / 100d) + "U Duration: " + param2 + "min");
- DetailedBolusInfoStorage.remove(detailedBolusInfo.date);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug((newRecord ? "**NEW** " : "") + "EVENT DUALBOLUS (" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")" + " Bolus: " + (param1 / 100d) + "U Duration: " + param2 + "min");
status = "DUALBOLUS " + DateUtil.timeString(datetime);
break;
case DanaRPump.DUALEXTENDEDSTART:
- log.debug("EVENT DUALEXTENDEDSTART (" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + (param1 / 100d) + "U Duration: " + param2 + "min");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("EVENT DUALEXTENDEDSTART (" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")" + " Amount: " + (param1 / 100d) + "U Duration: " + param2 + "min");
extendedBolus.insulin = param1 / 100d;
extendedBolus.durationInMinutes = param2;
TreatmentsPlugin.getPlugin().addToHistoryExtendedBolus(extendedBolus);
status = "DUALEXTENDEDSTART " + DateUtil.timeString(datetime);
break;
case DanaRPump.DUALEXTENDEDSTOP:
- log.debug("EVENT DUALEXTENDEDSTOP (" + recordCode + ") " + datetime.toLocaleString() + " Delivered: " + (param1 / 100d) + "U RealDuration: " + param2 + "min");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("EVENT DUALEXTENDEDSTOP (" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")" + " Delivered: " + (param1 / 100d) + "U RealDuration: " + param2 + "min");
TreatmentsPlugin.getPlugin().addToHistoryExtendedBolus(extendedBolus);
status = "DUALEXTENDEDSTOP " + DateUtil.timeString(datetime);
break;
case DanaRPump.SUSPENDON:
- log.debug("EVENT SUSPENDON (" + recordCode + ") " + datetime.toLocaleString());
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("EVENT SUSPENDON (" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")");
status = "SUSPENDON " + DateUtil.timeString(datetime);
break;
case DanaRPump.SUSPENDOFF:
- log.debug("EVENT SUSPENDOFF (" + recordCode + ") " + datetime.toLocaleString());
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("EVENT SUSPENDOFF (" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")");
status = "SUSPENDOFF " + DateUtil.timeString(datetime);
break;
case DanaRPump.REFILL:
- log.debug("EVENT REFILL (" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + param1 / 100d + "U");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("EVENT REFILL (" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")" + " Amount: " + param1 / 100d + "U");
status = "REFILL " + DateUtil.timeString(datetime);
break;
case DanaRPump.PRIME:
- log.debug("EVENT PRIME (" + recordCode + ") " + datetime.toLocaleString() + " Amount: " + param1 / 100d + "U");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("EVENT PRIME (" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")" + " Amount: " + param1 / 100d + "U");
status = "PRIME " + DateUtil.timeString(datetime);
break;
case DanaRPump.PROFILECHANGE:
- log.debug("EVENT PROFILECHANGE (" + recordCode + ") " + datetime.toLocaleString() + " No: " + param1 + " CurrentRate: " + (param2 / 100d) + "U/h");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("EVENT PROFILECHANGE (" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")" + " No: " + param1 + " CurrentRate: " + (param2 / 100d) + "U/h");
status = "PROFILECHANGE " + DateUtil.timeString(datetime);
break;
case DanaRPump.CARBS:
DetailedBolusInfo emptyCarbsInfo = new DetailedBolusInfo();
emptyCarbsInfo.carbs = param1;
- emptyCarbsInfo.date = datetime.getTime();
+ emptyCarbsInfo.date = datetime;
emptyCarbsInfo.source = Source.PUMP;
- emptyCarbsInfo.pumpId = datetime.getTime();
+ emptyCarbsInfo.pumpId = datetime;
newRecord = TreatmentsPlugin.getPlugin().addToHistoryTreatment(emptyCarbsInfo, false);
- log.debug((newRecord ? "**NEW** " : "") + "EVENT CARBS (" + recordCode + ") " + datetime.toLocaleString() + " Carbs: " + param1 + "g");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug((newRecord ? "**NEW** " : "") + "EVENT CARBS (" + recordCode + ") " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")" + " Carbs: " + param1 + "g");
status = "CARBS " + DateUtil.timeString(datetime);
break;
default:
- log.debug("Event: " + recordCode + " " + datetime.toLocaleString() + " Param1: " + param1 + " Param2: " + param2);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Event: " + recordCode + " " + DateUtil.dateAndTimeFullString(datetime) + " (" + datetime + ")" + " Param1: " + param1 + " Param2: " + param2);
status = "UNKNOWN " + DateUtil.timeString(datetime);
break;
}
- if (datetime.getTime() > lastEventTimeLoaded)
- lastEventTimeLoaded = datetime.getTime();
+ if (datetime > lastEventTimeLoaded)
+ lastEventTimeLoaded = datetime;
MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.processinghistory) + ": " + status));
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgSetAPSTempBasalStart_v2.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgSetAPSTempBasalStart_v2.java
index 6b6e3045de..42964a64c6 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgSetAPSTempBasalStart_v2.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgSetAPSTempBasalStart_v2.java
@@ -3,11 +3,11 @@ package info.nightscout.androidaps.plugins.PumpDanaRv2.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase;
public class MsgSetAPSTempBasalStart_v2 extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgSetAPSTempBasalStart_v2.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
protected final int PARAM30MIN = 160;
protected final int PARAM15MIN = 150;
@@ -19,6 +19,8 @@ public class MsgSetAPSTempBasalStart_v2 extends MessageBase {
public MsgSetAPSTempBasalStart_v2(int percent) {
this();
setParams(percent);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message: percent: " + percent);
}
protected void setParams(int percent) {
@@ -29,11 +31,11 @@ public class MsgSetAPSTempBasalStart_v2 extends MessageBase {
AddParamInt(percent);
if (percent < 100) {
AddParamByte((byte) PARAM30MIN);
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("APS Temp basal start percent: " + percent + " duration 30 min");
} else {
AddParamByte((byte) PARAM15MIN);
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("APS Temp basal start percent: " + percent + " duration 15 min");
}
}
@@ -51,11 +53,11 @@ public class MsgSetAPSTempBasalStart_v2 extends MessageBase {
AddParamInt(percent);
if (thirtyMinutes && percent <= 200) { // 30 min is allowed up to 200%
AddParamByte((byte) PARAM30MIN);
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("APS Temp basal start percent: " + percent + " duration 30 min");
} else {
AddParamByte((byte) PARAM15MIN);
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("APS Temp basal start percent: " + percent + " duration 15 min");
}
}
@@ -64,10 +66,11 @@ public class MsgSetAPSTempBasalStart_v2 extends MessageBase {
int result = intFromBuff(bytes, 0, 1);
if (result != 1) {
failed = true;
- log.debug("Set APS temp basal start result: " + result + " FAILED!!!");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Set APS temp basal start result: " + result + " FAILED!!!");
} else {
failed = false;
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Set APS temp basal start result: " + result);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgSetHistoryEntry_v2.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgSetHistoryEntry_v2.java
index abeb656f03..0c55b29a3f 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgSetHistoryEntry_v2.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgSetHistoryEntry_v2.java
@@ -6,11 +6,11 @@ import org.slf4j.LoggerFactory;
import java.util.Date;
import java.util.GregorianCalendar;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase;
public class MsgSetHistoryEntry_v2 extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgSetHistoryEntry_v2.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgSetHistoryEntry_v2() {
SetCommand(0xE004);
@@ -25,7 +25,7 @@ public class MsgSetHistoryEntry_v2 extends MessageBase {
AddParamDateTime(gtime);
AddParamInt(param1);
AddParamInt(param2);
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Set history entry: type: " + type + " date: " + new Date(time).toString() + " param1: " + param1 + " param2: " + param2);
}
@@ -34,9 +34,10 @@ public class MsgSetHistoryEntry_v2 extends MessageBase {
int result = intFromBuff(bytes, 0, 1);
if (result != 1) {
failed = true;
- log.debug("Set history entry result: " + result + " FAILED!!!");
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Set history entry result: " + result + " FAILED!!!");
} else {
- if (Config.logDanaMessageDetail)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Set history entry result: " + result);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgStatusAPS_v2.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgStatusAPS_v2.java
index c2f87ee36a..5d0238f2f7 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgStatusAPS_v2.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgStatusAPS_v2.java
@@ -3,15 +3,17 @@ package info.nightscout.androidaps.plugins.PumpDanaRv2.comm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase;
public class MsgStatusAPS_v2 extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgStatusAPS_v2.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgStatusAPS_v2() {
SetCommand(0xE001);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
public void handleMessage(byte[] bytes) {
@@ -21,7 +23,7 @@ public class MsgStatusAPS_v2 extends MessageBase {
DanaRPump pump = DanaRPump.getInstance();
pump.iob = iob;
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Delivered so far: " + deliveredSoFar);
log.debug("Current pump IOB: " + iob);
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgStatusBolusExtended_v2.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgStatusBolusExtended_v2.java
index f695f6a792..5a442e39c1 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgStatusBolusExtended_v2.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgStatusBolusExtended_v2.java
@@ -5,20 +5,17 @@ import android.support.annotation.NonNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.Date;
-
-import info.nightscout.androidaps.Config;
-import info.nightscout.androidaps.MainApp;
-import info.nightscout.androidaps.db.ExtendedBolus;
-import info.nightscout.androidaps.interfaces.TreatmentsInterface;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase;
public class MsgStatusBolusExtended_v2 extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgStatusBolusExtended_v2.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgStatusBolusExtended_v2() {
SetCommand(0x0207);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
public void handleMessage(byte[] bytes) {
@@ -34,7 +31,7 @@ public class MsgStatusBolusExtended_v2 extends MessageBase {
int extendedBolusSoFarInMinutes = extendedBolusSoFarInSecs / 60;
double extendedBolusAbsoluteRate = isExtendedInProgress ? extendedBolusAmount / extendedBolusMinutes * 60 : 0d;
- Date extendedBolusStart = isExtendedInProgress ? getDateFromSecAgo(extendedBolusSoFarInSecs) : new Date(0);
+ long extendedBolusStart = isExtendedInProgress ? getDateFromSecAgo(extendedBolusSoFarInSecs) : 0;
int extendedBolusRemainingMinutes = extendedBolusMinutes - extendedBolusSoFarInMinutes;
DanaRPump pump = DanaRPump.getInstance();
@@ -46,7 +43,7 @@ public class MsgStatusBolusExtended_v2 extends MessageBase {
pump.extendedBolusStart = extendedBolusStart;
pump.extendedBolusRemainingMinutes = extendedBolusRemainingMinutes;
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Is extended bolus running: " + isExtendedInProgress);
log.debug("Extended bolus min: " + extendedBolusMinutes);
log.debug("Extended bolus amount: " + extendedBolusAmount);
@@ -58,8 +55,8 @@ public class MsgStatusBolusExtended_v2 extends MessageBase {
}
@NonNull
- private Date getDateFromSecAgo(int tempBasalAgoSecs) {
- return new Date((long) (Math.ceil(System.currentTimeMillis() / 1000d) - tempBasalAgoSecs) * 1000);
+ private long getDateFromSecAgo(int tempBasalAgoSecs) {
+ return (long) (Math.ceil(System.currentTimeMillis() / 1000d) - tempBasalAgoSecs) * 1000;
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgStatusTempBasal_v2.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgStatusTempBasal_v2.java
index 256fa4cd8a..fb26d2c0de 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgStatusTempBasal_v2.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgStatusTempBasal_v2.java
@@ -5,20 +5,18 @@ import android.support.annotation.NonNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.Date;
-
-import info.nightscout.androidaps.Config;
-import info.nightscout.androidaps.MainApp;
-import info.nightscout.androidaps.db.TemporaryBasal;
-import info.nightscout.androidaps.interfaces.TreatmentsInterface;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump;
import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase;
+import info.nightscout.utils.DateUtil;
public class MsgStatusTempBasal_v2 extends MessageBase {
- private static Logger log = LoggerFactory.getLogger(MsgStatusTempBasal_v2.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPCOMM);
public MsgStatusTempBasal_v2() {
SetCommand(0x0205);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("New message");
}
public void handleMessage(byte[] bytes) {
@@ -32,7 +30,7 @@ public class MsgStatusTempBasal_v2 extends MessageBase {
else tempBasalTotalSec = intFromBuff(bytes, 2, 1) * 60 * 60;
int tempBasalRunningSeconds = intFromBuff(bytes, 3, 3);
int tempBasalRemainingMin = (tempBasalTotalSec - tempBasalRunningSeconds) / 60;
- Date tempBasalStart = isTempBasalInProgress ? getDateFromTempBasalSecAgo(tempBasalRunningSeconds) : new Date(0);
+ long tempBasalStart = isTempBasalInProgress ? getDateFromTempBasalSecAgo(tempBasalRunningSeconds) : 0;
DanaRPump pump = DanaRPump.getInstance();
pump.isTempBasalInProgress = isTempBasalInProgress;
@@ -41,19 +39,19 @@ public class MsgStatusTempBasal_v2 extends MessageBase {
pump.tempBasalTotalSec = tempBasalTotalSec;
pump.tempBasalStart = tempBasalStart;
- if (Config.logDanaMessageDetail) {
+ if (L.isEnabled(L.PUMPCOMM)) {
log.debug("Is temp basal running: " + isTempBasalInProgress);
log.debug("Is APS temp basal running: " + isAPSTempBasalInProgress);
log.debug("Current temp basal percent: " + tempBasalPercent);
log.debug("Current temp basal remaining min: " + tempBasalRemainingMin);
log.debug("Current temp basal total sec: " + tempBasalTotalSec);
- log.debug("Current temp basal start: " + tempBasalStart);
+ log.debug("Current temp basal start: " + DateUtil.dateAndTimeFullString(tempBasalStart));
}
}
@NonNull
- private Date getDateFromTempBasalSecAgo(int tempBasalAgoSecs) {
- return new Date((long) (Math.ceil(System.currentTimeMillis() / 1000d) - tempBasalAgoSecs) * 1000);
+ private long getDateFromTempBasalSecAgo(int tempBasalAgoSecs) {
+ return (long) (Math.ceil(System.currentTimeMillis() / 1000d) - tempBasalAgoSecs) * 1000;
}
}
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 1229f23f4e..59f0ba9330 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
@@ -8,12 +8,9 @@ import android.os.SystemClock;
import com.squareup.otto.Subscribe;
-import org.slf4j.LoggerFactory;
-
import java.io.IOException;
import java.util.Date;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
@@ -25,7 +22,9 @@ import info.nightscout.androidaps.events.EventPreferenceChange;
import info.nightscout.androidaps.events.EventProfileSwitchChange;
import info.nightscout.androidaps.events.EventPumpStatusChanged;
import info.nightscout.androidaps.interfaces.PumpInterface;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.Overview.Dialogs.BolusProgressDialog;
import info.nightscout.androidaps.plugins.Overview.Dialogs.ErrorHelperActivity;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
@@ -72,7 +71,7 @@ import info.nightscout.androidaps.plugins.Treatments.Treatment;
import info.nightscout.androidaps.queue.Callback;
import info.nightscout.androidaps.queue.commands.Command;
import info.nightscout.utils.DateUtil;
-import info.nightscout.utils.NSUpload;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.utils.SP;
import info.nightscout.utils.T;
@@ -81,7 +80,6 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService {
private long lastHistoryFetched = 0;
public DanaRv2ExecutionService() {
- log = LoggerFactory.getLogger(DanaRv2ExecutionService.class);
mBinder = new LocalBinder();
registerBus();
@@ -105,7 +103,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService {
@Subscribe
public void onStatusEvent(EventAppExit event) {
- if (Config.logFunctionCalls)
+ if (L.isEnabled(L.PUMP))
log.debug("EventAppExit received");
if (mSerialIOThread != null)
@@ -114,8 +112,6 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService {
MainApp.instance().getApplicationContext().unregisterReceiver(receiver);
stopSelf();
- if (Config.logFunctionCalls)
- log.debug("EventAppExit finished");
}
@Subscribe
@@ -125,47 +121,37 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService {
}
public void connect() {
- if (mDanaRPump.password != -1 && mDanaRPump.password != SP.getInt(R.string.key_danar_password, -1)) {
- if(System.currentTimeMillis() > lastWrongPumpPassword + 30 * 1000) {
- Notification notification = new Notification(Notification.WRONG_PUMP_PASSWORD, MainApp.gs(R.string.wrongpumppassword), Notification.URGENT);
- notification.soundId = R.raw.error;
- lastWrongPumpPassword = System.currentTimeMillis();
- }
- return;
- }
-
if (mConnectionInProgress)
return;
- new Thread(new Runnable() {
- @Override
- public void run() {
- mConnectionInProgress = true;
- getBTSocketForSelectedPump();
- if (mRfcommSocket == null || mBTDevice == null) {
- mConnectionInProgress = false;
- return; // Device not found
- }
-
- try {
- mRfcommSocket.connect();
- } catch (IOException e) {
- //log.error("Unhandled exception", e);
- if (e.getMessage().contains("socket closed")) {
- log.error("Unhandled exception", e);
- }
- }
-
- if (isConnected()) {
- if (mSerialIOThread != null) {
- mSerialIOThread.disconnect("Recreate SerialIOThread");
- }
- mSerialIOThread = new SerialIOThread(mRfcommSocket);
- MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.CONNECTED, 0));
- }
-
+ new Thread(() -> {
+ mHandshakeInProgress = false;
+ mConnectionInProgress = true;
+ getBTSocketForSelectedPump();
+ if (mRfcommSocket == null || mBTDevice == null) {
mConnectionInProgress = false;
+ return; // Device not found
}
+
+ try {
+ mRfcommSocket.connect();
+ } catch (IOException e) {
+ //log.error("Unhandled exception", e);
+ if (e.getMessage().contains("socket closed")) {
+ log.error("Unhandled exception", e);
+ }
+ }
+
+ if (isConnected()) {
+ if (mSerialIOThread != null) {
+ mSerialIOThread.disconnect("Recreate SerialIOThread");
+ }
+ mSerialIOThread = new SerialIOThread(mRfcommSocket);
+ mHandshakeInProgress = true;
+ MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.HANDSHAKING, 0));
+ }
+
+ mConnectionInProgress = false;
}).start();
}
@@ -195,7 +181,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService {
mDanaRPump.lastConnection = System.currentTimeMillis();
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
PumpInterface pump = MainApp.getConfigBuilder().getActivePump();
if (profile != null && Math.abs(mDanaRPump.currentBasal - profile.getBasal()) >= pump.getPumpDescription().basalStep) {
MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpsettings)));
@@ -207,11 +193,13 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService {
MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumptime)));
mSerialIOThread.sendMessage(new MsgSettingPumpTime());
- long timeDiff = (mDanaRPump.pumpTime.getTime() - System.currentTimeMillis()) / 1000L;
- log.debug("Pump time difference: " + timeDiff + " seconds");
+ long timeDiff = (mDanaRPump.pumpTime - System.currentTimeMillis()) / 1000L;
+ if (L.isEnabled(L.PUMP))
+ log.debug("Pump time difference: " + timeDiff + " seconds");
if (Math.abs(timeDiff) > 3) {
- if (Math.abs(timeDiff) > 60*60*1.5) {
- log.debug("Pump time difference: " + timeDiff + " seconds - large difference");
+ if (Math.abs(timeDiff) > 60 * 60 * 1.5) {
+ if (L.isEnabled(L.PUMP))
+ log.debug("Pump time difference: " + timeDiff + " seconds - large difference");
//If time-diff is very large, warn user until we can synchronize history readings properly
Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class);
i.putExtra("soundid", R.raw.error);
@@ -230,8 +218,9 @@ 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.getTime() - System.currentTimeMillis()) / 1000L;
- log.debug("Pump time difference: " + timeDiff + " seconds");
+ timeDiff = (mDanaRPump.pumpTime - System.currentTimeMillis()) / 1000L;
+ if (L.isEnabled(L.PUMP))
+ log.debug("Pump time difference: " + timeDiff + " seconds");
}
}
@@ -258,8 +247,9 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService {
MainApp.bus().post(new EventInitializationChanged());
NSUpload.uploadDeviceStatus();
if (mDanaRPump.dailyTotalUnits > mDanaRPump.maxDailyTotalUnits * Constants.dailyLimitWarning) {
- log.debug("Approaching daily limit: " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.maxDailyTotalUnits);
- if(System.currentTimeMillis() > lastApproachingDailyLimit + 30 * 60 * 1000) {
+ if (L.isEnabled(L.PUMP))
+ log.debug("Approaching daily limit: " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.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");
@@ -269,7 +259,6 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService {
} catch (Exception e) {
log.error("Unhandled exception", e);
}
- return;
}
public boolean tempBasal(int percent, int durationInHours) {
@@ -315,7 +304,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService {
SystemClock.sleep(500);
}
MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.settingtempbasal)));
- mSerialIOThread.sendMessage(new MsgSetAPSTempBasalStart_v2(percent, durationInMinutes == 15, durationInMinutes == 30));
+ mSerialIOThread.sendMessage(new MsgSetAPSTempBasalStart_v2(percent, durationInMinutes == 15, durationInMinutes == 30));
mSerialIOThread.sendMessage(new MsgStatusTempBasal_v2());
loadEvents();
MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTING));
@@ -389,7 +378,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService {
if ((System.currentTimeMillis() - progress.lastReceive) > 15 * 1000L) { // if i didn't receive status for more than 15 sec expecting broken comm
stop.stopped = true;
stop.forced = true;
- log.debug("Communication stopped");
+ log.error("Communication stopped");
}
}
}
@@ -434,7 +423,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService {
}
public void bolusStop() {
- if (Config.logDanaBTComm)
+ if (L.isEnabled(L.PUMP))
log.debug("bolusStop >>>>> @ " + (mBolusingTreatment == null ? "" : mBolusingTreatment.insulin));
MsgBolusStop stop = new MsgBolusStop();
stop.forced = true;
@@ -461,23 +450,25 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService {
public PumpEnactResult loadEvents() {
- if(!MainApp.getSpecificPlugin(DanaRv2Plugin.class).isInitialized()){
+ if (!MainApp.getSpecificPlugin(DanaRv2Plugin.class).isInitialized()) {
PumpEnactResult result = new PumpEnactResult().success(false);
result.comment = "pump not initialized";
return result;
}
-
-
+
+
if (!isConnected())
return new PumpEnactResult().success(false);
SystemClock.sleep(300);
MsgHistoryEvents_v2 msg;
if (lastHistoryFetched == 0) {
msg = new MsgHistoryEvents_v2();
- log.debug("Loading complete event history");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Loading complete event history");
} else {
msg = new MsgHistoryEvents_v2(lastHistoryFetched);
- log.debug("Loading event history from: " + new Date(lastHistoryFetched).toLocaleString());
+ if (L.isEnabled(L.PUMP))
+ log.debug("Loading event history from: " + DateUtil.dateAndTimeFullString(lastHistoryFetched));
}
mSerialIOThread.sendMessage(msg);
while (!msg.done && mRfcommSocket.isConnected()) {
@@ -495,7 +486,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService {
public boolean updateBasalsInPump(final Profile profile) {
if (!isConnected()) return false;
MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.updatingbasalrates)));
- double[] basal = DanaRPump.buildDanaRProfileRecord(profile);
+ double[] basal = DanaRPump.getInstance().buildDanaRProfileRecord(profile);
MsgSetBasalProfile msgSet = new MsgSetBasalProfile((byte) 0, basal);
mSerialIOThread.sendMessage(msgSet);
MsgSetActivateBasalProfile msgActivate = new MsgSetActivateBasalProfile((byte) 0);
@@ -512,7 +503,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService {
long timeToWholeMinute = (60000 - time % 60000);
if (timeToWholeMinute > 59800 || timeToWholeMinute < 3000)
break;
- MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.waitingfortimesynchronization, (int)(timeToWholeMinute / 1000))));
+ MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.waitingfortimesynchronization, (int) (timeToWholeMinute / 1000))));
SystemClock.sleep(Math.min(timeToWholeMinute, 100));
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightFragment.java
index 156c8271e3..5d3c3850b3 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightFragment.java
@@ -9,7 +9,6 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
-
import com.squareup.otto.Subscribe;
import org.slf4j.Logger;
@@ -18,6 +17,7 @@ import org.slf4j.LoggerFactory;
import java.util.List;
import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
import info.nightscout.androidaps.plugins.PumpInsight.events.EventInsightUpdateGui;
import info.nightscout.androidaps.plugins.PumpInsight.utils.StatusItem;
@@ -26,7 +26,7 @@ import info.nightscout.utils.FabricPrivacy;
public class InsightFragment extends SubscriberFragment {
- private static final Logger log = LoggerFactory.getLogger(InsightFragment.class);
+ private static final Logger log = LoggerFactory.getLogger(L.PUMP);
private static final Handler sLoopHandler = new Handler();
private static volatile boolean refresh = false;
private static volatile boolean pending = false;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPlugin.java
index 5fd8e25f26..c72da31fdf 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPlugin.java
@@ -1,6 +1,7 @@
package info.nightscout.androidaps.plugins.PumpInsight;
import android.content.DialogInterface;
+import android.os.SystemClock;
import android.support.v4.app.FragmentActivity;
import android.support.v7.app.AlertDialog;
@@ -11,7 +12,6 @@ import org.slf4j.LoggerFactory;
import java.text.DecimalFormat;
import java.util.ArrayList;
-import java.util.Date;
import java.util.List;
import info.nightscout.androidaps.BuildConfig;
@@ -31,11 +31,15 @@ import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.interfaces.PumpDescription;
import info.nightscout.androidaps.interfaces.PumpInterface;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress;
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
+import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpType;
import info.nightscout.androidaps.plugins.PumpInsight.connector.CancelBolusSilentlyTaskRunner;
import info.nightscout.androidaps.plugins.PumpInsight.connector.CancelTBRSilentlyTaskRunner;
import info.nightscout.androidaps.plugins.PumpInsight.connector.Connector;
@@ -51,7 +55,6 @@ import info.nightscout.androidaps.plugins.PumpInsight.utils.StatusItem;
import info.nightscout.androidaps.plugins.Treatments.Treatment;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.utils.DateUtil;
-import info.nightscout.utils.NSUpload;
import info.nightscout.utils.SP;
import sugar.free.sightparser.applayer.descriptors.ActiveBolus;
import sugar.free.sightparser.applayer.descriptors.ActiveBolusType;
@@ -83,6 +86,7 @@ import static info.nightscout.androidaps.plugins.PumpInsight.history.PumpIdCache
@SuppressWarnings("AccessStaticViaInstance")
public class InsightPlugin extends PluginBase implements PumpInterface, ConstraintsInterface {
+ private Logger log = LoggerFactory.getLogger(L.PUMP);
private static volatile InsightPlugin plugin;
@@ -98,10 +102,9 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
private static Integer reservoirInUnits = 0;
private static boolean initialized = false;
private static volatile boolean update_pending = false;
- private static Logger log = LoggerFactory.getLogger(InsightPlugin.class);
private StatusTaskRunner.Result statusResult;
private long statusResultTime = -1;
- private Date lastDataTime = new Date(0);
+ private long lastDataTime = 0;
private boolean fauxTBRcancel = true;
private PumpDescription pumpDescription = new PumpDescription();
private double basalRate = 0;
@@ -118,47 +121,12 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
.preferencesId(R.xml.pref_insightpump)
.description(R.string.description_pump_insight)
);
- log("InsightPlugin instantiated");
- pumpDescription.isBolusCapable = true;
- pumpDescription.bolusStep = 0.01d; // specification says 0.05U up to 2U then 0.1U @ 2-5U 0.2U @ 10-20U 0.5U 10-20U (are these just UI restrictions? Yes, they are!)
-
- pumpDescription.isExtendedBolusCapable = true;
- pumpDescription.extendedBolusStep = 0.01d; // specification probably same as above
- pumpDescription.extendedBolusDurationStep = 15; // 15 minutes up to 24 hours
- pumpDescription.extendedBolusMaxDuration = 24 * 60;
-
- pumpDescription.isTempBasalCapable = true;
- //pumpDescription.tempBasalStyle = PumpDescription.PERCENT | PumpDescription.ABSOLUTE;
- pumpDescription.tempBasalStyle = PumpDescription.PERCENT;
-
- pumpDescription.maxTempPercent = 250; // 0-250%
- pumpDescription.tempPercentStep = 10;
-
- pumpDescription.tempDurationStep = 15; // 15 minutes up to 24 hours
- pumpDescription.tempDurationStep15mAllowed = true;
- pumpDescription.tempDurationStep30mAllowed = true;
- pumpDescription.tempMaxDuration = 24 * 60;
-
- pumpDescription.isSetBasalProfileCapable = true;
- pumpDescription.is30minBasalRatesCapable = true;
- pumpDescription.basalStep = 0.01d;
- pumpDescription.basalMinimumRate = 0.02d;
- pumpDescription.basalMaximumRate = 25d;
-
- pumpDescription.isRefillingCapable = true;
-
- pumpDescription.storesCarbInfo = false;
-
- pumpDescription.supportsTDDs = true;
- pumpDescription.needsManualTDDLoad = false;
+ if (L.isEnabled(L.PUMP))
+ log.debug("InsightPlugin instantiated");
+ pumpDescription.setPumpDescription(PumpType.AccuChekInsight);
}
- // just log during debugging
- private static void log(String msg) {
- android.util.Log.e("INSIGHTPUMP", msg);
- }
-
private static void updateGui() {
update_pending = false;
MainApp.bus().post(new EventInsightUpdateGui());
@@ -173,7 +141,8 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
if (!connector_enabled) {
synchronized (this) {
if (!connector_enabled) {
- log("Instantiating connector");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Instantiating connector");
connector_enabled = true;
this.connector = Connector.get();
this.connector.init();
@@ -187,7 +156,8 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
if (connector_enabled) {
synchronized (this) {
if (connector_enabled) {
- log("Shutting down connector");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Shutting down connector");
Connector.get().shutdown();
connector_enabled = false;
}
@@ -210,7 +180,7 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
@Override
public void switchAllowed(ConfigBuilderFragment.PluginViewHolder.PluginSwitcher pluginSwitcher, FragmentActivity context) {
boolean allowHardwarePump = SP.getBoolean("allow_hardware_pump", false);
- if (allowHardwarePump || context == null){
+ if (allowHardwarePump || context == null) {
pluginSwitcher.invoke();
} else {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
@@ -257,77 +227,98 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
return Connector.get().isPumpConnecting();
}
+ @Override
+ public boolean isHandshakeInProgress() {
+ return false;
+ }
+
+ @Override
+ public void finishHandshaking() {
+ }
+
@Override
public void connect(String reason) {
- log("InsightPlugin::connect()");
+ if (L.isEnabled(L.PUMP))
+ log.debug("InsightPlugin::connect()");
try {
if (!connector.isPumpConnected()) {
if (Helpers.ratelimit("insight-connect-timer", 40)) {
- log("Actually requesting a connect");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Actually requesting a connect");
connector.connectToPump();
}
} else {
- log("Already connected");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Already connected");
}
} catch (NullPointerException e) {
- log("Could not sconnect - null pointer: " + e);
+ log.error("Could not sconnect - null pointer: " + e);
}
// TODO review
- if (!Config.NSCLIENT && !Config.G5UPLOADER)
+ if (!Config.NSCLIENT)
NSUpload.uploadDeviceStatus();
}
@Override
public void disconnect(String reason) {
- log("InsightPlugin::disconnect()");
+ if (L.isEnabled(L.PUMP))
+ log.debug("InsightPlugin::disconnect()");
try {
if (!SP.getBoolean("insight_always_connected", false)) {
- log("Requesting disconnect");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Requesting disconnect");
connector.disconnectFromPump();
} else {
- log("Not disconnecting due to preference");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Not disconnecting due to preference");
}
} catch (NullPointerException e) {
- log("Could not disconnect - null pointer: " + e);
+ log.error("Could not disconnect - null pointer: " + e);
}
}
@Override
public void stopConnecting() {
- log("InsightPlugin::stopConnecting()");
+ if (L.isEnabled(L.PUMP))
+ log.debug("InsightPlugin::stopConnecting()");
try {
if (isConnecting()) {
if (!SP.getBoolean("insight_always_connected", false)) {
- log("Requesting disconnect");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Requesting disconnect");
connector.disconnectFromPump();
} else {
- log("Not disconnecting due to preference");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Not disconnecting due to preference");
}
} else {
- log("Not currently trying to connect so not stopping connection");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Not currently trying to connect so not stopping connection");
}
} catch (NullPointerException e) {
- log("Could not stop connecting - null pointer: " + e);
+ log.error("Could not stop connecting - null pointer: " + e);
}
}
@Override
public void getPumpStatus() {
-
- log("getPumpStatus");
+ if (L.isEnabled(L.PUMP))
+ log.debug("getPumpStatus");
if (Connector.get().isPumpConnected()) {
- log("is connected.. requesting status");
+ if (L.isEnabled(L.PUMP))
+ log.debug("is connected.. requesting status");
try {
setStatusResult(fetchTaskRunner(new StatusTaskRunner(connector.getServiceConnector()), StatusTaskRunner.Result.class));
- log("GOT STATUS RESULT!!! PARTY WOOHOO!!!");
+ if (L.isEnabled(L.PUMP))
+ log.debug("GOT STATUS RESULT!!! PARTY WOOHOO!!!");
statusResultTime = Helpers.tsl();
processStatusResult();
updateGui();
connector.requestHistoryReSync();
connector.requestHistorySync();
} catch (Exception e) {
- log("StatusTaskRunner wasn't successful.");
+ log.error("StatusTaskRunner wasn't successful.");
if (connector.getServiceConnector().isConnectedToService() && connector.getServiceConnector().getStatus() != Status.CONNECTED) {
if (Helpers.ratelimit("insight-reconnect", 2)) {
Connector.connectToPump();
@@ -336,7 +327,8 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
}
}
} else {
- log("not connected.. not requesting status");
+ if (L.isEnabled(L.PUMP))
+ log.debug("not connected.. not requesting status");
}
}
@@ -364,7 +356,8 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
if (profile.getBasalValues().length > i + 1)
nextValue = profile.getBasalValues()[i + 1];
profileBlocks.add(new BRProfileBlock.ProfileBlock((((nextValue != null ? nextValue.timeAsSeconds : 24 * 60 * 60) - basalValue.timeAsSeconds) / 60), Helpers.roundDouble(basalValue.value, 2)));
- log("setNewBasalProfile: " + basalValue.value + " for " + Integer.toString(((nextValue != null ? nextValue.timeAsSeconds : 24 * 60 * 60) - basalValue.timeAsSeconds) / 60));
+ if (L.isEnabled(L.PUMP))
+ log.debug("setNewBasalProfile: " + basalValue.value + " for " + Integer.toString(((nextValue != null ? nextValue.timeAsSeconds : 24 * 60 * 60) - basalValue.timeAsSeconds) / 60));
}
try {
fetchTaskRunner(new WriteBasalProfileTaskRunner(connector.getServiceConnector(), profileBlocks));
@@ -393,8 +386,9 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
Profile.BasalValue nextValue = null;
if (profile.getBasalValues().length > i + 1)
nextValue = profile.getBasalValues()[i + 1];
- log("isThisProfileSet - Comparing block: Pump: " + profileBlock.getAmount() + " for " + profileBlock.getDuration()
- + " Profile: " + basalValue.value + " for " + Integer.toString(((nextValue != null ? nextValue.timeAsSeconds : 24 * 60 * 60) - basalValue.timeAsSeconds) / 60));
+ if (L.isEnabled(L.PUMP))
+ log.debug("isThisProfileSet - Comparing block: Pump: " + profileBlock.getAmount() + " for " + profileBlock.getDuration()
+ + " Profile: " + basalValue.value + " for " + Integer.toString(((nextValue != null ? nextValue.timeAsSeconds : 24 * 60 * 60) - basalValue.timeAsSeconds) / 60));
if (profileBlock.getDuration() * 60 != (nextValue != null ? nextValue.timeAsSeconds : 24 * 60 * 60) - basalValue.timeAsSeconds)
return false;
//Allow a little imprecision due to rounding errors
@@ -405,7 +399,7 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
}
@Override
- public Date lastDataTime() {
+ public long lastDataTime() {
return lastDataTime;
}
@@ -445,7 +439,8 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
}
if (result.success) {
- log("Success!");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Success!");
Treatment t = new Treatment();
t.isSMB = detailedBolusInfo.isSMB;
@@ -457,10 +452,11 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
MainApp.bus().post(bolusingEvent);
TreatmentsPlugin.getPlugin().addToHistoryTreatment(detailedBolusInfo, true);
} else {
- log.debug("Failure to deliver treatment");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Failure to deliver treatment");
}
- if (Config.logPumpComm)
+ if (L.isEnabled(L.PUMP))
log.debug("Delivering treatment insulin: " + detailedBolusInfo.insulin + "U carbs: " + detailedBolusInfo.carbs + "g " + result);
updateGui();
@@ -509,25 +505,31 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
@Override
public PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes, Profile profile, boolean enforceNew) {
- log("Set TBR absolute: " + absoluteRate);
+ if (L.isEnabled(L.PUMP))
+ log.debug("Set TBR absolute: " + absoluteRate);
if (getBaseBasalRate() == 0) {
- log("Base basal rate appears to be zero!");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Base basal rate appears to be zero!");
return pumpEnactFailure();
}
double percent = 100D / getBaseBasalRate() * absoluteRate;
- log("Calculated requested rate: " + absoluteRate + " base rate: " + getBaseBasalRate() + " percentage: " + percent + "%");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Calculated requested rate: " + absoluteRate + " base rate: " + getBaseBasalRate() + " percentage: " + percent + "%");
try {
if (percent > 250) {
- log ("Calculated rate is above 250%, switching to emulation using extended boluses");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Calculated rate is above 250%, switching to emulation using extended boluses");
cancelTempBasal(true);
if (!setExtendedBolus((absoluteRate - getBaseBasalRate()) / 60D * ((double) durationInMinutes), durationInMinutes).success) {
//Fallback to TBR if setting an extended bolus didn't work
- log ("Setting an extended bolus didn't work, falling back to normal TBR");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Setting an extended bolus didn't work, falling back to normal TBR");
return setTempBasalPercent((int) percent, durationInMinutes, profile, true);
}
return new PumpEnactResult().success(true).enacted(true).absolute(absoluteRate).duration(durationInMinutes);
} else {
- log ("Calculated rate is below or equal to 250%, using normal TBRs");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Calculated rate is below or equal to 250%, using normal TBRs");
cancelExtendedBolus();
return setTempBasalPercent((int) percent, durationInMinutes, profile, true);
}
@@ -539,7 +541,8 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
@Override
public PumpEnactResult setTempBasalPercent(Integer percent, Integer durationInMinutes, Profile profile, boolean enforceNew) {
- log("Set TBR %");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Set TBR %");
percent = (int) Math.round(((double) percent) / 10d) * 10;
if (percent == 100) {
@@ -556,7 +559,8 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
.source(Source.USER);
TreatmentsPlugin.getPlugin().addToHistoryTempBasal(tempBasal);
updateGui();
- if (Config.logPumpComm) log.debug("Set temp basal " + percent + "% for " + durationInMinutes + "m");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Set temp basal " + percent + "% for " + durationInMinutes + "m");
connector.requestHistorySync(5000);
connector.tryToGetPumpStatusAgain();
return new PumpEnactResult().success(true).enacted(true).percent(percent);
@@ -568,13 +572,15 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
@Override
public PumpEnactResult cancelTempBasal(boolean enforceNew) {
- log("Cancel TBR");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Cancel TBR called");
try {
cancelExtendedBolus();
+ SystemClock.sleep(1100); // to be sure db records are at least 1 sec off (for NS)
realTBRCancel();
+ SystemClock.sleep(1100); // to be sure db records are at least 1 sec off (for NS)
updateGui();
- if (Config.logPumpComm) log.debug("Canceling temp basal");
connector.requestHistorySync(5000);
connector.tryToGetPumpStatusAgain();
return new PumpEnactResult().success(true).enacted(true).isTempCancel(true);
@@ -595,24 +601,23 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
@Override
public PumpEnactResult setExtendedBolus(Double insulin, Integer durationInMinutes) {
- log("Set Extended bolus " + insulin + " " + durationInMinutes);
+ if (L.isEnabled(L.PUMP))
+ log.debug("Set Extended bolus " + insulin + " " + durationInMinutes);
try {
ExtendedBolusMessage extendedBolusMessage = new ExtendedBolusMessage();
extendedBolusMessage.setAmount(insulin);
extendedBolusMessage.setDuration(durationInMinutes);
BolusMessage bolusMessage = fetchSingleMessage(extendedBolusMessage, BolusMessage.class);
- final ExtendedBolus extendedBolus = new ExtendedBolus();
- extendedBolus.date = System.currentTimeMillis();
- extendedBolus.insulin = insulin;
- extendedBolus.durationInMinutes = durationInMinutes;
- extendedBolus.source = Source.USER;
- extendedBolus.pumpId = getRecordUniqueID(bolusMessage.getBolusId());
+ final ExtendedBolus extendedBolus = new ExtendedBolus()
+ .date(System.currentTimeMillis())
+ .insulin(insulin)
+ .durationInMinutes(durationInMinutes)
+ .source(Source.USER)
+ .pumpId(getRecordUniqueID(bolusMessage.getBolusId()));
TreatmentsPlugin.getPlugin().addToHistoryExtendedBolus(extendedBolus);
updateGui();
connector.requestHistorySync(30000);
connector.tryToGetPumpStatusAgain();
- if (Config.logPumpComm)
- log.debug("Setting extended bolus: " + insulin + " mins:" + durationInMinutes);
return new PumpEnactResult().success(true).enacted(true).duration(durationInMinutes).bolusDelivered(insulin);
} catch (Exception e) {
return pumpEnactFailure();
@@ -621,7 +626,8 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
@Override
public PumpEnactResult cancelExtendedBolus() {
- log("Cancel Extended bolus");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Cancel Extended bolus called");
Integer bolusId = null;
@@ -632,7 +638,6 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
exStop.source = Source.USER;
TreatmentsPlugin.getPlugin().addToHistoryExtendedBolus(exStop);
}
- if (Config.logPumpComm) log.debug("Cancel extended bolus:");
if (bolusId != null) connector.requestHistorySync(5000);
connector.tryToGetPumpStatusAgain();
updateGui();
@@ -644,7 +649,8 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
private int deliverBolus(double bolusValue) throws Exception {
- log("DeliverBolus: " + bolusValue);
+ if (L.isEnabled(L.PUMP))
+ log.debug("DeliverBolus: " + bolusValue);
final StandardBolusMessage message = new StandardBolusMessage();
message.setAmount(bolusValue);
@@ -656,7 +662,8 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
public JSONObject getJSONStatus(Profile profile, String profileName) {
long now = System.currentTimeMillis();
if (Helpers.msSince(connector.getLastContactTime()) > (60 * 60 * 1000)) {
- log("getJSONStatus not returning as data likely stale");
+ if (L.isEnabled(L.PUMP))
+ log.debug("getJSONStatus not returning as data likely stale");
return null;
}
@@ -670,7 +677,7 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
status.put("timestamp", DateUtil.toISOString(connector.getLastContactTime()));
extended.put("Version", BuildConfig.VERSION_NAME + "-" + BuildConfig.BUILDVERSION);
try {
- extended.put("ActiveProfile", MainApp.getConfigBuilder().getProfileName());
+ extended.put("ActiveProfile", ProfileFunctions.getInstance().getProfileName());
} catch (Exception e) {
}
TemporaryBasal tb = TreatmentsPlugin.getPlugin().getTempBasalFromHistory(now);
@@ -860,7 +867,7 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
break;
default:
- log("ERROR: unknown bolus type! " + activeBolus.getBolusType());
+ log.error("ERROR: unknown bolus type! " + activeBolus.getBolusType());
}
}
@@ -875,10 +882,10 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
private T fetchTaskRunner(TaskRunner taskRunner, Class resultType) throws Exception {
try {
T result = (T) taskRunner.fetchAndWaitUsingLatch(BUSY_WAIT_TIME);
- lastDataTime = new Date();
+ lastDataTime = System.currentTimeMillis();
return result;
} catch (Exception e) {
- log("Error while fetching " + taskRunner.getClass().getSimpleName() + ": " + e.getClass().getSimpleName());
+ log.error("Error while fetching " + taskRunner.getClass().getSimpleName() + ": " + e.getClass().getSimpleName());
throw e;
}
}
@@ -886,10 +893,10 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai
private T fetchSingleMessage(AppLayerMessage message, Class resultType) throws Exception {
try {
T result = (T) new SingleMessageTaskRunner(connector.getServiceConnector(), message).fetchAndWaitUsingLatch(BUSY_WAIT_TIME);
- lastDataTime = new Date();
+ lastDataTime = System.currentTimeMillis();
return result;
} catch (Exception e) {
- log("Error while fetching " + message.getClass().getSimpleName() + ": " + e.getClass().getSimpleName());
+ log.error("Error while fetching " + message.getClass().getSimpleName() + ": " + e.getClass().getSimpleName());
throw e;
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java
index 82b6cc3cc8..111c2e0bd2 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java
@@ -5,6 +5,9 @@ import android.os.PowerManager;
import com.squareup.otto.Subscribe;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import java.util.ArrayList;
import java.util.Formatter;
import java.util.HashMap;
@@ -14,6 +17,7 @@ import java.util.Map;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.events.EventFeatureRunning;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpInsight.events.EventInsightUpdateGui;
import info.nightscout.androidaps.plugins.PumpInsight.history.HistoryReceiver;
import info.nightscout.androidaps.plugins.PumpInsight.history.LiveHistory;
@@ -31,16 +35,16 @@ import static sugar.free.sightparser.handling.SightService.COMPATIBILITY_VERSION
/**
* Created by jamorham on 23/01/2018.
- *
+ *
* Connects to SightRemote app service using SightParser library
- *
+ *
* SightRemote and SightParser created by Tebbe Ubben
- *
+ *
* Original proof of concept SightProxy by jamorham
- *
*/
public class Connector {
+ private static Logger log = LoggerFactory.getLogger(L.PUMP);
// TODO connection statistics
@@ -65,7 +69,8 @@ public class Connector {
public synchronized void onStatusChange(Status status, long statusTime, long waitTime) {
if ((status != lastStatus) || (Helpers.msSince(lastStatusTime) > 2000)) {
- log("Status change: " + status);
+ if (L.isEnabled(L.PUMP))
+ log.debug("Status change: " + status);
updateStatusStatistics(lastStatus, lastStatusTime);
lastStatus = status;
@@ -78,7 +83,8 @@ public class Connector {
MainApp.bus().post(new EventInsightUpdateGui());
} else {
- log("Same status as before: " + status);
+ if (L.isEnabled(L.PUMP))
+ log.debug("Same status as before: " + status);
}
}
@@ -87,29 +93,32 @@ public class Connector {
@Override
public synchronized void onServiceConnected() {
- log("On service connected");
+ if (L.isEnabled(L.PUMP))
+ log.debug("On service connected");
try {
final String remoteVersion = serviceConnector.getRemoteVersion();
if (remoteVersion.equals(COMPATIBILITY_VERSION)) {
serviceConnector.connect();
} else {
- log("PROTOCOL VERSION MISMATCH! local: " + COMPATIBILITY_VERSION + " remote: " + remoteVersion);
+ log.error("PROTOCOL VERSION MISMATCH! local: " + COMPATIBILITY_VERSION + " remote: " + remoteVersion);
statusCallback.onStatusChange(Status.INCOMPATIBLE, 0, 0);
compatabilityMessage = MainApp.gs(R.string.insight_incompatible_compantion_app_we_need_version) + " " + getLocalVersion();
serviceConnector.disconnectFromService();
}
} catch (NullPointerException e) {
- log("ERROR: null pointer when trying to connect to pump");
+ log.error("ERROR: null pointer when trying to connect to pump");
}
statusCallback.onStatusChange(safeGetStatus(), 0, 0);
}
@Override
public synchronized void onServiceDisconnected() {
- log("Disconnected from service");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Disconnected from service");
if (Helpers.ratelimit("insight-automatic-reconnect", 30)) {
- log("Scheduling automatic service reconnection");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Scheduling automatic service reconnection");
Helpers.runOnUiThreadDelayed(new Runnable() {
@Override
public void run() {
@@ -147,11 +156,13 @@ public class Connector {
}
public synchronized static void connectToPump(long keep_alive) {
- log("Attempting to connect to pump.");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Attempting to connect to pump.");
if (keep_alive > 0 && Helpers.tsl() + keep_alive > stayConnectedTill) {
stayConnectedTime = keep_alive;
stayConnectedTill = Helpers.tsl() + keep_alive;
- log("Staying connected till: " + Helpers.dateTimeText(stayConnectedTill));
+ if (L.isEnabled(L.PUMP))
+ log.debug("Staying connected till: " + Helpers.dateTimeText(stayConnectedTill));
delayedDisconnectionThread();
}
get().getServiceConnector().connect();
@@ -159,18 +170,16 @@ public class Connector {
public static void disconnectFromPump() {
if (Helpers.tsl() >= stayConnectedTill) {
- log("Requesting real pump disconnect");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Requesting real pump disconnect");
get().getServiceConnector().disconnect();
} else {
- log("Cannot disconnect as due to keep alive till: " + Helpers.dateTimeText(stayConnectedTill));
+ if (L.isEnabled(L.PUMP))
+ log.debug("Cannot disconnect as due to keep alive till: " + Helpers.dateTimeText(stayConnectedTill));
// TODO set a disconnection timer?
}
}
- static void log(String msg) {
- android.util.Log.e("INSIGHTPUMP", msg);
- }
-
static String getLocalVersion() {
return COMPATIBILITY_VERSION;
}
@@ -206,7 +215,8 @@ public class Connector {
if (keepAliveActive()) {
if (Helpers.ratelimit("extend-insight-keepalive", 10)) {
stayConnectedTill = Helpers.tsl() + stayConnectedTime;
- log("Keep-alive extended until: " + Helpers.dateTimeText(stayConnectedTill));
+ if (L.isEnabled(L.PUMP))
+ log.debug("Keep-alive extended until: " + Helpers.dateTimeText(stayConnectedTill));
}
}
}
@@ -236,7 +246,8 @@ public class Connector {
try {
while (disconnect_thread_running && keepAliveActive()) {
if (Helpers.ratelimit("insight-expiry-notice", 5)) {
- log("Staying connected thread expires: " + Helpers.dateTimeText(stayConnectedTill));
+ if (L.isEnabled(L.PUMP))
+ log.debug("Staying connected thread expires: " + Helpers.dateTimeText(stayConnectedTill));
}
try {
Thread.sleep(1000);
@@ -246,10 +257,12 @@ public class Connector {
}
if (disconnect_thread_running) {
- log("Sending the real delayed disconnect");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Sending the real delayed disconnect");
get().getServiceConnector().disconnect();
} else {
- log("Disconnect thread already terminating");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Disconnect thread already terminating");
}
} finally {
Helpers.releaseWakeLock(wl);
@@ -258,7 +271,8 @@ public class Connector {
}
}).start();
} else {
- log("Disconnect thread already running");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Disconnect thread already running");
}
}
}
@@ -269,7 +283,8 @@ public class Connector {
public synchronized void shutdown() {
if (instance != null) {
- log("Attempting to shut down connector");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Attempting to shut down connector");
try {
disconnect_thread_running = false;
try {
@@ -285,17 +300,17 @@ public class Connector {
try {
instance.serviceConnector.disconnect();
} catch (Exception e) {
- log("Exception disconnecting: " + e);
+ log.error("Exception disconnecting: " + e);
}
try {
instance.serviceConnector.disconnectFromService();
} catch (Exception e) {
- log("Excpetion disconnecting service: " + e);
+ log.error("Excpetion disconnecting service: " + e);
}
instance.serviceConnector = null;
instance = null;
} catch (Exception e) {
- log("Exception shutting down: " + e);
+ log.error("Exception shutting down: " + e);
}
}
}
@@ -309,7 +324,8 @@ public class Connector {
}
public synchronized void init() {
- log("Connector::init()");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Connector::init()");
if (serviceConnector == null) {
companionAppInstalled = isCompanionAppInstalled();
if (companionAppInstalled) {
@@ -318,9 +334,11 @@ public class Connector {
serviceConnector.addStatusCallback(statusCallback);
serviceConnector.setConnectionCallback(connectionCallback);
serviceConnector.connectToService();
- log("Trying to connect");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Trying to connect");
} else {
- log("Not trying init due to missing companion app");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Not trying init due to missing companion app");
}
} else {
if (!serviceConnector.isConnectedToService()) {
@@ -328,7 +346,8 @@ public class Connector {
serviceConnector = null;
init();
} else {
- log("Trying to reconnect to service (" + serviceReconnects + ")");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Trying to reconnect to service (" + serviceReconnects + ")");
serviceConnector.connectToService();
serviceReconnects++;
}
@@ -384,7 +403,8 @@ public class Connector {
}
if (!isConnected()) {
- log("Not connected to companion");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Not connected to companion");
if (Helpers.ratelimit("insight-app-not-connected", 5)) {
init();
}
@@ -499,7 +519,8 @@ public class Connector {
Long total = statistics.get(last);
if (total == null) total = 0L;
statistics.put(last, total + Helpers.msSince(since));
- log("Updated statistics for: " + last + " total: " + Helpers.niceTimeScalar(statistics.get(last)));
+ if (L.isEnabled(L.PUMP))
+ log.debug("Updated statistics for: " + last + " total: " + Helpers.niceTimeScalar(statistics.get(last)));
// TODO persist data
}
}
@@ -534,11 +555,13 @@ public class Connector {
if (SP.getBoolean("insight_preemptive_connect", true)) {
switch (ev.getFeature()) {
case WIZARD:
- log("Wizard feature detected, preconnecting to pump");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Wizard feature detected, preconnecting to pump");
connectToPump(120 * 1000);
break;
case MAIN:
- log("Main feature detected, preconnecting to pump");
+ if (L.isEnabled(L.PUMP))
+ log.debug("Main feature detected, preconnecting to pump");
connectToPump(30 * 1000);
break;
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/events/EventInsightCallback.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/events/EventInsightCallback.java
index 16cb5af457..753ac7f0e6 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/events/EventInsightCallback.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/events/EventInsightCallback.java
@@ -12,7 +12,6 @@ public class EventInsightCallback extends Event {
public UUID request_uuid;
public boolean success = false;
public String message = null;
- public int response_id = -1;
public Object response_object = null;
public EventInsightCallback() {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryIntentAdapter.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryIntentAdapter.java
index 2c2235bf47..49836e9f3b 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryIntentAdapter.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryIntentAdapter.java
@@ -1,15 +1,22 @@
package info.nightscout.androidaps.plugins.PumpInsight.history;
import android.content.Intent;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.db.CareportalEvent;
import info.nightscout.androidaps.db.TDD;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.utils.DateUtil;
-import info.nightscout.utils.NSUpload;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.utils.SP;
+
import org.json.JSONException;
import org.json.JSONObject;
+
import sugar.free.sightparser.handling.HistoryBroadcast;
import java.util.Date;
@@ -23,15 +30,12 @@ import static info.nightscout.androidaps.plugins.PumpInsight.history.PumpIdCache
*/
class HistoryIntentAdapter {
+ private Logger log = LoggerFactory.getLogger(L.PUMP);
private HistoryLogAdapter logAdapter = new HistoryLogAdapter();
- private static Date getDateExtra(Intent intent, String name) {
- return (Date) intent.getSerializableExtra(name);
- }
-
- private static void log(String msg) {
- android.util.Log.e("HistoryIntentAdapter", msg);
+ private static long getDateExtra(Intent intent, String name) {
+ return ((Date) intent.getSerializableExtra(name)).getTime();
}
static long getRecordUniqueID(long pump_serial_number, long pump_record_id) {
@@ -48,17 +52,17 @@ class HistoryIntentAdapter {
pump_record_id = intent.getIntExtra(HistoryBroadcast.EXTRA_EVENT_NUMBER, -1);
}
final long pump_serial_number = Long.parseLong(intent.getStringExtra(HistoryBroadcast.EXTRA_PUMP_SERIAL_NUMBER));
- final Date event_time = getDateExtra(intent, HistoryBroadcast.EXTRA_EVENT_TIME);
- final Date start_time = getDateExtra(intent, HistoryBroadcast.EXTRA_START_TIME);
+ final long start_time = getDateExtra(intent, HistoryBroadcast.EXTRA_START_TIME);
if ((pump_tbr_duration == -1) || (pump_tbr_percent == -1) || (pump_record_id == -1)) {
- log("Invalid TBR record!!!");
+ log.error("Invalid TBR record!!!");
return;
}
final long record_unique_id = getRecordUniqueID(pump_serial_number, pump_record_id);
- log("Creating TBR record: " + pump_tbr_percent + "% " + pump_tbr_duration + "m" + " id:" + record_unique_id);
+ if (L.isEnabled(L.PUMP))
+ log.debug("Creating TBR record: " + pump_tbr_percent + "% " + pump_tbr_duration + "m" + " id:" + record_unique_id);
logAdapter.createTBRrecord(start_time, pump_tbr_percent, pump_tbr_duration, record_unique_id);
}
@@ -71,8 +75,8 @@ class HistoryIntentAdapter {
pump_record_id = intent.getIntExtra(HistoryBroadcast.EXTRA_EVENT_NUMBER, -1);
}
final long pump_serial_number = Long.parseLong(intent.getStringExtra(HistoryBroadcast.EXTRA_PUMP_SERIAL_NUMBER));
- final Date event_time = getDateExtra(intent, HistoryBroadcast.EXTRA_EVENT_TIME);
- final Date start_time = getDateExtra(intent, HistoryBroadcast.EXTRA_START_TIME);
+ final long event_time = getDateExtra(intent, HistoryBroadcast.EXTRA_EVENT_TIME);
+ final long start_time = getDateExtra(intent, HistoryBroadcast.EXTRA_START_TIME);
final double immediate_amount = intent.getDoubleExtra(HistoryBroadcast.EXTRA_IMMEDIATE_AMOUNT, -1);
final double extended_insulin = intent.getDoubleExtra(HistoryBroadcast.EXTRA_EXTENDED_AMOUNT, -1);
final int extended_minutes = intent.getIntExtra(HistoryBroadcast.EXTRA_DURATION, -1);
@@ -82,62 +86,63 @@ class HistoryIntentAdapter {
switch (bolus_type) {
case "STANDARD":
if (immediate_amount == -1) {
- log("ERROR Standard bolus fails sanity check");
+ log.error("ERROR Standard bolus fails sanity check");
return;
}
- LiveHistory.setStatus(bolus_type + " BOLUS\n" + immediate_amount + "U ", event_time.getTime());
+ LiveHistory.setStatus(bolus_type + " BOLUS\n" + immediate_amount + "U ", event_time);
logAdapter.createStandardBolusRecord(start_time, immediate_amount, record_unique_id);
break;
case "EXTENDED":
if ((extended_insulin == -1) || (extended_minutes == -1)) {
- log("ERROR: Extended bolus fails sanity check");
+ log.error("ERROR: Extended bolus fails sanity check");
return;
}
- LiveHistory.setStatus(bolus_type + " BOLUS\n" + extended_insulin + "U over " + extended_minutes + " min, ", event_time.getTime());
+ LiveHistory.setStatus(bolus_type + " BOLUS\n" + extended_insulin + "U over " + extended_minutes + " min, ", event_time);
logAdapter.createExtendedBolusRecord(start_time, extended_insulin, extended_minutes, record_unique_id);
break;
case "MULTIWAVE":
if ((immediate_amount == -1) || (extended_insulin == -1) || (extended_minutes == -1)) {
- log("ERROR: Multiwave bolus fails sanity check");
+ log.error("ERROR: Multiwave bolus fails sanity check");
return;
}
- LiveHistory.setStatus(bolus_type + " BOLUS\n" + immediate_amount + "U + " + extended_insulin + "U over " + extended_minutes + " min, ", event_time.getTime());
+ LiveHistory.setStatus(bolus_type + " BOLUS\n" + immediate_amount + "U + " + extended_insulin + "U over " + extended_minutes + " min, ", event_time);
logAdapter.createStandardBolusRecord(start_time, immediate_amount, pump_serial_number + pump_record_id);
logAdapter.createExtendedBolusRecord(start_time, extended_insulin, extended_minutes, record_unique_id);
break;
default:
- log("ERROR, UNKNWON BOLUS TYPE: " + bolus_type);
+ log.error("ERROR, UNKNWON BOLUS TYPE: " + bolus_type);
}
}
void processDailyTotalIntent(Intent intent) {
- Date date = getDateExtra(intent, HistoryBroadcast.EXTRA_TOTAL_DATE);
+ long date = getDateExtra(intent, HistoryBroadcast.EXTRA_TOTAL_DATE);
double basal = intent.getDoubleExtra(HistoryBroadcast.EXTRA_BASAL_TOTAL, 0D);
double bolus = intent.getDoubleExtra(HistoryBroadcast.EXTRA_BOLUS_TOTAL, 0D);
- TDD tdd = new TDD(date.getTime(), bolus, basal, bolus + basal);
+ TDD tdd = new TDD(date, bolus, basal, bolus + basal);
MainApp.getDbHelper().createOrUpdateTDD(tdd);
}
void processCannulaFilledIntent(Intent intent) {
- Date date = getDateExtra(intent, HistoryBroadcast.EXTRA_EVENT_TIME);
+ long date = getDateExtra(intent, HistoryBroadcast.EXTRA_EVENT_TIME);
uploadCareportalEvent(date, CareportalEvent.SITECHANGE);
}
void processCartridgeInsertedIntent(Intent intent) {
- Date date = getDateExtra(intent, HistoryBroadcast.EXTRA_EVENT_TIME);
+ long date = getDateExtra(intent, HistoryBroadcast.EXTRA_EVENT_TIME);
uploadCareportalEvent(date, CareportalEvent.INSULINCHANGE);
}
void processBatteryInsertedIntent(Intent intent) {
- Date date = getDateExtra(intent, HistoryBroadcast.EXTRA_EVENT_TIME);
+ long date = getDateExtra(intent, HistoryBroadcast.EXTRA_EVENT_TIME);
uploadCareportalEvent(date, CareportalEvent.PUMPBATTERYCHANGE);
}
- private void uploadCareportalEvent(Date date, String event) {
+ private void uploadCareportalEvent(long date, String event) {
if (SP.getBoolean("insight_automatic_careportal_events", false)) {
- if (MainApp.getDbHelper().getCareportalEventFromTimestamp(date.getTime()) != null) return;
+ if (MainApp.getDbHelper().getCareportalEventFromTimestamp(date) != null)
+ return;
try {
JSONObject data = new JSONObject();
String enteredBy = SP.getString("careportal_enteredby", "");
@@ -153,17 +158,18 @@ class HistoryIntentAdapter {
void processOccurenceOfAlertIntent(Intent intent) {
if (SP.getBoolean("insight_automatic_careportal_events", false)) {
- Date date = getDateExtra(intent, HistoryBroadcast.EXTRA_EVENT_TIME);
+ long date = getDateExtra(intent, HistoryBroadcast.EXTRA_EVENT_TIME);
String alertType = intent.getStringExtra(HistoryBroadcast.EXTRA_ALERT_TYPE);
int alertText = getAlertText(alertType);
if (alertText == 0) return;
- if (MainApp.getDbHelper().getCareportalEventFromTimestamp(date.getTime()) != null) return;
+ if (MainApp.getDbHelper().getCareportalEventFromTimestamp(date) != null)
+ return;
logNote(date, MainApp.gs(alertText));
}
}
void processPumpStatusChangedIntent(Intent intent) {
- Date newStatusTime = getDateExtra(intent, HistoryBroadcast.EXTRA_EVENT_TIME);
+ long newStatusTime = getDateExtra(intent, HistoryBroadcast.EXTRA_EVENT_TIME);
if (SP.getBoolean("insight_automatic_careportal_events", false)) {
String newStatus = intent.getStringExtra(HistoryBroadcast.EXTRA_NEW_STATUS);
switch (newStatus) {
@@ -181,8 +187,8 @@ class HistoryIntentAdapter {
if (intent.hasExtra(HistoryBroadcast.EXTRA_OLD_STATUS_TIME)) {
String oldStatus = intent.getStringExtra(HistoryBroadcast.EXTRA_OLD_STATUS);
if (oldStatus.equals("STOPPED")) {
- Date oldStatusTime = getDateExtra(intent, HistoryBroadcast.EXTRA_OLD_STATUS_TIME);
- int duration = (int) ((newStatusTime.getTime() - oldStatusTime.getTime()) / 60000);
+ long oldStatusTime = getDateExtra(intent, HistoryBroadcast.EXTRA_OLD_STATUS_TIME);
+ int duration = (int) ((newStatusTime - oldStatusTime) / 60000);
long serialNumber = Long.parseLong(intent.getStringExtra(HistoryBroadcast.EXTRA_PUMP_SERIAL_NUMBER));
long recordId = intent.getLongExtra(HistoryBroadcast.EXTRA_EVENT_NUMBER, -1);
@@ -193,9 +199,10 @@ class HistoryIntentAdapter {
}
}
- private void logNote(Date date, String note) {
+ private void logNote(long date, String note) {
try {
- if (MainApp.getDbHelper().getCareportalEventFromTimestamp(date.getTime()) != null) return;
+ if (MainApp.getDbHelper().getCareportalEventFromTimestamp(date) != null)
+ return;
JSONObject data = new JSONObject();
String enteredBy = SP.getString("careportal_enteredby", "");
if (!enteredBy.equals("")) data.put("enteredBy", enteredBy);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryLogAdapter.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryLogAdapter.java
index bff37c9fdd..fc44f25418 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryLogAdapter.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryLogAdapter.java
@@ -1,13 +1,20 @@
package info.nightscout.androidaps.plugins.PumpInsight.history;
-import java.util.Date;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.data.DetailedBolusInfo;
import info.nightscout.androidaps.db.ExtendedBolus;
import info.nightscout.androidaps.db.Source;
import info.nightscout.androidaps.db.TemporaryBasal;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
+import info.nightscout.androidaps.plugins.NSClientInternal.UploadQueue;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
+import info.nightscout.utils.DateUtil;
+import info.nightscout.utils.T;
/**
* Created by jamorham on 27/01/2018.
@@ -16,37 +23,46 @@ import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
*/
class HistoryLogAdapter {
+ private Logger log = LoggerFactory.getLogger(L.PUMP);
- private static final long MAX_TIME_DIFFERENCE = 61000;
+ private static final long MAX_TIME_DIFFERENCE = T.secs(61).msecs();
- private static void log(String msg) {
- android.util.Log.e("HISTORYLOG", msg);
- }
+ void createTBRrecord(long eventDate, int percent, int duration, long record_id) {
- void createTBRrecord(Date eventDate, int percent, int duration, long record_id) {
+ TemporaryBasal temporaryBasal = new TemporaryBasal().date(eventDate);
- TemporaryBasal temporaryBasal = new TemporaryBasal().date(eventDate.getTime());
-
- final TemporaryBasal temporaryBasalFromHistory = TreatmentsPlugin.getPlugin().getTempBasalFromHistory(eventDate.getTime());
+ final TemporaryBasal temporaryBasalFromHistory = TreatmentsPlugin.getPlugin().getTempBasalFromHistory(eventDate);
if (temporaryBasalFromHistory == null) {
- log("Create new TBR: " + eventDate + " " + percent + " " + duration);
+ if (L.isEnabled(L.PUMP))
+ log.debug("Create new TBR: " + eventDate + " " + percent + " " + duration);
} else {
- log("Loaded existing TBR record: " + temporaryBasalFromHistory.toString());
- if (Math.abs(eventDate.getTime() - temporaryBasalFromHistory.date) < MAX_TIME_DIFFERENCE) {
+ if (L.isEnabled(L.PUMP))
+ log.debug("Loaded existing TBR record: " + temporaryBasalFromHistory.toString());
+ if (Math.abs(eventDate - temporaryBasalFromHistory.date) < MAX_TIME_DIFFERENCE) {
if (temporaryBasalFromHistory.source != Source.PUMP) {
if (temporaryBasalFromHistory.percentRate == percent) {
- log("Things seem to match: %" + percent);
+ if (L.isEnabled(L.PUMP))
+ log.debug("Things seem to match: %" + percent);
temporaryBasal = temporaryBasalFromHistory;
+ String _id = temporaryBasal._id;
+ if (NSUpload.isIdValid(_id)) {
+ NSUpload.removeCareportalEntryFromNS(_id);
+ } else {
+ UploadQueue.removeID("dbAdd", _id);
+ }
MainApp.getDbHelper().delete(temporaryBasalFromHistory);
} else {
- log("This record has different percent rates: " + temporaryBasalFromHistory.percentRate + " vs us: " + percent);
+ if (L.isEnabled(L.PUMP))
+ log.debug("This record has different percent rates: " + temporaryBasalFromHistory.percentRate + " vs us: " + percent);
}
} else {
- log("This record is already a pump record!");
+ if (L.isEnabled(L.PUMP))
+ log.debug("This record is already a pump record!");
}
} else {
- log("Time difference too great! : " + (eventDate.getTime() - temporaryBasalFromHistory.date));
+ if (L.isEnabled(L.PUMP))
+ log.debug("Time difference too big! : " + (eventDate - temporaryBasalFromHistory.date));
}
}
@@ -58,28 +74,60 @@ class HistoryLogAdapter {
TreatmentsPlugin.getPlugin().addToHistoryTempBasal(temporaryBasal);
}
- void createExtendedBolusRecord(Date eventDate, double insulin, int durationInMinutes, long record_id) {
+ void createExtendedBolusRecord(long eventDate, double insulin, int durationInMinutes, long record_id) {
+
+ final ExtendedBolus extendedBolusFromHistory = TreatmentsPlugin.getPlugin().getExtendedBolusFromHistory(eventDate);
+
+ if (extendedBolusFromHistory == null) {
+ if (L.isEnabled(L.PUMP))
+ log.debug("Create new EB: " + eventDate + " " + insulin + " " + durationInMinutes);
+ } else {
+ if (L.isEnabled(L.PUMP))
+ log.debug("Loaded existing EB record: " + extendedBolusFromHistory.log());
+ if (Math.abs(eventDate - extendedBolusFromHistory.date) < MAX_TIME_DIFFERENCE) {
+ if (extendedBolusFromHistory.source != Source.PUMP) {
+ if (L.isEnabled(L.PUMP))
+ log.debug("Date seem to match: " + DateUtil.dateAndTimeFullString(eventDate));
+ String _id = extendedBolusFromHistory._id;
+ if (NSUpload.isIdValid(_id)) {
+ NSUpload.removeCareportalEntryFromNS(_id);
+ } else {
+ UploadQueue.removeID("dbAdd", _id);
+ }
+ MainApp.getDbHelper().delete(extendedBolusFromHistory);
+ } else {
+ if (L.isEnabled(L.PUMP))
+ log.debug("This record is already a pump record!");
+ }
+ } else {
+ if (L.isEnabled(L.PUMP))
+ log.debug("Time difference too big! : " + (eventDate - extendedBolusFromHistory.date));
+ }
+ }
// TODO trap items below minimum period
- final ExtendedBolus extendedBolus = new ExtendedBolus();
- extendedBolus.date = eventDate.getTime();
- extendedBolus.insulin = insulin;
- extendedBolus.durationInMinutes = durationInMinutes;
- extendedBolus.source = Source.PUMP;
- extendedBolus.pumpId = record_id;
+ // TODO (mike) find and remove ending record with Source.USER
- TreatmentsPlugin.getPlugin().addToHistoryExtendedBolus(extendedBolus);
+ ExtendedBolus extendedBolus = new ExtendedBolus()
+ .date(eventDate)
+ .insulin(insulin)
+ .durationInMinutes(durationInMinutes)
+ .source(Source.PUMP)
+ .pumpId(record_id);
+
+ if (ProfileFunctions.getInstance().getProfile(extendedBolus.date) != null) // actual basal rate is needed for absolute rate calculation
+ TreatmentsPlugin.getPlugin().addToHistoryExtendedBolus(extendedBolus);
}
- void createStandardBolusRecord(Date eventDate, double insulin, long record_id) {
+ void createStandardBolusRecord(long eventDate, double insulin, long record_id) {
//DetailedBolusInfo detailedBolusInfo = DetailedBolusInfoStorage.findDetailedBolusInfo(eventDate.getTime());
// TODO do we need to do the same delete + insert that we are doing for temporary basals here too?
final DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo();
- detailedBolusInfo.date = eventDate.getTime();
+ detailedBolusInfo.date = eventDate;
detailedBolusInfo.source = Source.PUMP;
detailedBolusInfo.pumpId = record_id;
detailedBolusInfo.insulin = insulin;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryReceiver.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryReceiver.java
index ca68a389c8..a66378ba54 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryReceiver.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryReceiver.java
@@ -54,10 +54,6 @@ public class HistoryReceiver {
// History
- private static void log(String msg) {
- android.util.Log.e("INSIGHTPUMPHR", msg);
- }
-
public static String getStatusString() {
return status.toString();
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/PumpIdCache.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/PumpIdCache.java
index 940a7af3cf..9a2bcfeff5 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/PumpIdCache.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/PumpIdCache.java
@@ -1,5 +1,9 @@
package info.nightscout.androidaps.plugins.PumpInsight.history;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import info.nightscout.androidaps.logging.L;
import info.nightscout.utils.SP;
/**
@@ -7,18 +11,16 @@ import info.nightscout.utils.SP;
*/
public class PumpIdCache {
+ private static Logger log = LoggerFactory.getLogger(L.PUMP);
private static final String INSIGHT_PUMP_ID_PREF = "insight-pump-id";
private static long cachedPumpSerialNumber = -1;
- private static void log(String msg) {
- android.util.Log.e("PumpIdCache", msg);
- }
-
static void updatePumpSerialNumber(long pump_serial_number) {
if (pump_serial_number != cachedPumpSerialNumber) {
cachedPumpSerialNumber = pump_serial_number;
- log("Updating pump serial number: " + pump_serial_number);
+ if (L.isEnabled(L.PUMP))
+ log.debug("Updating pump serial number: " + pump_serial_number);
SP.putLong(INSIGHT_PUMP_ID_PREF, cachedPumpSerialNumber);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/utils/Helpers.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/utils/Helpers.java
index 344bf638b2..bfdca16588 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/utils/Helpers.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/utils/Helpers.java
@@ -7,6 +7,9 @@ import android.os.Handler;
import android.os.PowerManager;
import android.util.Log;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
@@ -16,17 +19,17 @@ import java.util.Map;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.logging.L;
/**
* Created by jamorham on 24/01/2018.
- *
+ *
* Useful utility methods from xDrip+
- *
*/
public class Helpers {
+ private static Logger log = LoggerFactory.getLogger(L.PUMP);
- private static final String TAG = "InsightHelpers";
private static final Map rateLimits = new HashMap<>();
// singletons to avoid repeated allocation
@@ -37,7 +40,8 @@ public class Helpers {
public static synchronized boolean ratelimit(String name, int seconds) {
// check if over limit
if ((rateLimits.containsKey(name)) && (tsl() - rateLimits.get(name) < (seconds * 1000))) {
- Log.d(TAG, name + " rate limited: " + seconds + " seconds");
+ if (L.isEnabled(L.PUMP))
+ log.debug(name + " rate limited: " + seconds + " seconds");
return false;
}
// not over limit
@@ -65,7 +69,7 @@ public class Helpers {
} catch (PackageManager.NameNotFoundException e) {
return false;
} catch (Exception e) {
- Log.wtf(TAG, "Exception trying to determine packages! " + e);
+ log.error("Exception trying to determine packages! " + e);
return false;
}
}
@@ -160,7 +164,7 @@ public class Helpers {
public static String niceTimeScalarBrief(long t) {
// TODO i18n wont work for non-latin characterset
- return niceTimeScalar(t).replaceFirst("([a-z])[a-z]*", "$1").replace(" ","");
+ return niceTimeScalar(t).replaceFirst("([a-z])[a-z]*", "$1").replace(" ", "");
}
public static String hourMinuteString(long timestamp) {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java
index fb41a72e88..27651a7cfb 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,10 +5,7 @@ import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.Date;
-
import info.nightscout.androidaps.BuildConfig;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.DetailedBolusInfo;
@@ -19,6 +16,7 @@ import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.interfaces.PumpDescription;
import info.nightscout.androidaps.interfaces.PumpInterface;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.utils.DateUtil;
@@ -90,6 +88,15 @@ public class MDIPlugin extends PluginBase implements PumpInterface {
return false;
}
+ @Override
+ public boolean isHandshakeInProgress() {
+ return false;
+ }
+
+ @Override
+ public void finishHandshaking() {
+ }
+
@Override
public void connect(String reason) {
}
@@ -120,8 +127,8 @@ public class MDIPlugin extends PluginBase implements PumpInterface {
}
@Override
- public Date lastDataTime() {
- return new Date();
+ public long lastDataTime() {
+ return System.currentTimeMillis();
}
@Override
@@ -149,7 +156,7 @@ public class MDIPlugin extends PluginBase implements PumpInterface {
PumpEnactResult result = new PumpEnactResult();
result.success = false;
result.comment = MainApp.gs(R.string.pumperror);
- if (Config.logPumpComm)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Setting temp basal absolute: " + result);
return result;
}
@@ -159,7 +166,7 @@ public class MDIPlugin extends PluginBase implements PumpInterface {
PumpEnactResult result = new PumpEnactResult();
result.success = false;
result.comment = MainApp.gs(R.string.pumperror);
- if (Config.logPumpComm)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Settings temp basal percent: " + result);
return result;
}
@@ -169,7 +176,7 @@ public class MDIPlugin extends PluginBase implements PumpInterface {
PumpEnactResult result = new PumpEnactResult();
result.success = false;
result.comment = MainApp.gs(R.string.pumperror);
- if (Config.logPumpComm)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Setting extended bolus: " + result);
return result;
}
@@ -179,7 +186,7 @@ public class MDIPlugin extends PluginBase implements PumpInterface {
PumpEnactResult result = new PumpEnactResult();
result.success = false;
result.comment = MainApp.gs(R.string.pumperror);
- if (Config.logPumpComm)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Cancel temp basal: " + result);
return result;
}
@@ -189,8 +196,8 @@ public class MDIPlugin extends PluginBase implements PumpInterface {
PumpEnactResult result = new PumpEnactResult();
result.success = false;
result.comment = MainApp.gs(R.string.pumperror);
- if (Config.logPumpComm)
- log.debug("Canceling extended basal: " + result);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Canceling extended bolus: " + result);
return result;
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpMedtronic/MedtronicPumpPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpMedtronic/MedtronicPumpPlugin.java
index ab158bb1f2..e0842e9f3a 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpMedtronic/MedtronicPumpPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpMedtronic/MedtronicPumpPlugin.java
@@ -238,13 +238,22 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
public boolean isConnecting() {
-
if (!isServiceSet())
return true;
else
return !medtronicService.isInitialized();
}
+ @Override
+ public boolean isHandshakeInProgress() {
+ return false;
+ }
+
+ @Override
+ public void finishHandshaking() {
+
+ }
+
@Override
public void getPumpStatus() {
@@ -429,12 +438,12 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
@Override
- public Date lastDataTime() {
- if (pumpStatusLocal != null && pumpStatusLocal.lastDataTime != null) {
- return pumpStatusLocal.lastDataTime.toDate();
+ public long lastDataTime() {
+ if (pumpStatusLocal.lastConnection!=0) {
+ return pumpStatusLocal.lastConnection;
}
- return new Date();
+ return System.currentTimeMillis();
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpMedtronic/driver/MedtronicPumpDriver.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpMedtronic/driver/MedtronicPumpDriver.java
index 2e16c40cd5..523eb680e4 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpMedtronic/driver/MedtronicPumpDriver.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpMedtronic/driver/MedtronicPumpDriver.java
@@ -10,6 +10,7 @@ import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.data.PumpEnactResult;
import info.nightscout.androidaps.db.Source;
import info.nightscout.androidaps.db.TemporaryBasal;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.PumpVirtual.VirtualPumpDriver;
import info.nightscout.androidaps.plugins.PumpVirtual.events.EventVirtualPumpUpdateGui;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
@@ -78,7 +79,7 @@ public class MedtronicPumpDriver extends VirtualPumpDriver /* implements PumpInt
result.duration = durationInMinutes;
result.comment = MainApp.gs(R.string.virtualpump_resultok);
TreatmentsPlugin.getPlugin().addToHistoryTempBasal(tempBasal);
- if (Config.logPumpComm)
+ if (L.isEnabled(L.PUMP))
LOG.debug("Setting temp basal absolute: " + result);
MainApp.bus().post(new EventVirtualPumpUpdateGui());
getPumpStatusData().setLastCommunicationToNow();
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpDriver.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpDriver.java
index 0deedff9b4..f114440ec5 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpDriver.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpDriver.java
@@ -19,6 +19,9 @@ import info.nightscout.androidaps.data.PumpEnactResult;
import info.nightscout.androidaps.db.ExtendedBolus;
import info.nightscout.androidaps.db.Source;
import info.nightscout.androidaps.db.TemporaryBasal;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress;
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
@@ -26,7 +29,6 @@ import info.nightscout.androidaps.plugins.PumpCommon.driver.PumpDriverAbstract;
import info.nightscout.androidaps.plugins.PumpVirtual.events.EventVirtualPumpUpdateGui;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.utils.DateUtil;
-import info.nightscout.utils.NSUpload;
import info.nightscout.utils.SP;
/**
@@ -77,7 +79,7 @@ public class VirtualPumpDriver extends PumpDriverAbstract {
@Override
public boolean isFakingTempsByExtendedBoluses() {
- return (Config.NSCLIENT || Config.G5UPLOADER) && fromNSAreCommingFakedExtendedBoluses;
+ return (Config.NSCLIENT) && fromNSAreCommingFakedExtendedBoluses;
}
@@ -101,6 +103,19 @@ public class VirtualPumpDriver extends PumpDriverAbstract {
return true;
}
+ public boolean isHandshakeInProgress()
+ {
+ return false;
+ } // true if BT is connected but initial handshake is still in progress
+
+
+ public void finishHandshaking()
+ {
+
+ }// set initial handshake completed
+
+
+
@Override
public boolean isConnecting() {
return false;
@@ -108,7 +123,7 @@ public class VirtualPumpDriver extends PumpDriverAbstract {
@Override
public void connect(String reason) {
- if (!Config.NSCLIENT && !Config.G5UPLOADER)
+ if (!Config.NSCLIENT)
NSUpload.uploadDeviceStatus();
pumpStatusData.setLastCommunicationToNow();
}
@@ -143,13 +158,13 @@ public class VirtualPumpDriver extends PumpDriverAbstract {
}
@Override
- public Date lastDataTime() {
- return pumpStatusData.lastDataTime.toDate();
+ public long lastDataTime() {
+ return pumpStatusData.lastConnection;
}
@Override
public double getBaseBasalRate() {
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
if (profile != null)
return profile.getBasal();
else
@@ -182,7 +197,7 @@ public class VirtualPumpDriver extends PumpDriverAbstract {
bolusingEvent.percent = 100;
MainApp.bus().post(bolusingEvent);
SystemClock.sleep(1000);
- if (Config.logPumpComm)
+ if (L.isEnabled(L.PUMPCOMM))
LOG.debug("Delivering treatment insulin: " + detailedBolusInfo.insulin + "U carbs: " + detailedBolusInfo.carbs + "g " + result);
MainApp.bus().post(new EventVirtualPumpUpdateGui());
pumpStatusData.setLastCommunicationToNow();
@@ -212,7 +227,7 @@ public class VirtualPumpDriver extends PumpDriverAbstract {
result.duration = durationInMinutes;
result.comment = MainApp.gs(R.string.virtualpump_resultok);
TreatmentsPlugin.getPlugin().addToHistoryTempBasal(tempBasal);
- if (Config.logPumpComm)
+ if (L.isEnabled(L.PUMPCOMM))
LOG.debug("Setting temp basal absolute: " + result);
MainApp.bus().post(new EventVirtualPumpUpdateGui());
pumpStatusData.setLastCommunicationToNow();
@@ -241,7 +256,7 @@ public class VirtualPumpDriver extends PumpDriverAbstract {
result.duration = durationInMinutes;
result.comment = MainApp.gs(R.string.virtualpump_resultok);
TreatmentsPlugin.getPlugin().addToHistoryTempBasal(tempBasal);
- if (Config.logPumpComm)
+ if (L.isEnabled(L.PUMPCOMM))
LOG.debug("Settings temp basal percent: " + result);
MainApp.bus().post(new EventVirtualPumpUpdateGui());
pumpStatusData.setLastCommunicationToNow();
@@ -266,7 +281,7 @@ public class VirtualPumpDriver extends PumpDriverAbstract {
result.duration = durationInMinutes;
result.comment = MainApp.gs(R.string.virtualpump_resultok);
TreatmentsPlugin.getPlugin().addToHistoryExtendedBolus(extendedBolus);
- if (Config.logPumpComm)
+ if (L.isEnabled(L.PUMPCOMM))
LOG.debug("Setting extended bolus: " + result);
MainApp.bus().post(new EventVirtualPumpUpdateGui());
pumpStatusData.setLastCommunicationToNow();
@@ -285,7 +300,7 @@ public class VirtualPumpDriver extends PumpDriverAbstract {
TemporaryBasal tempStop = new TemporaryBasal().date(System.currentTimeMillis()).source(Source.USER);
TreatmentsPlugin.getPlugin().addToHistoryTempBasal(tempStop);
//tempBasal = null;
- if (Config.logPumpComm)
+ if (L.isEnabled(L.PUMPCOMM))
LOG.debug("Canceling temp basal: " + result);
MainApp.bus().post(new EventVirtualPumpUpdateGui());
}
@@ -306,7 +321,7 @@ public class VirtualPumpDriver extends PumpDriverAbstract {
result.enacted = true;
result.isTempCancel = true;
result.comment = MainApp.gs(R.string.virtualpump_resultok);
- if (Config.logPumpComm)
+ if (L.isEnabled(L.PUMPCOMM))
LOG.debug("Canceling extended basal: " + result);
MainApp.bus().post(new EventVirtualPumpUpdateGui());
pumpStatusData.setLastCommunicationToNow();
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpFragment.java
index f01fb0f379..ef4c85e0a7 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpFragment.java
@@ -113,10 +113,8 @@ public class VirtualPumpFragment extends SubscriberFragment {
String template = MainApp.gs(R.string.virtualpump_pump_def);
- template = template.replace("EXTENDED_NOTE", pumpType.hasExtendedBasals() ? //
- MainApp.gs(R.string.virtualpump_pump_def_extended_note) : "");
- pumpSettingsView.setText(pumpType.getFullDescription(template));
+ pumpSettingsView.setText(pumpType.getFullDescription(template, pumpType.hasExtendedBasals()));
}
});
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java
index 9d94cc6070..a21b1ca22b 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java
@@ -2,13 +2,13 @@ package info.nightscout.androidaps.plugins.PumpVirtual;
import android.os.SystemClock;
+import com.squareup.otto.Subscribe;
+
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.Date;
-
import info.nightscout.androidaps.BuildConfig;
import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
@@ -19,62 +19,38 @@ import info.nightscout.androidaps.data.PumpEnactResult;
import info.nightscout.androidaps.db.ExtendedBolus;
import info.nightscout.androidaps.db.Source;
import info.nightscout.androidaps.db.TemporaryBasal;
+import info.nightscout.androidaps.events.EventPreferenceChange;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.interfaces.PumpDescription;
import info.nightscout.androidaps.interfaces.PumpInterface;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress;
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpType;
-import info.nightscout.androidaps.plugins.PumpCommon.utils.PumpUtil;
import info.nightscout.androidaps.plugins.PumpVirtual.events.EventVirtualPumpUpdateGui;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.utils.DateUtil;
-import info.nightscout.utils.NSUpload;
import info.nightscout.utils.SP;
/**
* Created by mike on 05.08.2016.
*/
public class VirtualPumpPlugin extends PluginBase implements PumpInterface {
- private static Logger log = LoggerFactory.getLogger(VirtualPumpPlugin.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMP);
+ Integer batteryPercent = 50;
+ Integer reservoirInUnits = 50;
private static VirtualPumpPlugin plugin = null;
-
- public static VirtualPumpPlugin getPlugin() {
- loadFakingStatus();
- if (plugin == null)
- plugin = new VirtualPumpPlugin();
- return plugin;
- }
-
- static Integer batteryPercent = 50;
- static Integer reservoirInUnits = 50;
-
- private Date lastDataTime = new Date(0);
-
- private static boolean fromNSAreCommingFakedExtendedBoluses = false;
-
+ private boolean fromNSAreCommingFakedExtendedBoluses = false;
+ private PumpType pumpType = null;
+ private long lastDataTime = 0;
private PumpDescription pumpDescription = new PumpDescription();
- PumpType pumpType = null;
-
-
- private static void loadFakingStatus() {
- fromNSAreCommingFakedExtendedBoluses = SP.getBoolean(R.string.key_fromNSAreCommingFakedExtendedBoluses, false);
- }
-
- public static void setFakingStatus(boolean newStatus) {
- fromNSAreCommingFakedExtendedBoluses = newStatus;
- SP.putBoolean(R.string.key_fromNSAreCommingFakedExtendedBoluses, fromNSAreCommingFakedExtendedBoluses);
- }
-
- public static boolean getFakingStatus() {
- return fromNSAreCommingFakedExtendedBoluses;
- }
-
public VirtualPumpPlugin() {
super(new PluginDescription()
.mainType(PluginType.PUMP)
@@ -82,7 +58,7 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface {
.pluginName(R.string.virtualpump)
.shortName(R.string.virtualpump_shortname)
.preferencesId(R.xml.pref_virtualpump)
- .neverVisible(BuildConfig.NSCLIENTOLNY || BuildConfig.G5UPLOADER)
+ .neverVisible(Config.NSCLIENT)
.description(R.string.description_pump_virtual)
);
pumpDescription.isBolusCapable = true;
@@ -115,16 +91,53 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface {
pumpDescription.is30minBasalRatesCapable = true;
}
+ public static VirtualPumpPlugin getPlugin() {
+ if (plugin == null)
+ plugin = new VirtualPumpPlugin();
+ plugin.loadFakingStatus();
+ return plugin;
+ }
+
+ private void loadFakingStatus() {
+ fromNSAreCommingFakedExtendedBoluses = SP.getBoolean(R.string.key_fromNSAreCommingFakedExtendedBoluses, false);
+ }
+
+ public boolean getFakingStatus() {
+ return fromNSAreCommingFakedExtendedBoluses;
+ }
+
+ public void setFakingStatus(boolean newStatus) {
+ fromNSAreCommingFakedExtendedBoluses = newStatus;
+ SP.putBoolean(R.string.key_fromNSAreCommingFakedExtendedBoluses, fromNSAreCommingFakedExtendedBoluses);
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ MainApp.bus().register(this);
+ refreshConfiguration();
+ }
+
+ @Override
+ protected void onStop() {
+ MainApp.bus().unregister(this);
+ }
+
+ @Subscribe
+ public void onStatusEvent(final EventPreferenceChange s) {
+ if (s.isChanged(R.string.key_virtualpump_type))
+ refreshConfiguration();
+ }
+
@Override
public boolean isFakingTempsByExtendedBoluses() {
- return (Config.NSCLIENT || Config.G5UPLOADER) && fromNSAreCommingFakedExtendedBoluses;
+ return (Config.NSCLIENT) && fromNSAreCommingFakedExtendedBoluses;
}
@Override
public PumpEnactResult loadTDDs() {
//no result, could read DB in the future?
- PumpEnactResult result = new PumpEnactResult();
- return result;
+ return new PumpEnactResult();
}
@Override
@@ -152,11 +165,20 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface {
return false;
}
+ @Override
+ public boolean isHandshakeInProgress() {
+ return false;
+ }
+
+ @Override
+ public void finishHandshaking() {
+ }
+
@Override
public void connect(String reason) {
- if (!Config.NSCLIENT && !Config.G5UPLOADER)
+ if (!Config.NSCLIENT)
NSUpload.uploadDeviceStatus();
- lastDataTime = new Date();
+ lastDataTime = System.currentTimeMillis();
}
@Override
@@ -169,12 +191,12 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface {
@Override
public void getPumpStatus() {
- lastDataTime = new Date();
+ lastDataTime = System.currentTimeMillis();
}
@Override
public PumpEnactResult setNewBasalProfile(Profile profile) {
- lastDataTime = new Date();
+ lastDataTime = System.currentTimeMillis();
// Do nothing here. we are using MainApp.getConfigBuilder().getActiveProfile().getProfile();
PumpEnactResult result = new PumpEnactResult();
result.success = true;
@@ -189,21 +211,23 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface {
}
@Override
- public Date lastDataTime() {
+ public long lastDataTime() {
return lastDataTime;
}
@Override
public double getBaseBasalRate() {
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
if (profile != null)
return profile.getBasal();
else
return 0d;
}
+
@Override
public PumpEnactResult deliverTreatment(DetailedBolusInfo detailedBolusInfo) {
+
PumpEnactResult result = new PumpEnactResult();
result.success = true;
result.bolusDelivered = detailedBolusInfo.insulin;
@@ -227,21 +251,21 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface {
bolusingEvent.percent = 100;
MainApp.bus().post(bolusingEvent);
SystemClock.sleep(1000);
- if (Config.logPumpComm)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Delivering treatment insulin: " + detailedBolusInfo.insulin + "U carbs: " + detailedBolusInfo.carbs + "g " + result);
MainApp.bus().post(new EventVirtualPumpUpdateGui());
- lastDataTime = new Date();
+ lastDataTime = System.currentTimeMillis();
TreatmentsPlugin.getPlugin().addToHistoryTreatment(detailedBolusInfo, false);
return result;
}
@Override
public void stopBolusDelivering() {
-
}
@Override
public PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes, Profile profile, boolean enforceNew) {
+
TemporaryBasal tempBasal = new TemporaryBasal()
.date(System.currentTimeMillis())
.absolute(absoluteRate)
@@ -255,26 +279,21 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface {
result.duration = durationInMinutes;
result.comment = MainApp.gs(R.string.virtualpump_resultok);
TreatmentsPlugin.getPlugin().addToHistoryTempBasal(tempBasal);
- if (Config.logPumpComm)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Setting temp basal absolute: " + result);
MainApp.bus().post(new EventVirtualPumpUpdateGui());
- lastDataTime = new Date();
+ lastDataTime = System.currentTimeMillis();
return result;
}
@Override
public PumpEnactResult setTempBasalPercent(Integer percent, Integer durationInMinutes, Profile profile, boolean enforceNew) {
- PumpEnactResult result = new PumpEnactResult();
- if (TreatmentsPlugin.getPlugin().isTempBasalInProgress()) {
- result = cancelTempBasal(false);
- if (!result.success)
- return result;
- }
TemporaryBasal tempBasal = new TemporaryBasal()
.date(System.currentTimeMillis())
.percent(percent)
.duration(durationInMinutes)
.source(Source.USER);
+ PumpEnactResult result = new PumpEnactResult();
result.success = true;
result.enacted = true;
result.percent = percent;
@@ -283,10 +302,10 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface {
result.duration = durationInMinutes;
result.comment = MainApp.gs(R.string.virtualpump_resultok);
TreatmentsPlugin.getPlugin().addToHistoryTempBasal(tempBasal);
- if (Config.logPumpComm)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Settings temp basal percent: " + result);
MainApp.bus().post(new EventVirtualPumpUpdateGui());
- lastDataTime = new Date();
+ lastDataTime = System.currentTimeMillis();
return result;
}
@@ -295,11 +314,12 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface {
PumpEnactResult result = cancelExtendedBolus();
if (!result.success)
return result;
- ExtendedBolus extendedBolus = new ExtendedBolus();
- extendedBolus.date = System.currentTimeMillis();
- extendedBolus.insulin = insulin;
- extendedBolus.durationInMinutes = durationInMinutes;
- extendedBolus.source = Source.USER;
+
+ ExtendedBolus extendedBolus = new ExtendedBolus()
+ .date(System.currentTimeMillis())
+ .insulin(insulin)
+ .durationInMinutes(durationInMinutes)
+ .source(Source.USER);
result.success = true;
result.enacted = true;
result.bolusDelivered = insulin;
@@ -307,10 +327,10 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface {
result.duration = durationInMinutes;
result.comment = MainApp.gs(R.string.virtualpump_resultok);
TreatmentsPlugin.getPlugin().addToHistoryExtendedBolus(extendedBolus);
- if (Config.logPumpComm)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Setting extended bolus: " + result);
MainApp.bus().post(new EventVirtualPumpUpdateGui());
- lastDataTime = new Date();
+ lastDataTime = System.currentTimeMillis();
return result;
}
@@ -325,11 +345,11 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface {
TemporaryBasal tempStop = new TemporaryBasal().date(System.currentTimeMillis()).source(Source.USER);
TreatmentsPlugin.getPlugin().addToHistoryTempBasal(tempStop);
//tempBasal = null;
- if (Config.logPumpComm)
+ if (L.isEnabled(L.PUMPCOMM))
log.debug("Canceling temp basal: " + result);
MainApp.bus().post(new EventVirtualPumpUpdateGui());
}
- lastDataTime = new Date();
+ lastDataTime = System.currentTimeMillis();
return result;
}
@@ -345,10 +365,10 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface {
result.enacted = true;
result.isTempCancel = true;
result.comment = MainApp.gs(R.string.virtualpump_resultok);
- if (Config.logPumpComm)
- log.debug("Canceling extended basal: " + result);
+ if (L.isEnabled(L.PUMPCOMM))
+ log.debug("Canceling extended bolus: " + result);
MainApp.bus().post(new EventVirtualPumpUpdateGui());
- lastDataTime = new Date();
+ lastDataTime = System.currentTimeMillis();
return result;
}
@@ -368,7 +388,7 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface {
extended.put("Version", BuildConfig.VERSION_NAME + "-" + BuildConfig.BUILDVERSION);
try {
extended.put("ActiveProfile", profileName);
- } catch (Exception e) {
+ } catch (Exception ignored) {
}
TemporaryBasal tb = TreatmentsPlugin.getPlugin().getTempBasalFromHistory(now);
if (tb != null) {
@@ -410,25 +430,26 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface {
return "Virtual Pump";
}
- public PumpType getPumpType()
- {
+ public PumpType getPumpType() {
return pumpType;
}
- public void refreshConfiguration()
- {
- String pumptype = SP.getString("virtualpump_type", "Generic AAPS");
+ public void refreshConfiguration() {
+ String pumptype = SP.getString(R.string.key_virtualpump_type, "Generic AAPS");
PumpType pumpTypeNew = PumpType.getByDescription(pumptype);
+ if (L.isEnabled(L.PUMP))
+ log.debug("Pump in configuration: {}, PumpType object: {}", pumptype, pumpTypeNew);
+
if (pumpType == pumpTypeNew)
return;
- // reset
- pumpDescription.resetSettings();
+ if (L.isEnabled(L.PUMP))
+ log.debug("New pump configuration found ({}), changing from previous ({})", pumpTypeNew, pumpType);
- PumpUtil.setPumpDescription(pumpDescription, pumpTypeNew, true);
+ pumpDescription.setPumpDescription(pumpTypeNew);
this.pumpType = pumpTypeNew;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/AbstractSensitivityPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/AbstractSensitivityPlugin.java
index 1d96eeff6b..9f72f1b119 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/AbstractSensitivityPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/AbstractSensitivityPlugin.java
@@ -7,24 +7,26 @@ import info.nightscout.androidaps.R;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.SensitivityInterface;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensResult;
+import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
import info.nightscout.utils.Round;
import info.nightscout.utils.SP;
import info.nightscout.utils.SafeParse;
public abstract class AbstractSensitivityPlugin extends PluginBase implements SensitivityInterface {
- private static final Logger log = LoggerFactory.getLogger("AUTOSENS");
+ private static final Logger log = LoggerFactory.getLogger(L.AUTOSENS);
public AbstractSensitivityPlugin(PluginDescription pluginDescription) {
super(pluginDescription);
}
@Override
- public abstract AutosensResult detectSensitivity(long fromTime, long toTime);
+ public abstract AutosensResult detectSensitivity(IobCobCalculatorPlugin plugin, long fromTime, long toTime);
- public AutosensResult fillResult(double ratio, double carbsAbsorbed, String pastSensitivity,
- String ratioLimit, String sensResult, int deviationsArraySize) {
+ AutosensResult fillResult(double ratio, double carbsAbsorbed, String pastSensitivity,
+ String ratioLimit, String sensResult, int deviationsArraySize) {
return this.fillResult(ratio, carbsAbsorbed, pastSensitivity, ratioLimit, sensResult,
deviationsArraySize,
SafeParse.stringToDouble(SP.getString(R.string.key_openapsama_autosens_min, "0.7")),
@@ -32,8 +34,8 @@ public abstract class AbstractSensitivityPlugin extends PluginBase implements Se
}
public AutosensResult fillResult(double ratio, double carbsAbsorbed, String pastSensitivity,
- String ratioLimit, String sensResult, int deviationsArraySize,
- double ratioMin, double ratioMax) {
+ String ratioLimit, String sensResult, int deviationsArraySize,
+ double ratioMin, double ratioMax) {
double rawRatio = ratio;
ratio = Math.max(ratio, ratioMin);
ratio = Math.min(ratio, ratioMax);
@@ -51,7 +53,8 @@ public abstract class AbstractSensitivityPlugin extends PluginBase implements Se
if (ratio != rawRatio) {
ratioLimit += "Ratio limited from " + rawRatio + " to " + ratio;
- log.debug(ratioLimit);
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug(ratioLimit);
}
AutosensResult output = new AutosensResult();
@@ -64,5 +67,4 @@ public abstract class AbstractSensitivityPlugin extends PluginBase implements Se
}
-
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityAAPSPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityAAPSPlugin.java
index e5ca522a51..432420df85 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityAAPSPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityAAPSPlugin.java
@@ -10,13 +10,15 @@ import java.util.Arrays;
import java.util.Date;
import java.util.List;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.db.CareportalEvent;
+import info.nightscout.androidaps.db.ProfileSwitch;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData;
import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensResult;
import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
@@ -28,7 +30,7 @@ import info.nightscout.utils.SP;
*/
public class SensitivityAAPSPlugin extends AbstractSensitivityPlugin {
- private static Logger log = LoggerFactory.getLogger("AUTOSENS");
+ private static Logger log = LoggerFactory.getLogger(L.AUTOSENS);
static SensitivityAAPSPlugin plugin = null;
@@ -49,8 +51,8 @@ public class SensitivityAAPSPlugin extends AbstractSensitivityPlugin {
}
@Override
- public AutosensResult detectSensitivity(long fromTime, long toTime) {
- LongSparseArray autosensDataTable = IobCobCalculatorPlugin.getPlugin().getAutosensDataTable();
+ public AutosensResult detectSensitivity(IobCobCalculatorPlugin iobCobCalculatorPlugin, long fromTime, long toTime) {
+ LongSparseArray autosensDataTable = iobCobCalculatorPlugin.getAutosensDataTable();
String age = SP.getString(R.string.key_age, "");
int defaultHours = 24;
@@ -59,26 +61,29 @@ public class SensitivityAAPSPlugin extends AbstractSensitivityPlugin {
if (age.equals(MainApp.gs(R.string.key_child))) defaultHours = 4;
int hoursForDetection = SP.getInt(R.string.key_openapsama_autosens_period, defaultHours);
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
if (profile == null) {
- log.debug("No profile");
+ log.error("No profile");
return new AutosensResult();
}
if (autosensDataTable == null || autosensDataTable.size() < 4) {
- log.debug("No autosens data available. lastDataTime=" + IobCobCalculatorPlugin.getPlugin().lastDataTime());
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("No autosens data available. lastDataTime=" + iobCobCalculatorPlugin.lastDataTime());
return new AutosensResult();
}
- AutosensData current = IobCobCalculatorPlugin.getPlugin().getAutosensData(toTime); // this is running inside lock already
+ AutosensData current = iobCobCalculatorPlugin.getAutosensData(toTime); // this is running inside lock already
if (current == null) {
- log.debug("No autosens data available. toTime: " + DateUtil.dateAndTimeString(toTime) + " lastDataTime: " + IobCobCalculatorPlugin.getPlugin().lastDataTime());
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("No autosens data available. toTime: " + DateUtil.dateAndTimeString(toTime) + " lastDataTime: " + iobCobCalculatorPlugin.lastDataTime());
return new AutosensResult();
}
List siteChanges = MainApp.getDbHelper().getCareportalEventsFromTime(fromTime, CareportalEvent.SITECHANGE, true);
+ List profileSwitches = MainApp.getDbHelper().getProfileSwitchEventsFromTime(fromTime, true);
List deviationsArray = new ArrayList<>();
String pastSensitivity = "";
@@ -102,6 +107,12 @@ public class SensitivityAAPSPlugin extends AbstractSensitivityPlugin {
pastSensitivity += "(SITECHANGE)";
}
+ // reset deviations after profile switch
+ if (ProfileSwitch.isEvent5minBack(profileSwitches, autosensData.time, true)) {
+ deviationsArray.clear();
+ pastSensitivity += "(PROFILESWITCH)";
+ }
+
double deviation = autosensData.deviation;
//set positive deviations to zero if bg < 80
@@ -131,7 +142,7 @@ public class SensitivityAAPSPlugin extends AbstractSensitivityPlugin {
String ratioLimit = "";
String sensResult = "";
- if (Config.logAutosensData)
+ if (L.isEnabled(L.AUTOSENS))
log.debug("Records: " + index + " " + pastSensitivity);
Arrays.sort(deviations);
@@ -148,13 +159,13 @@ public class SensitivityAAPSPlugin extends AbstractSensitivityPlugin {
sensResult = "Sensitivity normal";
}
- if (Config.logAutosensData)
+ if (L.isEnabled(L.AUTOSENS))
log.debug(sensResult);
AutosensResult output = fillResult(ratio, current.cob, pastSensitivity, ratioLimit,
sensResult, deviationsArray.size());
- if (Config.logAutosensData) {
+ if (L.isEnabled(L.AUTOSENS)) {
log.debug("Sensitivity to: {}, percentile: {} ratio: {} mealCOB: ",
new Date(toTime).toLocaleString(),
percentile, output.ratio, ratio, current.cob);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityOref0Plugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityOref0Plugin.java
index c9086dbfbd..53a8be8661 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityOref0Plugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityOref0Plugin.java
@@ -10,13 +10,15 @@ import java.util.Arrays;
import java.util.Date;
import java.util.List;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.db.CareportalEvent;
+import info.nightscout.androidaps.db.ProfileSwitch;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData;
import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensResult;
import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
@@ -27,7 +29,7 @@ import info.nightscout.utils.DateUtil;
*/
public class SensitivityOref0Plugin extends AbstractSensitivityPlugin {
- private static Logger log = LoggerFactory.getLogger("AUTOSENS");
+ private static Logger log = LoggerFactory.getLogger(L.AUTOSENS);
static SensitivityOref0Plugin plugin = null;
@@ -48,32 +50,35 @@ public class SensitivityOref0Plugin extends AbstractSensitivityPlugin {
}
@Override
- public AutosensResult detectSensitivity(long fromTime, long toTime) {
- LongSparseArray autosensDataTable = IobCobCalculatorPlugin.getPlugin().getAutosensDataTable();
+ public AutosensResult detectSensitivity(IobCobCalculatorPlugin iobCobCalculatorPlugin, long fromTime, long toTime) {
+ LongSparseArray autosensDataTable = iobCobCalculatorPlugin.getAutosensDataTable();
int hoursForDetection = 24;
long now = System.currentTimeMillis();
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
if (profile == null) {
- log.debug("No profile");
+ log.error("No profile");
return new AutosensResult();
}
if (autosensDataTable == null || autosensDataTable.size() < 4) {
- log.debug("No autosens data available. lastDataTime=" + IobCobCalculatorPlugin.getPlugin().lastDataTime());
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("No autosens data available. lastDataTime=" + iobCobCalculatorPlugin.lastDataTime());
return new AutosensResult();
}
- AutosensData current = IobCobCalculatorPlugin.getPlugin().getAutosensData(toTime); // this is running inside lock already
+ AutosensData current = iobCobCalculatorPlugin.getAutosensData(toTime); // this is running inside lock already
if (current == null) {
- log.debug("No autosens data available. toTime: " + DateUtil.dateAndTimeString(toTime) + " lastDataTime: " + IobCobCalculatorPlugin.getPlugin().lastDataTime());
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("No autosens data available. toTime: " + DateUtil.dateAndTimeString(toTime) + " lastDataTime: " + iobCobCalculatorPlugin.lastDataTime());
return new AutosensResult();
}
List siteChanges = MainApp.getDbHelper().getCareportalEventsFromTime(fromTime, CareportalEvent.SITECHANGE, true);
+ List profileSwitches = MainApp.getDbHelper().getProfileSwitchEventsFromTime(fromTime, true);
List deviationsArray = new ArrayList<>();
String pastSensitivity = "";
@@ -97,6 +102,12 @@ public class SensitivityOref0Plugin extends AbstractSensitivityPlugin {
pastSensitivity += "(SITECHANGE)";
}
+ // reset deviations after profile switch
+ if (ProfileSwitch.isEvent5minBack(profileSwitches, autosensData.time, true)) {
+ deviationsArray.clear();
+ pastSensitivity += "(PROFILESWITCH)";
+ }
+
double deviation = autosensData.deviation;
//set positive deviations to zero if bg < 80
@@ -126,14 +137,14 @@ public class SensitivityOref0Plugin extends AbstractSensitivityPlugin {
String ratioLimit = "";
String sensResult = "";
- if (Config.logAutosensData)
+ if (L.isEnabled(L.AUTOSENS))
log.debug("Records: " + index + " " + pastSensitivity);
Arrays.sort(deviations);
for (double i = 0.9; i > 0.1; i = i - 0.02) {
if (IobCobCalculatorPlugin.percentile(deviations, (i + 0.02)) >= 0 && IobCobCalculatorPlugin.percentile(deviations, i) < 0) {
- if (Config.logAutosensData)
+ if (L.isEnabled(L.AUTOSENS))
log.debug(Math.round(100 * i) + "% of non-meal deviations negative (target 45%-50%)");
}
}
@@ -152,7 +163,7 @@ public class SensitivityOref0Plugin extends AbstractSensitivityPlugin {
sensResult = "Sensitivity normal";
}
- if (Config.logAutosensData)
+ if (L.isEnabled(L.AUTOSENS))
log.debug(sensResult);
ratio = 1 + (basalOff / profile.getMaxDailyBasal());
@@ -160,7 +171,7 @@ public class SensitivityOref0Plugin extends AbstractSensitivityPlugin {
AutosensResult output = fillResult(ratio, current.cob, pastSensitivity, ratioLimit,
sensResult, deviationsArray.size());
- if (Config.logAutosensData)
+ if (L.isEnabled(L.AUTOSENS))
log.debug("Sensitivity to: {} ratio: {} mealCOB: {}",
new Date(toTime).toLocaleString(), output.ratio, current.cob);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityOref1Plugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityOref1Plugin.java
index 214c82db9b..7d91c7fc4a 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityOref1Plugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityOref1Plugin.java
@@ -10,13 +10,15 @@ import java.util.Arrays;
import java.util.Date;
import java.util.List;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.db.CareportalEvent;
+import info.nightscout.androidaps.db.ProfileSwitch;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData;
import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensResult;
import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
@@ -27,7 +29,7 @@ import info.nightscout.utils.DateUtil;
*/
public class SensitivityOref1Plugin extends AbstractSensitivityPlugin {
- private static Logger log = LoggerFactory.getLogger("AUTOSENS");
+ private static Logger log = LoggerFactory.getLogger(L.AUTOSENS);
static SensitivityOref1Plugin plugin = null;
@@ -48,31 +50,34 @@ public class SensitivityOref1Plugin extends AbstractSensitivityPlugin {
}
@Override
- public AutosensResult detectSensitivity(long fromTime, long toTime) {
+ public AutosensResult detectSensitivity(IobCobCalculatorPlugin iobCobCalculatorPlugin, long fromTime, long toTime) {
// todo this method is called from the IobCobCalculatorPlugin, which leads to a circular
// dependency, this should be avoided
- LongSparseArray autosensDataTable = IobCobCalculatorPlugin.getPlugin().getAutosensDataTable();
+ LongSparseArray autosensDataTable = iobCobCalculatorPlugin.getAutosensDataTable();
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
if (profile == null) {
- log.debug("No profile");
+ log.error("No profile");
return new AutosensResult();
}
if (autosensDataTable == null || autosensDataTable.size() < 4) {
- log.debug("No autosens data available. lastDataTime=" + IobCobCalculatorPlugin.getPlugin().lastDataTime());
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("No autosens data available. lastDataTime=" + iobCobCalculatorPlugin.lastDataTime());
return new AutosensResult();
}
// the current
- AutosensData current = IobCobCalculatorPlugin.getPlugin().getAutosensData(toTime); // this is running inside lock already
+ AutosensData current = iobCobCalculatorPlugin.getAutosensData(toTime); // this is running inside lock already
if (current == null) {
- log.debug("No autosens data available. toTime: " + DateUtil.dateAndTimeString(toTime) + " lastDataTime: " + IobCobCalculatorPlugin.getPlugin().lastDataTime());
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("No autosens data available. toTime: " + DateUtil.dateAndTimeString(toTime) + " lastDataTime: " + iobCobCalculatorPlugin.lastDataTime());
return new AutosensResult();
}
List siteChanges = MainApp.getDbHelper().getCareportalEventsFromTime(fromTime, CareportalEvent.SITECHANGE, true);
+ List profileSwitches = MainApp.getDbHelper().getProfileSwitchEventsFromTime(fromTime, true);
List deviationsArray = new ArrayList<>();
String pastSensitivity = "";
@@ -96,6 +101,12 @@ public class SensitivityOref1Plugin extends AbstractSensitivityPlugin {
pastSensitivity += "(SITECHANGE)";
}
+ // reset deviations after profile switch
+ if (ProfileSwitch.isEvent5minBack(profileSwitches, autosensData.time, true)) {
+ deviationsArray.clear();
+ pastSensitivity += "(PROFILESWITCH)";
+ }
+
double deviation = autosensData.deviation;
//set positive deviations to zero if bg < 80
@@ -120,11 +131,11 @@ public class SensitivityOref1Plugin extends AbstractSensitivityPlugin {
// when we have less than 8h worth of deviation data, add up to 90m of zero deviations
// this dampens any large sensitivity changes detected based on too little data, without ignoring them completely
- if (Config.logAutosensData)
+ if (L.isEnabled(L.AUTOSENS))
log.debug("Using most recent " + deviationsArray.size() + " deviations");
if (deviationsArray.size() < 96) {
int pad = Math.round((1 - deviationsArray.size() / 96) * 18);
- if (Config.logAutosensData)
+ if (L.isEnabled(L.AUTOSENS))
log.debug("Adding " + pad + " more zero deviations");
for (int d = 0; d < pad; d++) {
//process.stderr.write(".");
@@ -141,18 +152,18 @@ public class SensitivityOref1Plugin extends AbstractSensitivityPlugin {
String ratioLimit = "";
String sensResult = "";
- if (Config.logAutosensData)
+ if (L.isEnabled(L.AUTOSENS))
log.debug("Records: " + index + " " + pastSensitivity);
Arrays.sort(deviations);
for (double i = 0.9; i > 0.1; i = i - 0.01) {
if (IobCobCalculatorPlugin.percentile(deviations, (i + 0.01)) >= 0 && IobCobCalculatorPlugin.percentile(deviations, i) < 0) {
- if (Config.logAutosensData)
+ if (L.isEnabled(L.AUTOSENS))
log.debug(Math.round(100 * i) + "% of non-meal deviations negative (>50% = sensitivity)");
}
if (IobCobCalculatorPlugin.percentile(deviations, (i + 0.01)) > 0 && IobCobCalculatorPlugin.percentile(deviations, i) <= 0) {
- if (Config.logAutosensData)
+ if (L.isEnabled(L.AUTOSENS))
log.debug(Math.round(100 * i) + "% of non-meal deviations negative (>50% = resistance)");
}
}
@@ -171,7 +182,7 @@ public class SensitivityOref1Plugin extends AbstractSensitivityPlugin {
sensResult = "Sensitivity normal";
}
- if (Config.logAutosensData)
+ if (L.isEnabled(L.AUTOSENS))
log.debug(sensResult);
ratio = 1 + (basalOff / profile.getMaxDailyBasal());
@@ -179,7 +190,7 @@ public class SensitivityOref1Plugin extends AbstractSensitivityPlugin {
AutosensResult output = fillResult(ratio, current.cob, pastSensitivity, ratioLimit,
sensResult, deviationsArray.size());
- if (Config.logAutosensData)
+ if (L.isEnabled(L.AUTOSENS))
log.debug("Sensitivity to: {} ratio: {} mealCOB: {}",
new Date(toTime).toLocaleString(), output.ratio, current.cob);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityWeightedAveragePlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityWeightedAveragePlugin.java
index 0200838d39..2aeb26bd1a 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityWeightedAveragePlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Sensitivity/SensitivityWeightedAveragePlugin.java
@@ -8,13 +8,15 @@ import org.slf4j.LoggerFactory;
import java.util.Date;
import java.util.List;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.db.CareportalEvent;
+import info.nightscout.androidaps.db.ProfileSwitch;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData;
import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensResult;
import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
@@ -26,7 +28,7 @@ import info.nightscout.utils.SP;
*/
public class SensitivityWeightedAveragePlugin extends AbstractSensitivityPlugin {
- private static Logger log = LoggerFactory.getLogger("AUTOSENS");
+ private static Logger log = LoggerFactory.getLogger(L.AUTOSENS);
private static SensitivityWeightedAveragePlugin plugin = null;
@@ -47,8 +49,8 @@ public class SensitivityWeightedAveragePlugin extends AbstractSensitivityPlugin
}
@Override
- public AutosensResult detectSensitivity(long fromTime, long toTime) {
- LongSparseArray autosensDataTable = IobCobCalculatorPlugin.getPlugin().getAutosensDataTable();
+ public AutosensResult detectSensitivity(IobCobCalculatorPlugin iobCobCalculatorPlugin, long fromTime, long toTime) {
+ LongSparseArray autosensDataTable = iobCobCalculatorPlugin.getAutosensDataTable();
String age = SP.getString(R.string.key_age, "");
int defaultHours = 24;
@@ -58,26 +60,28 @@ public class SensitivityWeightedAveragePlugin extends AbstractSensitivityPlugin
int hoursForDetection = SP.getInt(R.string.key_openapsama_autosens_period, defaultHours);
if (autosensDataTable == null || autosensDataTable.size() < 4) {
- log.debug("No autosens data available. lastDataTime=" + IobCobCalculatorPlugin.getPlugin().lastDataTime());
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("No autosens data available. lastDataTime=" + iobCobCalculatorPlugin.lastDataTime());
return new AutosensResult();
}
- AutosensData current = IobCobCalculatorPlugin.getPlugin().getAutosensData(toTime); // this is running inside lock already
+ AutosensData current = iobCobCalculatorPlugin.getAutosensData(toTime); // this is running inside lock already
if (current == null) {
- if (Config.logAutosensData)
- log.debug("No autosens data available. toTime: " + DateUtil.dateAndTimeString(toTime) + " lastDataTime: " + IobCobCalculatorPlugin.getPlugin().lastDataTime());
+ if (L.isEnabled(L.AUTOSENS))
+ log.debug("No autosens data available. toTime: " + DateUtil.dateAndTimeString(toTime) + " lastDataTime: " + iobCobCalculatorPlugin.lastDataTime());
return new AutosensResult();
}
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
if (profile == null) {
- if (Config.logAutosensData)
+ if (L.isEnabled(L.AUTOSENS))
log.debug("No profile available");
return new AutosensResult();
}
List siteChanges = MainApp.getDbHelper().getCareportalEventsFromTime(fromTime, CareportalEvent.SITECHANGE, true);
+ List profileSwitches = MainApp.getDbHelper().getProfileSwitchEventsFromTime(fromTime, true);
String pastSensitivity = "";
int index = 0;
@@ -107,6 +111,12 @@ public class SensitivityWeightedAveragePlugin extends AbstractSensitivityPlugin
pastSensitivity += "(SITECHANGE)";
}
+ // reset deviations after profile switch
+ if (ProfileSwitch.isEvent5minBack(profileSwitches, autosensData.time, true)) {
+ data.clear();
+ pastSensitivity += "(PROFILESWITCH)";
+ }
+
double deviation = autosensData.deviation;
//set positive deviations to zero if bg < 80
@@ -130,11 +140,11 @@ public class SensitivityWeightedAveragePlugin extends AbstractSensitivityPlugin
}
if (data.size() == 0) {
- if (Config.logAutosensData)
+ if (L.isEnabled(L.AUTOSENS))
log.debug("Data size: " + data.size() + " fromTime: " + DateUtil.dateAndTimeString(fromTime) + " toTime: " + DateUtil.dateAndTimeString(toTime));
return new AutosensResult();
} else {
- if (Config.logAutosensData)
+ if (L.isEnabled(L.AUTOSENS))
log.debug("Data size: " + data.size() + " fromTime: " + DateUtil.dateAndTimeString(fromTime) + " toTime: " + DateUtil.dateAndTimeString(toTime));
}
@@ -159,7 +169,7 @@ public class SensitivityWeightedAveragePlugin extends AbstractSensitivityPlugin
String ratioLimit = "";
String sensResult;
- if (Config.logAutosensData)
+ if (L.isEnabled(L.AUTOSENS))
log.debug("Records: " + index + " " + pastSensitivity);
double average = weightedsum / weights;
@@ -174,13 +184,13 @@ public class SensitivityWeightedAveragePlugin extends AbstractSensitivityPlugin
sensResult = "Sensitivity normal";
}
- if (Config.logAutosensData)
+ if (L.isEnabled(L.AUTOSENS))
log.debug(sensResult);
AutosensResult output = fillResult(ratio, current.cob, pastSensitivity, ratioLimit,
sensResult, data.size());
- if (Config.logAutosensData)
+ if (L.isEnabled(L.AUTOSENS))
log.debug("Sensitivity to: {} weightedaverage: {} ratio: {} mealCOB: {}", new Date(toTime).toLocaleString(),
average, output.ratio, current.cob);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorFragment.java
index d10786f8e5..3f218063ef 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorFragment.java
@@ -68,7 +68,7 @@ public class SmsCommunicatorFragment extends SubscriberFragment {
public void run() {
class CustomComparator implements Comparator {
public int compare(SmsCommunicatorPlugin.Sms object1, SmsCommunicatorPlugin.Sms object2) {
- return (int) (object1.date.getTime() - object2.date.getTime());
+ return (int) (object1.date - object2.date);
}
}
Collections.sort(SmsCommunicatorPlugin.getPlugin().messages, new CustomComparator());
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java
index 847ead4482..e5b8b76c9b 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java
@@ -2,6 +2,7 @@ package info.nightscout.androidaps.plugins.SmsCommunicator;
import android.content.Intent;
import android.content.pm.ResolveInfo;
+import android.os.Bundle;
import android.os.SystemClock;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
@@ -20,7 +21,8 @@ import java.util.List;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.Services.Intents;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
+import info.nightscout.androidaps.services.Intents;
import info.nightscout.androidaps.data.DetailedBolusInfo;
import info.nightscout.androidaps.data.GlucoseStatus;
import info.nightscout.androidaps.data.IobTotal;
@@ -39,13 +41,12 @@ import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.Loop.LoopPlugin;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
-import info.nightscout.androidaps.plugins.SmsCommunicator.events.EventNewSMS;
import info.nightscout.androidaps.plugins.SmsCommunicator.events.EventSmsCommunicatorUpdateGui;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.androidaps.queue.Callback;
import info.nightscout.utils.DecimalFormatter;
import info.nightscout.utils.FabricPrivacy;
-import info.nightscout.utils.NSUpload;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.utils.SP;
import info.nightscout.utils.SafeParse;
import info.nightscout.utils.T;
@@ -72,7 +73,7 @@ public class SmsCommunicatorPlugin extends PluginBase {
class Sms {
String phoneNumber;
String text;
- Date date;
+ long date;
boolean received = false;
boolean sent = false;
boolean processed = false;
@@ -86,18 +87,18 @@ public class SmsCommunicatorPlugin extends PluginBase {
Sms(SmsMessage message) {
phoneNumber = message.getOriginatingAddress();
text = message.getMessageBody();
- date = new Date(message.getTimestampMillis());
+ date = message.getTimestampMillis();
received = true;
}
- Sms(String phoneNumber, String text, Date date) {
+ Sms(String phoneNumber, String text, long date) {
this.phoneNumber = phoneNumber;
this.text = text;
this.date = date;
sent = true;
}
- Sms(String phoneNumber, String text, Date date, String confirmCode) {
+ Sms(String phoneNumber, String text, long date, String confirmCode) {
this.phoneNumber = phoneNumber;
this.text = text;
this.date = date;
@@ -165,10 +166,11 @@ public class SmsCommunicatorPlugin extends PluginBase {
return false;
}
- @Subscribe
- public void onStatusEvent(final EventNewSMS ev) {
+ public void handleNewData(Intent intent) {
+ Bundle bundle = intent.getExtras();
+ if (bundle == null) return;
- Object[] pdus = (Object[]) ev.bundle.get("pdus");
+ Object[] pdus = (Object[]) bundle.get("pdus");
if (pdus != null) {
// For every SMS message received
for (Object pdu : pdus) {
@@ -206,7 +208,7 @@ public class SmsCommunicatorPlugin extends PluginBase {
BgReading actualBG = DatabaseHelper.actualBg();
BgReading lastBG = DatabaseHelper.lastBg();
- String units = MainApp.getConfigBuilder().getProfileUnits();
+ String units = ProfileFunctions.getInstance().getProfileUnits();
if (actualBG != null) {
reply = MainApp.gs(R.string.sms_actualbg) + " " + actualBG.valueToUnitsToString(units) + ", ";
@@ -228,7 +230,7 @@ public class SmsCommunicatorPlugin extends PluginBase {
+ MainApp.gs(R.string.sms_bolus) + " " + DecimalFormatter.to2Decimal(bolusIob.iob) + "U "
+ MainApp.gs(R.string.sms_basal) + " " + DecimalFormatter.to2Decimal(basalIob.basaliob) + "U)";
- sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
+ sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis()));
receivedSms.processed = true;
FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Bg"));
break;
@@ -246,7 +248,7 @@ public class SmsCommunicatorPlugin extends PluginBase {
MainApp.bus().post(new EventRefreshOverview("SMS_LOOP_STOP"));
String reply = MainApp.gs(R.string.smscommunicator_loophasbeendisabled) + " " +
MainApp.gs(result.success ? R.string.smscommunicator_tempbasalcanceled : R.string.smscommunicator_tempbasalcancelfailed);
- sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
+ sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis()));
}
});
}
@@ -259,7 +261,7 @@ public class SmsCommunicatorPlugin extends PluginBase {
if (loopPlugin != null && !loopPlugin.isEnabled(PluginType.LOOP)) {
loopPlugin.setPluginEnabled(PluginType.LOOP, true);
reply = MainApp.gs(R.string.smscommunicator_loophasbeenenabled);
- sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
+ sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis()));
MainApp.bus().post(new EventRefreshOverview("SMS_LOOP_START"));
}
receivedSms.processed = true;
@@ -276,7 +278,7 @@ public class SmsCommunicatorPlugin extends PluginBase {
} else {
reply = MainApp.gs(R.string.smscommunicator_loopisdisabled);
}
- sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
+ sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis()));
}
receivedSms.processed = true;
FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Loop_Status"));
@@ -286,7 +288,7 @@ public class SmsCommunicatorPlugin extends PluginBase {
MainApp.bus().post(new EventRefreshOverview("SMS_LOOP_RESUME"));
NSUpload.uploadOpenAPSOffline(0);
reply = MainApp.gs(R.string.smscommunicator_loopresumed);
- sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date()));
+ sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis()));
FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Loop_Resume"));
break;
case "SUSPEND":
@@ -296,18 +298,18 @@ public class SmsCommunicatorPlugin extends PluginBase {
duration = Math.min(180, duration);
if (duration == 0) {
reply = MainApp.gs(R.string.smscommunicator_wrongduration);
- sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
+ sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis()));
} else if (remoteCommandsAllowed) {
passCode = generatePasscode();
reply = String.format(MainApp.gs(R.string.smscommunicator_suspendreplywithcode), duration, passCode);
receivedSms.processed = true;
resetWaitingMessages();
- sendSMS(suspendWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, new Date(), passCode));
+ sendSMS(suspendWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis(), passCode));
suspendWaitingForConfirmation.duration = duration;
FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Loop_Suspend"));
} else {
reply = MainApp.gs(R.string.smscommunicator_remotecommandnotallowed);
- sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
+ sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis()));
}
break;
}
@@ -321,7 +323,7 @@ public class SmsCommunicatorPlugin extends PluginBase {
MainApp.instance().getApplicationContext().sendBroadcast(restartNSClient);
List q = MainApp.instance().getApplicationContext().getPackageManager().queryBroadcastReceivers(restartNSClient, 0);
reply = "TERATMENTS REFRESH " + q.size() + " receivers";
- sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
+ sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis()));
receivedSms.processed = true;
FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Treatments_Refresh"));
break;
@@ -335,7 +337,7 @@ public class SmsCommunicatorPlugin extends PluginBase {
MainApp.instance().getApplicationContext().sendBroadcast(restartNSClient);
List q = MainApp.instance().getApplicationContext().getPackageManager().queryBroadcastReceivers(restartNSClient, 0);
reply = "NSCLIENT RESTART " + q.size() + " receivers";
- sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
+ sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis()));
receivedSms.processed = true;
FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Nsclient_Restart"));
break;
@@ -350,11 +352,11 @@ public class SmsCommunicatorPlugin extends PluginBase {
if (result.success) {
if (pump != null) {
String reply = pump.shortStatus(true);
- sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date()));
+ sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis()));
}
} else {
String reply = MainApp.gs(R.string.readstatusfailed);
- sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
+ sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis()));
}
}
});
@@ -369,18 +371,18 @@ public class SmsCommunicatorPlugin extends PluginBase {
reply = String.format(MainApp.gs(R.string.smscommunicator_basalstopreplywithcode), passCode);
receivedSms.processed = true;
resetWaitingMessages();
- sendSMS(cancelTempBasalWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, new Date(), passCode));
+ sendSMS(cancelTempBasalWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis(), passCode));
FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Basal"));
} else {
reply = MainApp.gs(R.string.smscommunicator_remotebasalnotallowed);
- sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
+ sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis()));
}
} else {
tempBasal = SafeParse.stringToDouble(splited[1]);
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
if (profile == null) {
reply = MainApp.gs(R.string.noprofile);
- sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
+ sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis()));
} else {
tempBasal = MainApp.getConstraintChecker().applyBasalConstraints(new Constraint<>(tempBasal), profile).value();
if (remoteCommandsAllowed) {
@@ -388,12 +390,12 @@ public class SmsCommunicatorPlugin extends PluginBase {
reply = String.format(MainApp.gs(R.string.smscommunicator_basalreplywithcode), tempBasal, passCode);
receivedSms.processed = true;
resetWaitingMessages();
- sendSMS(tempBasalWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, new Date(), passCode));
+ sendSMS(tempBasalWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis(), passCode));
tempBasalWaitingForConfirmation.tempBasal = tempBasal;
FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Basal"));
} else {
reply = MainApp.gs(R.string.smscommunicator_remotebasalnotallowed);
- sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
+ sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis()));
}
}
}
@@ -402,10 +404,10 @@ public class SmsCommunicatorPlugin extends PluginBase {
case "BOLUS":
if (System.currentTimeMillis() - lastRemoteBolusTime.getTime() < Constants.remoteBolusMinDistance) {
reply = MainApp.gs(R.string.smscommunicator_remotebolusnotallowed);
- sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
+ sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis()));
} else if (ConfigBuilderPlugin.getActivePump().isSuspended()) {
reply = MainApp.gs(R.string.pumpsuspended);
- sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
+ sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis()));
} else if (splited.length > 1) {
amount = SafeParse.stringToDouble(splited[1]);
amount = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(amount)).value();
@@ -414,12 +416,12 @@ public class SmsCommunicatorPlugin extends PluginBase {
reply = String.format(MainApp.gs(R.string.smscommunicator_bolusreplywithcode), amount, passCode);
receivedSms.processed = true;
resetWaitingMessages();
- sendSMS(bolusWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, new Date(), passCode));
+ sendSMS(bolusWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis(), passCode));
bolusWaitingForConfirmation.bolusRequested = amount;
FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Bolus"));
} else {
reply = MainApp.gs(R.string.smscommunicator_remotebolusnotallowed);
- sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
+ sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis()));
}
}
break;
@@ -431,18 +433,18 @@ public class SmsCommunicatorPlugin extends PluginBase {
reply = String.format(MainApp.gs(R.string.smscommunicator_calibrationreplywithcode), amount, passCode);
receivedSms.processed = true;
resetWaitingMessages();
- sendSMS(calibrationWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, new Date(), passCode));
+ sendSMS(calibrationWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis(), passCode));
calibrationWaitingForConfirmation.calibrationRequested = amount;
FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Cal"));
} else {
reply = MainApp.gs(R.string.smscommunicator_remotecalibrationnotallowed);
- sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
+ sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis()));
}
}
break;
default: // expect passCode here
if (bolusWaitingForConfirmation != null && !bolusWaitingForConfirmation.processed &&
- bolusWaitingForConfirmation.confirmCode.equals(splited[0]) && System.currentTimeMillis() - bolusWaitingForConfirmation.date.getTime() < Constants.SMS_CONFIRM_TIMEOUT) {
+ bolusWaitingForConfirmation.confirmCode.equals(splited[0]) && System.currentTimeMillis() - bolusWaitingForConfirmation.date < Constants.SMS_CONFIRM_TIMEOUT) {
bolusWaitingForConfirmation.processed = true;
DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo();
detailedBolusInfo.insulin = bolusWaitingForConfirmation.bolusRequested;
@@ -457,20 +459,20 @@ public class SmsCommunicatorPlugin extends PluginBase {
if (pump != null)
reply += "\n" + pump.shortStatus(true);
lastRemoteBolusTime = new Date();
- sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date()));
+ sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis()));
} else {
SystemClock.sleep(T.secs(60).msecs()); // wait some time to get history
String reply = MainApp.gs(R.string.smscommunicator_bolusfailed);
if (pump != null)
reply += "\n" + pump.shortStatus(true);
- sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
+ sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis()));
}
}
});
} else if (tempBasalWaitingForConfirmation != null && !tempBasalWaitingForConfirmation.processed &&
- tempBasalWaitingForConfirmation.confirmCode.equals(splited[0]) && System.currentTimeMillis() - tempBasalWaitingForConfirmation.date.getTime() < Constants.SMS_CONFIRM_TIMEOUT) {
+ tempBasalWaitingForConfirmation.confirmCode.equals(splited[0]) && System.currentTimeMillis() - tempBasalWaitingForConfirmation.date < Constants.SMS_CONFIRM_TIMEOUT) {
tempBasalWaitingForConfirmation.processed = true;
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
if (profile != null)
ConfigBuilderPlugin.getCommandQueue().tempBasalAbsolute(tempBasalWaitingForConfirmation.tempBasal, 30, true, profile, new Callback() {
@Override
@@ -478,16 +480,16 @@ public class SmsCommunicatorPlugin extends PluginBase {
if (result.success) {
String reply = String.format(MainApp.gs(R.string.smscommunicator_tempbasalset), result.absolute, result.duration);
reply += "\n" + ConfigBuilderPlugin.getActivePump().shortStatus(true);
- sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date()));
+ sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis()));
} else {
String reply = MainApp.gs(R.string.smscommunicator_tempbasalfailed);
reply += "\n" + ConfigBuilderPlugin.getActivePump().shortStatus(true);
- sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
+ sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis()));
}
}
});
} else if (cancelTempBasalWaitingForConfirmation != null && !cancelTempBasalWaitingForConfirmation.processed &&
- cancelTempBasalWaitingForConfirmation.confirmCode.equals(splited[0]) && System.currentTimeMillis() - cancelTempBasalWaitingForConfirmation.date.getTime() < Constants.SMS_CONFIRM_TIMEOUT) {
+ cancelTempBasalWaitingForConfirmation.confirmCode.equals(splited[0]) && System.currentTimeMillis() - cancelTempBasalWaitingForConfirmation.date < Constants.SMS_CONFIRM_TIMEOUT) {
cancelTempBasalWaitingForConfirmation.processed = true;
ConfigBuilderPlugin.getCommandQueue().cancelTempBasal(true, new Callback() {
@Override
@@ -495,27 +497,27 @@ public class SmsCommunicatorPlugin extends PluginBase {
if (result.success) {
String reply = MainApp.gs(R.string.smscommunicator_tempbasalcanceled);
reply += "\n" + ConfigBuilderPlugin.getActivePump().shortStatus(true);
- sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date()));
+ sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis()));
} else {
String reply = MainApp.gs(R.string.smscommunicator_tempbasalcancelfailed);
reply += "\n" + ConfigBuilderPlugin.getActivePump().shortStatus(true);
- sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
+ sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis()));
}
}
});
} else if (calibrationWaitingForConfirmation != null && !calibrationWaitingForConfirmation.processed &&
- calibrationWaitingForConfirmation.confirmCode.equals(splited[0]) && System.currentTimeMillis() - calibrationWaitingForConfirmation.date.getTime() < Constants.SMS_CONFIRM_TIMEOUT) {
+ calibrationWaitingForConfirmation.confirmCode.equals(splited[0]) && System.currentTimeMillis() - calibrationWaitingForConfirmation.date < Constants.SMS_CONFIRM_TIMEOUT) {
calibrationWaitingForConfirmation.processed = true;
boolean result = XdripCalibrations.sendIntent(calibrationWaitingForConfirmation.calibrationRequested);
if (result) {
reply = MainApp.gs(R.string.smscommunicator_calibrationsent);
- sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date()));
+ sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis()));
} else {
reply = MainApp.gs(R.string.smscommunicator_calibrationfailed);
- sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
+ sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis()));
}
} else if (suspendWaitingForConfirmation != null && !suspendWaitingForConfirmation.processed &&
- suspendWaitingForConfirmation.confirmCode.equals(splited[0]) && System.currentTimeMillis() - suspendWaitingForConfirmation.date.getTime() < Constants.SMS_CONFIRM_TIMEOUT) {
+ suspendWaitingForConfirmation.confirmCode.equals(splited[0]) && System.currentTimeMillis() - suspendWaitingForConfirmation.date < Constants.SMS_CONFIRM_TIMEOUT) {
suspendWaitingForConfirmation.processed = true;
ConfigBuilderPlugin.getCommandQueue().cancelTempBasal(true, new Callback() {
@Override
@@ -526,16 +528,16 @@ public class SmsCommunicatorPlugin extends PluginBase {
MainApp.bus().post(new EventRefreshOverview("SMS_LOOP_SUSPENDED"));
String reply = MainApp.gs(R.string.smscommunicator_loopsuspended) + " " +
MainApp.gs(result.success ? R.string.smscommunicator_tempbasalcanceled : R.string.smscommunicator_tempbasalcancelfailed);
- sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date()));
+ sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis()));
} else {
String reply = MainApp.gs(R.string.smscommunicator_tempbasalcancelfailed);
reply += "\n" + ConfigBuilderPlugin.getActivePump().shortStatus(true);
- sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
+ sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis()));
}
}
});
} else {
- sendSMS(new Sms(receivedSms.phoneNumber, MainApp.gs(R.string.smscommunicator_unknowncommand), new Date()));
+ sendSMS(new Sms(receivedSms.phoneNumber, MainApp.gs(R.string.smscommunicator_unknowncommand), System.currentTimeMillis()));
}
resetWaitingMessages();
break;
@@ -547,7 +549,7 @@ public class SmsCommunicatorPlugin extends PluginBase {
public void sendNotificationToAllNumbers(String text) {
for (int i = 0; i < allowedNumbers.size(); i++) {
- Sms sms = new Sms(allowedNumbers.get(i), text, new Date());
+ Sms sms = new Sms(allowedNumbers.get(i), text, System.currentTimeMillis());
sendSMS(sms);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/events/EventNewSMS.java b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/events/EventNewSMS.java
deleted file mode 100644
index dfaebb3942..0000000000
--- a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/events/EventNewSMS.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package info.nightscout.androidaps.plugins.SmsCommunicator.events;
-
-import android.os.Bundle;
-
-import info.nightscout.androidaps.events.Event;
-
-/**
- * Created by mike on 13.07.2016.
- */
-public class EventNewSMS extends Event {
- public Bundle bundle;
- public EventNewSMS(Bundle bundle) {
- this.bundle = bundle;
- }
-}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Source/BGSourceFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Source/BGSourceFragment.java
index 3e9a79d459..18fb3178d8 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Source/BGSourceFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Source/BGSourceFragment.java
@@ -4,6 +4,7 @@ import android.app.Activity;
import android.content.DialogInterface;
import android.graphics.Paint;
import android.os.Bundle;
+import android.support.annotation.NonNull;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
@@ -19,28 +20,27 @@ import org.slf4j.LoggerFactory;
import java.util.List;
+import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.db.BgReading;
import info.nightscout.androidaps.events.EventNewBG;
import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.utils.DateUtil;
import info.nightscout.utils.FabricPrivacy;
-import info.nightscout.utils.NSUpload;
+import info.nightscout.utils.T;
/**
* Created by mike on 16.10.2017.
*/
public class BGSourceFragment extends SubscriberFragment {
- private static Logger log = LoggerFactory.getLogger(BGSourceFragment.class);
-
RecyclerView recyclerView;
- Profile profile;
+ String units = Constants.MGDL;
- final long MILLS_TO_THE_PAST = 12 * 60 * 60 * 1000L;
+ final long MILLS_TO_THE_PAST = T.hours(12).msecs();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
@@ -57,7 +57,8 @@ public class BGSourceFragment extends SubscriberFragment {
RecyclerViewAdapter adapter = new RecyclerViewAdapter(MainApp.getDbHelper().getAllBgreadingsDataFromTime(now - MILLS_TO_THE_PAST, false));
recyclerView.setAdapter(adapter);
- profile = MainApp.getConfigBuilder().getActiveProfileInterface().getProfile().getDefaultProfile();
+ if (MainApp.getConfigBuilder().getActiveProfileInterface() != null && MainApp.getConfigBuilder().getActiveProfileInterface().getProfile() != null && MainApp.getConfigBuilder().getActiveProfileInterface().getProfile().getDefaultProfile() != null)
+ units = MainApp.getConfigBuilder().getActiveProfileInterface().getProfile().getDefaultProfile().getUnits();
return view;
} catch (Exception e) {
@@ -68,8 +69,7 @@ public class BGSourceFragment extends SubscriberFragment {
}
@Subscribe
- @SuppressWarnings("unused")
- public void onStatusEvent(final EventNewBG ev) {
+ public void onStatusEvent(final EventNewBG unused) {
updateGUI();
}
@@ -77,12 +77,9 @@ public class BGSourceFragment extends SubscriberFragment {
protected void updateGUI() {
Activity activity = getActivity();
if (activity != null)
- activity.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- long now = System.currentTimeMillis();
- recyclerView.swapAdapter(new BGSourceFragment.RecyclerViewAdapter(MainApp.getDbHelper().getAllBgreadingsDataFromTime(now - MILLS_TO_THE_PAST, false)), true);
- }
+ activity.runOnUiThread(() -> {
+ long now = System.currentTimeMillis();
+ recyclerView.swapAdapter(new RecyclerViewAdapter(MainApp.getDbHelper().getAllBgreadingsDataFromTime(now - MILLS_TO_THE_PAST, false)), true);
});
}
@@ -101,12 +98,12 @@ public class BGSourceFragment extends SubscriberFragment {
}
@Override
- public void onBindViewHolder(BgReadingsViewHolder holder, int position) {
+ public void onBindViewHolder(@NonNull BgReadingsViewHolder holder, int position) {
BgReading bgReading = bgReadings.get(position);
holder.ns.setVisibility(NSUpload.isIdValid(bgReading._id) ? View.VISIBLE : View.GONE);
holder.invalid.setVisibility(!bgReading.isValid ? View.VISIBLE : View.GONE);
holder.date.setText(DateUtil.dateAndTimeString(bgReading.date));
- holder.value.setText(bgReading.valueToUnitsToString(profile.getUnits()));
+ holder.value.setText(bgReading.valueToUnitsToString(units));
holder.direction.setText(bgReading.directionToSymbol());
holder.remove.setTag(bgReading);
}
@@ -144,7 +141,7 @@ public class BGSourceFragment extends SubscriberFragment {
case R.id.bgsource_remove:
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setTitle(MainApp.gs(R.string.confirmation));
- builder.setMessage(MainApp.gs(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(bgReading.date) + "\n" + bgReading.valueToUnitsToString(profile.getUnits()));
+ builder.setMessage(MainApp.gs(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(bgReading.date) + "\n" + bgReading.valueToUnitsToString(units));
builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
/* final String _id = bgReading._id;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceDexcomG5Plugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceDexcomG5Plugin.java
index af040c8c90..460e550b8e 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceDexcomG5Plugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceDexcomG5Plugin.java
@@ -1,17 +1,32 @@
package info.nightscout.androidaps.plugins.Source;
+import android.content.Intent;
+import android.os.Bundle;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.db.BgReading;
import info.nightscout.androidaps.interfaces.BgSourceInterface;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
+import info.nightscout.utils.SP;
/**
* Created by mike on 28.11.2017.
*/
public class SourceDexcomG5Plugin extends PluginBase implements BgSourceInterface {
+ private static Logger log = LoggerFactory.getLogger(L.BGSOURCE);
private static SourceDexcomG5Plugin plugin = null;
@@ -27,7 +42,6 @@ public class SourceDexcomG5Plugin extends PluginBase implements BgSourceInterfac
.fragmentClass(BGSourceFragment.class.getName())
.pluginName(R.string.DexcomG5)
.shortName(R.string.dexcomG5_shortname)
- .showInList(!Config.NSCLIENT)
.preferencesId(R.xml.pref_dexcomg5)
.description(R.string.description_source_dexcom_g5)
);
@@ -37,4 +51,45 @@ public class SourceDexcomG5Plugin extends PluginBase implements BgSourceInterfac
public boolean advancedFilteringSupported() {
return true;
}
+
+ @Override
+ public void handleNewData(Intent intent) {
+ // onHandleIntent Bundle{ data => [{"m_time":1511939180,"m_trend":"NotComputable","m_value":335}]; android.support.content.wakelockid => 95; }Bundle
+
+ if (!isEnabled(PluginType.BGSOURCE)) return;
+
+ Bundle bundle = intent.getExtras();
+ if (bundle == null) return;
+
+ BgReading bgReading = new BgReading();
+
+ String data = bundle.getString("data");
+ if (L.isEnabled(L.BGSOURCE))
+ log.debug("Received Dexcom Data", data);
+
+ if (data == null) return;
+
+ try {
+ JSONArray jsonArray = new JSONArray(data);
+ if (L.isEnabled(L.BGSOURCE))
+ log.debug("Received Dexcom Data size:" + jsonArray.length());
+ for (int i = 0; i < jsonArray.length(); i++) {
+ JSONObject json = jsonArray.getJSONObject(i);
+ bgReading.value = json.getInt("m_value");
+ bgReading.direction = json.getString("m_trend");
+ bgReading.date = json.getLong("m_time") * 1000L;
+ bgReading.raw = 0;
+ boolean isNew = MainApp.getDbHelper().createIfNotExists(bgReading, "DexcomG5");
+ if (isNew && SP.getBoolean(R.string.key_dexcomg5_nsupload, false)) {
+ NSUpload.uploadBg(bgReading);
+ }
+ if (isNew && SP.getBoolean(R.string.key_dexcomg5_xdripupload, false)) {
+ NSUpload.sendToXdrip(bgReading);
+ }
+ }
+
+ } catch (JSONException e) {
+ log.error("Exception: ", e);
+ }
+ }
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceGlimpPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceGlimpPlugin.java
index 38b891ff65..07fdba51ee 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceGlimpPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceGlimpPlugin.java
@@ -1,15 +1,26 @@
package info.nightscout.androidaps.plugins.Source;
+import android.content.Intent;
+import android.os.Bundle;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.db.BgReading;
import info.nightscout.androidaps.interfaces.BgSourceInterface;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.logging.BundleLogger;
+import info.nightscout.androidaps.logging.L;
/**
* Created by mike on 05.08.2016.
*/
public class SourceGlimpPlugin extends PluginBase implements BgSourceInterface {
+ private static Logger log = LoggerFactory.getLogger(L.BGSOURCE);
private static SourceGlimpPlugin plugin = null;
@@ -32,4 +43,25 @@ public class SourceGlimpPlugin extends PluginBase implements BgSourceInterface {
public boolean advancedFilteringSupported() {
return false;
}
+
+ @Override
+ public void handleNewData(Intent intent) {
+
+ if (!isEnabled(PluginType.BGSOURCE)) return;
+
+ Bundle bundle = intent.getExtras();
+ if (bundle == null) return;
+
+ if (L.isEnabled(L.BGSOURCE))
+ log.debug("Received Glimp Data: " + BundleLogger.log(bundle));
+
+ BgReading bgReading = new BgReading();
+
+ bgReading.value = bundle.getDouble("mySGV");
+ bgReading.direction = bundle.getString("myTrend");
+ bgReading.date = bundle.getLong("myTimestamp");
+ bgReading.raw = 0;
+
+ MainApp.getDbHelper().createIfNotExists(bgReading, "GLIMP");
+ }
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceMM640gPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceMM640gPlugin.java
index 041b084efd..8bc6811ef4 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceMM640gPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceMM640gPlugin.java
@@ -1,15 +1,29 @@
package info.nightscout.androidaps.plugins.Source;
+import android.content.Intent;
+import android.os.Bundle;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.db.BgReading;
import info.nightscout.androidaps.interfaces.BgSourceInterface;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.logging.L;
/**
* Created by mike on 05.08.2016.
*/
public class SourceMM640gPlugin extends PluginBase implements BgSourceInterface {
+ private static Logger log = LoggerFactory.getLogger(L.BGSOURCE);
+
private static SourceMM640gPlugin plugin = null;
public static SourceMM640gPlugin getPlugin() {
@@ -31,4 +45,49 @@ public class SourceMM640gPlugin extends PluginBase implements BgSourceInterface
public boolean advancedFilteringSupported() {
return false;
}
+
+ @Override
+ public void handleNewData(Intent intent) {
+
+ if (!isEnabled(PluginType.BGSOURCE)) return;
+
+ Bundle bundle = intent.getExtras();
+ if (bundle == null) return;
+
+ final String collection = bundle.getString("collection");
+ if (collection == null) return;
+
+ if (collection.equals("entries")) {
+ final String data = bundle.getString("data");
+ if (L.isEnabled(L.BGSOURCE))
+ log.debug("Received MM640g Data: ", data);
+
+ if ((data != null) && (data.length() > 0)) {
+ try {
+ final JSONArray json_array = new JSONArray(data);
+ for (int i = 0; i < json_array.length(); i++) {
+ final JSONObject json_object = json_array.getJSONObject(i);
+ final String type = json_object.getString("type");
+ switch (type) {
+ case "sgv":
+ BgReading bgReading = new BgReading();
+
+ bgReading.value = json_object.getDouble("sgv");
+ bgReading.direction = json_object.getString("direction");
+ bgReading.date = json_object.getLong("date");
+ bgReading.raw = json_object.getDouble("sgv");
+
+ MainApp.getDbHelper().createIfNotExists(bgReading, "MM640g");
+ break;
+ default:
+ if (L.isEnabled(L.BGSOURCE))
+ log.debug("Unknown entries type: " + type);
+ }
+ }
+ } catch (JSONException e) {
+ log.error("Exception: ", e);
+ }
+ }
+ }
+ }
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceNSClientPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceNSClientPlugin.java
index c99fbcb9bb..de110edd4e 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceNSClientPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceNSClientPlugin.java
@@ -1,16 +1,32 @@
package info.nightscout.androidaps.plugins.Source;
+import android.content.Intent;
+import android.os.Bundle;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.db.BgReading;
import info.nightscout.androidaps.interfaces.BgSourceInterface;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.ConstraintsObjectives.ObjectivesPlugin;
+import info.nightscout.androidaps.plugins.NSClientInternal.data.NSSgv;
+import info.nightscout.utils.JsonHelper;
+import info.nightscout.utils.SP;
/**
* Created by mike on 05.08.2016.
*/
public class SourceNSClientPlugin extends PluginBase implements BgSourceInterface {
+ private static Logger log = LoggerFactory.getLogger(L.BGSOURCE);
private static SourceNSClientPlugin plugin = null;
@@ -28,8 +44,6 @@ public class SourceNSClientPlugin extends PluginBase implements BgSourceInterfac
.mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment.class.getName())
.pluginName(R.string.nsclientbg)
- .showInList(!Config.NSCLIENT)
- .alwaysEnabled(Config.NSCLIENT)
.description(R.string.description_source_ns_client)
);
}
@@ -39,9 +53,53 @@ public class SourceNSClientPlugin extends PluginBase implements BgSourceInterfac
return isAdvancedFilteringEnabled;
}
+ @Override
+ public void handleNewData(Intent intent) {
+
+ if (!isEnabled(PluginType.BGSOURCE) && !SP.getBoolean(R.string.key_ns_autobackfill, true))
+ return;
+
+ Bundle bundles = intent.getExtras();
+
+ try {
+ if (bundles.containsKey("sgv")) {
+ String sgvstring = bundles.getString("sgv");
+ if (L.isEnabled(L.BGSOURCE))
+ log.debug("Received NS Data: " + sgvstring);
+
+ JSONObject sgvJson = new JSONObject(sgvstring);
+ storeSgv(sgvJson);
+ }
+
+ if (bundles.containsKey("sgvs")) {
+ String sgvstring = bundles.getString("sgvs");
+ if (L.isEnabled(L.BGSOURCE))
+ log.debug("Received NS Data: " + sgvstring);
+ JSONArray jsonArray = new JSONArray(sgvstring);
+ for (int i = 0; i < jsonArray.length(); i++) {
+ JSONObject sgvJson = jsonArray.getJSONObject(i);
+ storeSgv(sgvJson);
+ }
+ }
+ } catch (Exception e) {
+ log.error("Unhandled exception", e);
+ }
+
+ // Objectives 0
+ ObjectivesPlugin.getPlugin().bgIsAvailableInNS = true;
+ ObjectivesPlugin.getPlugin().saveProgress();
+ }
+
+ private void storeSgv(JSONObject sgvJson) {
+ NSSgv nsSgv = new NSSgv(sgvJson);
+ BgReading bgReading = new BgReading(nsSgv);
+ MainApp.getDbHelper().createIfNotExists(bgReading, "NS");
+ SourceNSClientPlugin.getPlugin().detectSource(JsonHelper.safeGetString(sgvJson, "device", "none"), JsonHelper.safeGetLong(sgvJson, "mills"));
+ }
+
public void detectSource(String source, long timeStamp) {
if (timeStamp > lastBGTimeStamp) {
- if (source.contains("G5 Native") || source.contains("AndroidAPS-DexcomG5"))
+ if (source.contains("G5 Native") || source.contains("G6 Native") || source.contains("AndroidAPS-DexcomG5"))
isAdvancedFilteringEnabled = true;
else
isAdvancedFilteringEnabled = false;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourcePoctechPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourcePoctechPlugin.java
index 13cb99d392..df390522d3 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourcePoctechPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourcePoctechPlugin.java
@@ -1,16 +1,33 @@
package info.nightscout.androidaps.plugins.Source;
+import android.content.Intent;
+import android.os.Bundle;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.Constants;
+import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.db.BgReading;
import info.nightscout.androidaps.interfaces.BgSourceInterface;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.utils.JsonHelper;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
+import info.nightscout.utils.SP;
/**
* Created by mike on 05.08.2016.
*/
public class SourcePoctechPlugin extends PluginBase implements BgSourceInterface {
+ private static Logger log = LoggerFactory.getLogger(L.BGSOURCE);
private static SourcePoctechPlugin plugin = null;
@@ -25,7 +42,6 @@ public class SourcePoctechPlugin extends PluginBase implements BgSourceInterface
.mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment.class.getName())
.pluginName(R.string.poctech)
- .showInList(!Config.NSCLIENT)
.preferencesId(R.xml.pref_poctech)
.description(R.string.description_source_poctech)
);
@@ -36,4 +52,44 @@ public class SourcePoctechPlugin extends PluginBase implements BgSourceInterface
return false;
}
+ @Override
+ public void handleNewData(Intent intent) {
+
+ if (!isEnabled(PluginType.BGSOURCE)) return;
+
+ Bundle bundle = intent.getExtras();
+ if (bundle == null) return;
+
+ BgReading bgReading = new BgReading();
+
+ String data = bundle.getString("data");
+ if (L.isEnabled(L.BGSOURCE))
+ log.debug("Received Poctech Data", data);
+
+ try {
+ JSONArray jsonArray = new JSONArray(data);
+ if (L.isEnabled(L.BGSOURCE))
+ log.debug("Received Poctech Data size:" + jsonArray.length());
+ for (int i = 0; i < jsonArray.length(); i++) {
+ JSONObject json = jsonArray.getJSONObject(i);
+ bgReading.value = json.getDouble("current");
+ bgReading.direction = json.getString("direction");
+ bgReading.date = json.getLong("date");
+ bgReading.raw = json.getDouble("raw");
+ if (JsonHelper.safeGetString(json, "units", Constants.MGDL).equals("mmol/L"))
+ bgReading.value = bgReading.value * Constants.MMOLL_TO_MGDL;
+ boolean isNew = MainApp.getDbHelper().createIfNotExists(bgReading, "Poctech");
+ if (isNew && SP.getBoolean(R.string.key_dexcomg5_nsupload, false)) {
+ NSUpload.uploadBg(bgReading);
+ }
+ if (isNew && SP.getBoolean(R.string.key_dexcomg5_xdripupload, false)) {
+ NSUpload.sendToXdrip(bgReading);
+ }
+ }
+
+ } catch (JSONException e) {
+ log.error("Exception: ", e);
+ }
+ }
+
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceXdripPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceXdripPlugin.java
index fa61c9ea61..a81bad41f4 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceXdripPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceXdripPlugin.java
@@ -1,18 +1,30 @@
package info.nightscout.androidaps.plugins.Source;
+import android.content.Intent;
+import android.os.Bundle;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.services.Intents;
+import info.nightscout.androidaps.db.BgReading;
import info.nightscout.androidaps.interfaces.BgSourceInterface;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.logging.BundleLogger;
/**
* Created by mike on 05.08.2016.
*/
public class SourceXdripPlugin extends PluginBase implements BgSourceInterface {
+ private static Logger log = LoggerFactory.getLogger(L.BGSOURCE);
private static SourceXdripPlugin plugin = null;
-
+
boolean advancedFiltering;
public static SourceXdripPlugin getPlugin() {
@@ -35,7 +47,29 @@ public class SourceXdripPlugin extends PluginBase implements BgSourceInterface {
return advancedFiltering;
}
+ @Override
+ public void handleNewData(Intent intent) {
+
+ if (!isEnabled(PluginType.BGSOURCE)) return;
+
+ Bundle bundle = intent.getExtras();
+ if (bundle == null) return;
+
+ if (L.isEnabled(L.BGSOURCE))
+ log.debug("Received xDrip data: " + BundleLogger.log(intent.getExtras()));
+
+ BgReading bgReading = new BgReading();
+
+ bgReading.value = bundle.getDouble(Intents.EXTRA_BG_ESTIMATE);
+ bgReading.direction = bundle.getString(Intents.EXTRA_BG_SLOPE_NAME);
+ bgReading.date = bundle.getLong(Intents.EXTRA_TIMESTAMP);
+ bgReading.raw = bundle.getDouble(Intents.EXTRA_RAW);
+ String source = bundle.getString(Intents.XDRIP_DATA_SOURCE_DESCRIPTION, "no Source specified");
+ SourceXdripPlugin.getPlugin().setSource(source);
+ MainApp.getDbHelper().createIfNotExists(bgReading, "XDRIP");
+ }
+
public void setSource(String source) {
- this.advancedFiltering = source.contains("G5 Native");
+ this.advancedFiltering = source.contains("G5 Native")||source.contains("G6 Native");
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/Treatment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/Treatment.java
index 73423c0eab..2e9dfdd5ea 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/Treatment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/Treatment.java
@@ -1,6 +1,7 @@
package info.nightscout.androidaps.plugins.Treatments;
import android.graphics.Color;
+import android.support.annotation.Nullable;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
@@ -10,6 +11,7 @@ import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.util.Date;
import java.util.Objects;
import info.nightscout.androidaps.Constants;
@@ -29,8 +31,6 @@ import info.nightscout.utils.JsonHelper;
@DatabaseTable(tableName = Treatment.TABLE_TREATMENTS)
public class Treatment implements DataPointWithLabelInterface {
- private static Logger log = LoggerFactory.getLogger(Treatment.class);
-
public static final String TABLE_TREATMENTS = "Treatments";
@DatabaseField(id = true)
@@ -60,6 +60,8 @@ public class Treatment implements DataPointWithLabelInterface {
public int insulinInterfaceID = InsulinInterface.OREF_RAPID_ACTING; // currently unused, will be used in the future
@DatabaseField
public double dia = Constants.defaultDIA; // currently unused, will be used in the future
+ @DatabaseField
+ public String boluscalc;
public Treatment() {
}
@@ -80,6 +82,7 @@ public class Treatment implements DataPointWithLabelInterface {
double carbs = treatment.carbs;
if (json.has("boluscalc")) {
JSONObject boluscalc = json.getJSONObject("boluscalc");
+ treatment.boluscalc = boluscalc.toString();
if (boluscalc.has("carbs")) {
carbs = Math.max(boluscalc.getDouble("carbs"), carbs);
}
@@ -93,7 +96,7 @@ public class Treatment implements DataPointWithLabelInterface {
public String toString() {
return "Treatment{" +
"date= " + date +
- ", date= " + DateUtil.dateAndTimeString(date) +
+ ", date= " + new Date(date).toLocaleString() +
", isValid= " + isValid +
", isSMB= " + isSMB +
", _id= " + _id +
@@ -132,6 +135,15 @@ public class Treatment implements DataPointWithLabelInterface {
return true;
}
+ @Nullable
+ public JSONObject getBoluscalc() {
+ try {
+ if (boluscalc != null)
+ return new JSONObject(boluscalc);
+ } catch (JSONException ignored) {
+ }
+ return null;
+ }
/*
* mealBolus, _id and isSMB cannot be known coming from pump. Only compare rest
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 e701986e89..8c01db13fd 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentService.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentService.java
@@ -37,6 +37,7 @@ import info.nightscout.androidaps.events.Event;
import info.nightscout.androidaps.events.EventNsTreatment;
import info.nightscout.androidaps.events.EventReloadTreatmentData;
import info.nightscout.androidaps.events.EventTreatmentChange;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventNewHistoryData;
import info.nightscout.utils.JsonHelper;
@@ -46,7 +47,7 @@ import info.nightscout.utils.JsonHelper;
*/
public class TreatmentService extends OrmLiteBaseService {
- private static Logger log = LoggerFactory.getLogger(TreatmentService.class);
+ private static Logger log = LoggerFactory.getLogger(L.DATATREATMENTS);
private static final ScheduledExecutorService treatmentEventWorker = Executors.newSingleThreadScheduledExecutor();
private static ScheduledFuture> scheduledTreatmentEventPost = null;
@@ -102,7 +103,8 @@ public class TreatmentService extends OrmLiteBaseService {
public void onCreate() {
super.onCreate();
try {
- log.info("onCreate");
+ if (L.isEnabled(L.DATATREATMENTS))
+ log.info("onCreate");
TableUtils.createTableIfNotExists(this.getConnectionSource(), Treatment.class);
} catch (SQLException e) {
log.error("Can't create database", e);
@@ -120,14 +122,28 @@ public class TreatmentService extends OrmLiteBaseService {
log.error("Can't create database", e);
throw new RuntimeException(e);
}
+ } else if (oldVersion == 8 && newVersion == 9) {
+ log.debug("Upgrading database from v8 to v9");
+ try {
+ getDao().executeRaw("ALTER TABLE `" + Treatment.TABLE_TREATMENTS + "` ADD COLUMN boluscalc STRING;");
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
} else {
- log.info("onUpgrade");
+ if (L.isEnabled(L.DATATREATMENTS))
+ log.info("onUpgrade");
// this.resetFood();
}
}
public void onDowngrade(ConnectionSource connectionSource, int oldVersion, int newVersion) {
- // this method is not supported right now
+ if (oldVersion == 9 && newVersion == 8) {
+ try {
+ getDao().executeRaw("ALTER TABLE `" + Treatment.TABLE_TREATMENTS + "` DROP COLUMN boluscalc STRING;");
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
}
public void resetTreatments() {
@@ -161,10 +177,14 @@ public class TreatmentService extends OrmLiteBaseService {
class PostRunnable implements Runnable {
public void run() {
- log.debug("Firing EventFoodChange");
+ if (L.isEnabled(L.DATATREATMENTS))
+ log.debug("Firing EventReloadTreatmentData");
MainApp.bus().post(event);
- if (DatabaseHelper.earliestDataChange != null)
+ if (DatabaseHelper.earliestDataChange != null) {
+ if (L.isEnabled(L.DATATREATMENTS))
+ log.debug("Firing EventNewHistoryData");
MainApp.bus().post(new EventNewHistoryData(DatabaseHelper.earliestDataChange));
+ }
DatabaseHelper.earliestDataChange = null;
callback.setPost(null);
}
@@ -224,17 +244,8 @@ public class TreatmentService extends OrmLiteBaseService {
Treatment treatment = Treatment.createFromJson(json);
if (treatment != null)
createOrUpdate(treatment);
- } catch (JSONException e) {
- log.error("Unhandled exception", e);
- }
- }
-
- public void createFoodFromJsonIfNotExists(JSONArray array) {
- try {
- for (int n = 0; n < array.length(); n++) {
- JSONObject json = array.getJSONObject(n);
- createTreatmentFromJsonIfNotExists(json);
- }
+ else
+ log.error("Date is null: " + treatment.toString());
} catch (JSONException e) {
log.error("Unhandled exception", e);
}
@@ -252,13 +263,14 @@ public class TreatmentService extends OrmLiteBaseService {
if (existingTreatment != null) {
boolean equalRePumpHistory = existingTreatment.equalsRePumpHistory(treatment);
boolean sameSource = existingTreatment.source == treatment.source;
- if(!equalRePumpHistory) {
+ if (!equalRePumpHistory) {
// another treatment exists. Update it with the treatment coming from the pump
- log.debug("TREATMENT: Pump record already found in database: " + existingTreatment.toString() + " wanting to add " + treatment.toString());
+ if (L.isEnabled(L.DATATREATMENTS))
+ log.debug("Pump record already found in database: " + existingTreatment.toString() + " wanting to add " + treatment.toString());
long oldDate = existingTreatment.date;
//preserve carbs
- if(existingTreatment.isValid && existingTreatment.carbs > 0 && treatment.carbs == 0){
+ if (existingTreatment.isValid && existingTreatment.carbs > 0 && treatment.carbs == 0) {
treatment.carbs = existingTreatment.carbs;
}
@@ -278,13 +290,14 @@ public class TreatmentService extends OrmLiteBaseService {
boolean equalRePumpHistory = existingTreatment.equalsRePumpHistory(treatment);
boolean sameSource = existingTreatment.source == treatment.source;
long oldDate = existingTreatment.date;
- log.debug("TREATMENT: Pump record already found in database: " + existingTreatment.toString() + " wanting to add " + treatment.toString());
+ if (L.isEnabled(L.DATATREATMENTS))
+ log.debug("Pump record already found in database: " + existingTreatment.toString() + " wanting to add " + treatment.toString());
//preserve carbs
- if(existingTreatment.isValid && existingTreatment.carbs > 0 && treatment.carbs == 0){
+ if (existingTreatment.isValid && existingTreatment.carbs > 0 && treatment.carbs == 0) {
treatment.carbs = existingTreatment.carbs;
}
-
+
getDao().delete(existingTreatment); // need to delete/create because date may change too
existingTreatment.copyFrom(treatment);
getDao().create(existingTreatment);
@@ -294,7 +307,8 @@ public class TreatmentService extends OrmLiteBaseService {
return new UpdateReturn(equalRePumpHistory || sameSource, false);
}
getDao().create(treatment);
- log.debug("TREATMENT: New record from: " + Source.getString(treatment.source) + " " + treatment.toString());
+ if (L.isEnabled(L.DATATREATMENTS))
+ log.debug("New record from: " + Source.getString(treatment.source) + " " + treatment.toString());
DatabaseHelper.updateEarliestDataChange(treatment.date);
scheduleTreatmentChange(treatment);
return new UpdateReturn(true, true);
@@ -308,7 +322,8 @@ public class TreatmentService extends OrmLiteBaseService {
getDao().delete(old); // need to delete/create because date may change too
old.copyFrom(treatment);
getDao().create(old);
- log.debug("TREATMENT: Updating record by date from: " + Source.getString(treatment.source) + " " + old.toString());
+ if (L.isEnabled(L.DATATREATMENTS))
+ log.debug("Updating record by date from: " + Source.getString(treatment.source) + " " + old.toString());
if (historyChange) {
DatabaseHelper.updateEarliestDataChange(oldDate);
DatabaseHelper.updateEarliestDataChange(old.date);
@@ -316,6 +331,8 @@ public class TreatmentService extends OrmLiteBaseService {
scheduleTreatmentChange(treatment);
return new UpdateReturn(true, true);
}
+ if (L.isEnabled(L.DATATREATMENTS))
+ log.debug("Equal record by date from: " + Source.getString(treatment.source) + " " + old.toString());
return new UpdateReturn(true, false);
}
// find by NS _id
@@ -328,7 +345,8 @@ public class TreatmentService extends OrmLiteBaseService {
getDao().delete(old); // need to delete/create because date may change too
old.copyFrom(treatment);
getDao().create(old);
- log.debug("TREATMENT: Updating record by _id from: " + Source.getString(treatment.source) + " " + old.toString());
+ if (L.isEnabled(L.DATATREATMENTS))
+ log.debug("Updating record by _id from: " + Source.getString(treatment.source) + " " + old.toString());
if (historyChange) {
DatabaseHelper.updateEarliestDataChange(oldDate);
DatabaseHelper.updateEarliestDataChange(old.date);
@@ -336,17 +354,22 @@ public class TreatmentService extends OrmLiteBaseService {
scheduleTreatmentChange(treatment);
return new UpdateReturn(true, true);
}
+ if (L.isEnabled(L.DATATREATMENTS))
+ log.debug("Equal record by _id from: " + Source.getString(treatment.source) + " " + old.toString());
+ return new UpdateReturn(true, false);
}
}
getDao().create(treatment);
- log.debug("TREATMENT: New record from: " + Source.getString(treatment.source) + " " + treatment.toString());
+ if (L.isEnabled(L.DATATREATMENTS))
+ log.debug("New record from: " + Source.getString(treatment.source) + " " + treatment.toString());
DatabaseHelper.updateEarliestDataChange(treatment.date);
scheduleTreatmentChange(treatment);
return new UpdateReturn(true, true);
}
if (treatment.source == Source.USER) {
getDao().create(treatment);
- log.debug("TREATMENT: New record from: " + Source.getString(treatment.source) + " " + treatment.toString());
+ if (L.isEnabled(L.DATATREATMENTS))
+ log.debug("New record from: " + Source.getString(treatment.source) + " " + treatment.toString());
DatabaseHelper.updateEarliestDataChange(treatment.date);
scheduleTreatmentChange(treatment);
return new UpdateReturn(true, true);
@@ -357,21 +380,24 @@ public class TreatmentService extends OrmLiteBaseService {
return new UpdateReturn(false, false);
}
- /** Returns the record for the given id, null if none, throws RuntimeException
- * if multiple records with the same pump id exist. */
+ /**
+ * Returns the record for the given id, null if none, throws RuntimeException
+ * if multiple records with the same pump id exist.
+ */
@Nullable
public Treatment getPumpRecordById(long pumpId) {
try {
QueryBuilder queryBuilder = getDao().queryBuilder();
Where where = queryBuilder.where();
where.eq("pumpId", pumpId);
- PreparedQuery preparedQuery = queryBuilder.prepare();
- List result = getDao().query(preparedQuery);
- switch (result.size()) {
- case 0: return null;
- case 1: return result.get(0);
- default: throw new RuntimeException("Multiple records with the same pump id found: " + result.toString());
- }
+ queryBuilder.orderBy("date", true);
+
+ List result = getDao().query(queryBuilder.prepare());
+ if (result.isEmpty())
+ return null;
+ if (result.size() > 1)
+ log.warn("Multiple records with the same pump id found (returning first one): " + result.toString());
+ return result.get(0);
} catch (SQLException e) {
throw new RuntimeException(e);
}
@@ -393,7 +419,8 @@ public class TreatmentService extends OrmLiteBaseService {
private void deleteByNSId(String _id) {
Treatment stored = findByNSId(_id);
if (stored != null) {
- log.debug("TREATMENT: Removing Treatment record from database: " + stored.toString());
+ if (L.isEnabled(L.DATATREATMENTS))
+ log.debug("Removing Treatment record from database: " + stored.toString());
delete(stored);
DatabaseHelper.updateEarliestDataChange(stored.date);
scheduleTreatmentChange(null);
@@ -480,10 +507,11 @@ public class TreatmentService extends OrmLiteBaseService {
}
public class UpdateReturn {
- public UpdateReturn(boolean success, boolean newRecord){
+ public UpdateReturn(boolean success, boolean newRecord) {
this.success = success;
this.newRecord = newRecord;
}
+
boolean newRecord;
boolean success;
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsFragment.java
index ea75dfad6a..550522313d 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsFragment.java
@@ -27,8 +27,6 @@ import info.nightscout.androidaps.plugins.Treatments.fragments.TreatmentsTempora
import info.nightscout.utils.FabricPrivacy;
public class TreatmentsFragment extends SubscriberFragment implements View.OnClickListener {
- private static Logger log = LoggerFactory.getLogger(TreatmentsFragment.class);
-
TextView treatmentsTab;
TextView extendedBolusesTab;
TextView tempBasalsTab;
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 b701f66afc..1967cc369b 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
@@ -33,11 +33,14 @@ import info.nightscout.androidaps.events.EventReloadProfileSwitchData;
import info.nightscout.androidaps.events.EventReloadTempBasalData;
import info.nightscout.androidaps.events.EventReloadTreatmentData;
import info.nightscout.androidaps.events.EventTempTargetChange;
+import info.nightscout.androidaps.interfaces.InsulinInterface;
import info.nightscout.androidaps.interfaces.PluginBase;
import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.interfaces.TreatmentsInterface;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData;
import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
import info.nightscout.androidaps.plugins.Overview.Dialogs.ErrorHelperActivity;
@@ -47,7 +50,7 @@ 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.utils.NSUpload;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.utils.SP;
import info.nightscout.utils.T;
@@ -55,7 +58,7 @@ import info.nightscout.utils.T;
* Created by mike on 05.08.2016.
*/
public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface {
- private static Logger log = LoggerFactory.getLogger(TreatmentsPlugin.class);
+ private Logger log = LoggerFactory.getLogger(L.DATATREATMENTS);
private static TreatmentsPlugin treatmentsPlugin;
@@ -109,9 +112,11 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
}
private void initializeTreatmentData() {
+ if (L.isEnabled(L.DATATREATMENTS))
+ log.debug("initializeTreatmentData");
double dia = Constants.defaultDIA;
- if (MainApp.getConfigBuilder() != null && MainApp.getConfigBuilder().getProfile() != null)
- dia = MainApp.getConfigBuilder().getProfile().getDia();
+ if (MainApp.getConfigBuilder() != null && ProfileFunctions.getInstance().getProfile() != null)
+ dia = ProfileFunctions.getInstance().getProfile().getDia();
long fromMills = (long) (System.currentTimeMillis() - 60 * 60 * 1000L * (24 + dia));
synchronized (treatments) {
treatments.clear();
@@ -120,9 +125,11 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
}
private void initializeTempBasalData() {
+ if (L.isEnabled(L.DATATREATMENTS))
+ log.debug("initializeTempBasalData");
double dia = Constants.defaultDIA;
- if (MainApp.getConfigBuilder() != null && MainApp.getConfigBuilder().getProfile() != null)
- dia = MainApp.getConfigBuilder().getProfile().getDia();
+ if (MainApp.getConfigBuilder() != null && ProfileFunctions.getInstance().getProfile() != null)
+ dia = ProfileFunctions.getInstance().getProfile().getDia();
long fromMills = (long) (System.currentTimeMillis() - 60 * 60 * 1000L * (24 + dia));
synchronized (tempBasals) {
@@ -132,9 +139,11 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
}
private void initializeExtendedBolusData() {
+ if (L.isEnabled(L.DATATREATMENTS))
+ log.debug("initializeExtendedBolusData");
double dia = Constants.defaultDIA;
- if (MainApp.getConfigBuilder() != null && MainApp.getConfigBuilder().getProfile() != null)
- dia = MainApp.getConfigBuilder().getProfile().getDia();
+ if (MainApp.getConfigBuilder() != null && ProfileFunctions.getInstance().getProfile() != null)
+ dia = ProfileFunctions.getInstance().getProfile().getDia();
long fromMills = (long) (System.currentTimeMillis() - 60 * 60 * 1000L * (24 + dia));
synchronized (extendedBoluses) {
@@ -144,6 +153,8 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
}
private void initializeTempTargetData() {
+ if (L.isEnabled(L.DATATREATMENTS))
+ log.debug("initializeTempTargetData");
synchronized (tempTargets) {
long fromMills = System.currentTimeMillis() - 60 * 60 * 1000L * 24;
tempTargets.reset().add(MainApp.getDbHelper().getTemptargetsDataFromTime(fromMills, false));
@@ -151,6 +162,8 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
}
private void initializeProfileSwitchData() {
+ if (L.isEnabled(L.DATATREATMENTS))
+ log.debug("initializeProfileSwitchData");
synchronized (profiles) {
profiles.reset().add(MainApp.getDbHelper().getProfileSwitchData(false));
}
@@ -165,10 +178,14 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
public IobTotal getCalculationToTimeTreatments(long time) {
IobTotal total = new IobTotal(time);
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
if (profile == null)
return total;
+ InsulinInterface insulinInterface = MainApp.getConfigBuilder().getActiveInsulin();
+ if (insulinInterface == null)
+ return total;
+
double dia = profile.getDia();
synchronized (treatments) {
@@ -213,7 +230,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
public MealData getMealData() {
MealData result = new MealData();
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
if (profile == null) return result;
long now = System.currentTimeMillis();
@@ -294,6 +311,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
last = t.date;
}
}
+ if (L.isEnabled(L.DATATREATMENTS))
log.debug("Last bolus time: " + new Date(last).toLocaleString());
return last;
}
@@ -322,6 +340,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
@Subscribe
public void onStatusEvent(final EventReloadTreatmentData ev) {
+ if (L.isEnabled(L.DATATREATMENTS))
log.debug("EventReloadTreatmentData");
initializeTreatmentData();
initializeExtendedBolusData();
@@ -332,6 +351,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
@Subscribe
@SuppressWarnings("unused")
public void onStatusEvent(final EventReloadTempBasalData ev) {
+ if (L.isEnabled(L.DATATREATMENTS))
log.debug("EventReloadTempBasalData");
initializeTempBasalData();
updateTotalIOBTempBasals();
@@ -349,6 +369,11 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
public IobTotal getCalculationToTimeTempBasals(long time, Profile profile, boolean truncate, long truncateTime) {
IobTotal total = new IobTotal(time);
+
+ InsulinInterface insulinInterface = MainApp.getConfigBuilder().getActiveInsulin();
+ if (insulinInterface == null)
+ return total;
+
synchronized (tempBasals) {
for (Integer pos = 0; pos < tempBasals.size(); pos++) {
TemporaryBasal t = tempBasals.get(pos);
@@ -396,7 +421,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
@Override
public void updateTotalIOBTempBasals() {
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
if (profile != null)
lastTempBasalsCalculation = getCalculationToTimeTempBasals(DateUtil.now(), profile);
}
@@ -481,6 +506,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
treatment.carbs = detailedBolusInfo.carbs;
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());
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/dialogs/WizardInfoDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/dialogs/WizardInfoDialog.java
new file mode 100644
index 0000000000..25ffc946a2
--- /dev/null
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/dialogs/WizardInfoDialog.java
@@ -0,0 +1,88 @@
+package info.nightscout.androidaps.plugins.Treatments.dialogs;
+
+import android.os.Bundle;
+import android.support.v4.app.DialogFragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.CheckBox;
+import android.widget.TextView;
+
+import org.json.JSONObject;
+
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.R;
+import info.nightscout.utils.DecimalFormatter;
+import info.nightscout.utils.JsonHelper;
+
+public class WizardInfoDialog extends DialogFragment implements OnClickListener {
+ JSONObject json;
+
+ public WizardInfoDialog() {
+ super();
+ }
+
+ public void setData(JSONObject json) {
+ this.json = json;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.treatments_wizardinfo_dialog, container, false);
+
+ getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
+
+ view.findViewById(R.id.ok).setOnClickListener(this);
+
+ // BG
+ ((TextView) view.findViewById(R.id.treatments_wizard_bg)).setText(DecimalFormatter.to1Decimal(JsonHelper.safeGetDouble(json, "bg")) + " ISF: " + DecimalFormatter.to1Decimal(JsonHelper.safeGetDouble(json, "isf")));
+ ((TextView) view.findViewById(R.id.treatments_wizard_bginsulin)).setText(DecimalFormatter.to2Decimal(JsonHelper.safeGetDouble(json, "insulinbg")) + "U");
+ ((CheckBox) view.findViewById(R.id.treatments_wizard_bgcheckbox)).setChecked(JsonHelper.safeGetBoolean(json, "insulinbgused"));
+ ((CheckBox) view.findViewById(R.id.treatments_wizard_ttcheckbox)).setChecked(JsonHelper.safeGetBoolean(json, "ttused"));
+ // Trend
+ ((TextView) view.findViewById(R.id.treatments_wizard_bgtrend)).setText(JsonHelper.safeGetString(json, "trend"));
+ ((TextView) view.findViewById(R.id.treatments_wizard_bgtrendinsulin)).setText(DecimalFormatter.to2Decimal(JsonHelper.safeGetDouble(json, "insulintrend")) + "U");
+ ((CheckBox) view.findViewById(R.id.treatments_wizard_bgtrendcheckbox)).setChecked(JsonHelper.safeGetBoolean(json, "trendused"));
+ // COB
+ ((TextView) view.findViewById(R.id.treatments_wizard_cob)).setText(DecimalFormatter.to0Decimal(JsonHelper.safeGetDouble(json, "cob")) + "g IC: " + DecimalFormatter.to1Decimal(JsonHelper.safeGetDouble(json, "ic")));
+ ((TextView) view.findViewById(R.id.treatments_wizard_cobinsulin)).setText(DecimalFormatter.to2Decimal(JsonHelper.safeGetDouble(json, "insulincob")) + "U");
+ ((CheckBox) view.findViewById(R.id.treatments_wizard_cobcheckbox)).setChecked(JsonHelper.safeGetBoolean(json, "cobused"));
+ // Bolus IOB
+ ((TextView) view.findViewById(R.id.treatments_wizard_bolusiobinsulin)).setText(DecimalFormatter.to2Decimal(JsonHelper.safeGetDouble(json, "bolusiob")) + "U");
+ ((CheckBox) view.findViewById(R.id.treatments_wizard_bolusiobcheckbox)).setChecked(JsonHelper.safeGetBoolean(json, "bolusiobused"));
+ // Basal IOB
+ ((TextView) view.findViewById(R.id.treatments_wizard_basaliobinsulin)).setText(DecimalFormatter.to2Decimal(JsonHelper.safeGetDouble(json, "basaliob")) + "U");
+ ((CheckBox) view.findViewById(R.id.treatments_wizard_basaliobcheckbox)).setChecked(JsonHelper.safeGetBoolean(json, "basaliobused"));
+ // Superbolus
+ ((TextView) view.findViewById(R.id.treatments_wizard_sbinsulin)).setText(DecimalFormatter.to2Decimal(JsonHelper.safeGetDouble(json, "insulinsuperbolus")) + "U");
+ ((CheckBox) view.findViewById(R.id.treatments_wizard_sbcheckbox)).setChecked(JsonHelper.safeGetBoolean(json, "superbolusused"));
+ // Carbs
+ ((TextView) view.findViewById(R.id.treatments_wizard_carbs)).setText(DecimalFormatter.to0Decimal(JsonHelper.safeGetDouble(json, "carbs")) + "g IC: " + DecimalFormatter.to1Decimal(JsonHelper.safeGetDouble(json, "ic")));
+ ((TextView) view.findViewById(R.id.treatments_wizard_carbsinsulin)).setText(DecimalFormatter.to2Decimal(JsonHelper.safeGetDouble(json, "insulincarbs")) + "U");
+ // Correction
+ ((TextView) view.findViewById(R.id.treatments_wizard_correctioninsulin)).setText(DecimalFormatter.to2Decimal(JsonHelper.safeGetDouble(json, "othercorrection")) + "U");
+ // Profile
+ ((TextView) view.findViewById(R.id.treatments_wizard_profile)).setText(JsonHelper.safeGetString(json, "profile"));
+ // Notes
+ ((TextView) view.findViewById(R.id.treatments_wizard_notes)).setText(JsonHelper.safeGetString(json, "notes"));
+ // Total
+ ((TextView) view.findViewById(R.id.treatments_wizard_totalinsulin)).setText(DecimalFormatter.to2Decimal(JsonHelper.safeGetDouble(json, "insulin")) + "U");
+
+ setCancelable(true);
+ return view;
+ }
+
+ @Override
+ public synchronized void onClick(View view) {
+ switch (view.getId()) {
+ case R.id.ok:
+ dismiss();
+ break;
+ }
+ }
+
+}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/ProfileViewerDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/ProfileViewerDialog.java
index 5f758c8a06..c2263d81b5 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/ProfileViewerDialog.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/ProfileViewerDialog.java
@@ -31,8 +31,6 @@ public class ProfileViewerDialog extends DialogFragment {
private long time;
- private static Logger log = LoggerFactory.getLogger(ProfileViewDialog.class);
-
@BindView(R.id.profileview_noprofile)
TextView noProfile;
@BindView(R.id.profileview_invalidprofile)
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsBolusFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsBolusFragment.java
index 0faceb2382..b99ad97685 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsBolusFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsBolusFragment.java
@@ -6,6 +6,7 @@ import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Paint;
import android.os.Bundle;
+import android.support.v4.app.FragmentManager;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.CardView;
@@ -20,34 +21,33 @@ import android.widget.TextView;
import com.crashlytics.android.answers.CustomEvent;
import com.squareup.otto.Subscribe;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.json.JSONObject;
import java.util.List;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.Services.Intents;
import info.nightscout.androidaps.data.Iob;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.db.Source;
-import info.nightscout.androidaps.plugins.Treatments.Treatment;
import info.nightscout.androidaps.events.EventNewBG;
import info.nightscout.androidaps.events.EventTreatmentChange;
import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.androidaps.plugins.NSClientInternal.UploadQueue;
+import info.nightscout.androidaps.plugins.Treatments.Treatment;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
-import info.nightscout.utils.FabricPrivacy;
+import info.nightscout.androidaps.plugins.Treatments.dialogs.WizardInfoDialog;
+import info.nightscout.androidaps.services.Intents;
import info.nightscout.utils.DateUtil;
import info.nightscout.utils.DecimalFormatter;
-import info.nightscout.utils.NSUpload;
+import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.SP;
import static info.nightscout.utils.DateUtil.now;
public class TreatmentsBolusFragment extends SubscriberFragment implements View.OnClickListener {
- private static Logger log = LoggerFactory.getLogger(TreatmentsBolusFragment.class);
-
RecyclerView recyclerView;
LinearLayoutManager llm;
@@ -74,7 +74,7 @@ public class TreatmentsBolusFragment extends SubscriberFragment implements View.
@Override
public void onBindViewHolder(TreatmentsViewHolder holder, int position) {
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
if (profile == null)
return;
Treatment t = treatments.get(position);
@@ -83,7 +83,6 @@ public class TreatmentsBolusFragment extends SubscriberFragment implements View.
holder.carbs.setText(DecimalFormatter.to0Decimal(t.carbs) + " g");
Iob iob = t.iobCalc(System.currentTimeMillis(), profile.getDia());
holder.iob.setText(DecimalFormatter.to2Decimal(iob.iobContrib) + " U");
- holder.activity.setText(DecimalFormatter.to3Decimal(iob.activityContrib) + " U");
holder.mealOrCorrection.setText(t.isSMB ? "SMB" : t.mealBolus ? MainApp.gs(R.string.mealbolus) : MainApp.gs(R.string.correctionbous));
holder.ph.setVisibility(t.source == Source.PUMP ? View.VISIBLE : View.GONE);
holder.ns.setVisibility(NSUpload.isIdValid(t._id) ? View.VISIBLE : View.GONE);
@@ -97,6 +96,8 @@ public class TreatmentsBolusFragment extends SubscriberFragment implements View.
else
holder.date.setTextColor(holder.carbs.getCurrentTextColor());
holder.remove.setTag(t);
+ holder.calculation.setTag(t);
+ holder.calculation.setVisibility(t.getBoluscalc() == null ? View.INVISIBLE : View.VISIBLE);
}
@Override
@@ -115,9 +116,9 @@ public class TreatmentsBolusFragment extends SubscriberFragment implements View.
TextView insulin;
TextView carbs;
TextView iob;
- TextView activity;
TextView mealOrCorrection;
TextView remove;
+ TextView calculation;
TextView ph;
TextView ns;
TextView invalid;
@@ -129,11 +130,13 @@ public class TreatmentsBolusFragment extends SubscriberFragment implements View.
insulin = (TextView) itemView.findViewById(R.id.treatments_insulin);
carbs = (TextView) itemView.findViewById(R.id.treatments_carbs);
iob = (TextView) itemView.findViewById(R.id.treatments_iob);
- activity = (TextView) itemView.findViewById(R.id.treatments_activity);
mealOrCorrection = (TextView) itemView.findViewById(R.id.treatments_mealorcorrection);
ph = (TextView) itemView.findViewById(R.id.pump_sign);
ns = (TextView) itemView.findViewById(R.id.ns_sign);
invalid = (TextView) itemView.findViewById(R.id.invalid_sign);
+ calculation = (TextView) itemView.findViewById(R.id.treatments_calculation);
+ calculation.setOnClickListener(this);
+ calculation.setPaintFlags(calculation.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
remove = (TextView) itemView.findViewById(R.id.treatments_remove);
remove.setOnClickListener(this);
remove.setPaintFlags(remove.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
@@ -142,6 +145,8 @@ public class TreatmentsBolusFragment extends SubscriberFragment implements View.
@Override
public void onClick(View v) {
final Treatment treatment = (Treatment) v.getTag();
+ if (treatment == null)
+ return;
switch (v.getId()) {
case R.id.treatments_remove:
AlertDialog.Builder builder = new AlertDialog.Builder(context);
@@ -168,6 +173,18 @@ public class TreatmentsBolusFragment extends SubscriberFragment implements View.
builder.setNegativeButton(MainApp.gs(R.string.cancel), null);
builder.show();
break;
+ case R.id.treatments_calculation:
+ FragmentManager manager = getFragmentManager();
+ // try to fix https://fabric.io/nightscout3/android/apps/info.nightscout.androidaps/issues/5aca7a1536c7b23527eb4be7?time=last-seven-days
+ // https://stackoverflow.com/questions/14860239/checking-if-state-is-saved-before-committing-a-fragmenttransaction
+ if (manager.isStateSaved())
+ return;
+ if (treatment.getBoluscalc() != null) {
+ WizardInfoDialog wizardDialog = new WizardInfoDialog();
+ wizardDialog.setData(treatment.getBoluscalc());
+ wizardDialog.show(manager, "WizardInfoDialog");
+ }
+ break;
}
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsCareportalFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsCareportalFragment.java
index 7e69883a3d..56709963f7 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsCareportalFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsCareportalFragment.java
@@ -22,13 +22,13 @@ import java.util.List;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.Services.Intents;
+import info.nightscout.androidaps.services.Intents;
import info.nightscout.androidaps.db.CareportalEvent;
import info.nightscout.androidaps.events.EventCareportalEventChange;
import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
import info.nightscout.androidaps.plugins.NSClientInternal.UploadQueue;
import info.nightscout.utils.DateUtil;
-import info.nightscout.utils.NSUpload;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.utils.SP;
import info.nightscout.utils.Translator;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsExtendedBolusesFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsExtendedBolusesFragment.java
index 05e18bfdc3..037a1a0023 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsExtendedBolusesFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsExtendedBolusesFragment.java
@@ -18,9 +18,6 @@ import android.widget.TextView;
import com.crashlytics.android.answers.CustomEvent;
import com.squareup.otto.Subscribe;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.Intervals;
@@ -35,12 +32,10 @@ import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.utils.DateUtil;
import info.nightscout.utils.DecimalFormatter;
import info.nightscout.utils.FabricPrivacy;
-import info.nightscout.utils.NSUpload;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
public class TreatmentsExtendedBolusesFragment extends SubscriberFragment {
- private static Logger log = LoggerFactory.getLogger(TreatmentsExtendedBolusesFragment.class);
-
RecyclerView recyclerView;
LinearLayoutManager llm;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsProfileSwitchFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsProfileSwitchFragment.java
index 307f9c8ee6..0edc704eb6 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsProfileSwitchFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsProfileSwitchFragment.java
@@ -20,11 +20,16 @@ import android.widget.TextView;
import com.squareup.otto.Subscribe;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import java.util.List;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.Services.Intents;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
+import info.nightscout.androidaps.services.Intents;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.db.ProfileSwitch;
import info.nightscout.androidaps.db.Source;
@@ -33,7 +38,7 @@ import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
import info.nightscout.androidaps.plugins.NSClientInternal.UploadQueue;
import info.nightscout.utils.DateUtil;
import info.nightscout.utils.DecimalFormatter;
-import info.nightscout.utils.NSUpload;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.utils.SP;
/**
@@ -41,6 +46,7 @@ import info.nightscout.utils.SP;
*/
public class TreatmentsProfileSwitchFragment extends SubscriberFragment implements View.OnClickListener {
+ private Logger log = LoggerFactory.getLogger(L.UI);
RecyclerView recyclerView;
LinearLayoutManager llm;
@@ -64,7 +70,7 @@ public class TreatmentsProfileSwitchFragment extends SubscriberFragment implemen
@Override
public void onBindViewHolder(ProfileSwitchViewHolder holder, int position) {
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
if (profile == null) return;
ProfileSwitch profileSwitch = profileSwitchList.get(position);
holder.ph.setVisibility(profileSwitch.source == Source.PUMP ? View.VISIBLE : View.GONE);
@@ -128,6 +134,10 @@ public class TreatmentsProfileSwitchFragment extends SubscriberFragment implemen
@Override
public void onClick(View v) {
final ProfileSwitch profileSwitch = (ProfileSwitch) v.getTag();
+ if (profileSwitch == null) {
+ log.error("profileSwitch == null");
+ return;
+ }
switch (v.getId()) {
case R.id.profileswitch_remove:
AlertDialog.Builder builder = new AlertDialog.Builder(context);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTempTargetFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTempTargetFragment.java
index df67349839..d60dfc9e4c 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTempTargetFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTempTargetFragment.java
@@ -21,7 +21,8 @@ import com.squareup.otto.Subscribe;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.Services.Intents;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
+import info.nightscout.androidaps.services.Intents;
import info.nightscout.androidaps.data.Intervals;
import info.nightscout.androidaps.db.Source;
import info.nightscout.androidaps.db.TempTarget;
@@ -31,7 +32,7 @@ import info.nightscout.androidaps.plugins.NSClientInternal.UploadQueue;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.utils.DateUtil;
import info.nightscout.utils.DecimalFormatter;
-import info.nightscout.utils.NSUpload;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.utils.SP;
/**
@@ -65,7 +66,7 @@ public class TreatmentsTempTargetFragment extends SubscriberFragment implements
@Override
public void onBindViewHolder(TempTargetsViewHolder holder, int position) {
- String units = MainApp.getConfigBuilder().getProfileUnits();
+ String units = ProfileFunctions.getInstance().getProfileUnits();
TempTarget tempTarget = tempTargetList.getReversed(position);
holder.ph.setVisibility(tempTarget.source == Source.PUMP ? View.VISIBLE : View.GONE);
holder.ns.setVisibility(NSUpload.isIdValid(tempTarget._id) ? View.VISIBLE : View.GONE);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTemporaryBasalsFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTemporaryBasalsFragment.java
index 957c5c02f1..3185bd81ac 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTemporaryBasalsFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTemporaryBasalsFragment.java
@@ -28,12 +28,13 @@ import info.nightscout.androidaps.db.TemporaryBasal;
import info.nightscout.androidaps.events.EventNewBG;
import info.nightscout.androidaps.events.EventTempBasalChange;
import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.NSClientInternal.UploadQueue;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.utils.DateUtil;
import info.nightscout.utils.DecimalFormatter;
import info.nightscout.utils.FabricPrivacy;
-import info.nightscout.utils.NSUpload;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
public class TreatmentsTemporaryBasalsFragment extends SubscriberFragment {
@@ -84,7 +85,7 @@ public class TreatmentsTemporaryBasalsFragment extends SubscriberFragment {
}
holder.duration.setText(DecimalFormatter.to0Decimal(tempBasal.durationInMinutes, " min"));
if (tempBasal.isAbsolute) {
- Profile profile = MainApp.getConfigBuilder().getProfile(tempBasal.date);
+ Profile profile = ProfileFunctions.getInstance().getProfile(tempBasal.date);
if (profile != null) {
holder.absolute.setText(DecimalFormatter.to0Decimal(tempBasal.tempBasalConvertedToAbsolute(tempBasal.date, profile), " U/h"));
holder.percent.setText("");
@@ -99,7 +100,7 @@ public class TreatmentsTemporaryBasalsFragment extends SubscriberFragment {
holder.realDuration.setText(DecimalFormatter.to0Decimal(tempBasal.getRealDuration(), " min"));
long now = DateUtil.now();
IobTotal iob = new IobTotal(now);
- Profile profile = MainApp.getConfigBuilder().getProfile(now);
+ Profile profile = ProfileFunctions.getInstance().getProfile(now);
if (profile != null)
iob = tempBasal.iobCalc(now, profile);
holder.iob.setText(DecimalFormatter.to2Decimal(iob.basaliob, " U"));
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 fc4728c53c..0fd1c557b1 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
@@ -1,5 +1,7 @@
package info.nightscout.androidaps.plugins.Wear;
+import android.app.NotificationManager;
+import android.content.Context;
import android.os.HandlerThread;
import android.support.annotation.NonNull;
@@ -32,6 +34,7 @@ import info.nightscout.androidaps.interfaces.PumpInterface;
import info.nightscout.androidaps.plugins.Actions.dialogs.FillDialog;
import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialog;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.IobCobCalculator.CobInfo;
import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
import info.nightscout.androidaps.plugins.Loop.APSResult;
@@ -134,7 +137,7 @@ public class ActionStringHandler {
///////////////////////////////////////////////////////// TEMPTARGET
boolean isMGDL = Boolean.parseBoolean(act[1]);
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
if (profile == null) {
sendError("No profile found!");
return;
@@ -203,7 +206,7 @@ public class ActionStringHandler {
boolean useTrend = SP.getBoolean(R.string.key_wearwizard_trend, false);
int percentage = Integer.parseInt(act[2]);
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
if (profile == null) {
sendError("No profile found!");
return;
@@ -352,6 +355,23 @@ public class ActionStringHandler {
}
rAction += "ecarbs " + carbsAfterConstraints + " " + starttimestamp + " " + duration;
+ } else if ("changeRequest".equals(act[0])) {
+ ////////////////////////////////////////////// CHANGE REQUEST
+ rTitle = MainApp.gs(R.string.openloop_newsuggestion);
+ rAction = "changeRequest";
+ final LoopPlugin.LastRun finalLastRun = LoopPlugin.lastRun;
+ rMessage += finalLastRun.constraintsProcessed;
+
+ WearPlugin.getPlugin().requestChangeConfirmation(rTitle, rMessage, rAction);
+ lastSentTimestamp = System.currentTimeMillis();
+ lastConfirmActionString = rAction;
+ return;
+ } else if ("cancelChangeRequest".equals(act[0])) {
+ ////////////////////////////////////////////// CANCEL CHANGE REQUEST NOTIFICATION
+ rAction = "cancelChangeRequest";
+
+ WearPlugin.getPlugin().requestNotificationCancel(rAction);
+ return;
} else return;
@@ -363,7 +383,7 @@ public class ActionStringHandler {
private static String generateTDDMessage(List historyList, List dummies) {
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
if (profile == null) {
return "No profile loaded :(";
@@ -517,7 +537,7 @@ public class ActionStringHandler {
if (!Config.APS) {
return "Targets only apply in APS mode!";
}
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
if (profile == null) {
return "No profile set :(";
}
@@ -541,7 +561,7 @@ public class ActionStringHandler {
if (!Config.APS) {
return "Only apply in APS mode!";
}
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
if (profile == null) {
return "No profile set :(";
}
@@ -625,6 +645,11 @@ public class ActionStringHandler {
doECarbs(carbs, starttime, duration);
} else if ("dismissoverviewnotification".equals(act[0])) {
MainApp.bus().post(new EventDismissNotification(SafeParse.stringToInt(act[1])));
+ } else if ("changeRequest".equals(act[0])) {
+ LoopPlugin.getPlugin().acceptChangeRequest();
+ NotificationManager notificationManager =
+ (NotificationManager) MainApp.instance().getSystemService(Context.NOTIFICATION_SERVICE);
+ notificationManager.cancel(Constants.notificationID);
}
lastBolusWizard = null;
}
@@ -651,7 +676,7 @@ public class ActionStringHandler {
if (timeshift < 0 || timeshift > 23) {
msg += String.format(MainApp.gs(R.string.valueoutofrange), "Profile-Timeshift") + "\n";
}
- final Profile profile = MainApp.getConfigBuilder().getProfile();
+ final Profile profile = ProfileFunctions.getInstance().getProfile();
if (profile == null) {
msg += MainApp.gs(R.string.notloadedplugins) + "\n";
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/WearPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/WearPlugin.java
index 6cb47e1a3a..72b2397213 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/WearPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/WearPlugin.java
@@ -100,6 +100,12 @@ public class WearPlugin extends PluginBase {
ctx.startService(new Intent(ctx, WatchUpdaterService.class).setAction(WatchUpdaterService.ACTION_OPEN_SETTINGS));
}
+ void requestNotificationCancel(String actionstring) {
+ Intent intent = new Intent(ctx, WatchUpdaterService.class).setAction(WatchUpdaterService.ACTION_CANCEL_NOTIFICATION);
+ intent.putExtra("actionstring", actionstring);
+ ctx.startService(intent);
+ }
+
@Subscribe
public void onStatusEvent(final EventPreferenceChange ev) {
@@ -192,6 +198,15 @@ public class WearPlugin extends PluginBase {
ctx.startService(intent);
}
+ public void requestChangeConfirmation(String title, String message, String actionstring) {
+
+ Intent intent = new Intent(ctx, WatchUpdaterService.class).setAction(WatchUpdaterService.ACTION_SEND_CHANGECONFIRMATIONREQUEST);
+ intent.putExtra("title", title);
+ intent.putExtra("message", message);
+ intent.putExtra("actionstring", actionstring);
+ ctx.startService(intent);
+ }
+
public static void registerWatchUpdaterService(WatchUpdaterService wus) {
watchUS = wus;
}
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 b5d30ad071..4b4d1c4854 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
@@ -37,6 +37,7 @@ import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.db.BgReading;
import info.nightscout.androidaps.db.DatabaseHelper;
import info.nightscout.androidaps.db.TemporaryBasal;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.IobCobCalculator.CobInfo;
import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
import info.nightscout.androidaps.plugins.Treatments.Treatment;
@@ -63,7 +64,8 @@ public class WatchUpdaterService extends WearableListenerService implements
public static final String ACTION_SEND_BASALS = WatchUpdaterService.class.getName().concat(".SendBasals");
public static final String ACTION_SEND_BOLUSPROGRESS = WatchUpdaterService.class.getName().concat(".BolusProgress");
public static final String ACTION_SEND_ACTIONCONFIRMATIONREQUEST = WatchUpdaterService.class.getName().concat(".ActionConfirmationRequest");
-
+ public static final String ACTION_SEND_CHANGECONFIRMATIONREQUEST = WatchUpdaterService.class.getName().concat(".ChangeConfirmationRequest");
+ public static final String ACTION_CANCEL_NOTIFICATION = WatchUpdaterService.class.getName().concat(".CancelNotification");
private GoogleApiClient googleApiClient;
public static final String WEARABLE_DATA_PATH = "/nightscout_watch_data";
@@ -78,6 +80,8 @@ public class WatchUpdaterService extends WearableListenerService implements
public static final String BASAL_DATA_PATH = "/nightscout_watch_basal";
public static final String BOLUS_PROGRESS_PATH = "/nightscout_watch_bolusprogress";
public static final String ACTION_CONFIRMATION_REQUEST_PATH = "/nightscout_watch_actionconfirmationrequest";
+ public static final String ACTION_CHANGECONFIRMATION_REQUEST_PATH = "/nightscout_watch_changeconfirmationrequest";
+ public static final String ACTION_CANCELNOTIFICATION_REQUEST_PATH = "/nightscout_watch_cancelnotificationrequest";
boolean wear_integration = false;
@@ -153,6 +157,14 @@ public class WatchUpdaterService extends WearableListenerService implements
String message = intent.getStringExtra("message");
String actionstring = intent.getStringExtra("actionstring");
sendActionConfirmationRequest(title, message, actionstring);
+ } else if (ACTION_SEND_CHANGECONFIRMATIONREQUEST.equals(action)) {
+ String title = intent.getStringExtra("title");
+ String message = intent.getStringExtra("message");
+ String actionstring = intent.getStringExtra("actionstring");
+ sendChangeConfirmationRequest(title, message, actionstring);
+ } else if (ACTION_CANCEL_NOTIFICATION.equals(action)) {
+ String actionstring = intent.getStringExtra("actionstring");
+ sendCancelNotificationRequest(actionstring);
} else {
sendData();
}
@@ -223,7 +235,7 @@ public class WatchUpdaterService extends WearableListenerService implements
}
private DataMap dataMapSingleBG(BgReading lastBG, GlucoseStatus glucoseStatus) {
- String units = MainApp.getConfigBuilder().getProfileUnits();
+ String units = ProfileFunctions.getInstance().getProfileUnits();
Double lowLine = SafeParse.stringToDouble(mPrefs.getString("low_mark", "0"));
Double highLine = SafeParse.stringToDouble(mPrefs.getString("high_mark", "0"));
@@ -363,7 +375,7 @@ public class WatchUpdaterService extends WearableListenerService implements
ArrayList predictions = new ArrayList<>();
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
if (profile == null) {
return;
@@ -383,7 +395,7 @@ public class WatchUpdaterService extends WearableListenerService implements
if (tb1 != null) {
tb_before = beginBasalValue;
- Profile profileTB = MainApp.getConfigBuilder().getProfile(runningTime);
+ Profile profileTB = ProfileFunctions.getInstance().getProfile(runningTime);
if (profileTB != null) {
tb_amount = tb1.tempBasalConvertedToAbsolute(runningTime, profileTB);
tb_start = runningTime;
@@ -392,7 +404,7 @@ public class WatchUpdaterService extends WearableListenerService implements
for (; runningTime < now; runningTime += 5 * 60 * 1000) {
- Profile profileTB = MainApp.getConfigBuilder().getProfile(runningTime);
+ Profile profileTB = ProfileFunctions.getInstance().getProfile(runningTime);
//basal rate
endBasalValue = profile.getBasal(runningTime);
if (endBasalValue != beginBasalValue) {
@@ -444,7 +456,7 @@ public class WatchUpdaterService extends WearableListenerService implements
temps.add(tempDatamap(tb_start, tb_before, now - 1 * 60 * 1000, endBasalValue, tb_amount));
} else {
//express currently running temp by painting it a bit into the future
- Profile profileNow = MainApp.getConfigBuilder().getProfile(now);
+ Profile profileNow = ProfileFunctions.getInstance().getProfile(now);
double currentAmount = tb2.tempBasalConvertedToAbsolute(now, profileNow);
if (currentAmount != tb_amount) {
temps.add(tempDatamap(tb_start, tb_before, now, tb_amount, tb_amount));
@@ -457,7 +469,7 @@ public class WatchUpdaterService extends WearableListenerService implements
tb2 = TreatmentsPlugin.getPlugin().getTempBasalFromHistory(now); //use "now" to express current situation
if (tb2 != null) {
//onset at the end
- Profile profileTB = MainApp.getConfigBuilder().getProfile(runningTime);
+ Profile profileTB = ProfileFunctions.getInstance().getProfile(runningTime);
double currentAmount = tb2.tempBasalConvertedToAbsolute(runningTime, profileTB);
temps.add(tempDatamap(now - 1 * 60 * 1000, endBasalValue, runningTime + 5 * 60 * 1000, currentAmount, currentAmount));
}
@@ -577,10 +589,46 @@ public class WatchUpdaterService extends WearableListenerService implements
}
}
+ private void sendChangeConfirmationRequest(String title, String message, String actionstring) {
+ if (googleApiClient.isConnected()) {
+ PutDataMapRequest dataMapRequest = PutDataMapRequest.create(ACTION_CHANGECONFIRMATION_REQUEST_PATH);
+ //unique content
+ dataMapRequest.getDataMap().putLong("timestamp", System.currentTimeMillis());
+ dataMapRequest.getDataMap().putString("changeConfirmationRequest", "changeConfirmationRequest");
+ dataMapRequest.getDataMap().putString("title", title);
+ dataMapRequest.getDataMap().putString("message", message);
+ dataMapRequest.getDataMap().putString("actionstring", actionstring);
+
+ log.debug("Requesting confirmation from wear: " + actionstring);
+
+ PutDataRequest putDataRequest = dataMapRequest.asPutDataRequest();
+ Wearable.DataApi.putDataItem(googleApiClient, putDataRequest);
+ } else {
+ Log.e("changeConfirmRequest", "No connection to wearable available!");
+ }
+ }
+
+ private void sendCancelNotificationRequest(String actionstring) {
+ if (googleApiClient.isConnected()) {
+ PutDataMapRequest dataMapRequest = PutDataMapRequest.create(ACTION_CANCELNOTIFICATION_REQUEST_PATH);
+ //unique content
+ dataMapRequest.getDataMap().putLong("timestamp", System.currentTimeMillis());
+ dataMapRequest.getDataMap().putString("cancelNotificationRequest", "cancelNotificationRequest");
+ dataMapRequest.getDataMap().putString("actionstring", actionstring);
+
+ log.debug("Canceling notification on wear: " + actionstring);
+
+ PutDataRequest putDataRequest = dataMapRequest.asPutDataRequest();
+ Wearable.DataApi.putDataItem(googleApiClient, putDataRequest);
+ } else {
+ Log.e("cancelNotificationRequest", "No connection to wearable available!");
+ }
+ }
+
private void sendStatus() {
if (googleApiClient.isConnected()) {
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
String status = MainApp.gs(R.string.noprofile);
String iobSum, iobDetail, cobString, currentBasal, bgiString;
iobSum = iobDetail = cobString = currentBasal = bgiString = "";
@@ -699,7 +747,7 @@ public class WatchUpdaterService extends WearableListenerService implements
String basalStringResult;
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
if (profile == null)
return "";
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java
index d5ac60a626..9c4ec1551a 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java
@@ -9,11 +9,14 @@ import android.support.annotation.NonNull;
import com.squareup.otto.Subscribe;
+import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.IobTotal;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.db.TemporaryBasal;
+import info.nightscout.androidaps.events.EventAppInitialized;
+import info.nightscout.androidaps.events.EventConfigBuilderChange;
import info.nightscout.androidaps.events.EventExtendedBolusChange;
import info.nightscout.androidaps.events.EventNewBG;
import info.nightscout.androidaps.events.EventPreferenceChange;
@@ -25,6 +28,7 @@ import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.interfaces.TreatmentsInterface;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.IobCobCalculator.CobInfo;
import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
import info.nightscout.androidaps.plugins.Loop.LoopPlugin;
@@ -79,7 +83,6 @@ public class StatuslinePlugin extends PluginBase {
@Override
protected void onStart() {
MainApp.bus().register(this);
- sendStatus();
super.onStart();
}
@@ -93,7 +96,7 @@ public class StatuslinePlugin extends PluginBase {
private void sendStatus() {
String status = ""; // sent once on disable
- Profile profile = MainApp.getConfigBuilder().getProfile();
+ Profile profile = ProfileFunctions.getInstance().getProfile();
if (isEnabled(PluginType.GENERAL) && profile != null) {
status = buildStatusString(profile);
@@ -111,6 +114,10 @@ public class StatuslinePlugin extends PluginBase {
@NonNull
private String buildStatusString(Profile profile) {
String status = "";
+
+ if (ConfigBuilderPlugin.getPlugin().getActivePump() == null)
+ return "";
+
LoopPlugin loopPlugin = LoopPlugin.getPlugin();
if (!loopPlugin.isEnabled(PluginType.LOOP)) {
@@ -181,6 +188,16 @@ public class StatuslinePlugin extends PluginBase {
sendStatus();
}
+ @Subscribe
+ public void onStatusEvent(final EventAppInitialized ev) {
+ sendStatus();
+ }
+
+ @Subscribe
+ public void onStatusEvent(final EventConfigBuilderChange ev) {
+ sendStatus();
+ }
+
@Subscribe
public void onStatusEvent(final EventRefreshOverview ev) {
//Filter events where loop is (de)activated
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 47fe4acd6a..0e74ec8185 100644
--- a/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java
+++ b/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java
@@ -20,9 +20,12 @@ import info.nightscout.androidaps.data.PumpEnactResult;
import info.nightscout.androidaps.events.EventBolusRequested;
import info.nightscout.androidaps.interfaces.Constraint;
import info.nightscout.androidaps.interfaces.PumpInterface;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.Overview.Dialogs.BolusProgressDialog;
import info.nightscout.androidaps.plugins.Overview.Dialogs.BolusProgressHelperActivity;
+import info.nightscout.androidaps.plugins.Overview.events.EventDismissBolusprogressIfRunning;
import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
@@ -75,10 +78,10 @@ import info.nightscout.androidaps.queue.commands.CommandTempBasalPercent;
*/
public class CommandQueue {
- private static Logger log = LoggerFactory.getLogger(CommandQueue.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPQUEUE);
private final LinkedList queue = new LinkedList<>();
- protected Command performing;
+ Command performing;
private QueueThread thread = null;
@@ -109,12 +112,14 @@ public class CommandQueue {
private synchronized void inject(Command command) {
// inject as a first command
- log.debug("QUEUE: Adding as first: " + command.getClass().getSimpleName() + " - " + command.status());
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("Adding as first: " + command.getClass().getSimpleName() + " - " + command.status());
queue.addFirst(command);
}
private synchronized void add(Command command) {
- log.debug("QUEUE: Adding: " + command.getClass().getSimpleName() + " - " + command.status());
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("Adding: " + command.getClass().getSimpleName() + " - " + command.status());
queue.add(command);
}
@@ -147,25 +152,30 @@ public class CommandQueue {
// start thread again if not already running
protected synchronized void notifyAboutNewCommand() {
while (thread != null && thread.getState() != Thread.State.TERMINATED && thread.waitingForDisconnect) {
- log.debug("QUEUE: Waiting for previous thread finish");
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("Waiting for previous thread finish");
SystemClock.sleep(500);
}
if (thread == null || thread.getState() == Thread.State.TERMINATED) {
thread = new QueueThread(this);
thread.start();
- log.debug("QUEUE: Starting new thread");
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("Starting new thread");
} else {
- log.debug("QUEUE: Thread is already running");
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("Thread is already running");
}
}
- public static void independentConnect(String reason, Callback callback) {
+ public void independentConnect(String reason, Callback callback) {
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("Starting new queue");
CommandQueue tempCommandQueue = new CommandQueue();
tempCommandQueue.readStatus(reason, callback);
}
- public synchronized boolean bolusInQueue(){
- if(isRunning(Command.CommandType.BOLUS)) return true;
+ public synchronized boolean bolusInQueue() {
+ if (isRunning(Command.CommandType.BOLUS)) return true;
for (int i = 0; i < queue.size(); i++) {
if (queue.get(i).commandType == Command.CommandType.BOLUS) {
return true;
@@ -180,17 +190,19 @@ public class CommandQueue {
if (type == Command.CommandType.SMB_BOLUS) {
if (isRunning(Command.CommandType.BOLUS) || bolusInQueue()) {
- log.debug("Rejecting SMB since a bolus is queue/running");
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("Rejecting SMB since a bolus is queue/running");
return false;
}
if (detailedBolusInfo.lastKnownBolusTime < TreatmentsPlugin.getPlugin().getLastBolusTime()) {
- log.debug("Rejecting bolus, another bolus was issued since request time");
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("Rejecting bolus, another bolus was issued since request time");
return false;
}
}
- if(type.equals(Command.CommandType.BOLUS) && detailedBolusInfo.carbs > 0 && detailedBolusInfo.insulin == 0){
+ if (type.equals(Command.CommandType.BOLUS) && detailedBolusInfo.carbs > 0 && detailedBolusInfo.insulin == 0) {
type = Command.CommandType.CARBS_ONLY_TREATMENT;
//Carbs only can be added in parallel as they can be "in the future".
} else {
@@ -213,7 +225,7 @@ public class CommandQueue {
add(new CommandSMBBolus(detailedBolusInfo, callback));
} else {
add(new CommandBolus(detailedBolusInfo, callback, type));
- if(type.equals(Command.CommandType.BOLUS)) {
+ if (type.equals(Command.CommandType.BOLUS)) {
// Bring up bolus progress dialog (start here, so the dialog is shown when the bolus is requested,
// not when the Bolus command is starting. The command closes the dialog upon completion).
showBolusProgressDialog(detailedBolusInfo.insulin, detailedBolusInfo.context);
@@ -228,6 +240,9 @@ public class CommandQueue {
}
public synchronized void cancelAllBoluses() {
+ if (!isRunning(Command.CommandType.BOLUS)) {
+ MainApp.bus().post(new EventDismissBolusprogressIfRunning(new PumpEnactResult().success(true).enacted(false)));
+ }
removeAll(Command.CommandType.BOLUS);
removeAll(Command.CommandType.SMB_BOLUS);
ConfigBuilderPlugin.getActivePump().stopBolusDelivering();
@@ -283,7 +298,7 @@ public class CommandQueue {
return false;
}
- Double rateAfterConstraints = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(insulin)).value();
+ Double rateAfterConstraints = MainApp.getConstraintChecker().applyExtendedBolusConstraints(new Constraint<>(insulin)).value();
// remove all unfinished
removeAll(Command.CommandType.EXTENDEDBOLUS);
@@ -337,7 +352,8 @@ public class CommandQueue {
// returns true if command is queued
public boolean setProfile(Profile profile, Callback callback) {
if (isThisProfileSet(profile)) {
- log.debug("QUEUE: Correct profile already set");
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("Correct profile already set");
if (callback != null)
callback.result(new PumpEnactResult().success(true).enacted(false)).run();
return false;
@@ -381,7 +397,8 @@ public class CommandQueue {
// returns true if command is queued
public boolean readStatus(String reason, Callback callback) {
if (isLastScheduled(Command.CommandType.READSTATUS)) {
- log.debug("QUEUE: READSTATUS " + reason + " ignored as duplicated");
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("READSTATUS " + reason + " ignored as duplicated");
if (callback != null)
callback.result(executingNowError()).run();
return false;
@@ -492,12 +509,14 @@ public class CommandQueue {
public boolean isThisProfileSet(Profile profile) {
PumpInterface activePump = ConfigBuilderPlugin.getActivePump();
- Profile current = MainApp.getConfigBuilder().getProfile();
+ Profile current = ProfileFunctions.getInstance().getProfile();
if (activePump != null && current != null) {
boolean result = activePump.isThisProfileSet(profile);
if (!result) {
- log.debug("Current profile: " + current.getData().toString());
- log.debug("New profile: " + profile.getData().toString());
+ if (L.isEnabled(L.PUMPQUEUE)) {
+ log.debug("Current profile: " + current.toString());
+ log.debug("New profile: " + profile.toString());
+ }
}
return result;
} else return true;
diff --git a/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.java b/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.java
index a5ad59ca0b..d59a83a4f4 100644
--- a/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.java
+++ b/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.java
@@ -2,6 +2,7 @@ package info.nightscout.androidaps.queue;
import android.bluetooth.BluetoothAdapter;
import android.content.Context;
+import android.content.ContextWrapper;
import android.os.PowerManager;
import android.os.SystemClock;
@@ -11,13 +12,11 @@ import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.data.PumpEnactResult;
import info.nightscout.androidaps.events.EventPumpStatusChanged;
import info.nightscout.androidaps.interfaces.PumpInterface;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.Overview.events.EventDismissBolusprogressIfRunning;
-import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
-import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
import info.nightscout.androidaps.queue.events.EventQueueChanged;
import info.nightscout.utils.SP;
@@ -26,7 +25,7 @@ import info.nightscout.utils.SP;
*/
public class QueueThread extends Thread {
- private static Logger log = LoggerFactory.getLogger(QueueThread.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPQUEUE);
private CommandQueue queue;
@@ -36,12 +35,15 @@ public class QueueThread extends Thread {
private PowerManager.WakeLock mWakeLock;
- public QueueThread(CommandQueue queue) {
+ QueueThread(CommandQueue queue) {
super();
this.queue = queue;
- PowerManager powerManager = (PowerManager) MainApp.instance().getApplicationContext().getSystemService(Context.POWER_SERVICE);
- mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "QueueThread");
+ Context context = MainApp.instance().getApplicationContext();
+ if (context != null) {
+ PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+ mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "QueueThread");
+ }
}
@Override
@@ -54,7 +56,8 @@ public class QueueThread extends Thread {
while (true) {
PumpInterface pump = ConfigBuilderPlugin.getActivePump();
if (pump == null) {
- log.debug("QUEUE: pump == null");
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("pump == null");
MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.pumpNotInitialized)));
SystemClock.sleep(1000);
continue;
@@ -64,15 +67,17 @@ public class QueueThread extends Thread {
if (!pump.isConnected() && secondsElapsed > Constants.PUMP_MAX_CONNECTION_TIME_IN_SECONDS) {
MainApp.bus().post(new EventDismissBolusprogressIfRunning(null));
MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.connectiontimedout)));
- log.debug("QUEUE: timed out");
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("timed out");
pump.stopConnecting();
//BLUETOOTH-WATCHDOG
boolean watchdog = SP.getBoolean(R.string.key_btwatchdog, false);
long last_watchdog = SP.getLong(R.string.key_btwatchdog_lastbark, 0l);
watchdog = watchdog && System.currentTimeMillis() - last_watchdog > (Constants.MIN_WATCHDOG_INTERVAL_IN_SECONDS * 1000);
- if(watchdog) {
- log.debug("BT watchdog - toggeling the phonest bluetooth");
+ if (watchdog) {
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("BT watchdog - toggeling the phonest bluetooth");
//write time
SP.putLong(R.string.key_btwatchdog_lastbark, System.currentTimeMillis());
//toggle BT
@@ -91,7 +96,8 @@ public class QueueThread extends Thread {
pump.connect("watchdog");
} else {
queue.clear();
- log.debug("QUEUE: no connection possible");
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("no connection possible");
MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTING));
pump.disconnect("Queue empty");
MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTED));
@@ -99,16 +105,25 @@ public class QueueThread extends Thread {
}
}
+ if (pump.isHandshakeInProgress()) {
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("handshaking " + secondsElapsed);
+ MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.HANDSHAKING, (int) secondsElapsed));
+ SystemClock.sleep(100);
+ continue;
+ }
+
if (pump.isConnecting()) {
- log.debug("QUEUE: connecting " + secondsElapsed);
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("connecting " + secondsElapsed);
MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.CONNECTING, (int) secondsElapsed));
SystemClock.sleep(1000);
continue;
}
-
if (!pump.isConnected()) {
- log.debug("QUEUE: connect");
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("connect");
MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.CONNECTING, (int) secondsElapsed));
pump.connect("Connection needed");
SystemClock.sleep(1000);
@@ -118,12 +133,14 @@ public class QueueThread extends Thread {
if (queue.performing() == null) {
if (!connectLogged) {
connectLogged = true;
- log.debug("QUEUE: connection time " + secondsElapsed + "s");
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("connection time " + secondsElapsed + "s");
}
// Pickup 1st command and set performing variable
if (queue.size() > 0) {
queue.pickup();
- log.debug("QUEUE: performing " + queue.performing().status());
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("performing " + queue.performing().status());
MainApp.bus().post(new EventQueueChanged());
queue.performing().execute();
queue.resetPerforming();
@@ -138,22 +155,25 @@ public class QueueThread extends Thread {
long secondsFromLastCommand = (System.currentTimeMillis() - lastCommandTime) / 1000;
if (secondsFromLastCommand >= 5) {
waitingForDisconnect = true;
- log.debug("QUEUE: queue empty. disconnect");
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("queue empty. disconnect");
MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTING));
pump.disconnect("Queue empty");
MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTED));
- log.debug("QUEUE: disconnected");
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("disconnected");
return;
} else {
- log.debug("QUEUE: waiting for disconnect");
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("waiting for disconnect");
SystemClock.sleep(1000);
}
}
}
} finally {
mWakeLock.release();
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("thread end");
}
}
-
-
}
diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/Command.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/Command.java
index 7156a72f25..7207f5b8d1 100644
--- a/app/src/main/java/info/nightscout/androidaps/queue/commands/Command.java
+++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/Command.java
@@ -1,14 +1,20 @@
package info.nightscout.androidaps.queue.commands;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.PumpEnactResult;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.queue.Callback;
/**
* Created by mike on 09.11.2017.
*/
public abstract class Command {
+ private Logger log = LoggerFactory.getLogger(L.PUMPQUEUE);
+
public enum CommandType {
BOLUS,
SMB_BOLUS,
@@ -33,6 +39,8 @@ public abstract class Command {
PumpEnactResult result = new PumpEnactResult();
result.success = false;
result.comment = MainApp.gs(R.string.connectiontimedout);
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("Result cancel");
if (callback != null)
callback.result(result).run();
}
diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandBolus.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandBolus.java
index 2be3831ace..7e17e831e9 100644
--- a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandBolus.java
+++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandBolus.java
@@ -1,8 +1,12 @@
package info.nightscout.androidaps.queue.commands;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.data.DetailedBolusInfo;
import info.nightscout.androidaps.data.PumpEnactResult;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.Overview.Dialogs.BolusProgressDialog;
import info.nightscout.androidaps.plugins.Overview.events.EventDismissBolusprogressIfRunning;
@@ -14,7 +18,9 @@ import info.nightscout.utils.DecimalFormatter;
*/
public class CommandBolus extends Command {
- DetailedBolusInfo detailedBolusInfo;
+ private Logger log = LoggerFactory.getLogger(L.PUMPQUEUE);
+
+ private DetailedBolusInfo detailedBolusInfo;
public CommandBolus(DetailedBolusInfo detailedBolusInfo, Callback callback, CommandType type) {
commandType = type;
@@ -28,6 +34,8 @@ public class CommandBolus extends Command {
BolusProgressDialog.bolusEnded = true;
MainApp.bus().post(new EventDismissBolusprogressIfRunning(r));
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("Result success: " + r.success + " enacted: " + r.enacted);
if (callback != null)
callback.result(r).run();
diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandCancelExtendedBolus.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandCancelExtendedBolus.java
index 536c2d876c..164a049647 100644
--- a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandCancelExtendedBolus.java
+++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandCancelExtendedBolus.java
@@ -3,9 +3,8 @@ package info.nightscout.androidaps.queue.commands;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.data.PumpEnactResult;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.queue.Callback;
@@ -14,7 +13,7 @@ import info.nightscout.androidaps.queue.Callback;
*/
public class CommandCancelExtendedBolus extends Command {
- private static Logger log = LoggerFactory.getLogger(CommandCancelExtendedBolus.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPQUEUE);
public CommandCancelExtendedBolus(Callback callback) {
commandType = CommandType.EXTENDEDBOLUS;
@@ -24,8 +23,8 @@ public class CommandCancelExtendedBolus extends Command {
@Override
public void execute() {
PumpEnactResult r = ConfigBuilderPlugin.getActivePump().cancelExtendedBolus();
- if (Config.logCongigBuilderActions)
- log.debug("cancelExtendedBolus success: " + r.success + " enacted: " + r.enacted);
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("Result success: " + r.success + " enacted: " + r.enacted);
if (callback != null)
callback.result(r).run();
}
diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandCancelTempBasal.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandCancelTempBasal.java
index d2496c871a..5daa0e38e4 100644
--- a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandCancelTempBasal.java
+++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandCancelTempBasal.java
@@ -1,7 +1,10 @@
package info.nightscout.androidaps.queue.commands;
-import info.nightscout.androidaps.MainApp;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import info.nightscout.androidaps.data.PumpEnactResult;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.queue.Callback;
@@ -10,7 +13,9 @@ import info.nightscout.androidaps.queue.Callback;
*/
public class CommandCancelTempBasal extends Command {
- boolean enforceNew;
+ private Logger log = LoggerFactory.getLogger(L.PUMPQUEUE);
+
+ private boolean enforceNew;
public CommandCancelTempBasal(boolean enforceNew, Callback callback) {
commandType = CommandType.TEMPBASAL;
@@ -21,6 +26,8 @@ public class CommandCancelTempBasal extends Command {
@Override
public void execute() {
PumpEnactResult r = ConfigBuilderPlugin.getActivePump().cancelTempBasal(enforceNew);
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("Result success: " + r.success + " enacted: " + r.enacted);
if (callback != null)
callback.result(r).run();
}
diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandExtendedBolus.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandExtendedBolus.java
index 0641d9139d..ea329c04d7 100644
--- a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandExtendedBolus.java
+++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandExtendedBolus.java
@@ -3,9 +3,8 @@ package info.nightscout.androidaps.queue.commands;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.data.PumpEnactResult;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.queue.Callback;
@@ -14,7 +13,7 @@ import info.nightscout.androidaps.queue.Callback;
*/
public class CommandExtendedBolus extends Command {
- private static Logger log = LoggerFactory.getLogger(CommandExtendedBolus.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPQUEUE);
private double insulin;
private int durationInMinutes;
@@ -29,8 +28,8 @@ public class CommandExtendedBolus extends Command {
@Override
public void execute() {
PumpEnactResult r = ConfigBuilderPlugin.getActivePump().setExtendedBolus(insulin, durationInMinutes);
- if (Config.logCongigBuilderActions)
- log.debug("setExtendedBolus rate: " + insulin + " durationInMinutes: " + durationInMinutes + " success: " + r.success + " enacted: " + r.enacted);
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("Result rate: " + insulin + " durationInMinutes: " + durationInMinutes + " success: " + r.success + " enacted: " + r.enacted);
if (callback != null)
callback.result(r).run();
}
diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandLoadEvents.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandLoadEvents.java
index 2d6bc5b5fc..5cc954f5ff 100644
--- a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandLoadEvents.java
+++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandLoadEvents.java
@@ -1,8 +1,12 @@
package info.nightscout.androidaps.queue.commands;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import info.nightscout.androidaps.data.PumpEnactResult;
import info.nightscout.androidaps.interfaces.DanaRInterface;
import info.nightscout.androidaps.interfaces.PumpInterface;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.queue.Callback;
@@ -11,6 +15,8 @@ import info.nightscout.androidaps.queue.Callback;
*/
public class CommandLoadEvents extends Command {
+ private Logger log = LoggerFactory.getLogger(L.PUMPQUEUE);
+
public CommandLoadEvents(Callback callback) {
commandType = CommandType.LOADEVENTS;
this.callback = callback;
@@ -22,6 +28,8 @@ public class CommandLoadEvents extends Command {
if (pump instanceof DanaRInterface) {
DanaRInterface danaPump = (DanaRInterface) pump;
PumpEnactResult r = danaPump.loadEvents();
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("Result success: " + r.success + " enacted: " + r.enacted);
if (callback != null)
callback.result(r).run();
}
diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandLoadHistory.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandLoadHistory.java
index 16e9a18048..1259812676 100644
--- a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandLoadHistory.java
+++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandLoadHistory.java
@@ -1,18 +1,23 @@
package info.nightscout.androidaps.queue.commands;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import info.nightscout.androidaps.data.PumpEnactResult;
import info.nightscout.androidaps.interfaces.DanaRInterface;
import info.nightscout.androidaps.interfaces.PumpInterface;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.queue.Callback;
-import info.nightscout.androidaps.queue.commands.Command;
/**
* Created by mike on 10.11.2017.
*/
public class CommandLoadHistory extends Command {
- byte type;
+ private Logger log = LoggerFactory.getLogger(L.PUMPQUEUE);
+
+ private byte type;
public CommandLoadHistory(byte type, Callback callback) {
commandType = CommandType.LOADHISTORY;
@@ -26,6 +31,8 @@ public class CommandLoadHistory extends Command {
if (pump instanceof DanaRInterface) {
DanaRInterface danaPump = (DanaRInterface) pump;
PumpEnactResult r = danaPump.loadHistory(type);
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("Result success: " + r.success + " enacted: " + r.enacted);
if (callback != null)
callback.result(r).run();
}
diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandLoadTDDs.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandLoadTDDs.java
index 363781a379..1212303e82 100644
--- a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandLoadTDDs.java
+++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandLoadTDDs.java
@@ -1,7 +1,11 @@
package info.nightscout.androidaps.queue.commands;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import info.nightscout.androidaps.data.PumpEnactResult;
import info.nightscout.androidaps.interfaces.PumpInterface;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.queue.Callback;
@@ -10,6 +14,8 @@ import info.nightscout.androidaps.queue.Callback;
*/
public class CommandLoadTDDs extends Command {
+ private Logger log = LoggerFactory.getLogger(L.PUMPQUEUE);
+
public CommandLoadTDDs(Callback callback) {
commandType = CommandType.LOADHISTORY; //belongs to the history group of commands
@@ -20,9 +26,11 @@ public class CommandLoadTDDs extends Command {
public void execute() {
PumpInterface pump = ConfigBuilderPlugin.getActivePump();
PumpEnactResult r = pump.loadTDDs();
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("Result success: " + r.success + " enacted: " + r.enacted);
if (callback != null)
callback.result(r).run();
- }
+ }
@Override
public String status() {
diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandReadStatus.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandReadStatus.java
index 44c778c5f7..a303375a49 100644
--- a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandReadStatus.java
+++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandReadStatus.java
@@ -1,15 +1,24 @@
package info.nightscout.androidaps.queue.commands;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import info.nightscout.androidaps.data.PumpEnactResult;
+import info.nightscout.androidaps.interfaces.PumpInterface;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.queue.Callback;
import info.nightscout.utils.LocalAlertUtils;
+import info.nightscout.utils.T;
/**
* Created by mike on 09.11.2017.
*/
public class CommandReadStatus extends Command {
- String reason;
+ private Logger log = LoggerFactory.getLogger(L.PUMPQUEUE);
+
+ private String reason;
public CommandReadStatus(String reason, Callback callback) {
commandType = CommandType.READSTATUS;
@@ -21,8 +30,17 @@ public class CommandReadStatus extends Command {
public void execute() {
ConfigBuilderPlugin.getActivePump().getPumpStatus();
LocalAlertUtils.notifyPumpStatusRead();
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("CommandReadStatus executed. Reason: " + reason);
+ final PumpInterface pump = ConfigBuilderPlugin.getActivePump();
+ PumpEnactResult result = new PumpEnactResult().success(false);
+ if (pump != null) {
+ long lastConnection = pump.lastDataTime();
+ if (lastConnection > System.currentTimeMillis() - T.mins(1).msecs())
+ result.success(true);
+ }
if (callback != null)
- callback.result(null).run();
+ callback.result(result).run();
}
@Override
diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandSMBBolus.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandSMBBolus.java
index 46336f7d4b..affc7aed22 100644
--- a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandSMBBolus.java
+++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandSMBBolus.java
@@ -3,12 +3,10 @@ package info.nightscout.androidaps.queue.commands;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.data.DetailedBolusInfo;
import info.nightscout.androidaps.data.PumpEnactResult;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
-import info.nightscout.androidaps.plugins.Overview.Dialogs.BolusProgressDialog;
-import info.nightscout.androidaps.plugins.Overview.events.EventDismissBolusprogressIfRunning;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.androidaps.queue.Callback;
import info.nightscout.utils.DateUtil;
@@ -20,8 +18,9 @@ import info.nightscout.utils.T;
*/
public class CommandSMBBolus extends Command {
- private static Logger log = LoggerFactory.getLogger(CommandSMBBolus.class);
- DetailedBolusInfo detailedBolusInfo;
+ private Logger log = LoggerFactory.getLogger(L.PUMPQUEUE);
+
+ private DetailedBolusInfo detailedBolusInfo;
public CommandSMBBolus(DetailedBolusInfo detailedBolusInfo, Callback callback) {
commandType = CommandType.SMB_BOLUS;
@@ -34,20 +33,25 @@ public class CommandSMBBolus extends Command {
PumpEnactResult r;
long lastBolusTime = TreatmentsPlugin.getPlugin().getLastBolusTime();
if (lastBolusTime != 0 && lastBolusTime + T.mins(3).msecs() > DateUtil.now()) {
- log.debug("SMB requsted but still in 3 min interval");
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("SMB requsted but still in 3 min interval");
r = new PumpEnactResult().enacted(false).success(false).comment("SMB requsted but still in 3 min interval");
- } else if (detailedBolusInfo.deliverAt != 0 && detailedBolusInfo.deliverAt + T.mins(1).msecs() > System.currentTimeMillis())
+ } else if (detailedBolusInfo.deliverAt != 0 && detailedBolusInfo.deliverAt + T.mins(1).msecs() > System.currentTimeMillis()) {
r = ConfigBuilderPlugin.getActivePump().deliverTreatment(detailedBolusInfo);
- else {
+ } else {
r = new PumpEnactResult().enacted(false).success(false).comment("SMB request too old");
- log.debug("SMB bolus canceled. delivetAt=" + detailedBolusInfo.deliverAt + " now=" + System.currentTimeMillis());
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("SMB bolus canceled. delivetAt: " + DateUtil.dateAndTimeString(detailedBolusInfo.deliverAt));
}
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("Result success: " + r.success + " enacted: " + r.enacted);
+
if (callback != null)
callback.result(r).run();
}
public String status() {
- return "SMBBOLUS " + DecimalFormatter.to1Decimal(detailedBolusInfo.insulin) + "U";
+ return "SMBBOLUS " + DecimalFormatter.to2Decimal(detailedBolusInfo.insulin) + "U";
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandSetProfile.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandSetProfile.java
index 03764dee0b..2a5e4a275a 100644
--- a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandSetProfile.java
+++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandSetProfile.java
@@ -10,6 +10,7 @@ import info.nightscout.androidaps.data.PumpEnactResult;
import info.nightscout.androidaps.db.ProfileSwitch;
import info.nightscout.androidaps.db.Source;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.SmsCommunicator.SmsCommunicatorPlugin;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
@@ -20,7 +21,8 @@ import info.nightscout.androidaps.queue.Callback;
*/
public class CommandSetProfile extends Command {
- private static Logger log = LoggerFactory.getLogger(CommandSetProfile.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPQUEUE);
+
private Profile profile;
public CommandSetProfile(Profile profile, Callback callback) {
@@ -32,19 +34,22 @@ public class CommandSetProfile extends Command {
@Override
public void execute() {
if (ConfigBuilderPlugin.getCommandQueue().isThisProfileSet(profile)) {
- log.debug("QUEUE: Correct profile already set");
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("Correct profile already set. profile: " + profile.toString());
if (callback != null)
callback.result(new PumpEnactResult().success(true).enacted(false)).run();
return;
}
PumpEnactResult r = ConfigBuilderPlugin.getActivePump().setNewBasalProfile(profile);
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("Result success: " + r.success + " enacted: " + r.enacted + " profile: " + profile.toString());
if (callback != null)
callback.result(r).run();
// Send SMS notification if ProfileSwitch is comming from NS
ProfileSwitch profileSwitch = TreatmentsPlugin.getPlugin().getProfileSwitchFromHistory(System.currentTimeMillis());
- if (r.enacted && profileSwitch.source == Source.NIGHTSCOUT) {
+ if (profileSwitch != null && r.enacted && profileSwitch.source == Source.NIGHTSCOUT) {
SmsCommunicatorPlugin smsCommunicatorPlugin = MainApp.getSpecificPlugin(SmsCommunicatorPlugin.class);
if (smsCommunicatorPlugin != null && smsCommunicatorPlugin.isEnabled(PluginType.GENERAL)) {
smsCommunicatorPlugin.sendNotificationToAllNumbers(MainApp.gs(R.string.profile_set_ok));
diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandSetUserSettings.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandSetUserSettings.java
index f3d9fe2a4b..8a9ae21c70 100644
--- a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandSetUserSettings.java
+++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandSetUserSettings.java
@@ -3,13 +3,11 @@ package info.nightscout.androidaps.queue.commands;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.data.PumpEnactResult;
import info.nightscout.androidaps.interfaces.DanaRInterface;
-import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.interfaces.PumpInterface;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
-import info.nightscout.androidaps.plugins.PumpDanaRv2.DanaRv2Plugin;
import info.nightscout.androidaps.queue.Callback;
/**
@@ -17,7 +15,8 @@ import info.nightscout.androidaps.queue.Callback;
*/
public class CommandSetUserSettings extends Command {
- private static Logger log = LoggerFactory.getLogger(CommandSetUserSettings.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPQUEUE);
+
public CommandSetUserSettings(Callback callback) {
commandType = CommandType.SETUSERSETTINGS;
this.callback = callback;
@@ -28,11 +27,9 @@ public class CommandSetUserSettings extends Command {
PumpInterface pump = ConfigBuilderPlugin.getActivePump();
if (pump instanceof DanaRInterface) {
DanaRInterface danaPump = (DanaRInterface) pump;
- boolean isDanaRv2 = MainApp.getSpecificPlugin(DanaRv2Plugin.class) != null && MainApp.getSpecificPlugin(DanaRv2Plugin.class).isEnabled(PluginType.PUMP);
- if(isDanaRv2){
- log.debug("MsgSetUserOptions detected for DanaRv2");
- }
PumpEnactResult r = danaPump.setUserOptions();
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("Result success: " + r.success + " enacted: " + r.enacted);
if (callback != null)
callback.result(r).run();
}
diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandTempBasalAbsolute.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandTempBasalAbsolute.java
index 35c2435558..a2787cabb6 100644
--- a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandTempBasalAbsolute.java
+++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandTempBasalAbsolute.java
@@ -3,10 +3,9 @@ package info.nightscout.androidaps.queue.commands;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
-import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.data.PumpEnactResult;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.queue.Callback;
@@ -15,12 +14,12 @@ import info.nightscout.androidaps.queue.Callback;
*/
public class CommandTempBasalAbsolute extends Command {
- private static Logger log = LoggerFactory.getLogger(CommandTempBasalAbsolute.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPQUEUE);
- int durationInMinutes;
- double absoluteRate;
- boolean enforceNew;
- Profile profile;
+ private int durationInMinutes;
+ private double absoluteRate;
+ private boolean enforceNew;
+ private Profile profile;
public CommandTempBasalAbsolute(double absoluteRate, int durationInMinutes, boolean enforceNew, Profile profile, Callback callback) {
commandType = CommandType.TEMPBASAL;
@@ -34,8 +33,8 @@ public class CommandTempBasalAbsolute extends Command {
@Override
public void execute() {
PumpEnactResult r = ConfigBuilderPlugin.getActivePump().setTempBasalAbsolute(absoluteRate, durationInMinutes, profile, enforceNew);
- if (Config.logCongigBuilderActions)
- log.debug("setTempBasalAbsolute rate: " + absoluteRate + " durationInMinutes: " + durationInMinutes + " success: " + r.success + " enacted: " + r.enacted);
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("Result rate: " + absoluteRate + " durationInMinutes: " + durationInMinutes + " success: " + r.success + " enacted: " + r.enacted);
if (callback != null)
callback.result(r).run();
}
diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandTempBasalPercent.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandTempBasalPercent.java
index bbb421e128..efdfca0a69 100644
--- a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandTempBasalPercent.java
+++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandTempBasalPercent.java
@@ -3,9 +3,9 @@ package info.nightscout.androidaps.queue.commands;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.data.PumpEnactResult;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.queue.Callback;
@@ -14,12 +14,12 @@ import info.nightscout.androidaps.queue.Callback;
*/
public class CommandTempBasalPercent extends Command {
- private static Logger log = LoggerFactory.getLogger(CommandTempBasalPercent.class);
+ private Logger log = LoggerFactory.getLogger(L.PUMPQUEUE);
- int durationInMinutes;
- int percent;
- boolean enforceNew;
- Profile profile;
+ private int durationInMinutes;
+ private int percent;
+ private boolean enforceNew;
+ private Profile profile;
public CommandTempBasalPercent(int percent, int durationInMinutes, boolean enforceNew, Profile profile, Callback callback) {
commandType = CommandType.TEMPBASAL;
@@ -33,8 +33,8 @@ public class CommandTempBasalPercent extends Command {
@Override
public void execute() {
PumpEnactResult r = ConfigBuilderPlugin.getActivePump().setTempBasalPercent(percent, durationInMinutes, profile, enforceNew);
- if (Config.logCongigBuilderActions)
- log.debug("setTempBasalPercent percent: " + percent + " durationInMinutes: " + durationInMinutes + " success: " + r.success + " enacted: " + r.enacted);
+ if (L.isEnabled(L.PUMPQUEUE))
+ log.debug("Result percent: " + percent + " durationInMinutes: " + durationInMinutes + " success: " + r.success + " enacted: " + r.enacted);
if (callback != null)
callback.result(r).run();
}
diff --git a/app/src/main/java/info/nightscout/androidaps/receivers/ChargingStateReceiver.java b/app/src/main/java/info/nightscout/androidaps/receivers/ChargingStateReceiver.java
index 3dbec90b4f..b10c2e99e5 100644
--- a/app/src/main/java/info/nightscout/androidaps/receivers/ChargingStateReceiver.java
+++ b/app/src/main/java/info/nightscout/androidaps/receivers/ChargingStateReceiver.java
@@ -21,6 +21,9 @@ public class ChargingStateReceiver extends BroadcastReceiver {
public EventChargingState grabChargingState(Context context) {
BatteryManager bm = (BatteryManager) context.getSystemService(Context.BATTERY_SERVICE);
+ if (bm == null)
+ return new EventChargingState(false);
+
int status = bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_STATUS);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING
|| status == BatteryManager.BATTERY_STATUS_FULL;
diff --git a/app/src/main/java/info/nightscout/androidaps/receivers/DataReceiver.java b/app/src/main/java/info/nightscout/androidaps/receivers/DataReceiver.java
index aa767bb154..087cd3a5f5 100644
--- a/app/src/main/java/info/nightscout/androidaps/receivers/DataReceiver.java
+++ b/app/src/main/java/info/nightscout/androidaps/receivers/DataReceiver.java
@@ -7,15 +7,15 @@ import android.support.v4.content.WakefulBroadcastReceiver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import info.nightscout.androidaps.Services.DataService;
-import info.nightscout.androidaps.Config;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.services.DataService;
public class DataReceiver extends WakefulBroadcastReceiver {
- private static Logger log = LoggerFactory.getLogger(DataReceiver.class);
+ private static Logger log = LoggerFactory.getLogger(L.DATASERVICE);
@Override
public void onReceive(Context context, Intent intent) {
- if (Config.logFunctionCalls)
+ if (L.isEnabled(L.DATASERVICE))
log.debug("onReceive " + intent);
startWakefulService(context, new Intent(context, DataService.class)
.setAction(intent.getAction())
diff --git a/app/src/main/java/info/nightscout/androidaps/receivers/KeepAliveReceiver.java b/app/src/main/java/info/nightscout/androidaps/receivers/KeepAliveReceiver.java
index d574b08f40..6b51fc1418 100644
--- a/app/src/main/java/info/nightscout/androidaps/receivers/KeepAliveReceiver.java
+++ b/app/src/main/java/info/nightscout/androidaps/receivers/KeepAliveReceiver.java
@@ -7,28 +7,34 @@ import android.content.Context;
import android.content.Intent;
import android.os.PowerManager;
-import info.nightscout.utils.FabricPrivacy;
+import com.crashlytics.android.answers.CustomEvent;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.Date;
-
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.events.EventProfileSwitchChange;
import info.nightscout.androidaps.interfaces.PumpInterface;
-import info.nightscout.androidaps.data.Profile;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.queue.commands.Command;
+import info.nightscout.utils.DateUtil;
+import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.LocalAlertUtils;
+import info.nightscout.utils.T;
/**
* Created by mike on 07.07.2016.
*/
public class KeepAliveReceiver extends BroadcastReceiver {
- private static Logger log = LoggerFactory.getLogger(KeepAliveReceiver.class);
- public static final long STATUS_UPDATE_FREQUENCY = 15 * 60 * 1000L;
+ private static Logger log = LoggerFactory.getLogger(L.CORE);
+ public static final long STATUS_UPDATE_FREQUENCY = T.mins(15).msecs();
+ private static long lastReadStatus = 0;
+ private static long lastRun = 0;
public static void cancelAlarm(Context context) {
Intent intent = new Intent(context, KeepAliveReceiver.class);
@@ -48,28 +54,42 @@ public class KeepAliveReceiver extends BroadcastReceiver {
checkPump();
FabricPrivacy.uploadDailyStats();
- log.debug("KeepAlive received");
+ if (L.isEnabled(L.CORE))
+ log.debug("KeepAlive received");
wl.release();
}
private void checkPump() {
final PumpInterface pump = ConfigBuilderPlugin.getActivePump();
- final Profile profile = MainApp.getConfigBuilder().getProfile();
+ final Profile profile = ProfileFunctions.getInstance().getProfile();
if (pump != null && profile != null) {
- Date lastConnection = pump.lastDataTime();
- boolean isStatusOutdated = lastConnection.getTime() + STATUS_UPDATE_FREQUENCY < System.currentTimeMillis();
+ long lastConnection = pump.lastDataTime();
+ boolean isStatusOutdated = lastConnection + STATUS_UPDATE_FREQUENCY < System.currentTimeMillis();
boolean isBasalOutdated = Math.abs(profile.getBasal() - pump.getBaseBasalRate()) > pump.getPumpDescription().basalStep;
- LocalAlertUtils.checkPumpUnreachableAlarm(lastConnection, isStatusOutdated);
+ if (L.isEnabled(L.CORE))
+ log.debug("Last connection: " + DateUtil.dateAndTimeString(lastConnection));
+ // sometimes keepalive broadcast stops
+ // as as workaround test if readStatus was requested before an alarm is generated
+ if (lastReadStatus != 0 && lastReadStatus > System.currentTimeMillis() - T.mins(5).msecs()) {
+ LocalAlertUtils.checkPumpUnreachableAlarm(lastConnection, isStatusOutdated);
+ }
if (!pump.isThisProfileSet(profile) && !ConfigBuilderPlugin.getCommandQueue().isRunning(Command.CommandType.BASALPROFILE)) {
MainApp.bus().post(new EventProfileSwitchChange());
} else if (isStatusOutdated && !pump.isBusy()) {
+ lastReadStatus = System.currentTimeMillis();
ConfigBuilderPlugin.getCommandQueue().readStatus("KeepAlive. Status outdated.", null);
} else if (isBasalOutdated && !pump.isBusy()) {
+ lastReadStatus = System.currentTimeMillis();
ConfigBuilderPlugin.getCommandQueue().readStatus("KeepAlive. Basal outdated.", null);
}
}
+ if (lastRun != 0 && System.currentTimeMillis() - lastRun > T.mins(10).msecs()) {
+ log.error("KeepAlive fail");
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("KeepAliveFail"));
+ }
+ lastRun = System.currentTimeMillis();
}
//called by MainApp at first app start
diff --git a/app/src/main/java/info/nightscout/androidaps/receivers/NSAlarmReceiver.java b/app/src/main/java/info/nightscout/androidaps/receivers/NSAlarmReceiver.java
index 95bb5e17b3..d167bb9510 100644
--- a/app/src/main/java/info/nightscout/androidaps/receivers/NSAlarmReceiver.java
+++ b/app/src/main/java/info/nightscout/androidaps/receivers/NSAlarmReceiver.java
@@ -11,14 +11,15 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.MainApp;
-import info.nightscout.androidaps.Services.Intents;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSAlarm;
-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.androidaps.plugins.Overview.notifications.Notification;
+import info.nightscout.androidaps.services.Intents;
public class NSAlarmReceiver extends BroadcastReceiver {
- private static Logger log = LoggerFactory.getLogger(NSAlarmReceiver.class);
+ private static Logger log = LoggerFactory.getLogger(L.CORE);
@Override
public void onReceive(Context context, Intent intent) {
diff --git a/app/src/main/java/info/nightscout/androidaps/receivers/NetworkChangeReceiver.java b/app/src/main/java/info/nightscout/androidaps/receivers/NetworkChangeReceiver.java
index a8bd49f430..9a3108e98c 100644
--- a/app/src/main/java/info/nightscout/androidaps/receivers/NetworkChangeReceiver.java
+++ b/app/src/main/java/info/nightscout/androidaps/receivers/NetworkChangeReceiver.java
@@ -15,10 +15,11 @@ import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.events.EventNetworkChange;
+import info.nightscout.androidaps.logging.L;
public class NetworkChangeReceiver extends BroadcastReceiver {
- private static Logger log = LoggerFactory.getLogger(NetworkChangeReceiver.class);
+ private static Logger log = LoggerFactory.getLogger(L.CORE);
@Override
public void onReceive(final Context context, final Intent intent) {
@@ -44,17 +45,20 @@ public class NetworkChangeReceiver extends BroadcastReceiver {
if (wifiInfo.getSupplicantState() == SupplicantState.COMPLETED) {
event.ssid = wifiInfo.getSSID();
}
- log.debug("NETCHANGE: Wifi connected. SSID: " + event.ssid);
+ if (L.isEnabled(L.CORE))
+ log.debug("NETCHANGE: Wifi connected. SSID: " + event.ssid);
}
}
if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
event.mobileConnected = true;
event.roaming = activeNetwork.isRoaming();
- log.debug("NETCHANGE: Mobile connected. Roaming: " + event.roaming);
+ if (L.isEnabled(L.CORE))
+ log.debug("NETCHANGE: Mobile connected. Roaming: " + event.roaming);
}
} else {
- log.debug("NETCHANGE: Disconnected.");
+ if (L.isEnabled(L.CORE))
+ log.debug("NETCHANGE: Disconnected.");
}
return event;
diff --git a/app/src/main/java/info/nightscout/androidaps/Services/AlarmSoundService.java b/app/src/main/java/info/nightscout/androidaps/services/AlarmSoundService.java
similarity index 81%
rename from app/src/main/java/info/nightscout/androidaps/Services/AlarmSoundService.java
rename to app/src/main/java/info/nightscout/androidaps/services/AlarmSoundService.java
index f453b04d36..e95cd7c479 100644
--- a/app/src/main/java/info/nightscout/androidaps/Services/AlarmSoundService.java
+++ b/app/src/main/java/info/nightscout/androidaps/services/AlarmSoundService.java
@@ -1,4 +1,4 @@
-package info.nightscout.androidaps.Services;
+package info.nightscout.androidaps.services;
import android.app.Service;
import android.content.Context;
@@ -15,9 +15,10 @@ import java.io.IOException;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.logging.L;
public class AlarmSoundService extends Service {
- private static Logger log = LoggerFactory.getLogger(AlarmSoundService.class);
+ private static Logger log = LoggerFactory.getLogger(L.CORE);
MediaPlayer player;
int resourceId = R.raw.error;
@@ -34,13 +35,15 @@ public class AlarmSoundService extends Service {
@Override
public void onCreate() {
super.onCreate();
- log.debug("onCreate");
+ if (L.isEnabled(L.CORE))
+ log.debug("onCreate");
}
public int onStartCommand(Intent intent, int flags, int startId) {
if (player != null && player.isPlaying())
player.stop();
- log.debug("onStartCommand");
+ if (L.isEnabled(L.CORE))
+ log.debug("onStartCommand");
if (intent != null && intent.hasExtra("soundid"))
resourceId = intent.getIntExtra("soundid", R.raw.error);
@@ -55,7 +58,7 @@ public class AlarmSoundService extends Service {
log.error("Unhandled exception", e);
}
player.setLooping(true); // Set looping
- AudioManager manager = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE);
+ AudioManager manager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
if (manager == null || !manager.isMusicActive()) {
player.setVolume(100, 100);
}
@@ -74,5 +77,7 @@ public class AlarmSoundService extends Service {
public void onDestroy() {
player.stop();
player.release();
+ if (L.isEnabled(L.CORE))
+ log.debug("onDestroy");
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/services/DataService.java b/app/src/main/java/info/nightscout/androidaps/services/DataService.java
new file mode 100644
index 0000000000..cfc564770d
--- /dev/null
+++ b/app/src/main/java/info/nightscout/androidaps/services/DataService.java
@@ -0,0 +1,264 @@
+package info.nightscout.androidaps.services;
+
+import android.app.IntentService;
+import android.content.Intent;
+import android.os.Bundle;
+import android.provider.Telephony;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.db.CareportalEvent;
+import info.nightscout.androidaps.events.EventNsFood;
+import info.nightscout.androidaps.events.EventNsTreatment;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.NSClientInternal.data.NSDeviceStatus;
+import info.nightscout.androidaps.plugins.NSClientInternal.data.NSMbg;
+import info.nightscout.androidaps.plugins.NSClientInternal.data.NSSettingsStatus;
+import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
+import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
+import info.nightscout.androidaps.plugins.ProfileNS.NSProfilePlugin;
+import info.nightscout.androidaps.plugins.PumpDanaR.activities.DanaRNSHistorySync;
+import info.nightscout.androidaps.plugins.SmsCommunicator.SmsCommunicatorPlugin;
+import info.nightscout.androidaps.plugins.Source.SourceDexcomG5Plugin;
+import info.nightscout.androidaps.plugins.Source.SourceGlimpPlugin;
+import info.nightscout.androidaps.plugins.Source.SourceMM640gPlugin;
+import info.nightscout.androidaps.plugins.Source.SourceNSClientPlugin;
+import info.nightscout.androidaps.plugins.Source.SourcePoctechPlugin;
+import info.nightscout.androidaps.plugins.Source.SourceXdripPlugin;
+import info.nightscout.androidaps.receivers.DataReceiver;
+import info.nightscout.androidaps.logging.BundleLogger;
+import info.nightscout.utils.JsonHelper;
+import info.nightscout.utils.SP;
+
+
+public class DataService extends IntentService {
+ private Logger log = LoggerFactory.getLogger(L.DATASERVICE);
+
+ public DataService() {
+ super("DataService");
+ registerBus();
+ }
+
+ @Override
+ protected void onHandleIntent(final Intent intent) {
+ if (L.isEnabled(L.DATASERVICE)) {
+ log.debug("onHandleIntent " + intent);
+ log.debug("onHandleIntent " + BundleLogger.log(intent.getExtras()));
+ }
+
+ boolean acceptNSData = !SP.getBoolean(R.string.key_ns_upload_only, false);
+ Bundle bundles = intent.getExtras();
+ if (bundles != null && bundles.containsKey("islocal")) {
+ acceptNSData = acceptNSData || bundles.getBoolean("islocal");
+ }
+
+
+ final String action = intent.getAction();
+ if (Intents.ACTION_NEW_BG_ESTIMATE.equals(action)) {
+ SourceXdripPlugin.getPlugin().handleNewData(intent);
+ } else if (Intents.NS_EMULATOR.equals(action)) {
+ SourceMM640gPlugin.getPlugin().handleNewData(intent);
+ } else if (Intents.GLIMP_BG.equals(action)) {
+ SourceGlimpPlugin.getPlugin().handleNewData(intent);
+ } else if (Intents.DEXCOMG5_BG.equals(action)) {
+ SourceDexcomG5Plugin.getPlugin().handleNewData(intent);
+ } else if (Intents.POCTECH_BG.equals(action)) {
+ SourcePoctechPlugin.getPlugin().handleNewData(intent);
+ } else if (Intents.ACTION_NEW_SGV.equals(action)) {
+ SourceNSClientPlugin.getPlugin().handleNewData(intent);
+ } else if (Intents.ACTION_NEW_PROFILE.equals(action)) {
+ // always handle Profile if NSProfile is enabled without looking at nsUploadOnly
+ NSProfilePlugin.getPlugin().handleNewData(intent);
+ } else if (Intents.ACTION_NEW_DEVICESTATUS.equals(action)) {
+ NSDeviceStatus.getInstance().handleNewData(intent);
+ } else if (Intents.ACTION_NEW_STATUS.equals(action)) {
+ NSSettingsStatus.getInstance().handleNewData(intent);
+ } else if (Intents.ACTION_NEW_FOOD.equals(action)) {
+ EventNsFood evt = new EventNsFood(EventNsFood.ADD, bundles);
+ MainApp.bus().post(evt);
+ } else if (Intents.ACTION_CHANGED_FOOD.equals(action)) {
+ EventNsFood evt = new EventNsFood(EventNsFood.UPDATE, bundles);
+ MainApp.bus().post(evt);
+ } else if (Intents.ACTION_REMOVED_FOOD.equals(action)) {
+ EventNsFood evt = new EventNsFood(EventNsFood.REMOVE, bundles);
+ MainApp.bus().post(evt);
+ } else if (acceptNSData &&
+ (Intents.ACTION_NEW_TREATMENT.equals(action) ||
+ Intents.ACTION_CHANGED_TREATMENT.equals(action) ||
+ Intents.ACTION_REMOVED_TREATMENT.equals(action) ||
+ Intents.ACTION_NEW_CAL.equals(action) ||
+ Intents.ACTION_NEW_MBG.equals(action))
+ ) {
+ handleNewDataFromNSClient(intent);
+ } else if (Telephony.Sms.Intents.SMS_RECEIVED_ACTION.equals(action)) {
+ SmsCommunicatorPlugin.getPlugin().handleNewData(intent);
+ }
+
+ if (L.isEnabled(L.DATASERVICE))
+ log.debug("onHandleIntent exit " + intent);
+ DataReceiver.completeWakefulIntent(intent);
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ MainApp.bus().unregister(this);
+ }
+
+ private void registerBus() {
+ try {
+ MainApp.bus().unregister(this);
+ } catch (RuntimeException x) {
+ // Ignore
+ }
+ MainApp.bus().register(this);
+ }
+
+ private void handleNewDataFromNSClient(Intent intent) {
+ Bundle bundles = intent.getExtras();
+ if (bundles == null) return;
+ if (L.isEnabled(L.DATASERVICE))
+ log.debug("Got intent: " + intent.getAction());
+
+
+ if (intent.getAction().equals(Intents.ACTION_NEW_TREATMENT) || intent.getAction().equals(Intents.ACTION_CHANGED_TREATMENT)) {
+ try {
+ if (bundles.containsKey("treatment")) {
+ JSONObject json = new JSONObject(bundles.getString("treatment"));
+ handleTreatmentFromNS(json, intent);
+ }
+ if (bundles.containsKey("treatments")) {
+ String trstring = bundles.getString("treatments");
+ JSONArray jsonArray = new JSONArray(trstring);
+ for (int i = 0; i < jsonArray.length(); i++) {
+ JSONObject json = jsonArray.getJSONObject(i);
+ handleTreatmentFromNS(json, intent);
+ }
+ }
+ } catch (JSONException e) {
+ log.error("Unhandled exception", e);
+ }
+ }
+
+ if (intent.getAction().equals(Intents.ACTION_REMOVED_TREATMENT)) {
+ try {
+ if (bundles.containsKey("treatment")) {
+ String trstring = bundles.getString("treatment");
+ JSONObject json = new JSONObject(trstring);
+ handleRemovedTreatmentFromNS(json);
+ }
+
+ if (bundles.containsKey("treatments")) {
+ String trstring = bundles.getString("treatments");
+ JSONArray jsonArray = new JSONArray(trstring);
+ for (int i = 0; i < jsonArray.length(); i++) {
+ JSONObject json = jsonArray.getJSONObject(i);
+ handleRemovedTreatmentFromNS(json);
+ }
+ }
+ } catch (JSONException e) {
+ log.error("Unhandled exception", e);
+ }
+ }
+
+ if (intent.getAction().equals(Intents.ACTION_NEW_MBG)) {
+ try {
+ if (bundles.containsKey("mbg")) {
+ String mbgstring = bundles.getString("mbg");
+ JSONObject mbgJson = new JSONObject(mbgstring);
+ storeMbg(mbgJson);
+ }
+
+ if (bundles.containsKey("mbgs")) {
+ String sgvstring = bundles.getString("mbgs");
+ JSONArray jsonArray = new JSONArray(sgvstring);
+ for (int i = 0; i < jsonArray.length(); i++) {
+ JSONObject mbgJson = jsonArray.getJSONObject(i);
+ storeMbg(mbgJson);
+ }
+ }
+ } catch (Exception e) {
+ log.error("Unhandled exception", e);
+ }
+ }
+ }
+
+ private void handleRemovedTreatmentFromNS(JSONObject json) {
+ // new DB model
+ EventNsTreatment evtTreatment = new EventNsTreatment(EventNsTreatment.REMOVE, json);
+ MainApp.bus().post(evtTreatment);
+ // old DB model
+ String _id = JsonHelper.safeGetString(json, "_id");
+ MainApp.getDbHelper().deleteTempTargetById(_id);
+ MainApp.getDbHelper().deleteTempBasalById(_id);
+ MainApp.getDbHelper().deleteExtendedBolusById(_id);
+ MainApp.getDbHelper().deleteCareportalEventById(_id);
+ MainApp.getDbHelper().deleteProfileSwitchById(_id);
+ }
+
+ private void handleTreatmentFromNS(JSONObject json, Intent intent) {
+ // new DB model
+ int mode = Intents.ACTION_NEW_TREATMENT.equals(intent.getAction()) ? EventNsTreatment.ADD : EventNsTreatment.UPDATE;
+ double insulin = JsonHelper.safeGetDouble(json, "insulin");
+ double carbs = JsonHelper.safeGetDouble(json, "carbs");
+ String eventType = JsonHelper.safeGetString(json, "eventType");
+ if (eventType == null) {
+ log.debug("Wrong treatment. Ignoring : " + json.toString());
+ return;
+ }
+ if (insulin > 0 || carbs > 0) {
+ EventNsTreatment evtTreatment = new EventNsTreatment(mode, json);
+ MainApp.bus().post(evtTreatment);
+ } else if (json.has(DanaRNSHistorySync.DANARSIGNATURE)) {
+ // old DB model
+ MainApp.getDbHelper().updateDanaRHistoryRecordId(json);
+ } else if (eventType.equals(CareportalEvent.TEMPORARYTARGET)) {
+ MainApp.getDbHelper().createTemptargetFromJsonIfNotExists(json);
+ } else if (eventType.equals(CareportalEvent.TEMPBASAL)) {
+ MainApp.getDbHelper().createTempBasalFromJsonIfNotExists(json);
+ } else if (eventType.equals(CareportalEvent.COMBOBOLUS)) {
+ MainApp.getDbHelper().createExtendedBolusFromJsonIfNotExists(json);
+ } else if (eventType.equals(CareportalEvent.PROFILESWITCH)) {
+ MainApp.getDbHelper().createProfileSwitchFromJsonIfNotExists(json);
+ } else if (eventType.equals(CareportalEvent.SITECHANGE) ||
+ eventType.equals(CareportalEvent.INSULINCHANGE) ||
+ eventType.equals(CareportalEvent.SENSORCHANGE) ||
+ eventType.equals(CareportalEvent.BGCHECK) ||
+ eventType.equals(CareportalEvent.NOTE) ||
+ eventType.equals(CareportalEvent.NONE) ||
+ eventType.equals(CareportalEvent.ANNOUNCEMENT) ||
+ eventType.equals(CareportalEvent.QUESTION) ||
+ eventType.equals(CareportalEvent.EXERCISE) ||
+ eventType.equals(CareportalEvent.OPENAPSOFFLINE) ||
+ eventType.equals(CareportalEvent.PUMPBATTERYCHANGE)) {
+ MainApp.getDbHelper().createCareportalEventFromJsonIfNotExists(json);
+ }
+
+ if (eventType.equals(CareportalEvent.ANNOUNCEMENT)) {
+ long date = JsonHelper.safeGetLong(json, "mills");
+ long now = System.currentTimeMillis();
+ String enteredBy = JsonHelper.safeGetString(json, "enteredBy", "");
+ String notes = JsonHelper.safeGetString(json, "notes", "");
+ if (date > now - 15 * 60 * 1000L && !notes.isEmpty()
+ && !enteredBy.equals(SP.getString("careportal_enteredby", "AndroidAPS"))) {
+ Notification announcement = new Notification(Notification.NSANNOUNCEMENT, notes, Notification.ANNOUNCEMENT, 60);
+ MainApp.bus().post(new EventNewNotification(announcement));
+ }
+ }
+ }
+
+ private void storeMbg(JSONObject mbgJson) {
+ NSMbg nsMbg = new NSMbg(mbgJson);
+ CareportalEvent careportalEvent = new CareportalEvent(nsMbg);
+ MainApp.getDbHelper().createOrUpdate(careportalEvent);
+ if (L.isEnabled(L.DATASERVICE))
+ log.debug("Adding/Updating new MBG: " + careportalEvent.toString());
+ }
+
+}
diff --git a/app/src/main/java/info/nightscout/androidaps/Services/Intents.java b/app/src/main/java/info/nightscout/androidaps/services/Intents.java
similarity index 98%
rename from app/src/main/java/info/nightscout/androidaps/Services/Intents.java
rename to app/src/main/java/info/nightscout/androidaps/services/Intents.java
index 25485fb34d..6d3daf1ea9 100644
--- a/app/src/main/java/info/nightscout/androidaps/Services/Intents.java
+++ b/app/src/main/java/info/nightscout/androidaps/services/Intents.java
@@ -1,4 +1,4 @@
-package info.nightscout.androidaps.Services;
+package info.nightscout.androidaps.services;
public interface Intents {
// NSClient -> App
diff --git a/app/src/main/java/info/nightscout/androidaps/setupwizard/SWDefinition.java b/app/src/main/java/info/nightscout/androidaps/setupwizard/SWDefinition.java
index c1669b73d0..be95f3e3ac 100644
--- a/app/src/main/java/info/nightscout/androidaps/setupwizard/SWDefinition.java
+++ b/app/src/main/java/info/nightscout/androidaps/setupwizard/SWDefinition.java
@@ -1,13 +1,8 @@
package info.nightscout.androidaps.setupwizard;
import android.Manifest;
-import android.content.ActivityNotFoundException;
-import android.content.Context;
import android.content.Intent;
-import android.net.Uri;
import android.os.Build;
-import android.os.PowerManager;
-import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import com.squareup.otto.Subscribe;
@@ -18,11 +13,10 @@ import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
-import info.nightscout.androidaps.BuildConfig;
import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
-import info.nightscout.androidaps.PreferencesActivity;
import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.activities.PreferencesActivity;
import info.nightscout.androidaps.events.EventConfigBuilderChange;
import info.nightscout.androidaps.events.EventPumpStatusChanged;
import info.nightscout.androidaps.interfaces.PluginBase;
@@ -32,9 +26,11 @@ import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialo
import info.nightscout.androidaps.plugins.Careportal.OptionsToShow;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.ConstraintsObjectives.ObjectivesFragment;
import info.nightscout.androidaps.plugins.ConstraintsObjectives.ObjectivesPlugin;
import info.nightscout.androidaps.plugins.Loop.LoopPlugin;
+import info.nightscout.androidaps.plugins.Maintenance.ImportExportPrefs;
import info.nightscout.androidaps.plugins.NSClientInternal.NSClientPlugin;
import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientStatus;
import info.nightscout.androidaps.plugins.ProfileLocal.LocalProfileFragment;
@@ -45,33 +41,28 @@ import info.nightscout.androidaps.plugins.ProfileSimple.SimpleProfileFragment;
import info.nightscout.androidaps.plugins.ProfileSimple.SimpleProfilePlugin;
import info.nightscout.androidaps.setupwizard.elements.SWBreak;
import info.nightscout.androidaps.setupwizard.elements.SWButton;
+import info.nightscout.androidaps.setupwizard.elements.SWEditString;
+import info.nightscout.androidaps.setupwizard.elements.SWEditUrl;
import info.nightscout.androidaps.setupwizard.elements.SWFragment;
import info.nightscout.androidaps.setupwizard.elements.SWHtmlLink;
import info.nightscout.androidaps.setupwizard.elements.SWInfotext;
import info.nightscout.androidaps.setupwizard.elements.SWPlugin;
import info.nightscout.androidaps.setupwizard.elements.SWRadioButton;
-import info.nightscout.androidaps.setupwizard.elements.SWEditString;
-import info.nightscout.androidaps.setupwizard.elements.SWEditUrl;
import info.nightscout.androidaps.setupwizard.events.EventSWLabel;
import info.nightscout.androidaps.setupwizard.events.EventSWUpdate;
import info.nightscout.utils.AndroidPermission;
-import info.nightscout.utils.ImportExportPrefs;
import info.nightscout.utils.LocaleHelper;
import info.nightscout.utils.PasswordProtection;
import info.nightscout.utils.SP;
-import info.nightscout.utils.ToastUtils;
public class SWDefinition {
private static Logger log = LoggerFactory.getLogger(SWDefinition.class);
- private String packageName;
-
private AppCompatActivity activity;
private List screens = new ArrayList<>();
public void setActivity(AppCompatActivity activity) {
this.activity = activity;
- packageName = activity.getPackageName();
}
public AppCompatActivity getActivity() {
@@ -88,9 +79,9 @@ public class SWDefinition {
}
SWDefinition() {
- if (BuildConfig.FLAVOR.equals("full") || BuildConfig.FLAVOR.equals("pumpcontrol"))
+ if (Config.APS || Config.PUMPCONTROL)
SWDefinitionFull();
- else if (BuildConfig.FLAVOR.equals("nsclient"))
+ else if (Config.NSCLIENT)
SWDefinitionNSClient();
}
@@ -190,11 +181,13 @@ public class SWDefinition {
.visibility(() -> !NSClientPlugin.getPlugin().isEnabled(PluginType.GENERAL)))
.add(new SWEditUrl()
.preferenceId(R.string.key_nsclientinternal_url)
+ .updateDelay(5)
.label(R.string.nsclientinternal_url_title)
.comment(R.string.nsclientinternal_url_dialogmessage))
.add(new SWEditString()
.validator(text -> text.length() >= 12)
.preferenceId(R.string.key_nsclientinternal_api_secret)
+ .updateDelay(5)
.label(R.string.nsclientinternal_secret_dialogtitle)
.comment(R.string.nsclientinternal_secret_dialogmessage))
.add(new SWBreak())
@@ -312,8 +305,8 @@ public class SWDefinition {
newDialog.setOptions(profileswitch, R.string.careportal_profileswitch);
newDialog.show(getActivity().getSupportFragmentManager(), "NewNSTreatmentDialog");
}))
- .validator(() -> MainApp.getConfigBuilder().getProfile() != null)
- .visibility(() -> MainApp.getConfigBuilder().getProfile() == null)
+ .validator(() -> ProfileFunctions.getInstance().getProfile() != null)
+ .visibility(() -> ProfileFunctions.getInstance().getProfile() == null)
)
.add(new SWScreen(R.string.configbuilder_pump)
.skippable(false)
@@ -371,6 +364,14 @@ public class SWDefinition {
.validator(() -> MainApp.getConfigBuilder().getActiveAPS() != null)
.visibility(() -> Config.APS)
)
+ .add(new SWScreen(R.string.apsmode_title)
+ .skippable(false)
+ .add(new SWRadioButton()
+ .option(R.array.aps_modeArray, R.array.aps_modeValues)
+ .preferenceId(R.string.key_aps_mode).label(R.string.apsmode_title)
+ .comment(R.string.setupwizard_preferred_aps_mode))
+ .validator(() -> SP.contains(R.string.key_aps_mode))
+ )
.add(new SWScreen(R.string.configbuilder_loop)
.skippable(false)
.add(new SWInfotext()
@@ -529,10 +530,12 @@ public class SWDefinition {
.visibility(() -> !NSClientPlugin.getPlugin().isEnabled(PluginType.GENERAL)))
.add(new SWEditUrl()
.preferenceId(R.string.key_nsclientinternal_url)
+ .updateDelay(5)
.label(R.string.nsclientinternal_url_title)
.comment(R.string.nsclientinternal_url_dialogmessage))
.add(new SWEditString()
.validator(text -> text.length() >= 12)
+ .updateDelay(5)
.preferenceId(R.string.key_nsclientinternal_api_secret)
.label(R.string.nsclientinternal_secret_dialogtitle)
.comment(R.string.nsclientinternal_secret_dialogmessage))
@@ -551,6 +554,25 @@ public class SWDefinition {
.validator(() -> NSClientPlugin.getPlugin().nsClientService != null && NSClientPlugin.getPlugin().nsClientService.isConnected && NSClientPlugin.getPlugin().nsClientService.hasWriteAuth)
.visibility(() -> !(NSClientPlugin.getPlugin().nsClientService != null && NSClientPlugin.getPlugin().nsClientService.isConnected && NSClientPlugin.getPlugin().nsClientService.hasWriteAuth))
)
+ .add(new SWScreen(R.string.configbuilder_bgsource)
+ .skippable(false)
+ .add(new SWPlugin()
+ .option(PluginType.BGSOURCE, R.string.configbuilder_bgsource_description)
+ .label(R.string.configbuilder_bgsource))
+ .add(new SWBreak())
+ .add(new SWButton()
+ .text(R.string.bgsourcesetup)
+ .action(() -> {
+ final PluginBase plugin = (PluginBase) MainApp.getConfigBuilder().getActiveBgSource();
+ PasswordProtection.QueryPassword(activity, R.string.settings_password, "settings_password", () -> {
+ Intent i = new Intent(activity, PreferencesActivity.class);
+ i.putExtra("id", plugin.getPreferencesId());
+ activity.startActivity(i);
+ }, null);
+ })
+ .visibility(() -> MainApp.getConfigBuilder().getActiveBgSource()!= null && ((PluginBase) MainApp.getConfigBuilder().getActiveBgSource()).getPreferencesId() > 0))
+ .validator(() -> MainApp.getConfigBuilder().getActiveBgSource() != null)
+ )
.add(new SWScreen(R.string.patientage)
.skippable(false)
.add(new SWInfotext()
diff --git a/app/src/main/java/info/nightscout/androidaps/setupwizard/elements/SWEditString.java b/app/src/main/java/info/nightscout/androidaps/setupwizard/elements/SWEditString.java
index d02f10acf0..1f32e6622d 100644
--- a/app/src/main/java/info/nightscout/androidaps/setupwizard/elements/SWEditString.java
+++ b/app/src/main/java/info/nightscout/androidaps/setupwizard/elements/SWEditString.java
@@ -21,6 +21,7 @@ public class SWEditString extends SWItem {
private static Logger log = LoggerFactory.getLogger(SWEditString.class);
private SWTextValidator validator = null;
+ private int updateDelay = 0;
public SWEditString() {
super(Type.STRING);
@@ -58,7 +59,7 @@ public class SWEditString extends SWItem {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (validator != null && validator.isValid(s.toString()))
- save(s.toString());
+ save(s.toString(), updateDelay);
}
@Override
@@ -76,4 +77,9 @@ public class SWEditString extends SWItem {
this.validator = validator;
return this;
}
+
+ public SWEditString updateDelay(int updateDelay) {
+ this.updateDelay = updateDelay;
+ return this;
+ }
}
diff --git a/app/src/main/java/info/nightscout/androidaps/setupwizard/elements/SWEditUrl.java b/app/src/main/java/info/nightscout/androidaps/setupwizard/elements/SWEditUrl.java
index 04b02a5bc2..254723e4e1 100644
--- a/app/src/main/java/info/nightscout/androidaps/setupwizard/elements/SWEditUrl.java
+++ b/app/src/main/java/info/nightscout/androidaps/setupwizard/elements/SWEditUrl.java
@@ -22,6 +22,8 @@ import info.nightscout.utils.SP;
public class SWEditUrl extends SWItem {
private static Logger log = LoggerFactory.getLogger(SWEditUrl.class);
+ private int updateDelay = 0;
+
public SWEditUrl() {
super(Type.URL);
}
@@ -58,7 +60,7 @@ public class SWEditUrl extends SWItem {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (Patterns.WEB_URL.matcher(s).matches())
- save(s.toString());
+ save(s.toString(), updateDelay);
else
MainApp.bus().post(new EventSWLabel(MainApp.gs(R.string.error_url_not_valid)));
}
@@ -74,4 +76,9 @@ public class SWEditUrl extends SWItem {
return this;
}
+ public SWEditUrl updateDelay(int updateDelay) {
+ this.updateDelay = updateDelay;
+ return this;
+ }
+
}
diff --git a/app/src/main/java/info/nightscout/androidaps/setupwizard/elements/SWItem.java b/app/src/main/java/info/nightscout/androidaps/setupwizard/elements/SWItem.java
index 4f454b843d..d9cfe3710d 100644
--- a/app/src/main/java/info/nightscout/androidaps/setupwizard/elements/SWItem.java
+++ b/app/src/main/java/info/nightscout/androidaps/setupwizard/elements/SWItem.java
@@ -6,14 +6,23 @@ import android.widget.LinearLayout;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.events.EventPreferenceChange;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.setupwizard.events.EventSWUpdate;
import info.nightscout.utils.SP;
public class SWItem {
private static Logger log = LoggerFactory.getLogger(SWItem.class);
+ private static final ScheduledExecutorService eventWorker = Executors.newSingleThreadScheduledExecutor();
+ private static ScheduledFuture> scheduledEventPost = null;
+
public enum Type {
NONE,
TEXT,
@@ -66,10 +75,9 @@ public class SWItem {
return this;
}
- public void save(String value) {
+ public void save(String value, int updateDelay) {
SP.putString(preferenceId, value);
- MainApp.bus().post(new EventPreferenceChange(preferenceId));
- MainApp.bus().post(new EventSWUpdate());
+ scheduleChange(updateDelay);
}
public static LinearLayout generateLayout(View view) {
@@ -83,4 +91,22 @@ public class SWItem {
public void processVisibility() {
}
+
+ private void scheduleChange(int updateDelay) {
+ class PostRunnable implements Runnable {
+ public void run() {
+ if (L.isEnabled(L.CORE))
+ log.debug("Firing EventPreferenceChange");
+ MainApp.bus().post(new EventPreferenceChange(preferenceId));
+ MainApp.bus().post(new EventSWUpdate());
+ scheduledEventPost = null;
+ }
+ }
+ // cancel waiting task to prevent sending multiple posts
+ if (scheduledEventPost != null)
+ scheduledEventPost.cancel(false);
+ Runnable task = new PostRunnable();
+ final int sec = updateDelay;
+ scheduledEventPost = eventWorker.schedule(task, sec, TimeUnit.SECONDS);
+ }
}
diff --git a/app/src/main/java/info/nightscout/androidaps/setupwizard/elements/SWRadioButton.java b/app/src/main/java/info/nightscout/androidaps/setupwizard/elements/SWRadioButton.java
index 80346c433c..cf7dbd55fe 100644
--- a/app/src/main/java/info/nightscout/androidaps/setupwizard/elements/SWRadioButton.java
+++ b/app/src/main/java/info/nightscout/androidaps/setupwizard/elements/SWRadioButton.java
@@ -2,9 +2,11 @@ package info.nightscout.androidaps.setupwizard.elements;
import android.content.Context;
import android.view.View;
+import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
+import android.widget.TextView;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -40,6 +42,14 @@ public class SWRadioButton extends SWItem {
@Override
public void generateDialog(LinearLayout layout) {
Context context = layout.getContext();
+
+ TextView pdesc = new TextView(context);
+ pdesc.setText(getComment());
+ LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+ params.setMargins(0, 0, 0, 40);
+ pdesc.setLayoutParams(params);
+ layout.addView(pdesc);
+
// Get if there is already value in SP
String previousValue = SP.getString(preferenceId, "none");
radioGroup = new RadioGroup(context);
@@ -59,9 +69,10 @@ public class SWRadioButton extends SWItem {
radioGroup.setOnCheckedChangeListener((group, checkedId) -> {
int i = (int) group.findViewById(checkedId).getTag();
- save(values()[i]);
+ save(values()[i], 0);
});
layout.addView(radioGroup);
+
super.generateDialog(layout);
}
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 79037ebcd8..88f7d48d32 100644
--- a/app/src/main/java/info/nightscout/androidaps/tabs/TabPageAdapter.java
+++ b/app/src/main/java/info/nightscout/androidaps/tabs/TabPageAdapter.java
@@ -1,14 +1,10 @@
package info.nightscout.androidaps.tabs;
import android.content.Context;
-import android.content.SharedPreferences;
-import android.preference.PreferenceManager;
-import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
-import android.support.v4.app.FragmentStatePagerAdapter;
import android.view.ViewGroup;
import org.slf4j.Logger;
@@ -16,7 +12,10 @@ import org.slf4j.LoggerFactory;
import java.util.ArrayList;
+import info.nightscout.androidaps.R;
import info.nightscout.androidaps.interfaces.PluginBase;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.utils.SP;
/**
* Created by mike on 30.05.2016.
@@ -27,7 +26,7 @@ public class TabPageAdapter extends FragmentPagerAdapter {
Context context;
- private static Logger log = LoggerFactory.getLogger(TabPageAdapter.class);
+ private static Logger log = LoggerFactory.getLogger(L.CORE);
public TabPageAdapter(FragmentManager fm, Context context) {
super(fm);
@@ -47,19 +46,18 @@ public class TabPageAdapter extends FragmentPagerAdapter {
@Override
public void finishUpdate(ViewGroup container) {
- try{
+ try {
super.finishUpdate(container);
- } catch (NullPointerException nullPointerException){
+ } catch (NullPointerException nullPointerException) {
System.out.println("Catch the NullPointerException in FragmentStatePagerAdapter.finishUpdate");
- } catch (IllegalStateException e){
- log.error(e.getMessage());
+ } catch (IllegalStateException e) {
+ log.error("Unhandled exception", e);
}
}
@Override
public CharSequence getPageTitle(int position) {
- SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
- if(preferences.getBoolean("short_tabtitles", false)){
+ if (SP.getBoolean(R.string.key_short_tabtitles, false)) {
return visibleFragmentList.get(position).getNameShort();
}
return visibleFragmentList.get(position).getName();
diff --git a/app/src/main/java/info/nightscout/utils/BolusWizard.java b/app/src/main/java/info/nightscout/utils/BolusWizard.java
index 3563a8a55d..cfdd670f51 100644
--- a/app/src/main/java/info/nightscout/utils/BolusWizard.java
+++ b/app/src/main/java/info/nightscout/utils/BolusWizard.java
@@ -1,10 +1,14 @@
package info.nightscout.utils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import info.nightscout.androidaps.data.GlucoseStatus;
import info.nightscout.androidaps.data.IobTotal;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.db.TempTarget;
import info.nightscout.androidaps.interfaces.TreatmentsInterface;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
@@ -13,35 +17,38 @@ import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
*/
public class BolusWizard {
+ private Logger log = LoggerFactory.getLogger(L.CORE);
// Inputs
private Profile specificProfile = null;
private TempTarget tempTarget;
public Integer carbs = 0;
private Double bg = 0d;
+ private Double cob = 0d;
private Double correction;
+ private Double percentageCorrection;
private Boolean includeBolusIOB = true;
private Boolean includeBasalIOB = true;
public Boolean superBolus = false;
private Boolean trend = false;
// Intermediate
- public Double sens = 0d;
- public Double ic = 0d;
+ public double sens = 0d;
+ public double ic = 0d;
public GlucoseStatus glucoseStatus;
- public Double targetBGLow = 0d;
- public Double targetBGHigh = 0d;
- public Double bgDiff = 0d;
+ public double targetBGLow = 0d;
+ public double targetBGHigh = 0d;
+ public double bgDiff = 0d;
- public Double insulinFromBG = 0d;
- public Double insulinFromCarbs = 0d;
- public Double insulingFromBolusIOB = 0d;
- public Double insulingFromBasalsIOB = 0d;
- public Double insulinFromCorrection = 0d;
- public Double insulinFromSuperBolus = 0d;
- public Double insulinFromCOB = 0d;
- public Double insulinFromTrend = 0d;
+ public double insulinFromBG = 0d;
+ public double insulinFromCarbs = 0d;
+ public double insulingFromBolusIOB = 0d;
+ public double insulingFromBasalsIOB = 0d;
+ public double insulinFromCorrection = 0d;
+ public double insulinFromSuperBolus = 0d;
+ public double insulinFromCOB = 0d;
+ public double insulinFromTrend = 0d;
// Result
public Double calculatedTotalInsulin = 0d;
@@ -57,7 +64,9 @@ public class BolusWizard {
this.tempTarget = tempTarget;
this.carbs = carbs;
this.bg = bg;
+ this.cob = cob;
this.correction = correction;
+ this.percentageCorrection = percentageCorrection;
this.includeBolusIOB = includeBolusIOB;
this.includeBasalIOB = includeBasalIOB;
this.superBolus = superBolus;
@@ -109,7 +118,7 @@ public class BolusWizard {
if (superBolus) {
insulinFromSuperBolus = specificProfile.getBasal();
long timeAfter1h = System.currentTimeMillis();
- timeAfter1h += 60L * 60 * 1000;
+ timeAfter1h += T.hours(1).msecs();
insulinFromSuperBolus += specificProfile.getBasal(timeAfter1h);
}
@@ -130,6 +139,45 @@ public class BolusWizard {
double bolusStep = ConfigBuilderPlugin.getActivePump().getPumpDescription().bolusStep;
calculatedTotalInsulin = Round.roundTo(calculatedTotalInsulin, bolusStep);
+ log.debug(log());
+
return calculatedTotalInsulin;
}
+
+ public String log() {
+ StringBuilder sb = new StringBuilder();
+
+ sb.append("TempTarget=").append(tempTarget != null ? tempTarget.toString() : "null").append("; ");
+ sb.append("Carbs=").append(carbs != null ? carbs : null).append("; ");
+ sb.append("Bg=").append(bg).append("; ");
+ sb.append("Cob=").append(cob).append("; ");
+ sb.append("Correction=").append(correction).append("; ");
+ sb.append("PercentageCorrection=").append(percentageCorrection).append("; ");
+ sb.append("IncludeBolusIOB=").append(includeBolusIOB).append("; ");
+ sb.append("IncludeBasalIOB=").append(includeBasalIOB).append("; ");
+ sb.append("Superbolus=").append(superBolus).append("; ");
+ sb.append("Trend=").append(trend).append("; ");
+ sb.append("Profile=").append(specificProfile != null && specificProfile.getData() != null ? specificProfile.getData().toString() : "null").append("; ");
+ sb.append("\n");
+
+ sb.append("targetBGLow=").append(targetBGLow).append("; ");
+ sb.append("targetBGHigh=").append(targetBGHigh).append("; ");
+ sb.append("bgDiff=").append(bgDiff).append("; ");
+ sb.append("insulinFromBG=").append(insulinFromBG).append("; ");
+ sb.append("insulinFromCarbs=").append(insulinFromCarbs).append("; ");
+ sb.append("insulingFromBolusIOB=").append(insulingFromBolusIOB).append("; ");
+ sb.append("insulingFromBasalsIOB=").append(insulingFromBasalsIOB).append("; ");
+ sb.append("insulinFromCorrection=").append(insulinFromCorrection).append("; ");
+ sb.append("insulinFromSuperBolus=").append(insulinFromSuperBolus).append("; ");
+ sb.append("insulinFromCOB=").append(insulinFromCOB).append("; ");
+ sb.append("insulinFromTrend=").append(insulinFromTrend).append("; ");
+ sb.append("\n");
+
+
+ sb.append("calculatedTotalInsulin=").append(calculatedTotalInsulin).append("; ");
+ sb.append("totalBeforePercentageAdjustment=").append(totalBeforePercentageAdjustment).append("; ");
+ sb.append("carbsEquivalent=").append(carbsEquivalent).append("; ");
+
+ return sb.toString();
+ }
}
diff --git a/app/src/main/java/info/nightscout/utils/DateUtil.java b/app/src/main/java/info/nightscout/utils/DateUtil.java
index c2164fd40e..c5d5eed51c 100644
--- a/app/src/main/java/info/nightscout/utils/DateUtil.java
+++ b/app/src/main/java/info/nightscout/utils/DateUtil.java
@@ -97,27 +97,27 @@ public class DateUtil {
}
public static String dateString(Date date) {
- //return DateUtils.formatDateTime(MainApp.instance(), date.getTime(), DateUtils.FORMAT_SHOW_DATE); this provide month name not number
DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
return df.format(date);
}
public static String dateString(long mills) {
- //return DateUtils.formatDateTime(MainApp.instance(), mills, DateUtils.FORMAT_SHOW_DATE); this provide month name not number
DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
return df.format(mills);
}
public static String timeString(Date date) {
- //return DateUtils.formatDateTime(MainApp.instance(), date.getTime(), DateUtils.FORMAT_SHOW_TIME);
return new DateTime(date).toString(DateTimeFormat.shortTime());
}
public static String timeString(long mills) {
- //return DateUtils.formatDateTime(MainApp.instance(), mills, DateUtils.FORMAT_SHOW_TIME);
return new DateTime(mills).toString(DateTimeFormat.shortTime());
}
+ public static String timeFullString(long mills) {
+ return new DateTime(mills).toString(DateTimeFormat.fullTime());
+ }
+
public static String dateAndTimeString(Date date) {
return dateString(date) + " " + timeString(date);
}
@@ -130,6 +130,10 @@ public class DateUtil {
return dateString(mills) + " " + timeString(mills);
}
+ public static String dateAndTimeFullString(long mills) {
+ return dateString(mills) + " " + timeFullString(mills);
+ }
+
public static String minAgo(long time) {
int mins = (int) ((now() - time) / 1000 / 60);
return MainApp.gs(R.string.minago, mins);
diff --git a/app/src/main/java/info/nightscout/utils/DecimalFormatter.java b/app/src/main/java/info/nightscout/utils/DecimalFormatter.java
index 0f7164b690..84a40de84b 100644
--- a/app/src/main/java/info/nightscout/utils/DecimalFormatter.java
+++ b/app/src/main/java/info/nightscout/utils/DecimalFormatter.java
@@ -46,13 +46,13 @@ public class DecimalFormatter {
}
public static String toPumpSupportedBolus(double value) {
- return ConfigBuilderPlugin.getActivePump().getPumpDescription().bolusStep <= 0.05
+ return ConfigBuilderPlugin.getActivePump().getPumpDescription().bolusStep <= 0.051
? to2Decimal(value)
: to1Decimal(value);
}
public static DecimalFormat pumpSupportedBolusFormat() {
- return ConfigBuilderPlugin.getActivePump().getPumpDescription().bolusStep <= 0.05
+ return ConfigBuilderPlugin.getActivePump().getPumpDescription().bolusStep <= 0.051
? new DecimalFormat("0.00")
: new DecimalFormat("0.0");
}
diff --git a/app/src/main/java/info/nightscout/utils/FabricPrivacy.java b/app/src/main/java/info/nightscout/utils/FabricPrivacy.java
index ad498fa4f7..7f050e609a 100644
--- a/app/src/main/java/info/nightscout/utils/FabricPrivacy.java
+++ b/app/src/main/java/info/nightscout/utils/FabricPrivacy.java
@@ -3,6 +3,7 @@ package info.nightscout.utils;
import com.crashlytics.android.Crashlytics;
import com.crashlytics.android.answers.Answers;
import com.crashlytics.android.answers.CustomEvent;
+
import info.nightscout.androidaps.BuildConfig;
import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
@@ -13,11 +14,10 @@ import java.util.Date;
/**
* Created by jamorham on 21/02/2018.
- *
+ *
* Some users do not wish to be tracked, Fabric Answers and Crashlytics do not provide an easy way
* to disable them and make calls from a potentially invalid singleton reference. This wrapper
* emulates the methods but ignores the request if the instance is null or invalid.
- *
*/
public class FabricPrivacy {
@@ -109,9 +109,13 @@ public class FabricPrivacy {
private static void uploadPluginStats() {
CustomEvent pluginStats = new CustomEvent("PluginStats");
pluginStats.putCustomAttribute("version", BuildConfig.VERSION);
+ pluginStats.putCustomAttribute("HEAD", BuildConfig.HEAD);
for (PluginBase plugin : MainApp.getPluginsList()) {
- if (plugin.isEnabled(plugin.getType()) && !plugin.pluginDescription.alwaysEnabled) {
- pluginStats.putCustomAttribute(plugin.getClass().getSimpleName(), "enabled");
+ if (!plugin.pluginDescription.alwaysEnabled) {
+ if (plugin.isEnabled(plugin.getType()))
+ pluginStats.putCustomAttribute(plugin.getClass().getSimpleName(), "enabled");
+ else
+ pluginStats.putCustomAttribute(plugin.getClass().getSimpleName(), "disabled");
}
}
@@ -122,8 +126,6 @@ public class FabricPrivacy {
CustomEvent type = new CustomEvent("AppUsageType");
if (Config.NSCLIENT)
type.putCustomAttribute("type", "NSClient");
- else if (Config.G5UPLOADER)
- type.putCustomAttribute("type", "G5Uploader");
else if (Config.PUMPCONTROL)
type.putCustomAttribute("type", "PumpControl");
else if (MainApp.getConstraintChecker().isClosedLoopAllowed().value())
diff --git a/app/src/main/java/info/nightscout/utils/HardLimits.java b/app/src/main/java/info/nightscout/utils/HardLimits.java
index 8e1a05db0d..1a36561b62 100644
--- a/app/src/main/java/info/nightscout/utils/HardLimits.java
+++ b/app/src/main/java/info/nightscout/utils/HardLimits.java
@@ -5,6 +5,7 @@ import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
/**
* Created by mike on 22.02.2017.
diff --git a/app/src/main/java/info/nightscout/utils/ImportExportPrefs.java b/app/src/main/java/info/nightscout/utils/ImportExportPrefs.java
deleted file mode 100644
index 22175e0281..0000000000
--- a/app/src/main/java/info/nightscout/utils/ImportExportPrefs.java
+++ /dev/null
@@ -1,140 +0,0 @@
-package info.nightscout.utils;
-
-import android.Manifest;
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.content.DialogInterface;
-import android.content.SharedPreferences;
-import android.content.pm.PackageManager;
-import android.os.Environment;
-import android.preference.PreferenceManager;
-import android.support.v4.app.ActivityCompat;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.Map;
-
-import info.nightscout.androidaps.MainApp;
-import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.events.EventAppExit;
-
-/**
- * Created by mike on 03.07.2016.
- */
-
-public class ImportExportPrefs {
- private static Logger log = LoggerFactory.getLogger(ImportExportPrefs.class);
- static File path = new File(Environment.getExternalStorageDirectory().toString());
- static public final File file = new File(path, MainApp.gs(R.string.app_name) + "Preferences");
-
- private static final int REQUEST_EXTERNAL_STORAGE = 1;
- private static String[] PERMISSIONS_STORAGE = {
- Manifest.permission.READ_EXTERNAL_STORAGE,
- Manifest.permission.WRITE_EXTERNAL_STORAGE
- };
-
- public static void verifyStoragePermissions(Activity activity) {
- // Check if we have write permission
- int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
-
-
- if (permission != PackageManager.PERMISSION_GRANTED) {
- // We don't have permission so prompt the user
- ActivityCompat.requestPermissions(
- activity,
- PERMISSIONS_STORAGE,
- REQUEST_EXTERNAL_STORAGE
- );
- }
- }
-
- public static void exportSharedPreferences(final Activity c) {
-
- new AlertDialog.Builder(c)
- .setMessage(MainApp.gs(R.string.export_to) + " " + file + " ?")
- .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
-
- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(c);
- try {
- FileWriter fw = new FileWriter(file);
- PrintWriter pw = new PrintWriter(fw);
- Map prefsMap = prefs.getAll();
- for (Map.Entry entry : prefsMap.entrySet()) {
- pw.println(entry.getKey() + "::" + entry.getValue().toString());
- }
- pw.close();
- fw.close();
- ToastUtils.showToastInUiThread(c, MainApp.gs(R.string.exported));
- } catch (FileNotFoundException e) {
- ToastUtils.showToastInUiThread(c, MainApp.gs(R.string.filenotfound) + " " + file);
- log.error("Unhandled exception", e);
- } catch (IOException e) {
- log.error("Unhandled exception", e);
- }
- }
- })
- .setNegativeButton(android.R.string.cancel, null)
- .show();
- }
-
- public static void importSharedPreferences(final Activity c) {
- new AlertDialog.Builder(c)
- .setMessage(MainApp.gs(R.string.import_from) + " " + file + " ?")
- .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
-
- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(c);
- SharedPreferences.Editor editor = prefs.edit();
- String line;
- String[] lineParts;
- try {
- editor.clear();
- editor.commit();
-
- BufferedReader reader = new BufferedReader(new FileReader(file));
- while ((line = reader.readLine()) != null) {
- lineParts = line.split("::");
- if (lineParts.length == 2) {
- if (lineParts[1].equals("true") || lineParts[1].equals("false")) {
- editor.putBoolean(lineParts[0], Boolean.parseBoolean(lineParts[1]));
- } else {
- editor.putString(lineParts[0], lineParts[1]);
- }
- }
- }
- reader.close();
- editor.commit();
- OKDialog.show(c, MainApp.gs(R.string.setting_imported), MainApp.gs(R.string.restartingapp), new Runnable() {
- @Override
- public void run() {
- log.debug("Exiting");
- MainApp.instance().stopKeepAliveService();
- MainApp.bus().post(new EventAppExit());
- MainApp.closeDbHelper();
- c.finish();
- System.runFinalization();
- System.exit(0);
- }
- });
- } catch (FileNotFoundException e) {
- ToastUtils.showToastInUiThread(c, MainApp.gs(R.string.filenotfound) + " " + file);
- log.error("Unhandled exception", e);
- } catch (IOException e) {
- log.error("Unhandled exception", e);
- }
- }
- })
- .setNegativeButton(android.R.string.cancel, null)
- .show();
- }
-
-}
diff --git a/app/src/main/java/info/nightscout/utils/LocalAlertUtils.java b/app/src/main/java/info/nightscout/utils/LocalAlertUtils.java
index 5556cae935..2e180365aa 100644
--- a/app/src/main/java/info/nightscout/utils/LocalAlertUtils.java
+++ b/app/src/main/java/info/nightscout/utils/LocalAlertUtils.java
@@ -3,8 +3,6 @@ package info.nightscout.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.Date;
-
import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
@@ -13,7 +11,9 @@ import info.nightscout.androidaps.db.BgReading;
import info.nightscout.androidaps.db.DatabaseHelper;
import info.nightscout.androidaps.interfaces.PumpInterface;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.Loop.LoopPlugin;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
@@ -33,8 +33,8 @@ public class LocalAlertUtils {
return T.mins(SP.getInt(MainApp.gs(R.string.key_pump_unreachable_threshold), 30)).msecs();
}
- public static void checkPumpUnreachableAlarm(Date lastConnection, boolean isStatusOutdated) {
- boolean alarmTimeoutExpired = lastConnection.getTime() + pumpUnreachableThreshold() < System.currentTimeMillis();
+ public static void checkPumpUnreachableAlarm(long lastConnection, boolean isStatusOutdated) {
+ boolean alarmTimeoutExpired = lastConnection + pumpUnreachableThreshold() < System.currentTimeMillis();
boolean nextAlarmOccurrenceReached = SP.getLong("nextPumpDisconnectedAlarm", 0L) < System.currentTimeMillis();
if (Config.APS && SP.getBoolean(MainApp.gs(R.string.key_enable_pump_unreachable_alert), true)
@@ -79,10 +79,10 @@ public class LocalAlertUtils {
//TODO: persist the actual time the pump is read and simplify the whole logic when to alarm
final PumpInterface pump = ConfigBuilderPlugin.getActivePump();
- final Profile profile = MainApp.getConfigBuilder().getProfile();
+ final Profile profile = ProfileFunctions.getInstance().getProfile();
if (pump != null && profile != null) {
- Date lastConnection = pump.lastDataTime();
- long earliestAlarmTime = lastConnection.getTime() + pumpUnreachableThreshold();
+ long lastConnection = pump.lastDataTime();
+ long earliestAlarmTime = lastConnection + pumpUnreachableThreshold();
if (SP.getLong("nextPumpDisconnectedAlarm", 0l) < earliestAlarmTime) {
SP.putLong("nextPumpDisconnectedAlarm", earliestAlarmTime);
}
diff --git a/app/src/main/java/info/nightscout/utils/LogDialog.java b/app/src/main/java/info/nightscout/utils/LogDialog.java
deleted file mode 100644
index 7e2468774e..0000000000
--- a/app/src/main/java/info/nightscout/utils/LogDialog.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package info.nightscout.utils;
-
-import android.app.AlertDialog;
-import android.content.ClipData;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.ClipboardManager;
-import android.widget.TextView;
-
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-
-import info.nightscout.androidaps.MainApp;
-import info.nightscout.androidaps.R;
-
-/**
- * Created by mike on 09.02.2017.
- */
-
-public class LogDialog {
-
- public static void showLogcat(Context context) {
- String logCat = "no logs";
- final String processId = Integer.toString(android.os.Process.myPid());
- try {
- Process process = Runtime.getRuntime().exec("logcat -d " + MainApp.gs(R.string.app_name) + ":D");
- BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
- StringBuilder log = new StringBuilder();
- String line;
-
- while ((line = bufferedReader.readLine()) != null) {
- if (line.contains(processId)) log.append(line + "\n");
- }
- logCat = log.toString();
-
- } catch (IOException e) {
- logCat = e.getLocalizedMessage();
- } finally {
- showAlertText(logCat, context);
- }
- }
-
- public static void showAlertText(final String msg, final Context context) {
- try {
- AlertDialog alertDialog = new AlertDialog.Builder(context)
- .setMessage(msg)
- .setPositiveButton(MainApp.gs(R.string.copy_to_clipboard), new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
- clipboard.setPrimaryClip(ClipData.newPlainText(null, msg));
- ToastUtils.showToastInUiThread(context, MainApp.gs(R.string.copied_to_clipboard));
- }
- })
- .setNegativeButton(android.R.string.cancel, null)
- .show();
-
- if (msg.length() > 100) {
- TextView textView = (TextView) alertDialog.findViewById(android.R.id.message);
- textView.setTextSize(10);
- }
- } catch (Exception e) {
- // crashing on screen rotation
- }
- }
-}
diff --git a/app/src/main/java/info/nightscout/utils/OKDialog.java b/app/src/main/java/info/nightscout/utils/OKDialog.java
index 5185049678..0e9d95a22c 100644
--- a/app/src/main/java/info/nightscout/utils/OKDialog.java
+++ b/app/src/main/java/info/nightscout/utils/OKDialog.java
@@ -1,7 +1,9 @@
package info.nightscout.utils;
import android.app.Activity;
+import android.content.Context;
import android.content.DialogInterface;
+import android.os.Handler;
import android.os.SystemClock;
import android.support.v7.app.AlertDialog;
import android.support.v7.view.ContextThemeWrapper;
@@ -20,9 +22,9 @@ import info.nightscout.androidaps.R;
public class OKDialog {
private static Logger log = LoggerFactory.getLogger(OKDialog.class);
- public static void show(final Activity activity, String title, String message, final Runnable runnable) {
+ public static void show(final Context context, String title, String message, final Runnable runnable) {
try {
- AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(activity, R.style.AppTheme));
+ AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(context, R.style.AppTheme));
builder.setTitle(title);
builder.setMessage(message);
builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() {
@@ -30,7 +32,7 @@ public class OKDialog {
dialog.dismiss();
if (runnable != null) {
SystemClock.sleep(100);
- activity.runOnUiThread(runnable);
+ runOnUiThread(runnable);
}
}
});
@@ -41,6 +43,11 @@ public class OKDialog {
}
}
+ public static boolean runOnUiThread(Runnable theRunnable) {
+ final Handler mainHandler = new Handler(MainApp.instance().getApplicationContext().getMainLooper());
+ return mainHandler.post(theRunnable);
+ }
+
public static void show(final Activity activity, String title, Spanned message, final Runnable runnable) {
try {
AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(activity, R.style.AppTheme));
diff --git a/app/src/main/java/info/nightscout/utils/Profiler.java b/app/src/main/java/info/nightscout/utils/Profiler.java
index 0410ad6ff8..140adc6366 100644
--- a/app/src/main/java/info/nightscout/utils/Profiler.java
+++ b/app/src/main/java/info/nightscout/utils/Profiler.java
@@ -2,8 +2,6 @@ package info.nightscout.utils;
import org.slf4j.Logger;
-import java.util.Date;
-
/**
* Created by mike on 29.01.2017.
*/
@@ -11,8 +9,8 @@ import java.util.Date;
public class Profiler {
public Profiler(){}
- static public void log(Logger log, String function, Date start) {
- long msec = System.currentTimeMillis() - start.getTime();
+ static public void log(Logger log, String function, long start) {
+ long msec = System.currentTimeMillis() - start;
log.debug(">>> " + function + " <<< executed in " + msec + " miliseconds");
}
}
diff --git a/app/src/main/java/info/nightscout/utils/VersionChecker.java b/app/src/main/java/info/nightscout/utils/VersionChecker.java
new file mode 100644
index 0000000000..00bfc50395
--- /dev/null
+++ b/app/src/main/java/info/nightscout/utils/VersionChecker.java
@@ -0,0 +1,101 @@
+package info.nightscout.utils;
+
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import info.nightscout.androidaps.BuildConfig;
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
+import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
+
+import static android.content.Context.CONNECTIVITY_SERVICE;
+
+public class VersionChecker {
+ private static Logger log = LoggerFactory.getLogger(L.CORE);
+
+ public static void check() {
+ if (isConnected())
+ new Thread(() -> {
+ HttpClient client = new DefaultHttpClient();
+ HttpGet request = new HttpGet("https://raw.githubusercontent.com/MilosKozak/AndroidAPS/master/app/build.gradle");
+ HttpResponse response;
+
+ try {
+ response = client.execute(request);
+ InputStream inputStream = response.getEntity().getContent();
+
+ if (inputStream != null) {
+ String result = findLine(inputStream);
+ if (result != null) {
+ result = result.replace("version", "").replace("\"", "").replace("\\s+", "").trim();
+ int compare = result.compareTo(BuildConfig.VERSION_NAME.replace("\"", ""));
+ if (compare == 0) {
+ log.debug("Version equal to master");
+ return;
+ } else if (compare > 0) {
+ log.debug("Version outdated. Found " + result);
+ Notification notification = new Notification(Notification.NEWVERSIONDETECTED, String.format(MainApp.gs(R.string.versionavailable), result), Notification.LOW);
+ MainApp.bus().post(new EventNewNotification(notification));
+ return;
+ } else {
+ log.debug("Version newer than master. Are you developer?");
+ return;
+ }
+ }
+ }
+
+ log.debug("Github master version not found");
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ log.debug("Github master version check error");
+ }
+ }).start();
+ else
+ log.debug("Github master version no checked. No connectivity");
+ }
+
+ // convert inputstream to String
+ private static String findLine(InputStream inputStream) throws IOException {
+ BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
+ String line;
+ String regex = "(.*)version(.*)\"(\\d+)\\.(\\d+)\"(.*)";
+ Pattern p = Pattern.compile(regex);
+
+ while ((line = bufferedReader.readLine()) != null) {
+ Matcher m = p.matcher(line);
+ if (m.matches()) {
+ log.debug("+++ " + line);
+ return line;
+ } else {
+ log.debug("--- " + line);
+ }
+ }
+ inputStream.close();
+ return null;
+ }
+
+ // check network connection
+ public static boolean isConnected() {
+ ConnectivityManager connMgr = (ConnectivityManager) MainApp.instance().getApplicationContext().getSystemService(CONNECTIVITY_SERVICE);
+ NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
+ return networkInfo != null && networkInfo.isConnected();
+ }
+
+}
diff --git a/app/src/main/java/info/nightscout/utils/XdripCalibrations.java b/app/src/main/java/info/nightscout/utils/XdripCalibrations.java
index 66ec6bd3df..18c066b1da 100644
--- a/app/src/main/java/info/nightscout/utils/XdripCalibrations.java
+++ b/app/src/main/java/info/nightscout/utils/XdripCalibrations.java
@@ -10,14 +10,13 @@ import android.support.v7.app.AlertDialog;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.Date;
import java.util.List;
import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.Services.Intents;
-import info.nightscout.androidaps.data.Profile;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
+import info.nightscout.androidaps.services.Intents;
/**
* Created by mike on 10.02.2017.
@@ -47,7 +46,7 @@ public class XdripCalibrations {
Context context = MainApp.instance().getApplicationContext();
Bundle bundle = new Bundle();
bundle.putDouble("glucose_number", bg);
- bundle.putString("units", MainApp.getConfigBuilder().getProfileUnits().equals(Constants.MGDL) ? "mgdl" : "mmol");
+ bundle.putString("units", ProfileFunctions.getInstance().getProfileUnits().equals(Constants.MGDL) ? "mgdl" : "mmol");
bundle.putLong("timestamp", System.currentTimeMillis());
Intent intent = new Intent(Intents.ACTION_REMOTE_CALIBRATION);
intent.putExtras(bundle);
diff --git a/app/src/main/res/drawable/ic_notification.png b/app/src/main/res/drawable/ic_notification.png
new file mode 100644
index 0000000000..453ed7b382
Binary files /dev/null and b/app/src/main/res/drawable/ic_notification.png differ
diff --git a/app/src/main/res/layout/activity_agreement.xml b/app/src/main/res/layout/activity_agreement.xml
index e5f5c8ddf1..9a17432930 100644
--- a/app/src/main/res/layout/activity_agreement.xml
+++ b/app/src/main/res/layout/activity_agreement.xml
@@ -4,7 +4,7 @@ android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizo
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
-tools:context="info.nightscout.androidaps.AgreementActivity">
+tools:context="info.nightscout.androidaps.activities.AgreementActivity">
+ tools:context="info.nightscout.androidaps.activities.HistoryBrowseActivity">
-
-
diff --git a/app/src/main/res/layout/activity_logsetting.xml b/app/src/main/res/layout/activity_logsetting.xml
new file mode 100644
index 0000000000..2ba89d267a
--- /dev/null
+++ b/app/src/main/res/layout/activity_logsetting.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/logsettings_item.xml b/app/src/main/res/layout/logsettings_item.xml
new file mode 100644
index 0000000000..d4caf63658
--- /dev/null
+++ b/app/src/main/res/layout/logsettings_item.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/maintenance_fragment.xml b/app/src/main/res/layout/maintenance_fragment.xml
new file mode 100644
index 0000000000..d5d8d5ff8e
--- /dev/null
+++ b/app/src/main/res/layout/maintenance_fragment.xml
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/overview_fragment.xml b/app/src/main/res/layout/overview_fragment.xml
index 8e37ae7675..b27f97b6cd 100644
--- a/app/src/main/res/layout/overview_fragment.xml
+++ b/app/src/main/res/layout/overview_fragment.xml
@@ -192,53 +192,99 @@
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="@color/mdtp_white" />
-
+ app:alignContent="center"
+ app:alignItems="center"
+ app:flexDirection="row"
+ app:flexWrap="wrap"
+ app:justifyContent="space_around">
-
-
-
+ android:id="@+id/iob_group"
+ android:orientation="horizontal">
-
+
-
+
-
+
+
+ android:id="@+id/cob_group"
+ android:orientation="horizontal">
+
-
+
+
+
+
+
+ android:gravity="center_horizontal"
+ android:id="@+id/as_group"
+ android:orientation="horizontal">
-
+
+
+
+
+
+
+
+
+
@@ -350,19 +350,6 @@
android:layout_height="wrap_content"
android:orientation="horizontal">
-
-
-
-
-
-
-
-
-
-
-
-
@@ -400,25 +400,6 @@
android:layout_height="wrap_content"
android:orientation="horizontal">
-
-
-
-
@@ -448,25 +429,6 @@
android:layout_height="wrap_content"
android:orientation="horizontal">
-
-
-
-
@@ -495,25 +457,6 @@
android:layout_height="wrap_content"
android:orientation="horizontal">
-
-
-
-
diff --git a/app/src/main/res/layout/overview_fragment_smallheight.xml b/app/src/main/res/layout/overview_fragment_smallheight.xml
index ca425337f6..b3721c4457 100644
--- a/app/src/main/res/layout/overview_fragment_smallheight.xml
+++ b/app/src/main/res/layout/overview_fragment_smallheight.xml
@@ -192,54 +192,99 @@
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="@color/mdtp_white" />
-
+ app:alignContent="center"
+ app:alignItems="center"
+ app:flexDirection="row"
+ app:flexWrap="wrap"
+ app:justifyContent="space_around">
-
-
-
+ android:id="@+id/iob_group"
+ android:orientation="horizontal">
-
+
-
+
-
+
+
+ android:id="@+id/cob_group"
+ android:orientation="horizontal">
+
-
+
+
+
+
+
+ android:gravity="center_horizontal"
+ android:id="@+id/as_group"
+ android:orientation="horizontal">
-
+
+
+
+
+
+
+
+
+
+ android:text="@string/time_offset" />
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ android:layout_weight="1"
+ android:text="@string/nav_refreshtreatments" />
diff --git a/app/src/main/res/layout/treatments_bolus_item.xml b/app/src/main/res/layout/treatments_bolus_item.xml
index e8a06151e8..29cbb6fe1d 100644
--- a/app/src/main/res/layout/treatments_bolus_item.xml
+++ b/app/src/main/res/layout/treatments_bolus_item.xml
@@ -137,15 +137,6 @@
android:layout_marginRight="30dp"
android:textStyle="bold" />
-
-
+
+
diff --git a/app/src/main/res/layout/treatments_careportal_fragment.xml b/app/src/main/res/layout/treatments_careportal_fragment.xml
index 367521d40c..288c790230 100644
--- a/app/src/main/res/layout/treatments_careportal_fragment.xml
+++ b/app/src/main/res/layout/treatments_careportal_fragment.xml
@@ -11,14 +11,14 @@
@@ -27,7 +27,7 @@
android:id="@+id/careportal_removeandroidapsstartedevents"
style="?android:attr/buttonStyle"
android:layout_width="wrap_content"
- android:layout_height="wrap_content"
+ android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:text="@string/careportal_removestartedevents" />
diff --git a/app/src/main/res/layout/treatments_wizardinfo_dialog.xml b/app/src/main/res/layout/treatments_wizardinfo_dialog.xml
new file mode 100644
index 0000000000..9f605ada12
--- /dev/null
+++ b/app/src/main/res/layout/treatments_wizardinfo_dialog.xml
@@ -0,0 +1,453 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml
index 09bd20a631..fb43d20d44 100644
--- a/app/src/main/res/menu/menu_main.xml
+++ b/app/src/main/res/menu/menu_main.xml
@@ -18,22 +18,6 @@
android:id="@+id/nav_setupwizard"
app:showAsAction="never"
android:title="@string/nav_setupwizard" />
-
-
-
-
+
+
diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml
index 97540d4d3c..6a681be743 100644
--- a/app/src/main/res/values-bg/strings.xml
+++ b/app/src/main/res/values-bg/strings.xml
@@ -1,871 +1,1066 @@
+
-Настройки на сигурността
- Максимален инсулин при болус [единици]
- Максимални въглехидрати [гр]
- Опции
- Обнови леченията от NS
- Нулирай базата данни
- Сигурни ли сте че искате да изтриете всички данни?
- Изход
- Използвай удължен болус за над 200%
- DanaR Bluetooth устройство
- Използване на абсолютни стойности за базал
- Рестартирайте телефона или AndroidAPS от системните настройки или Android APS няма да записва проблемите (което е важно за работата на алгоритъма)!
- Стартирай
- Провери
- Единици
- DIA (Време на действие на инсулина):
- IC (Инсулин/въглехидр.):
- ISF (Инс.чувствителност):
- Базал
- Целeва КЗ:
- НЕ Е ЗАДАДЕН ПРОФИЛ
- Инсулин:
- Вълехидрати:
- IOB:
- IOB:
- Активен:
- Общо IOB:
- Общо активен IOB:
- Време:
- Съотношение:
- Инс:
- IOB:
- Общо IOB:
- Въглехидрати (гр.):
- Инсулин (ед.):
- КЗ
- ВХ
- Корекция
- Ед.
- IOB от болуси
- Старт сега
- Базова базална стойност
- Батерия
- Удължен болус
- Резервоар
- OK
- Временен базал
- ВИРТУАЛНА ПОМПА
- Последно изпълнение
- Параметри на входа
- КЗ стастус
- Настоящ базал
- IOB данни
- Профил
- Данни за хранене
- Резултат
- Няма данни за КЗ
- Не се изисква промяна
- Искане
- Стойност
- Срок
- Основание
- Кръвна захар
- Изменение (Δ)
- Delta:
- Конфигурация
- Цели
- OpenAPS MA
- Общ
- NS Профил
- Обикновен профил
- TempBasal
- Лечения
- Виртуална помпа
- Careportal
- Помпа
- Treatments
- Профил
- Алгоритъм за APS
- Общи
- дни
- Ограничения
- Loop
- Loop
- APS
- След ограничения
- Последно зададено
- OK
- Откажи
- НЕ Е ИЗБРАН APS ИЛИ НЯМА РЕЗУЛТАТ ОТ НЕГО
- Сигурност
- Модула е изключен
- Нарушено ограничение
- Грешка при подаване на болус
- Грешка при подаване на временен базал
- Стойност на базал [%]
- % (100% = текущ)
- Приложи нов временен базал:
- Болус
- Калкулатор
- Приложено ограничение!
- Потвърждение
- Въведете ново лечение:
- Болус
- Bolus:
- Базал
- Basal:
- Въглехидрати
- Променете данните!
- Задай нов удължен болус:
- Източник на данни за КЗ
- xDrip
- APS режим
- Closed Loop
- Open Loop
- Loop изключен
- Изключи Loop
- Включи
- Има ново предложение
- Несъвместима версия на NSClient
- Несъвместима версия на Nightscout
- NSClient не е открит. Записът е загубен!
- КЗ да се вижда в NS
- Статуса на помпата да е достъпен в NS
- Ръчно приложени
- LOOP Е СПРЯН ОТ ОГРАНИЧЕНИЯТА
- Czech
- English
- Базален IOB
- Приложено ограничение на болус
- Приложено ограничение на въглехидрати
- Проверка на КЗ
- Известие
- Бележка
- Въпрос
- Физ. активност
- Смяна на сет
- Смяна на сензор
- Старт на сензор
- Смяна на резервоар
- Смяна на профил
- Болус за закуска
- Болус за основно хранене
- Болус корекция
- Комбиниран болус
- Старт на временен базал
- Край на временен базал
- Корекция с въглехидрати
- OpenAPS спрян
- Тип събитие
- Друго
- Глюкомер
- Сензор
- Въглехидрати
- Инсулин
- ВХ след
- Разделяне
- Продължителност
- Процент
- Абсолютна
- Бележки
- Време на събитие
- Профил
- Въведено от
- Тип КЗ
- Още не е зареден профила от NS
- Временен базал
- Удължен болус
- Nightscout версия:
- Липсва
- Настройките са експортирани
- Експортирай настройките в
- Импорт на настройки от
- Настройките са импортирани
- Файлът не е намерен
- Експорт настройки
- Импорт настройки
- German
- Spanish
- Greek
- Italian
- Russian
- Максимално позволен временен базал Е/ч
- Макс. лимит на временен базал [Е/ч]
- Максимален IOB
- Този параметър се нарича максимален IOB в OpenAPS и подразбиране е 0. След няколко дни или седмици можете да го увеличите.
- Bulgarian
- Разбрах
- Език
- DanaR
- Свързване
- Свързана
- Не е сврзана
- DanaR настройки
- End User License Agreement
- MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
- Разбирам и приемам
- Съхрани
- Не е открит Bluetooth адаптер
- Избраното устройство не е открито
- Грешка при свързване с помпата
- IOB на помпата
- Инсулин за деня
- Последен болус:
- Грешни входящи данни
- Неправилна стойност
- Презареди профил
- Виж профил
- Приложено
- Коментар
- Успешен
- Процент
- Абсолютна
- Откажи временен базал
- SMS комуникатор
- Изчаква резултат от помпата
- Разрешени телефонни номера
- +XXXXXXXXXX;+YYYYYYYYYY
- За да доставите болус от %1$.2fЕ отговорете с код %2$s
- За да изпратите калибрация %1$.2f отговорете с код %2$s
- Болус отказан
- Болус %.2fЕд беше подаден успешно
- Подава болус %.2fЕ
- Болус от %.2fЕ подаден успешно
- Подава %.2fЕ
- Позволи отдалечени команди чрез SMS
- Отдалечено подаване на болус - забранено!
- Пръст
- Сензор
- Ръчно
- Временна цел
- Откажи временна цел
- DanaR профил
- DIA (Време на действие на инсулина) ч.:
- Време на действие на инсулина
- Неуспешно обноввяване на базалния профил
- История
- Презареди
- Качване
- E болус
- DS болус
- DE болус
- грешка
- презареждане
- базал по часове
- КЗ
- въглехидрати
- аларма
- Общо %d записа качени
- S болус
- Аларми
- Базален по часове
- Болуси
- Въглехидрати
- Инсулин за деня
- Грешки
- КЗ
- Презареждане
- Спиране
- Свързва се с помпата за %d сек.
- Парола за помпата
- Грешна парола за помпата!
- Помпата е заета
- Доставен
- Спрян
- Запушване
- Спри
- Натиснат е СТОП!
- Очаква помпата
- Ще достави %.2fЕ
- Настройка на визуализацията и наблюдението, а също и анализиране на базалните нужди и коефициенти
- Работете в Open Loop няколко дни и ръчно прилагайте на много временни базали. Set up and use temporary and default temporary targets (e.g. for activity or hypo treatment carbs)
- Стартиране на Open Loop
- Определяне на макс. лимит на базалния инсулин и настройване в помпата и програмата
- Разбиране на вашият Open Loop, включително препоръчваните временни базали
- Стартиране на Closed Loop с изключване на базал при ниска КЗ
- Стартиране на Closed Loop с макс. IOB=0 без твърде много събития тип ниска КЗ
- Настройване на Closed Loop чрез повишаване на максималният IOB над 0 и понижаване на целевите нива на КЗ
- Прекарайте няколко дни по този начин, като поне една нощ нямате аларма за ниска КЗ.
- Настройване на базалния инсулин и коефициенти ако е необходимо и активиране на auto-sens
- Една седмица успешно дневно използване с редовно въвеждане на въглехидрати
- Активиране на допълнителни функции за дневно използване, включително и advanced meal assist
- Достигнахте лимита
- Няма избран профил
- Loop has been disabled
- Loop has been enabled
- Loop is disabled
- Loop is enabled
- %1$.2f ограничен до %2$.2f
- Стойността %s е извън границите
- Remote basal setting is not allowed
- Remote command is not allowed
- To start basal %1$.2fU/h reply with code %2$s
- To suspend loop for %1$d minutes reply with code %2$s
- Temp basal %1$.2fU/h for %2$d min started successfully
- Temp basal start failed
- To stop temp basal reply with code %s
- Temp basal canceled
- Canceling temp basal failed
- Uknonwn command or wrong reply
- Бърз болус
- Настройки за бърз болус
- Текст на бутона:
- Въглехидрати:
- Валиден от:
- Добави
- Редакция
- Изтрий
- Хранене
- Корекция
- Korean
- Действия
- Стартиран AndroidAPS
- NS upload only (изключва синхронизацията)
- Само качване на данните в NS. Няма ефект върху данните за КЗ ако локален източник като xDrip е избран. Няма ефект върху профила освен ако не е избран NS-профил.
- Помпата не е инициализирана!
- Помпата не е инициализирана, профила не е зададен!
- Prime/Fill
- Моля, уверете се, че стойността съответсва на вашият сет! Този инсулин не се включва в IOB!
- Други
- Fill/Prime количества инсулин по подразбиране.
- Бутон 1
- Бутон 2
- Бутон 3
- Единици:
- мг/дл
- ммол/л
- DIA:
- Целева КЗ:
- Диапазон за визуализация
- Стойност на линиите за ниска и висока КЗ (mmol/l) за телефона и часовника
- Ниска КЗ под
- Висока КЗ над
- Часовник
- Изпрати отново всички дани
- Отвори настройките на часовника
- Грешка в промпата
- Изтощена батерия
- Помпата е изключена
- Батерията на помпата е изтощена
- DanaR Korean
- Базал:
- Неуспешно задаване на базален профил
- Профила на помпата е обновен
- Забрани EasyUI режим в помпата
- Разреши удължен болус в помпата
- Промени режима от U/d на U/h в помпата
- Базалните стойности са под минимума. Не е зададен профил!
- BG:
- Last BG:
- Писалки
- MM640g
- Текущи известия
- СТАРИ ДАННИ
- преди %d мин
- %dmin ago
- Локален профил
- OpenAPS AMA
- Краткоср. Δ:
- Дългоср. Δ:
- Масив от %d елемента.Актуална стойност:
- Autosens данни
- Script debug
- Разреши AMA autosens
- Обнови от NS
- Преди хранене
- Физ.активност
- Премахни запис:
- DanaR статистика
- Комулативна TDD
- Експоненциално претеглена TDD
- Базал
- Болус
- TDD
- Дата
- Коефициент
- # дни
- Тегло
- Възможна неточност, ако сте използвали болус за презареждане!
- Стари данни - натиснете "ПРЕЗАРЕДИ"
- Общо базален инсулин
- ОБИ * 2
- Инициализация ...
- ДЕЙСТВ
- КОНФ
- LOOP
- ОПр
- OAPS
- ЛПр
- DANA
- ОСН
- ВП
- NSП
- Леч
- КП
- Цел
- WEAR
- SMS
- Използвай къси имена
- Използвай краткоср. Δ вместо разлика от последната КЗ
- Полезно при данни за КЗ с много шум
- Разширени настройки
- Модел: %1$02X Протокол: %2$02X Код: %3$02X
- Профил
- По подразбиране: 3 Това е основен параметър в сигурността на OpenAPS. Той ограничава максималният базал да бъде 3 пъти най-голямата стойност от дневните базали. Не би трябвало да има нужа от промяна, защото от опит сме проверили, че максимумите са “3x от най-високия дневен; 4x от текущия”.
- По подразбиране: 4\nТова е другият основен параметър в сигурността на OpenAPS, и другата половина от "3x от най-високия дневен; 4x от текущия". Това означава, че независимо от макс базал настроен в помпата, стойността на базала не може да е по-висока от тази стойност умножена по стойността на базала за текущият час от денонощието. Това е с цел да предпази от прекалено високи стойности на максималния базал преди да разбират как работи алгоритъма. Повечето от Вас няма да имат нужда от смяна на тази стойност и могат да се справят с настойки на другите параметри.
- По подразбиране: 1.2\nТова е максималният множител на autosens (а скоро autotune) за да позволи 20% максимален лимит на autosens коефициента, който от своя страна настройва базалите, колко може да намали ISF, и колко ниско може да свали целевата КЗ.
- По подразбиране: 0.7\nДругата част от сигурността на autosens, слагайки ограничение на колко ниско може да ограничи базалите, колко да повиши чувствителността (ISF) и целевите КЗ.
- По подразбиране: разрешено\nТова позволява на autosens да променя и целевите КЗ(освен чувствителност и базал).
- По подразбиране: 2\nBolus snooze се активира след като поставите болус за основно хранене, така Loop няма да пуснка/намаля базалите веднага след като сте се хранили. Примерът тук е с 2; така при 3 часа DIA това ще означава че bolus snooze ще бъде внимателно изместен 1.5 часа (3DIA/2).
- По подразбиране: 3.0\nТова е настройка на количеството на покачване на КЗ при усвояване на въглехидратите за всеки 5 минути. По подразбиране 3мг/дл/5мин. Това се отразява на това колко бързо се усвояват COB според алгоритъма, и как това се отразява в предвиждането на КЗ, когато тя не се покачва или пада с различен темп от очакваното.
- Внимание! Обикновено Вие не трябва да променяте тези стойности. Моля НАТИСНЕТЕ ТУК, прочетете текста и бъдете сигурни, че го РАЗБИРАТЕ преди да направите каквито и да е промени!
- Позволени са само числа
- Позволени са числа между %1$s - %2$s
- Полето не може да бъде празно
- Телефонният номер не е валиден
- Грешен тел номер за SMS
- Копирай
- Копирано
- Покажи лог
- Калибрация
- Изпрати калибрация %.1f на xDrip?
- xDrip+ не е инсталиран
- Калибрацията е изпратена към xDrip
- Не е разрешена отдалечена калибрация
- Неуспешно. Получаването трябва да е разрешено в xDrip.
- xDrip не получава калибрации
- Помпата е спряна
- Получава статус на помпата
- Настройва временен базал
- Спира временен базал
- Настойва удължен болус
- Спира удължен болус
- Обновява базални стойности
- Спира връзката
- Изпълнява
- Настойки Виртуална Помпа
- Качва статуса в NS
- Грешна парола
- Парола за настройки
- Отключи настройките
- Близо до максмалния дневен инсулин
- NSClient
- NSCI
- URL:
- Автопревъртане
- Рестарт
- Вътрешен NSClient
- Nightscout адрес
- Въведете Nightscout URL
- NS API парола
- NS API secret
- Въведете NS API secret (мин 12 символа)
- Изпрати сега
- Изчисти опашка
- Покажи опашка
- Опашка:
- Статус:
- Пауза
- Възраст на потребителя
- Дете
- Тийнейджър
- Възрастен
- Изберете възраст за определяне лимитите на безопасност
- Glimp
- %s се нуждае от зключване на оптимизиране на батерията за пълна функционалност
- Loop изключен
- Изключен (%d мин)
- Суперболус (%d мин)
- Изключи Loop за 1ч
- Изключи Loop за 2ч
- Изключи Loop за 3ч
- Изключи Loop за 10 ч
- Изключи помпата за 15 мин.
- Изключи помпата за 30 мин.
- Изключи помпата за 1 ч
- Изключи помпата за 2 ч
- Изключи помпата за 3 ч
- Възстанови
- Wrong duration
- Loop suspended
- Loop resumed
- Δ за 15мин
- COB
- Суперболус
- Записвай всяко стартиране на AndroidAPS в NS
- Рестартиране за да се приложат новите настройки.
- DanaRv2
- Инсулин
- Бързодействащ инсулин
- Novorapid, Novolog, Humalog
- ИНС
- Разреши използването на Суперболус
- Разреши функцията суперболус в съветника. Не я разрешавайте докато не научите какво наистина прави. ТОВА МОЖЕ ДА СЪЗДАДЕ ОПАСНОСТ ОТ ПРЕДОЗИРАНЕ С ИНСУЛИН.
- IOB
- COB
- Firmware
- Последно свързване
- Bluetooh статус
- За приложението
- Missing SMS permission
- xDrip статус (часовник)
- xDrip статус (часовник)
- xds
- Показвай BGI
- Добави BGI към статуса
- Без качване на данни в NS
- Всички данни за NS се пропускат. AAPS е свързан с NS, но не прави промени в NS
- Стъпка за базал
- Стъпка за болус
- Удължен болус
- Вр. цел
- Спри удължен болус
- Възраст на сензора
- Възраст на канюла
- Възраст на инсулина
- часа
- Тип базал
- Грешен профил !!!
- Смяна на профил
- Възраст на батерията на помпата
- Смяна на батерия
- Опции за аларми
- Много висока
- Висока
- Ниска
- Много ниска
- Няма данни
- Много стари данни
- Когато няма данни повече от [мин]
- Много стари данни при повече от [мин]
- Интервал за autosens [ч]
- Брой часове назад за определяне на чувствителността (приемът на въглехидрати е изключен)
- Помпа
- OpenAPS
- Uploader
- Определяне на чувствителност
- ЧУВСТВ
- чрез Oref0
- чрез AAPS
- Настройки за абсорбция
- Максимално време за усвояване на храненето [ч]
- Брой часове, за които се очаква храненето да бъде напълно усвоено в организма
- Показвай удължените болуси като %
- ВСенз
- ВИнс
- ВКан
- ВБат
- OAPS
- UPLD
- БАЗА
- УД.
- Когато включите Autosense feature трябва да въвеждате ВСИЧКИ въглехидрати. В противен случай те ще се изчисляват грешно като повишена чувствителност!!
- чрез Среднопретеглената стойност
- OK
- Откажи
- Не всички профили са заредени!
- Стойностите не са запазени!
- Изчисти лога
- неуспешно - моля проверете телефона
- Недостъпно
- NSClient няма права за запис. Грешна API secret?
- Разреши предаване към други приложения (напр. xDrip)
- Разреши локално предаване на данни
- Потвърждаване, че КЗ е достъпна в Найтскаут и данните за помпата се качват там
- Раздели IOB от болус и от базал на часовника
- Покажи подробен IOB
- Активирай профила
- АКТИВНОСТ И ОБРАТНА ВРЪЗКА
- ХРАНА И БОЛУС
- CGM & OPENAPS
- Продължителност [мин.]
- ПОМПА
- Дата
- DIA от %1$f е твърде кратка - използвай %2$f вместо това!
- Със свободен пик по Oref
- Пик на кривата на IOB
- Време на пик [мин.]
- НЕВАЛИДНО
- Dutch
- Базална стойност [Е/ч]
- Бързодействащ по Oref
- Swedish
- Fiasp
- Ултра бързодействащ по Oref
- време за физ. активност
- Целева КЗ при физ. активност
- Скорост на болус
- % от профила
- Време на отместване
- Все още устройството не е намерено
- DanaRS
- Dana
- Временна цел по подразбиране
- Време за \"Преди хранене\"
- Цел за \"Преди хранене\"
- Празен резервоар
- Получава болус статус
- Получава статус на удължен болус
- Получава настройките на помпата
- Получава времето на помпата
- Получава статус на временен базал
- СДВОЯВАНЕ
- Сдвоени
- Времето за сдвояване изтече
- Сдвояване с нова помпа
- отново
- Избрана помпа
- Сериен номер
- ЛЕЧ
- Очаква сдвояване с помпа
- Времето за връзка изтече
- Настройки на часовник
- Задаване временни цели и въвеждане Лечения от часовник Android wear
- Контролиране от часовник
- Closed Loop е позволен
- Чете историята на помпата
- Настройва базалният профил
- Задайте стъпка на базала 0.01 Е/ч
- Dexcom G5 приложение (модифицирано)
- Качвай данните за КЗ в NS
- В xDrip+ изберете 640g/Eversense за източник на данни
- Изпращай данни за КЗ към xDrip+
- Аларма при липса на данни за КЗ
- Аларма при недостъпна помпа
- Командата се изпълнява в момента
- Грешка при доставяне на удължен болус
- Храна
- Има данни за КЗ от избрания източник
- ИНФО
- Локални аларми
- Loop разрешен
- Максимален IOB е зададен правилно
- Базалната стойност е заместена от минимално подържаната
- Липсват данни за КЗ
- Само отрицателни
- Не
- ]]>
- КЗ от NS
- NSClient има права за запис
- Калкулиране на базален IOB
- Калкулиране на КЗ
- Калкулиране на Болус IOB
- Калкулиране на COB
- Калкулиране суперболус
- Калкулиране на временни цели
- Калкулиране на тенденция КЗ
- Само положителни
- Обработва се събитие
- Помпата е недостъпна
- Лимит за недостъпна помпа [мин]
- Драйверът за помпата е коригиран
- Оставащ инсулин
- Стартира доставка на болус
- Неподдържан фърмуер на помпата
- Спешна аларма
- Очаква края на болуса. Остават %d сек.
- Показвай делта с още един десетичен знак
- Показвай подробна делта
- Да
- Невалиден профил: %s
- En
- Използвай системни известия за аларми и съобщения
- Внимание
- Нормално
- Ниско
- Няма достатъчно инсулин в резервоара
- Празен
- Обнови
- един
- %.2f U/h
- Добавяне на допълнителни функции за използване през деня, като SMB
- Пълнене
- Избран APS
- Няма базални стойности за някои часове: %s
- Временният базал е зададен от помпата
- Romanian
- French
- Китайски
- Болусът е спрян
- Спиране на болус
- Хипоглекимия
- Настройка на целевата КЗ чрез аутосенс
- Възрастни с голяма инсулинова резистентност
- OpenAPS SMB
- SMB
- Разреши UAM
- Разреши SMB
- Използвай супер микро болуси вместо временен базал за по бързо действие
- Детекция на необявено хранене (UAM)
- Продължителност на вр. цел при хипоглекимия
- Временна цел при хипоглекимия
- мин.
- ч.
- Максимални минути за ограничаване на базала от SMB
- Програмиране на помпа за болус
- Състояние
- Активност
- Няма връзка от %d мин.
- %1$d%% (%2$d мин. остават)
- Инициализация
- Прекратен поради грешка
- Прекратен от потребителя
- Изпълнява
- Отказва временен базал
- Задава временен базал (%1$d%% / %2$d min)
- Болус (%.1f U)
- Обновява
- Исканата операция не се поддържа от помпата
- Опасно използване: удължени или многовълнови болуси са активни. Помпата е изключена за само 6 часа. Само нормални болуси се поддържат.
- Опасно използване: помпата използва различни базални нива от първоначалния профил. Loop е спрян. Изберете първоначалния профил и обновете.
- Болуси с едно и също количество бяха поискани в последните две минути. За да се предотврати дублиране вече доставен болус, операцията е забранена.
- Сега
- Ниско ниво на резервоар на помпа
- Батерията на помпата е слаба
- Помпата отчита грешка E%1$d: %2$s
- Необходимо е сверяване на часа в помпата
- Отказването на временният базал беше потвърдено
- Помпата е недостъпна. Не беше доставен болус.
- Болусът беше неуспешен. За да сте сигурни, моля, проверете помпата, за да избегнете повторение на вече доставен болус. За да се избегнат бъгове болусите не се повтарят автоматично.
- Само %1$.2f U от искания болус от %2$.2f U е доставен поради грешка. Моля, проверете помпата, за да потвърдите това и да предприемете съответните действия.
- Insight
- Insight помпа
- Статус
- Променено
- ПОМПАТА Е СПРЯНА
- Статуса е актуализиран
- преди
- с
- Активен временен базал
- мин. остават
- История
- Последно извършено действие
- мин.
- Предупреждение за измерване на КЗ
- Маз.
- гр.
- kJ
- Бел.
- ]]>
- BT Watchdog
- Изключва Bluetooth на телефона за една секунда, ако няма връзка с помпата. Това може да помогне на някои телефони, където Bluetooth блокира.
- Bluetooth
- G5 настройки за upload
- Настройки на съветник
- Изтегляне КЗ от Найтскаут
- ---
- Макс. множител за настоящ базал
- Макс. множител за най-големия базал за денонощието
- Мин. стойност за аутосенс
- Макс. стойност за аутосенс
- Позволи връзка в роуминг
- Настройки за свързване
- Само при зареждане
- Настройки за визуализация
- Основни настройки
- Използвай само WiFi
- CGM
- секунда
- минута
- час
- ден
- седмица
- %1$ds изтича %2$s
- Статистика
- Предварително свързване
- Автоматично свързване при отваряне на AndroidAPS, преди връзка с помпата за намаляване на първоначалното забавяне
- Не се препоръчва поради голяма консумация на батерия
- Разреши SMB постоянно
- "Разрешава SMB постоянно и независимо от болусите. Възможно само с източник на КЗ с добра филтрация като G5 "
- Разреши SMB след въглехидрати
- "Разрешава SMB 6 часа след въглехидрати, дори при COB=0. Възможно само с източник на КЗ с добра филтрация като G5 приложение "
- Разреши SMB с COB
- Разрешава SMB, когато има активни COB
- Разреши SMB с временни цели
- Разрешава SMB, когато има активна временна цел на КЗ
- Разреши SMB с по-високи временни цели на КЗ
- "Разрешава SMB когато има активна по-висока временна цел "
- Заглушаване
- Инсулин
- Въглехидрати
- Бутони
- Изпраща калибрация към xDrip+ или отваря G5 диалог за калибрация
- Отваря xDrip+, бутонът назад връща към AAPS
- Количество въглехидрати за добавяне при натискане на бутона
- Количество инсулин за добавяне при натискане на бутона
- Не може да се използва CGM приложението. Уверете се, че е инсталирано.
- CGM
- История
- Уведомяване при SMB
- Покажи SMB на часовника като стандартен болус.
- Създаване на известие при грешки
- Създаване на Nightscout известие при грешки и локални аларми (също видими в Кеърпортал при Лечения)
- Покажи предвиждане на часовника
- Предвиждане
- Избор на данни
- Позволява автоматично изпращане на данни за грешки и статистически данни до разработчиците чрез fabric.io service.
- Моля обновете G5 приложението до поддържана версия.
- Не доставяй болус, само запис
- Категория
- Подкатегория
- Болусът ще бъде само записан
- Допълни липсващи данни за КЗ от Nightscout
- SMB чрез помпата
- Чувствителност
- Отклонение
- Активни въглехидрати
- Базали
- Няма избрано действие, нищо няма да се изпълни
- Използвате dev версия. Closed loop е деактивиран.
- Engineering mode не е активиран и не е release версия
- Прочита базалният профил
- "Историята на помпата се промени след извършване на изчислението за болус. Болусът не беше доставен. Моля, преизчислете дали все още е необходим болус.
- " http://www.androidaps.org facebook: http://facebook.androidaps.org"
- Старт на вр.цел за физ. активност
- Старт на вр. цел за Eating soon
- Вр.цел
- Старт на вр. цел при хипо
- ЦЕЛ %d не е стартирана
- ЦЕЛ %d не е завършена
- Помпата не може да подава временен базал
- Няма валидна базална прочетена от помпата
- Closed loop е забранен в настройките
- Аутосенс е забранен в настройките
- SMB е забранен в настройките
- Ограничаване на макс. базална стойност до %1$.2f Е/ч поради %2$s
- лимит на помпата
- трябва да бъде положително число
- множител на макс. базал
- множител на макс. дневен базал
- Болус беше доставен през последните 3 мин, пропуска SMB
- Базалът е зададен коректно
- Ограничаване на максималната процентна стойност до %1$d%% поради %2$s
- Ограничаване на болус до %1$.1f Е поради %2$s
- Ограничаване на макс. IOB до %1$.1f Е поради %2$s
- Ограничаване на въглехидрати до %1$d гр. поради %2$s
- Ограничаване на IOB до %1$.1f Е поради %2$s
- макс. стойност в настройките
- опасно използване
- Четенето на статуса се провали
- Записва смяна на сет
- Записва смяна на резервоар
- SMB \"винаги\" и \"след въглехидрати\" е забранен, защото е активен източник на КЗ, който не поддържа необходимата филтрация
- SMB не е позволен в режим open loop
- Храна
- Очаква синхронизация (%d sec)
- Прекъснат (%d m)
- Автоматично careportal събитие
- Автоматично изпраща смяна на резервоар, сет и аларми на помпата към Nightscout
- Максималният общ IOB OpenAPS не може да бъде повече от [U]
- Помпата е спряна
- Помпата е стартирана
- Помпата е на пауза
- Макс. време за усвояване на храна (часа)
- Време за което всяко хранене се счита за усвоено. Оставащите въглехидрати ще бъдат изчиствани.
- Време
- нулиране
- Тази стойност се нарича Max IOB в контекста на OpenAPS. OpenAPS няма да добавя инсулин, ако текущата IOB е по-голяма от тази стойност
- Поискано: %1$.2fU Доставено: %2$.2fU Error code: %3$d
- Първо добавяне за инсулин
- Второ добавяне за инсулин
- Трето добавяне за инсулин
- Първо добавяне за въглехидрати
- Второ добавяне за въглехидрати
- Трето добавяне за въглехидрати
- WiFi SSID
- Разрешени WiFi мрежи(разделени с запетая)
- Keep-alive status
+ Настройки на сигурността
+ Максимален инсулин при болус [единици]
+ Максимални въглехидрати [гр]
+ Опции
+ Обнови леченията от NS
+ Нулирай базата данни
+ Сигурни ли сте че искате да изтриете всички данни?
+ Изход
+ Използвай удължен болус за над 200%
+ DanaR Bluetooth устройство
+ Използване на абсолютни стойности за базал
+ Рестартирайте телефона или AndroidAPS от системните настройки или Android APS няма да записва проблемите (което е важно за работата на алгоритъма)!
+ Бутони за бърз достъп до основни функции
+ Въвеждане на разширени записи в логовете.
+ За конфигурация на активните плъгини
+ Разучаване на програмата
+ Показва въведените в Nightscout храни
+ Действие на инсулините Humalog и NovoRapid / NovoLog
+ Действие на инсулин Fiasp
+ Позволява да зададете сами пика на инсулиновата активност (не използвайте, ако сте нови потребители)
+ Включва или изключва затворения кръг (loop).
+ Синхронизира локалните данни с Nightscout
+ Алгоритъма, какъвто е бил през 2016
+ Алгоритъма, какъвто е бил през 2017
+ Най-новият алгоритъм (само за напреднали потребители)
+ Показва текущото състояние на вашия APS и бутони за най-често използваните действия
+ Показва известие с резюме на това, което прави вашия APS
+ Работа с профил, който е наличен само на този телефон (локален).
+ Работа с профила, които сте дефинирали в Nightscout
+ Работа с профил със само една стойност за всички часове.
+ Поддръжка за Accu-Chek Combo помпи, изискваща инсталиран ruffy
+ Поддръжка за Dana Diabecare R помпи
+ Поддръжка за корейски Dana Diabecare R помпи
+ Поддръжка за Dana Diabecare R помпи с обновен софтуер
+ Поддръжка за Dana Diabecare RS помпи
+ Поддръжка за Accu-Chek Insight pumps помпи, изискваща инсталиран SightRemote
+ Писалки - За хората, които правят множество ежедневни инжекции ( интензифицирано лечение с писалки)
+ За помпи, който все още не работят с AndroidAPS(Open Loop)
+ Чувствителността се изчислява по същия начин като в Oref0, но можете да зададете времева рамка. Минимална въглехидрати абсорбция се изчислява от Макс време за усвояване на въглехидратите в опциите.
+ Чувствителността се изчислява за 24 часа назад в миналото, а въглехидрати (ако не са се абсорбирали) изчезват след изтичане на срока от настройките.
+ Чувствителността се изчислява за 8 часа назад в миналото, а въглехидрати (ако не са се абсорбирали) изчезват след изтичане на срока от настройките. Също така се изчисляват и необявени хранения (UAM).
+ Чувствителността се изчислява като среднопретеглена стойност от отклоненията. По-новите отклонения имат по-високо тегло. Минималната абсорбция на въглехидрати се изчислява от Време за макс усвояване на въглехидрати от опциите. Този алгоритъм е най-бързият при проследяването на промени в чувствителността.
+ Получава данни за КЗ от модифицираното приложение на Dexcom.
+ Получава данни за КЗ от Glimp.
+ Получават стойности на КЗ от 600SeriesAndroidUploader.
+ Изтегля стойности на КЗ от Nightscout
+ Получава данни за КЗ от xDrip.
+ Записва всички процедури, които са били направени
+ Наблюдавайте и контролирайте AndroidAPS, от вашия WearOS часовник.
+ Покажи информация за вашия APS на xDrip + циферблат на часовник.
+ Дистанционно управление AndroidAPS чрез използване на SMS команди.
+ Стартирай
+ Провери
+ Единици
+ DIA (Време на действие на инсулина):
+ IC (Инсулин/въглехидр.):
+ ISF (Инс.чувствителност):
+ Базал
+ Целeва КЗ:
+ НЕ Е ЗАДАДЕН ПРОФИЛ
+ Инсулин:
+ Вълехидрати:
+ IOB:
+ IOB:
+ Активен:
+ Общо IOB:
+ Общо активен IOB:
+ Прод.:
+ Съотношение:
+ Инс:
+ IOB:
+ Общо IOB:
+ Инсулин (ед.):
+ Въглехидрати (гр.):
+ КЗ
+ Вр.цел
+ ВХ
+ Корекция
+ Ед.
+ IOB от болуси
+ Старт сега
+ ВИРТУАЛНА ПОМПА
+ Базова базална стойност
+ Временен базал
+ Удължен болус
+ Батерия
+ Резервоар
+ ОК
+ Последно изпълнение
+ Параметри на входа
+ КЗ стастус
+ Настоящ базал
+ IOB данни
+ Профил
+ Данни за хранене
+ Резултат
+ Няма данни за КЗ
+ Не се изисква промяна
+ Искане
+ Стойност
+ Срок
+ Основание
+ Кръвна захар
+ Изменение (Δ)
+ Изменение (делта):
+ Конфигурация
+ Цели
+ OpenAPS МА
+ Общ
+ NS Профил
+ Обикновен профил
+ Временен базал
+ Лечения
+ Виртуална помпа
+ Careportal
+ Помпа
+ Каква помпа използвате с AndroidAPS?
+ Лечения
+ Коя приставка да използваме за леченията?
+ Профил
+ Кой тип профил да използва AndroidAPS?
+ Алгоритъм за APS
+ Кои APS алгоритъм да се използва за корекции в лечението?
+ Общи
+ Това са някой общи функции, които може да са Ви от полза.
+ Кои ограничения да се прилагат?
+ дни
+ Ограничения
+ Кръг - Loop
+ Режим на APS - Loop
+ Използвайте това, за да активирате loop интеграцията в \'AndroidAPS.
+ Алгоритъм за APS
+ След ограничения
+ Временният базал зададен от помпата
+ Последно зададено
+ ОК
+ Откажи
+ НЕ Е ИЗБРАН APS ИЛИ НЯМА РЕЗУЛТАТ ОТ НЕГО
+ Сигурност
+ Модула е изключен
+ Нарушено ограничение
+ Грешка при подаване на болус
+ Грешка при подаване на временен базал
+ Стойност на базал [%]
+ % (100% = текущ)
+ Приложи нов временен базал:
+ Болус
+ Калкулатор
+ Приложено ограничение!
+ Потвърждение
+ Въведете ново лечение:
+ Болус
+ Болус:
+ Базал
+ Базал:
+ Въглехидрати
+ Променете данните!
+ Задай нов удължен болус:
+ Източник на данни за КЗ
+ От къде трябва да AndroidAPS да си взима данни?
+ xDrip
+ APS режим
+ Затворен кръг
+ Отворен кръг
+ Loop изключен
+ Изключи Loop
+ Включи Loop
+ Има ново предложение
+ Несъвместима версия на NSClient
+ Несъвместима версия на Nightscout
+ NSClient не е открит. Записът е загубен!
+ КЗ да се вижда в NS
+ Статуса на помпата да е достъпен в NS
+ Ръчно приложени
+ LOOP Е СПРЯН ОТ ОГРАНИЧЕНИЯТА
+ Базален IOB
+ Приложено ограничение на болус
+ Приложено ограничение на въглехидрати
+ Проверка на КЗ
+ Известие
+ Бележка
+ Въпрос
+ Физ. активност
+ Смяна на сет
+ Смяна на сензор
+ Старт на сензор
+ Смяна на резервоар
+ Смяна на профил
+ Болус за закуска
+ Болус за основно хранене
+ Болус корекция
+ Комбиниран болус
+ Старт на временен базал
+ Край на временен базал
+ Корекция с въглехидрати
+ OpenAPS спрян
+ Тип събитие
+ Друго
+ Глюкомер
+ Сензор
+ Въглехидрати
+ Инсулин
+ ВХ след
+ Разделяне
+ Продължителност
+ Процент
+ Абсолютна
+ Бележки
+ Време на събитие
+ Профил
+ Въведено от
+ Тип КЗ
+ Още не е зареден профила от NS
+ Временен базал
+ Удължен болус
+ Nightscout версия:
+ Липсва
+ Настройките са експортирани
+ Експортирай настройките в
+ Импорт на настройки от
+ Настройките са импортирани
+ Файлът не е намерен
+ Експорт настройки
+ Импорт настройки
+ Максимално позволен временен базал Е/ч
+ Макс. лимит на временен базал [Е/ч]
+ Максимален IOB
+ Този параметър се нарича максимален IOB в OpenAPS и подразбиране е 0. След няколко дни или седмици можете да го увеличите.
+ Разбрах
+ DanaR
+ Свързване
+ Свързана
+ Не е сврзана
+ DanaR настройки
+ Лицензионно споразумение с краен потребител
+ НЕ ТРЯБВА ДА СЕ ИЗПОЛЗВА ЗА ВЗЕМАНЕ НА МЕДИЦИНСКИ РЕШЕНИЯ. НЯМА ГАРАНЦИЯ ЗА ПРОГРАМАТА, ДО СТЕПЕНТА, ПОЗВОЛЕНА ОТ ПРИЛОЖИМОТО ПРАВО. ОСВЕН КОГАТО Е ПОСОЧЕНО ДРУГО В ПИСМЕН ВИД, ПРИТЕЖАТЕЛИТЕ НА АВТОРСКОТО ПРАВО И/ИЛИ ДРУГИ СТРАНИ ПРЕДОСТАВЯТ ПРОГРАМАТА \"КАКТО Е\", БЕЗ ГАРАНЦИИ ОТ ВСЯКАКЪВ ВИД, ИЗРАЗЕНИ ИЛИ ПОДРАЗБИРАЩИ СЕ, ВКЛЮЧИТЕЛНО, НО НЕ САМО, ПОДРАЗБИРАЩИ СЕ ГАРАНЦИИ ЗА ПРОДАВАЕМОСТ И ПРИГОДНОСТ ЗА КОНКРЕТНА ЦЕЛ. ЦЕЛИЯ РИСК ПО ОТНОШЕНИЕ НА КАЧЕСТВОТО И ЕФЕКТИВНОСТТА НА ПРОГРАМАТА Е САМО ВАШ. АКО ПРОГРАМАТА НЕ СРАБОТИ, ВИЕ ПОЕМАТЕ ВСИЧКИ НЕОБХОДИМИ РАЗХОДИ ЗА ОБСЛУЖВАНЕ, РЕМОНТ ИЛИ КОРЕКЦИЯ.
+ Разбирам и приемам
+ Съхрани
+ Не е открит Bluetooth адаптер
+ Избраното устройство не е открито
+ Грешка при свързване с помпата
+ IOB на помпата
+ Инсулин за деня
+ Последен болус:
+ преди %.1fч
+ Грешни входящи данни
+ Неправилна стойност
+ Презареди профил
+ Виж профил
+ Приложено
+ Коментар
+ Успешен
+ Процент
+ Абсолютна
+ Откажи временен базал
+ SMS комуникатор
+ Изчаква резултат от помпата
+ Разрешени телефонни номера
+ +XXXXXXXXXX;+YYYYYYYYYY
+ За да доставите болус от %1$.2fЕ отговорете с код %2$s
+ За да изпратите калибрация %1$.2f отговорете с код %2$s
+ Болус отказан
+ Болус %.2fЕд беше подаден успешно
+ Подава болус %.2fЕ
+ Болус от %.2fЕ подаден успешно
+ Подава %.2fЕ
+ Позволи отдалечени команди чрез SMS
+ Отдалечено подаване на болус - забранено!
+ Пръст
+ Сензор
+ Друго
+ Временна цел
+ Откажи временна цел
+ DanaR профил
+ DIA (Време на действие на инсулина) ч.:
+ Време на действие на инсулина
+ Неуспешно обновяване на базалния профил
+ Презареди
+ Качване
+ E болус
+ Двувълнов болус
+ Двоен разширен болус
+ грешка
+ презареждане
+ базал по часове
+ КЗ
+ въглехидрати
+ аларма
+ Общо %1$d записа качени
+ Бърз болус
+ Аларми
+ Базален по часове
+ Болуси
+ Въглехидрати
+ Инсулин за деня
+ Грешки
+ КЗ
+ Презареждане
+ Спиране
+ Свързване %1$d сек
+ Парола за помпата
+ Грешна парола за помпата!
+ Помпата е заета
+ Доставен
+ Спрян
+ Болусът е спрян
+ Спиране на болус
+ Запушване
+ Спри
+ Натиснат е СТОП!
+ Очаква помпата
+ Ще достави %.2fЕ
+ Настройка на визуализацията и наблюдението, а също и анализиране на базалните нужди и коефициенти
+ Потвърждаване, че КЗ е достъпна в Найтскаут и данните за помпата се качват там
+ Стартиране в режим Отворен кръг (Open loop)
+ Работа в режим \"Отворен кръг\" за няколко дни и ръчно въвеждане на много временни базали. Настройте и използвайте временни и стандартни временни цели (напр. за активни или хипо-третирани въглехидрати)
+ Опитайте се да разбирате по-добре вашият APS в режим \"Отворен кръг\", включително препоръчваните временни базали
+ Определяне на макс. лимит на базалния инсулин и настройване в помпата и програмата
+ Стартиране на \"Затворен кръг\" с изключване на базал при ниска КЗ
+ Стартиране на \"Затворен кръг\" с макс. IOB=0 без твърде много събития тип ниска КЗ
+ Настройване на \"Затворен кръг\" чрез повишаване на максималният IOB над 0 и понижаване на целевите нива на КЗ
+ Прекарайте няколко дни по този начин, като поне една нощ нямате аларма за ниска КЗ.
+ Настройване на базалния инсулин и коефициенти ако е необходимо и активиране на auto-sens
+ Една седмица успешно дневно използване с редовно въвеждане на въглехидрати
+ Активиране на допълнителни функции за дневно използване, включително и advanced meal assist (АМА)
+ Добавяне на допълнителни функции за използване през деня, като SMB
+ Вие трябва да прочетете wiki и увеличите maxIOB за да може SMB да работи добре! Добро начало е maxIOB = средния болус за хранене + 3 x най-големия базал от профила
+ Достигнахте лимита
+ Няма избран профил
+ APS е деактивиран
+ APS е активиран
+ APS е изключен
+ APS е включен
+ %1$.2f ограничен до %2$.2f
+ Стойността %s е извън границите
+ Отдалечено прилагане на базал е забранено
+ Отдалеченото управление е забранено
+ За да стартирате базал от %1$.2fЕ отговорете с код %2$s
+ За да спрете APS за %1$d минути отговорете с код %2$s
+ Временен базал от %1$.2fЕ/ч за %2$d мин стартиран успешно
+ Неуспешно стартиране на временен базал
+ За да спрете времен базал отговорете с код %s
+ Временният базал е отменен
+ Спирането на временния базал е неуспешно
+ Непозната команда или грешен отговор
+ Бърз болус
+ Настройки за бърз болус
+ Текст на бутона:
+ Въглехидрати:
+ Валиден от:
+ Добави
+ Редакция
+ Изтрий
+ Хранене
+ Корекция
+ Действия
+ Стартиран AndroidAPS
+ Само качва данни в NS (изключва синхронизацията)
+ Само качване на данните в NS. Няма ефект върху данните за КЗ ако локален източник като xDrip е избран. Няма ефект върху профила освен ако не е избран NS-профил.
+ Помпата не е инициализирана!
+ Помпата не е инициализирана, профила не е зададен!
+ Пълнене на сет
+ Моля, уверете се, че стойността съответсва на вашият сет! Този инсулин не се включва в IOB!
+ Други
+ Fill/Prime количества инсулин по подразбиране.
+ Бутон 1
+ Бутон 2
+ Бутон 3
+ Единици:
+ мг/дл
+ ммол/л
+ DIA:
+ Целева КЗ:
+ Диапазон за визуализация
+ Стойност на линиите за ниска и висока КЗ (mmol/l) за телефона и часовника
+ Ниска КЗ под
+ Висока КЗ над
+ Часовник
+ Изпрати отново всички дани
+ Отвори настройките на часовника
+ Грешка в промпата
+ Изтощена батерия
+ Помпата е изключена
+ Батерията на помпата е изтощена
+ DanaR Корейска
+ Базал:
+ Неуспешно задаване на базален профил
+ Профила на помпата е обновен
+ Забрани EasyUI режим в помпата
+ Разрешете удължените болуси в настройките на помпата
+ Променете режима от U/d на U/h в помпата
+ Базалните стойности са под минимума. Не е зададен профил!
+ КЗ:
+ Последна КЗ:
+ Писалки
+ MM640g
+ Текущи известия
+ СТАРИ ДАННИ
+ преди %1$d мин
+ преди %1$d мин
+ Локален профил
+ OpenAPS AMA
+ Краткоср. Δ:
+ Дългоср. Δ:
+ Общо %1$d елемента.\nАктуална стойност:
+ Autosens данни
+ От скрипта
+ Разреши AMA autosens
+ Обнови от NS
+ Изтрий записите в бъдещето
+ Преди хранене
+ Хипоглекимия
+ Физ.активност
+ Премахни запис:
+ DanaR статистика
+ Комулативна TDD
+ Експоненциално претеглена TDD
+ Базал
+ Болус
+ TDD
+ Дата
+ Коефициент
+ # дни
+ Тегло
+ Възможна неточност, ако сте използвали болус за презареждане!
+ Стари данни - натиснете \"ПРЕЗАРЕДИ\"
+ Общо базален инсулин
+ ОБИ * 2
+ Инициализация ...
+ ДЕЙСТВ
+ КОНФ
+ ЦИК
+ ОПр
+ APS
+ ЛПр
+ DANA
+ ОСН
+ ВП
+ NSПр
+ Леч
+ КП
+ Цел
+ WEAR
+ SMS
+ Използвай къси имена
+ Използвай краткоср. Δ вместо разлика от последната КЗ
+ Полезно при данни за КЗ с много шум
+ Разширени настройки
+ Модел: %1$02X Протокол: %2$02X Код: %3$02X
+ Профил
+ По подразбиране: 3 Това е основен параметър в сигурността на OpenAPS. Той ограничава максималният базал да бъде 3 пъти най-голямата стойност от дневните базали. Не би трябвало да има нужа от промяна, защото от опит сме проверили, че максимумите са “3x от най-високия дневен; 4x от текущия”.
+ По подразбиране: 4\nТова е другият основен параметър в сигурността на OpenAPS, и другата половина от \"3x от най-високия дневен; 4x от текущия\". Това означава, че независимо от макс базал настроен в помпата, стойността на базала не може да е по-висока от тази стойност умножена по стойността на базала за текущият час от денонощието. Това е с цел да предпази от прекалено високи стойности на максималния базал преди да разбират как работи алгоритъма. Повечето от Вас няма да имат нужда от смяна на тази стойност и могат да се справят с настойки на другите параметри.
+ По подразбиране: 1.2\nТова е максималният множител на autosens (а скоро autotune) за да позволи 20% максимален лимит на autosens коефициента, който от своя страна настройва базалите, колко може да намали ISF, и колко ниско може да свали целевата КЗ.
+ По подразбиране: 0.7\nДругата част от сигурността на autosens, слагайки ограничение на колко ниско може да ограничи базалите, колко да повиши чувствителността (ISF) и целевите КЗ.
+ Да променя ли autosens и целевата КЗ
+ По подразбиране: разрешено\nТова позволява на autosens да променя и целевите КЗ(освен чувствителност и базал).
+ По подразбиране: 2\nBolus snooze се активира след като поставите болус за основно хранене, така Loop няма да пуснка/намаля базалите веднага след като сте се хранили. Примерът тук е с 2; така при 3 часа DIA това ще означава че bolus snooze ще бъде внимателно изместен 1.5 часа (3DIA/2).
+ Стойност по подразбиране: 3.0 (АМА) или 8.0 (SMB). Това е настройка на количеството на покачване на КЗ при усвояване на въглехидратите за всеки 5 минути. По подразбиране 3мг/дл за 5мин. Това се отразява на това колко бързо се усвояват COB според алгоритъма, и как това се отразява в предвиждането на КЗ, когато тя не се покачва или пада с различен темп от очакваното.
+ Внимание! Обикновено Вие не трябва да променяте тези стойности. Моля НАТИСНЕТЕ ТУК, прочетете текста и бъдете сигурни, че го РАЗБИРАТЕ преди да направите каквито и да е промени!
+ Позволени са само числа
+ Позволени са числа между %1$s - %2$s
+ Полето не може да бъде празно
+ Телефонният номер не е валиден
+ Грешен тел номер за SMS
+ Калибрация
+ Изпрати калибрация %.1f към xDrip?
+ xDrip+ не е инсталиран
+ Калибрацията е изпратена към xDrip
+ Не е разрешена отдалечена калибрация
+ Неуспешно. Получаването трябва да е разрешено в xDrip.
+ xDrip не получава калибрации
+ Помпата е спряна
+ Получава статус на помпата
+ Настройва временен базал
+ Спира временен базал
+ Настойва удължен болус
+ Спира удължен болус
+ Обновява базални стойности
+ Спира връзката
+ Изпълнява
+ Настойки Виртуална Помпа
+ Качва статуса в NS
+ Грешна парола
+ Парола за настройки
+ Отключи настройките
+ Близо до максмалния дневен инсулин
+ Вътрешен NS клиент
+ NSКЛ
+ Nightscout aдрес:
+ Автопревъртане
+ Рестарт
+ Вътрешен NSClient
+ Nightscout адрес
+ Въведете вашият Nightscout адрес
+ NS API парола
+ NS API парола
+ Въведете NS API паролата (мин 12 символа)
+ Изпрати сега
+ Изчисти опашка
+ Покажи опашка
+ Опашка:
+ Статус:
+ Пауза
+ Изчисти лога
+ NSClient няма права за запис. Грешна API парола?
+ Настройки на часовник
+ Покажи подробен IOB
+ Раздели IOB от болус и от базал на часовника
+ неуспешно - моля проверете телефона
+ Недостъпно
+ Възраст на потребителя
+ Дете
+ Тийнейджър
+ Възрастен
+ Възрастни с голяма инсулинова резистентност
+ Изберете възраст за определяне лимитите на безопасност
+ Glimp
+ %s се нуждае от зключване на оптимизиране на батерията за пълна функционалност
+ Loop изключен
+ Изключен (%1$d мин)
+ Суперболус (%1$d мин)
+ Изключи APS за 1ч
+ Изключи APS за 2ч
+ Изключи APS за 3ч
+ Изключи APS за 10 ч
+ Изключи помпата за 15 мин.
+ Изключи помпата за 30 мин.
+ Изключи помпата за 1 ч
+ Изключи помпата за 2 ч
+ Изключи помпата за 3 ч
+ Възстанови
+ Грешна продължителност
+ APS забранен
+ APS възобновен
+ Δ за 15мин
+ СОВ
+ Суперболус
+ Записвай всяко стартиране на AndroidAPS в NS
+ Рестартиране за да се приложат новите настройки.
+ DanaRv2
+ Инсулин
+ Кой тип на инсулин използвате?
+ Бързодействащ инсулин
+ Novorapid Novolog, Humalog
+ Fiasp
+ ИНС
+ Разреши използването на Суперболус
+ Разреши функцията суперболус в съветника. Не я разрешавайте докато не научите какво наистина прави. ТОВА МОЖЕ ДА СЪЗДАДЕ ОПАСНОСТ ОТ ПРЕДОЗИРАНЕ С ИНСУЛИН.
+ IOB
+ СОВ
+ Фърмуер
+ Последно свързване
+ Bluetooh статус
+ За приложението
+ SMS команда забранена
+ xDrip статус (часовник)
+ xDrip статус (часовник)
+ xds
+ Показвай BGI
+ Добави BGI към статуса
+ Без качване на данни в NS
+ Всички данни за NS се пропускат. AAPS е свързан с NS, но не прави промени в NS
+ Стъпка при базал
+ Стъпка при болус
+ Удължен болус
+ Вр. цел
+ Спри удължен болус
+ Възраст на сензора
+ Възраст на канюла
+ Възраст на инсулина
+ часа
+ Тип базал
+ Грешен профил !!!
+ Смяна на профил
+ Възраст на батерията на помпата
+ Смяна на батерия
+ Опции за аларми
+ Много висока
+ Висока
+ Ниска
+ Много ниска
+ Стари данни
+ Много стари данни
+ Когато няма данни повече от [мин]
+ Много стари данни при повече от [мин]
+ Интервал за autosens [ч]
+ Брой часове назад за определяне на чувствителността (приемът на въглехидрати е изключен)
+ Помпа
+ OpenAPS
+ Uploader
+ Определяне на чувствителност
+ Кой алгоритъм за определяне на чувствителността да се използва?
+ ЧУВСТВ
+ чрез Oref0
+ Чрез Oref1
+ чрез AAPS
+ Настройки за абсорбция
+ Максимално време за усвояване на храненето [ч]
+ Брой часове, за които се очаква храненето да бъде напълно усвоено в организма
+ Показвай удължените болуси като %
+ ВСенз
+ ВИнс
+ ВКан
+ ВБат
+ OAPS
+ КАЧВ
+ БАЗА
+ УД.
+ Винаги включен екран
+ Предотвратяване на андроид да изключва екрана. Това ще доведе до консумацията на много енергия, когато устройството не е включено в контакта.
+ Когато включите Autosense feature трябва да въвеждате ВСИЧКИ въглехидрати. В противен случай те ще се изчисляват грешно като повишена чувствителност!!
+ чрез Среднопретеглената стойност
+ ОК
+ Откажи
+ Не всички профили са заредени!
+ Стойностите не са запазени!
+ Разреши предаване към други приложения (напр. xDrip)
+ Разреши локално предаване на данни
+ АКТИВНОСТ И ОБРАТНА ВРЪЗКА
+ ХРАНА И БОЛУС
+ CGM & OPENAPS
+ ПОМПА
+ Базална стойност [Е/ч]
+ Продължителност [мин.]
+ OpenAPS SMB
+ SMB
+ Разреши UAM
+ Разреши SMB
+ Използвай супер микро болуси вместо временен базал за по бързо действие
+ Детекция на необявено хранене (UAM)
+ Пик на кривата на IOB
+ Време на пик [мин.]
+ Със свободен пик по Oref
+ Бързодействащ по Oref
+ Ултра бързодействащ по Oref
+ DIA от %1$f е твърде кратка - използвай %2$f вместо това!
+ Активирай профила
+ Дата
+ НЕВАЛИДНО
+ Очаква сдвояване с помпа
+ Сдвоени
+ Времето за сдвояване изтече
+ СДВОЯВАНЕ
+ Все още устройството не е намерено
+ Празен резервоар
+ Предупреждение за измерване на КЗ
+ Оставащ инсулин
+ DanaRS
+ Dana
+ Избрана помпа
+ Сдвояване с нова помпа
+ Скорост на болус
+ Задайте стъпка на базала 0.01 Е/ч
+ Сериен номер
+ % от профила
+ Време на отместване
+ Временна цел по подразбиране
+ Време за \"Преди хранене\"
+ Цел за \"Преди хранене\"
+ Време за физ. активност
+ Целева КЗ при физ. активност
+ Продължителност на вр. цел при хипоглекимия
+ Временна цел при хипоглекимия
+ Пълнене
+ Получава статус на удължен болус
+ Получава болус статус
+ Получава статус на временен базал
+ Получава настройките на помпата
+ Получава времето на помпата
+ отново
+ Контролиране от часовник
+ Задаване временни цели и въвеждане Лечения от часовник Android wear
+ Времето за връзка изтече
+ Храна
+ гр.
+ мин.
+ ч.
+ ]]>
+ килодж.
+ Ен
+ Бел.
+ Маз.
+ ]]>
+ Изчаква края на болуса. Остават %1$d сек.
+ Обработва се събитие
+ Стартира доставка на болус
+ Командата се изпълнява в момента
+ Драйверът за помпата е коригиран
+ Помпата е недостъпна
+ Липсват данни за КЗ
+ Използвай системни известия за аларми и съобщения
+ Локални аларми
+ Аларма при липса на данни за КЗ
+ Аларма при недостъпна помпа
+ Лимит за недостъпна помпа [мин]
+ Спешна аларма
+ ИНФО
+ Блутуут
+ Блутуут ограничения
+ Изключва Bluetooth на телефона за една секунда, ако няма връзка с помпата. Това може да помогне на някои телефони, където Bluetooth блокира.
+ Dexcom G5 приложение (модифицирано)
+ Качвай данните за КЗ в NS
+ G5 настройки за качване
+ Poctech настройки за качване
+ Показвай подробна делта
+ Показвай делта с още един десетичен знак
+ Максимални минути за ограничаване на базала от SMB
+ Неподдържан фърмуер на помпата
+ Изпращай данни за КЗ към xDrip+
+ В xDrip+ изберете 640g/Eversense за източник на данни
+ КЗ от NS
+ Базалната стойност е заместена от минимално поддържаната стойност %s
+ Базалната стойност е заместена от максимално поддържаната стойност %s
+ Калкулиране на КЗ
+ Калкулиране на Болус IOB
+ Калкулиране на базален IOB
+ Калкулиране на тенденция КЗ
+ Калкулиране суперболус
+ Да
+ Не
+ Само положителни
+ Само отрицателни
+ Калкулиране на COB
+ Калкулиране на временни цели
+ APS разрешен
+ Избран APS
+ NSClient има права за запис
+ APS - Затворен кръг е позволен
+ Максимален IOB е зададен правилно
+ Има данни за КЗ от избрания източник
+ Няма базални стойности за някои часове: %s
+ Невалиден профил: %s
+ Програмиране на помпа за болус
+ Обнови
+ Състояние
+ Активност
+ Няма връзка от %1$d мин.
+ %1$d%% (%2$d мин. остават)
+ Инициализация
+ Прекратен поради грешка
+ Прекратен от потребителя
+ Изпълнява
+ Отказва временен базал
+ Задава временен базал (%1$d%% / %2$d min)
+ Болус (%.1f U)
+ Обновява
+ Исканата операция не се поддържа от помпата
+ Опасно използване: удължени или многовълнови болуси са активни. Помпата е изключена за само 6 часа. Само нормални болуси се поддържат.
+ Опасно използване: помпата използва различни базални нива от първоначалния профил. Loop е спрян. Изберете първоначалния профил и обновете.
+ Болуси с едно и също количество бяха поискани в последните две минути. За да се предотврати дублиране вече доставен болус, операцията е забранена.
+ Сега
+ Чете историята на помпата
+ История
+ Настройва базалният профил
+ Ниско ниво на резервоар на помпа
+ Батерията на помпата е слаба
+ Помпата отчита грешка E%1$d: %2$s
+ Ниско
+ Празен
+ Нормално
+ Необходимо е сверяване на часа в помпата
+ Внимание
+ Отказването на временният базал беше потвърдено
+ Помпата е недостъпна. Не беше доставен болус.
+ Болусът беше неуспешен. За да сте сигурни, моля, проверете помпата, за да избегнете повторение на вече доставен болус. За да се избегнат бъгове болусите не се повтарят автоматично.
+ Само %1$.2f U от искания болус от %2$.2f U е доставен поради грешка. Моля, проверете помпата, за да потвърдите това и да предприемете съответните действия.
+ Свързването с помпата и стартирането на болус се провали. Моля, проверете ръчно в историята на помпата доставен ли е болусът. Ако болусът е доставен, ще бъде добавен автоматично при следващото свързване с помпата.
+ Няма достатъчно инсулин в резервоара
+ Грешка при доставяне на удължен болус
+ Insight
+ Помпа Insight
+ Статус
+ Променено
+ ПОМПАТА Е СПРЯНА
+ Статуса е актуализиран
+ преди
+ с
+ Активен временен базал
+ мин. остават
+ История
+ Последно извършено действие
+ мин.
+ Останало
+ Общо с
+ Преди
+ Винаги свързано
+ НЕЗАЕТ
+ СИНХР. НА
+ ЗАЕТ
+ СИНХР.
+ СТАРТИРАМ
+ нужно е
+ Не е свързан към приложението!
+ Приложението изглежда не е инсталирано!
+ Несъвместимо приложение, нужна е версия
+ Неизвестно
+ Изчаква се потвърждение на кода
+ Кодът е отхвърлен
+ Свързване с апликацията
+ Не е разрешено
+ Несъвместимо
+ секунда
+ минута
+ час
+ ден
+ седмица
+ с
+ %1$ds изтича %2$s
+ Запазване на състоянието
+ Статистика
+ Предварително свързване
+ Автоматично свързване при отваряне на AndroidAPS, преди връзка с помпата за намаляване на първоначалното забавяне
+ Не се препоръчва поради голяма консумация на батерия
+ Разреши SMB постоянно
+ Разрешава SMB постоянно и независимо от болусите. Възможно само с източник на КЗ с добра филтрация като G5
+ Разреши SMB след въглехидрати
+ Разрешава SMB 6 часа след въглехидрати, дори при COB=0. Възможно само с източник на КЗ с добра филтрация като G5 приложение
+ Разреши SMB с COB (въглехидрати)
+ Разрешава SMB, когато има активни COB
+ Разреши SMB с временни цели
+ Разрешава SMB, когато има активна временна цел на КЗ
+ Разреши SMB с по-високи временни цели на КЗ
+ Разрешава SMB когато има активна по-висока временна цел
+ Нека текущия временен базал продължи
+ Заглушаване
+ Инсулин
+ Въглехидрати
+ Бутони
+ Изпраща калибрация към xDrip+ или отваря G5 диалог за калибрация
+ Отваря xDrip+, бутонът назад връща към AAPS
+ Количество въглехидрати за добавяне при натискане на бутона
+ Количество инсулин за добавяне при натискане на бутона
+ Не може да се стартира CGM приложението. Уверете се, че е инсталирано.
+ CGM
+ История
+ Уведомяване при SMB
+ Покажи SMB на часовника като стандартен болус.
+ Създаване на известие при грешки
+ Създаване на Nightscout известие при грешки и локални аларми (също видими в Careportal - Treatments)
+ Показвай прогнозините КЗ на часовника.
+ Прогнозни КЗ
+ Избор на данни
+ Качване на статистики във Fabric
+ Позволява автоматично изпращане на данни за грешки и статистически данни до разработчиците чрез услугата fabric.io .
+ Моля обновете G5 приложението до поддържана версия.
+ Старт на вр.цел за физ. активност
+ Старт на вр. цел за Eating soon
+ Вр.цел
+ Не стартирай болус, а само запиши в базата данни
+ Категория
+ Подкатегория
+ Болусът ще бъде само записан
+ Допълни липсващи данни за КЗ от Nightscout
+ SMB в помпата
+ Чувствителност
+ Отклонения
+ Активни въглехидрати
+ Действащ инсулин
+ Базали
+ Няма избрано действие, нищо няма да се изпълни
+ Старт на вр. цел при хипо
+ Използвате dev версия. Затворения кръг е недостъпен за Вас.
+ Режим за раработчици (Engineering mode) включен
+ Режим за раработчици (Engineering mode) не е активиран и не е release версия
+ %.2f Е/ч
+ Прочита базалният профил
+ Историята на помпата се промени след извършване на изчислението за болус. Болусът не беше доставен. Моля, преизчислете дали все още е необходим болус.
+ Болус успешно инжектиран, но добавянето на лечение в базата данни е неуспешно. Това може да се случи, ако два малки болуса със същия размер са направени в рамките на последните две минути. Проверете записите в историята на помпата и използвайте Careportal, за да добавите липсващи записи. Уверете се,че не добавяте еднакви записи за точно една и съща минута и същото количество инсулин.
+ Отказан временен базал поради лиса на синхронизация с историята на помпата
+ Обновява състоянието на помпата
+ Базалите в помпата са променени и скоро ще се обновят
+ Базалният процент е променен в помпата, но прочитането е неуспешно
+ Проверка за промени в историята на помпата
+ Бяха внесени няколко болуса със същото количество в рамките на една и съща минута. Само един запис може да бъде добавен към лечението. Моля, проверете помпата и ръчно добавете болус запис, като използвате раздела Careportal . Уверете се, че сте създали болус и нямате друг болус за същото време.
+ http://www.androidaps.org facebook: http://facebook.androidaps.org
+ Последният болус е с време от преди 24 часа или е в бъдеще. Моля, проверете дали датата на помпата е зададена правилно.
+ Времето/датата на доставения болус на помпата изглежда погрешно, IOB вероятно е неправилно. Моля, проверете часа/датата на помпата.
+ Смяната на профила не е отразена. Моля, направете превключване на потребителския профил или натиснете \"Активирай профил\" в Локален профил.
+ Брой болуси
+ Брой TBR
+ ЦЕЛ %1$d не е стартирана
+ ЦЕЛ %1$d не е завършена
+ Помпата не поддържа временен базал
+ Няма валиден базал в помпата
+ Затворения кръг е забранен в настройките
+ Аутосенс е забранен в настройките
+ SMB е забранен в настройките
+ Ограничаване на макс. базална стойност до %1$.2f Е/ч поради %2$s
+ лимит на помпата
+ трябва да бъде положително число
+ множител на макс. базал
+ множител на макс. дневен базал
+ Има болус през последните 3 мин, пропускам SMB
+ Базалът е зададен коректно
+ Ограничаване на максималната процентна стойност до %1$d%% поради %2$s
+ Ограничаване на болус до %1$.1f Е поради %2$s
+ Ограничение на удължен болус до %1$.1f Е поради %2$s
+ Ограничаване на макс. IOB до %1$.1f Е поради %2$s
+ Ограничаване на въглехидрати до %1$d гр. поради %2$s
+ Ограничаване на IOB до %1$.1f Е поради %2$s
+ макс. стойност в настройките
+ твърд лимит
+ опасно използване
+ Четенето на статуса се провали
+ Запис смяна на сет
+ Запис смяна на резервоар
+ SMB \"винаги включен\" и \"след въглехидрати\" е забранен, защото е активен източник на КЗ, който не поддържа необходимата филтрация
+ SMB не е позволен в режим Отворен кръг
+ Храна
+ нулиране
+ Изчаква синхронизация на времето (%1$d сек)
+ Разкачена помпа (%1$d мин)
+ Автоматично careportal събитие
+ Автоматично изпраща статус на резервоар, сет и аларми на помпата към Nightscout
+ Максималният общ IOB OpenAPS не може да бъде повече от [U]
+ Тази стойност се нарича Max IOB в контекста на OpenAPS. OpenAPS няма да добавя инсулин, ако текущата IOB е по-голяма от тази стойност
+ Помпата е спряна
+ Помпата е стартирана
+ Помпата е на пауза
+ Макс. време за усвояване на храна (часове)
+ Време за което всяко хранене се счита за усвоено. Оставащите въглехидрати ще бъдат изчиствани.
+ Време
+ Показване на поле \"бележки\" в диалоговите прозорци за лечение
+ Следващ
+ Предишен
+ Съветник за настройване
+ КРАЙ
+ Избиране на език
+ Стартирано: %1$.2fЕ Доставено: %2$.2fЕ Код на грешка: %3$s
+ Стойност на първия бърз бутон [e]
+ Стойност на втория бърз бутон [e]
+ Стойност на третия бърз бутон [e]
+ Стойност на първия бърз бутон [гр]
+ Стойност на втория бърз бутон [гр]
+ Стойност на третия бърз бутон [гр]
+ CGM
+ Използвай само WiFi
+ WiFi име
+ Само при зареждане на телефона
+ Настройки за свързване
+ Разрешени WiFi мрежи(разделени с запетая)
+ Позволи връзка в роуминг
+ Макс. стойност за аутосенс
+ Мин. стойност за аутосенс
+ Каква част от DIA след болус да изчаква AAPS преди да направи нещо
+ Макс. множител за най-големия базал за денонощието
+ Макс. множител за настоящ базал
+ ---
+ Виртуална помпа тип
+ Описание на помпата
+ Болус: Стъпка =%1$s\Удължен болус: [стъпка =%2$s, продължителност =%3$smin -%4$sh] \nБазал: стъпка =%5$s\ nTBR: %6$s (от %7$s), продължителност =%8$sмин -%9$sh\n%10$s
+ * Диапазонни стойности за базал/болус не се поддържат от Виртиална Помпа.
+ Изтегляне КЗ от Найтскаут
+ Настройки на съветник
+ Изчисления, включени в резултата на съветника:
+ Настройки за визуализация
+ Основни настройки
+ Разреши NSClient
+ Добре дошли в съветника за настройки. Той ще ви преведе през етапите на настройка.
+ Настройки на помпата
+ Получавам състоянието на помпата
+ Промени трябва да се направят и в 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ч при стари инсулин профили.
+ Конфигуриране на източник на КЗ
+ Моля изберете вид профил. Ако пациентът е дете, трябва да използвате NS профил. Ако никой освен Вас не ви проследява в Nightscout вероятно ще предпочетете Локален профил. Моля, не забравяйте, че тук само избирате източника на профил. За да го използвате трябва да го активирате с натискане на \"Смяна на профила\"
+ Изберете един от наличните алгоритми. Те са подредени от най-стария до най-новия. По-новите алгоритми са обикновено по-мощни и по-агресивни. Така ако сте новак в APS системите може да започнете с AMA. Не забравяйте да прочетете документацията на OpenAPS и да го конфигурирате преди употреба.
+ Започнете първа цел
+ Разрешение
+ Питане за разрешение
+ Приложението се нуждае от достъп до вашето местоположение за да активира BT сканиране
+ Приложението се нуждае от разрешение да съхранява данни за да може съхранява лог файлове
+ Искане
+ Конфигуриране на модула за Инсулин
+ Изход
+ Потребителски опции
+ Формат на времето
+ Превъртане при задъжане
+ Звуков сигнал при натискане на бутон
+ Тип аларма
+ Звукова
+ Вибрация
+ И двете
+ Включен екран за [сек]
+ Подсветка за [сек]
+ Единици на КЗ
+ Изключване след(часа)
+ Минимален инсулин в резервоара (единици)
+ Запиши опциите в помпата
+ Вкл
+ Изкл
+ Отвори меню
+ Затвори меню
+ Настройки на модул
+ Приключихме, Браво!
+ Все още не сме неприключили
+ Изминало време
+ %1$d. Цел
+ Poctech
+ Получавай данни за КЗ от Poctech апликацията.
+ Високите временни цели да вдигат ли чувствителността?
+
+ Ниските цели да свалят ли чувствителността ?
+
+ Невалидни настройки на помпата, проверете wiki и се уверете че меню Quick Info се казва QUICK INFO, с помощта на 360 софтуера.
+ По избор
+ Голяма времева разлика
+ Голяма времева разлика: Помпата е изключена за повече от 1,5 часа. Моля, регулирайте ръчно времето на помпата и се уверете, че четенето на историята от помпата не води до неочаквано поведение. Ако е възможно, премахнете историята от помпата, преди да промените времето или да изключите затворения кръг за едно DIA след последното погрешно влизане в историята, но поне едно DIA отсега.
+ AndroidAPS стартира
+ Открити са предишни настройки
+ Внимание: Ако активирате и свържете с хардуерна помпа, AndroidAPS ще копира основните настройки от профила в помпата, като презапише съществуващата базова скорост, съхранявана на помпата. Уверете се, че имате правилните основни настройки в AndroidAPS. Ако не сте сигурни или не искате да презапишете основните настройки на помпата, натиснете Cancel и повторете превключването към помпата по-късно.
+ Данните за лечението не са пълни
+ Настройки за поддръжка
+ Имейл
+ Невалиден e-mail
+ Брой логове за изпращане
+ Поддръжка
+ ПОДДР
+ Предоставя няколко функции за поддръжка (напр. изпращане и изтриване на логовете).
+ Изпратщане на логове чрез ел. поща
+ Изтрий логове
+ Събитие (инсулин: %1$.2f, въглехидрати: %2$d, в: %3$s) не може да бъде добавено към събития. Моля уверете се, че е правилно и го добавете ръчно.
+ eCarbs: %1$d г (за %2$d ч), след: %3$d м
+ Няма налични данни за авточувствителност
+ Настройки на логовете
+ Възстанови настройките по подразбиране
+ Грешка в NSClient. Рестартирайте Nightscout и NSClient
+ като
+
+ Има налично обновяване до версия %1$s
+ времево отместване
+ Предпочитаният режим на APS
+ Общо
+ Калк
+ Сдвояване
+ Изпрати последните лог файлове на разработчиците. Непредвидена ситуация.
+ Превишавате макс болус
+ Грешка при команда
+ Скорост грешка
+ Нарушение на макс дневен инсулин
+ Минимална стойност за промяна [%]
+ AndroidAPS ще покаже запитването за промяна на базала само ако е по-голямо от тази стойност.(Стандартно 20%)
+
+ %1$d дeн
+ %1$d дни
+
+
+ %1$d часа
+ %1$d часа
+
+
+ %1$d минута
+ %1$d минутa
+
diff --git a/app/src/main/res/values-cs/insight_alerts.xml b/app/src/main/res/values-cs/insight_alerts.xml
new file mode 100644
index 0000000000..3afc2a7387
--- /dev/null
+++ b/app/src/main/res/values-cs/insight_alerts.xml
@@ -0,0 +1,26 @@
+
+
+
+ Varování W31: Zásobník
+ Varování W32: Nízký stav baterie
+ Varování W33: Neplatný čas/datum
+ Varování W34: Konec záruky
+ Varování W36: Dočasný bazál zrušen
+ Varování W38: Bolus zrušen
+ Varování W39: Varování doba výpůjčky
+ Údržba M20: Není vložen zásobník
+ Údržba M21: Prázdný zásobník
+ Údržba M22: Vybitá baterie
+ Údržba M23: Automatické vypnutí
+ Údržba M24: Okluze
+ Údržba M25: Doba vypůjčení vypršela - ukončení provozu
+ Údržba M26: Výměna zásobníku nedokončena
+ Údržba M27: Stahování se nezdařilo
+ Údržba M28: Časový limit režimu pauza
+ Údržba M29: Nenastavený typ baterie
+ Údržba M30: Nenastavený typ zásobníku
+ Chyba E6: Mechanická chyba
+ Chyba E7: Elektronická chyba
+ Chyba E10: Chyba převinutí
+ Chyba E13: Chyba jazyka
+
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 4d20892429..28fa6eaabd 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -1,1050 +1,1071 @@
+
- Uzavřená smyčka
- Otevřená smyčka
- Typ smyčky
- Bazál
- Glykémie dostupná v NS
- Bolus
- Aplikováno omezení bolusu
- Zrušit
- Sacharidy
- Aplikováno omezení sacharidů
- Péče
- Oznámení
- Kontrola glykémie
- Přídavek sacharidů
- Výměna senzoru
- Znovuspuštění senzoru
- Kombinovaný bolus
- Korekční bolus
- Cvičení
- Výměna inzulínu
- Bolus na jídlo
- Absolutní
- Sacharidy
- Čas jídla
- Trvání
- Zadal
- Čas
- Inzulín
- Glukoměr
- Poznámky
- Jiné
- Procenta
- Profil
- Senzor
- Rozdělění
- Poznámka
- OpenAPS vypnuto
- Přepnutí profilu
- Výměna setu
- Otázka
- Bolus na svačinu
- Dočasný bazál konec
- Dočasný bazál začátek
- Změňte zadání
- Konfigurace
- APS
- Zdroj glykémie
- Omezení
- Obecné
- Smyčka
- Profil
- Pumpa
- Ošetření
- Potvrzení
- Aplikováno omezení!
- Mimo povolený rozsah
- Čeština
- dnů
- Rozdíl
- Trvání
- English
- Aplikovat bolus
- Glykémie
- Smyčka
- APS
- Po zpracování omezení
- Bazál nastavený pumpou
- SMB provedené pumpou
- SMYČKA ZAKÁZÁNA OMEZENÍM
- Ručně spuštěno
- Ukončit
- Nastavení
- Aktualizuj ošetření z NS
- Inicializuj databáze
- ŽÁDNÉ APS NEVYBRÁNO NEBO NEVRÁTILO VÝSLEDEK
- Změna nepožadována
- Dosud nebyl načten profil z NS
- Vždy použít absolutní hodnoty bazálu
- Bazál
- Doba působnosti inzulínu
- Inzulínosacharidový poměr
- ŽÁDNÝ PROFIL NENASTAVEN
- Cíl
- Jednotky
- Cíle
- Začátek
- Kontrola
- OK
- Současný bazál
- Modul zakázán
- Vstupní glykémie
- Vstupní parametry
- IOB data
- Poslední provedení
- Poslední spuštění
- Data o jídle
- Nedostupná data o glykémiích
- Profil
- Požadavek
- Výsledek
- Sputit teď
- Dostupné nové doporučení
- Přehled
- Kalkulačka
- Hodnota bazálu [%]
- % (100% = současný)
- Bolus
- NS profil
- Stav pumpy dostupný v NS
- Hodnota
- Zdůvodnění
- Bezpečnost
- Použít prodloužené bolusy pro >200%
- Spustit nový prodloužený bolus:
- Spustit nový dočasný bazál:
- Jednoduchý profil
- IOB:
- Celkové IOB:
- Inz:
- Hodn:
- Trv:
- Chyba podání bolusu
- Ošetření
- Aktivita:
- Sacharidy:
- Inzulín:
- IOB:
- Celková aktivita IOB:
- Celkové IOB:
- Množství sacharidů
- Množství inzulínu
- Bazální IOB
- Glykémie
- Bolusové IOB
- Sacharidy
- Korekce
- U
- Maximální povolený bolus [U]
- Maximální povolené sacharidy [g]
- Bezpečnost zadání ošetřeni
- Nepodporovaná verze NSClient
- Virtuální pumpa
- Základní hodnota bazálu
- Baterie
- Prodloužený bolus
- Zásobník
- OK
- Dočasný bazál
- VIRTUÁLNÍ PUMPA
- xDrip
- Prodloužený bolus
- Dočasný bazál
- Citlivost:
- NSClient není nainstalován. Záznam je ztracen!
- Typ události
- Zadání glykémie
- OpenAPS MA
- Verze Nightscoutu:
- Chybí
- Nastavení exportováno
- Nastavení importováno
- Importovat nastavení z
- Soubor nenalezen
- Exportovat nastavení do
- Exportovat nastavení
- Importovat nastavení
- German
- Bulgarian
- POTVRDIT
- Jazyk
- Připojeno
- Připojuji
- DanaR
- Odpojeno
- DanaR Bluetooth zařízení
- DanaR nastavení
- Absolutní
- Komentář
- Chyba připojování pumpy
- Jednotek za den
- Chybná vstupní data
- IOB z pumpy
- Poslední bolus
- Hodnota nenastavena správně
- Zobrazit profil
- Vybrané zařízení nenalezeno
- Provedeno
- Licenční ujednání
- ROZUMÍM A POTVRZUJI
- před %.1fh
- Nenalezen bluetooth adaptér
- Procent
- Obnovit profil
- Uložit
- Úspěch
- Poslední spojení
- Zrušit dočasný bazál
- Bolus %.2fU aplikován úspěšně
- Chyba při aplikování bolusu
- Vzdálený bolus není momentálně povolen
- K potvzení bolusu %1$.2fU odpověz SMS s kódem %2$s
- SMS komunikátor
- Povolená tel. čísla
- +XXXXXXXXXX;+YYYYYYYYYY
- Povolit posílání příkazů přes SMS
- Čekání na výsledek
- Dočasný cíl
- Dočasný cíl konec
- Glukoměr
- Jiný
- Senzor
- DanaR profil
- Chyba při nastavení dočasného bazálu
- alarm
- hodinový bazál
- sacharidy
- DE bolus
- DS bolus
- E bolus
- chyba
- glykémie
- Historie
- Alarmy
- Hodinové bazály
- Bolusy
- Sacharidy
- Připojování %d sec
- Denní inzulín
- Chyby
- Glykémie
- Plnění
- Vypnutí
- Načíst
- plnění
- S bolus
- Celkem nahráno %d záznamů
- Nahrávám
- Pumpa je zaneprázdněna
- Špatné heslo k pumpě
- Heslo k pumpě
- Okluze
- Podáno
- Stop
- Zastaveno
- STISKNUTO STOP
- Podávání %.2fU inzulínu
- Zkontrolovat, zda jsou glykémie a údaje z pumpy viditelné v Nightscoutu
- Nastavit vizualizaci a monitoring, analyzovat bazály a koeficienty
- Provozovat několik dní otevřenou smyčku a ručně potvrzovat doporučené dočasné bazály. Nastavovat a používat dočasné cíle (např. pro sport nebo hypo)
- Začít s otevřenou smyčkou
- Na základě předchozích zkušeností rozhodnout, jaký je třeba maximální bazál a nastavit ho v pumpě a v aplikaci
- Porozumět otevřené smyčce a doporučeným dočasným bazálům
- Spustit uzavřenou smyčku s max IOB = 0 na několik dní s minimem nutných korekcí na nízkou glykémii
- Začít uzavřenou smyčku pouze s hlídáním nizké glykémie
- Provozovat smyčku několik dní s alespoň jednou nocí bez alarmů na nízkou glykémii
- Zapnout uzavřenou smyčku, zvyšovat max IOB nad 0 a snižovat cílovou glykémii
- Jeden týden úspěšného používání s běžným příjmem sacharidů
- Upravit bazály a koeficinty, když bude potřeba a povolit automatickou detekci citlivosti na inzulín
- Povolit další funkce pro běžné používání jako AMA
- Dosaženo limitu
- Aplikováno %.2fU
- Smyčka byla zakázána
- Smyčka byla povolena
- Smyčka je zakázána
- Smyčka je povolena
- Spanish
- Není vybrán žádný profil
- Hodnota %s je mimo přednastavený rozsah
- Vzdálené posílání příkazů není povoleno
- Na spuštění bazálu %1$.2fU/h odpověz SMS s kódem %2$s
- Na ukončení bazálu odpověz SMS s kódem %s
- Dočaný bazál zastaven
- Rušení dočasného bazálu selhalo
- Spuštění dočasného bazálu selhalo
- Dočasný bazál %1$.2fU/h na %2$d minut spuštěn
- Neznámý příkaz nebo chybná odpověď
- Text na tlačítku:
- Sacharidy:
- Platné:
- Přidat
- Upravit
- Odstranit
- Rychlý bolus
- Nastavení rychlých bolusů
- Bolus
- Korejština
- Korekce
- Akce
- AndroidAPS restartován
- Prosím restartujte Váš telefon nebo restartujte AndroidAPS z nastavení systému jinak nebudou zaznamenány ladící informace (důležité pro sledování a kontrolu, zda algoritmus pracuje správně)
- Baterie v pumpě vybitá
- Tlačítko 1
- Tlačítko 2
- Tlačítko 3
- DIA:
- Smyčka zakázána
- Hodnoty plnění/doplňování
- Prosím ujistěte se, že hodnota odpovídá specifikaci Vašeho setu!
- Horní značka
- Dolní značka
- Nízký stav baterie
- mg/dl
- mmol/l
- Pouze nahrávání do NS (zakázaná synchronizace)
- Pouze nahrávání dat do NS. Neplatí pro glykémie, dokud není vybraný místní zdroj dat jako xDrip. Neplatí pro profily, pokud se používá NS profil.
- Otevřít nastavení na hodinkách Wear
- Jiné
- Značka vysoké a nízké hodnoty v přehledu a na hodinkách Wear
- Rozsah pro zobrazení
- Plnění/doplňování
- Pumpa není inicializována
- Chyba pumpy
- Pumpa vypnuta
- Znovu poslat všechna data
- Opravdu resetovat všechny databáze
- Cílový rozsah:
- Jednotky:
- Wear
- Bazál:
- Zakázat EasyUI režim v pumpě
- Povolit kombo bolusy v pumpě
- Změnit režim z U/d na U/h v pumpě
- Korejská DanaR
- Nastavení bazálního profilu selhalo
- Bazální profil aktualizován
- Pumpa není inicializována, profil nenastaven!
- Hodnota bazálu pod povoleným minimem. Nenastaveno!
- Pera
- Glykémie:
- Poslední glykémie:
- před %d min
- Bazál:
- Bolus:
- Rozdíl:
- IOB:
- před %d min
- Bolus %.2fU aplikován úspěšně
- Průběžné oznámení
- ZASTARALÉ
- Místní profil
- Aktivita
- Pole %d prvků. Aktuální hodnota:
- Před jídlem
- Greek
- Inicializuji ...
- Dlouhodobý průměr
- OpenAPS AMA
- Používat autodetekci senzitivity
- Data detekce senzitivity
- Ladící informace
- %1$.2f omezeno na %2$.2f
- Odstranit záznam:
- Krátkodobý průměr
- Obnovit události z NS
- "AKCE"
- "WEAR"
- VPUM
- OŠET
- SMS
- JPRO
- "PROF"
- PŘEH
- CÍLE
- "OAPS"
- SMYČ
- MPRF
- DANA
- KONF
- PÉČE
- Rozšířené nastavení
- Vždy používat krátkodobý průměrný rozdíl glykémií místo rozdílu posledních 2 hodnot
- Výhodné, pokud data z xDripu obsahují velký šum
- Statistika z pumpy
- Dní
- Kumulativní TDD
- Exponenciálně vážené TDD
- Zastaralá data. Prosím načtěte je znovu
- Bazál
- Bolus
- Datum
- Koef
- Celk. denní bazál
- TBB * 2
- TDD
- Pravděpodobně nepřesné při používání bolusů k doplňování
- Váha
- Profil
- Krátké názvy modulů
- Firmware
- Špatné telefonní číslo
- Chyba nastavování dočasného bazálu
- Nakopírováno do schránky
- Kopírovat do schránky
- Celková doba aktivity inzulínu
- DIA [h]
- Toto pole nesmí být prázdné
- Zobrazit log
- Maximální povolený bazál [U/h]
- Maximální bazální IOB [U]
- Tato hodnota je v kontextu OpenAPS nazývána max basal
- Tato hodnota je v kontextu OpenAPS nazývána max IOB
- Povoleny pouze číslice
- Povoleny pouze čísla v rozsahu %1$s - %2$s
- Neplatné telefonní číslo
- Kalibrace odeslána do xDripu
- Kalibrace
- Poslat do xDripu kalibraci %.1f ?
- xDrip+ není nainstalován
- xDrip nepřijímá kalibrace
- Odeslání kalibrace %1$.2f potvrďte kódem %2$s
- Kalibrace odeslána. Příjem musí být v xDripu povolený.
- Vzdálené kalibrace nejsou povoleny
- Odpojuji
- Provádím
- Nahrávám stav pumpy
- Pumpa pozastavena
- Nastavuji extended bolus
- Nastavuji dočasný bazál
- Zastavuji extended bolus
- Zastavuji dočasný bazál
- Aktualizuji bazály
- Spouštím dodávání %.2fU
- Čekání na pumpu
- Heslo do nastavení
- Nastavení virtuální pumpy
- Nahrávat status do NS
- Chybné heslo
- Odemknout nastavení
- Blíží se denní limit inzulínu
- Dospělý
- Dítě
- Vymazat frontu
- Vymazat log
- Odeslat teď
- neúspěšně - zkontrolujte mobil
- Nedostupný
- NSClient nedostal oprávnění k zápisu. Špatné API secret?
- NSClient
- Posouvat
- Vložte API secret (min 12. znaků)
- NSCl
- Interní NSClient
- URL:
- Vložte adresu Nightscoutu
- Adresa Nightscoutu
- Stáří pacienta
- Vyberte věk pacienta pro nastavení bezpečnostních limitů
- Pozastaveno
- Fronta:
- Restart
- Zobrazit frontu
- Status:
- Dospívající
- Rozepsat IOB do bolusového a bazálního na hodinkách
- Zobrazit detailní IOB
- Nastavení hodinek
- Glimp
- Odpojit pumpu na 1 h
- Odpojit pumpu na 2 h
- Odpojit pumpu na 15 min
- Odpojit pumpu na 30 min
- Odpojit pumpu na 3 h
- Povolit smyčku
- Smyčka pozastavena
- Pozastaveno (%d min)
- %s potřebuje vypnout optimalizace baterie pro optimální výkon
- Uvolnit
- Pozastavit smyčku na 10 h
- Pozastavit smyčku na 1 h
- Pozastavit smyčku na 2 h
- Pozastavit smyčku na 3 h
- Zakázat smyčku
- Smyčka obnovena
- Smyčka pozastavena
- Vzdálený příkaz není povolen
- K pozastavení smyčky na %1$d minut odpověz SMS s kódem %2$s
- Chybná doba trvání
- Zaznamenávat spuštění aplikace do NS
- Ukončuji aplikaci, aby se nastavení projevilo.
- Inzulín
- Rychlý inzulín
- INZ
- Superbolus (%d m)
- 15min trend
- COB
- Superbolus
- Povolit superbolus
- Povolení superbolusu v kalkulátoru. Nepovolujte, dokud se nenaučíte, co to opravdu dělá. MŮŽE ZPŮSOBIT PŘEDÁVKOVÁNÍ INZULÍNEM PŘI NESPRÁVNÉM POUŽITÍ!
- O aplikaci
- Chybějící povolení SMS
- Italian
- Čas v hodinách, ve kterém předpokládáme, že všechny sacharidy budou strávené
- Max. doba absorbce sacharidu [h]
- Nastavení absorbce sacharidů
- Krok bolusu
- Stáří kanyly
- KAN
- SACHARIDY & BOLUSY
- CGM & OPENAPS
- Stáří inzulínu
- INZ
- Trvání [min]
- Stáří baterie v pumpě
- BAT
- PUMPA
- Výměna baterie pumpy
- Stáří senzoru
- SEN
- COB
- Detekce citlivosti
- Všechny profily nenačteny
- Hodnoty nejsou uloženy!
- DanaRv2
- ProdlouženýBolus
- hodin
- Chybný profil !!!
- IOB
- Zrušit
- OK
- Nastavení alarmů
- Povolit odesílání do ostatních aplikací (jako xDrip)
- Povolení odesílaní
- Zakázat nahrávání do NS
- Všechna data odeslaná do NS jsou zahozena. AAPS je připojen k NS, ale nedělá do něj žádné změny.
- Vysoká
- Nízká
- Zastaralá data
- Mezní hodnota pro zastaralá data [min]
- Urgetní mezní hodnota pro zastaralá data [min]
- Urgentně vysoká
- Urgentně nízká
- Urgentně zastaralá data
- Zrušit prodloužený bolus
- Hodnota bazálu [U/h]
- Typ bazálu
- Přepnutí profilu
- Pumpa
- Statusový řádek xDripu (hodinky)
- Status z xDripu (hodinky)
- xds
- EXT
- DočasnýBazál
- DočasnýCíl
- Přidat BGI do stavové řádky
- Zobrazovat BGI
- SENS
- Ruština
- Při zapnuté detektci sensitivity nezapomeňte vkládat všechny sacharidy. Jinak budou odchylky mylně vyhodnocovány jako změna sensitivity !!
- Sensitivita AAPS
- Sensitivita Oref0
- Sensitivita vážený průměr
- OpenAPS
- OAPS
- Bluetooth status
- AKTIVITA & ZPĚTNÁ VAZBA
- Krok bazálu
- BAZ
- Nepodporovaná verze Nightscoutu
- Uploader
- UPLD
- Aktivovat profil
- Zobrazovat prodloužený bolus v %
- Datum
- DIA %1$f je příliž krátké - použito %2$f !
- Čas vrcholu IOB křivky
- Vrchol křivky [min]
- NEPLATNÝ
- Nizozemština
- Švédština
- Trvání aktivity
- Cíl při aktivitě
- % změna
- Posun času
- Nastavte bazální krok 0.01U/h
- Prozatím žádné zařízení nenalezeno
- Doplňování
- Rychlost bolusu
- DanaRS
- Dana
- Výchozí nastavení dočasných cílů
- Trvání \"blížícího se jídla\"
- Cíl pro \"blížící se jídlo\"
- Prázdný zásobník
- Nahrávám bolusy
- Nahrávám prodloužené bolusy
- Nahrávám nastavení pumpy
- Nahrávám čas v pumpě
- Nahrávám dočasné bazály
- PÁROVÁNÍ
- Spárováno
- Vypršel časový limit pro párování
- Párování pumpy
- Zbývající inzulín
- znovu použít
- Vybraná pumpa
- Sériové číslo
- Čekání na spárování na pumpě
- Nastavování dočasných cílů a vkládání ošetření na hodinkách Wear
- Řízení z hodinek Wear
- Model: %1$02X Protokol: %2$02X Kód: %3$02X
- ]]>
- Výstraha měření glykémie
- Vypršel čas připojování
- DC
- Volitelný vrchol - Oref
- NS heslo
- NS heslo (API secret)
- Zpracovávám
- Rychle působící - Oref
- Spouštím bolus
- Fiasp
- Ultra rychlý - Oref
- Čekání na konec bolusu. Zbývá %d sek.
- Povolit další funkce pro běžné používání jako SMB
- Výchozí hodnota: 3 Toto je klíčová hodnota zabezpečení. Říká, že maximánlní nastavitelný bazál je trojnásobkem maximálního denního bazálu. Patrně to nebudete muset měnit, případně si přečtete o tématu \"3x max denní; 4x aktuální\"
- Výchozí hodnota: 4 Toto je druhá klíčová hodnota. Říká, že maximální hodnota dočasného bazálu nikdy nebude větší, než čtyřnásobek aktuálního bazálu. Je to proto, aby se lidé nedostali do hodnot nebezpečných bazálu dříve, než pochpí jak OpenAPS pracuje. Znovy vychozí hodnota je 4 a většina lidí ji nidky nebude muset změnit. Pokud nestačí, obvykle je problém někde jinde.
- Výchozí hodnota: 1.2 Toto je bezpečnostní nastavení pro detekci sensitivity. Říká, že autosens může zvýšit bazály, snížit ISF a snížit cílovou hodnotu glykémie o 20%
- Výchozí hodnota: 0.7 Toto je bezpečnostní nastavení pro detekci sensitivity. Říká, že autosens může snížit bazály, zvýšit ISF a zvýšit cílovou hodnotu glykémie na 70%
- Výchozí hodnota: zapnuto Toto nastavení říká, že autosens může měnit také cílové hodnoty glykémií.
- Výchozí hodnota: 2 Toto nastavení říká, po jakou část z hodnoty DIA smyčka po bolusu čeká a nereaguje na změny glykémií (zde 3DIA/2 = 1,5h)
- Výchozí hodnota: 3.0 Tato hodnota definuje minimální část strávených sacharidů za každých 5 min. Výchozí hodnota je 3mg/dl/5min. Tato hodnota ovlivňuje výpočet COB
- Pozor! Za normálních okolností tyto hodnoty nemusíte měnit. Klikněte ZDE, PŘEČTĚTE si informace a UJISTĚTE se, že jim rozumíte dříve, než je začnete měnit.
- Interval pro detekci senzitivity [h]
- Počet hodin do minulosti pro detekci senzitivity
- Jídlo
- g
- ]]>
- kJ
- En
- Pr
- Tuk
- Příkaz je právě prováděn
- Ovladač pumpy opraven
- Pumpa nedostupná
- Chybějící glykémie
- Používat systémové notifikace pro výstrahy a oznámení
- Místní výstrahy
- Výstraha při nedostupných glykémiích
- Výstraha při nedostupné pumpě
- Limit pro nedostupnost pumpy [min]
- Urgetní alarm
- INFO
- Bluetooth
- Hlídač BT
- Vypne na 1 sek bluetooth v telefonu, pokud se nedaří připojit k pumpě. Může to pomoci u telefonů, které mají problémy s BT
- DexcomG5 aplikace (upravená)
- Nahrávat data do NS
- Nastavení nahrávání z G5
- Zobrazovat detailní změny
- Zobrazovat rozdíl s jedním desetinným místem navíc
- Nepodporovaný firmware v pumpě
- Odesílat data do xDrip+
- V xDrip+ vyberte zdroj dat 640g/Eversense
- Glykémie z NS
- Hodnota bazálu nahrazena minimální možnou
- Kalkulace glykémie
- Kalkulace bolusového IOB
- Kalkulace bazálního IOB
- Kalkulace trendu
- Kalkulace superbolusu
- Ano
- No
- Pouze kladné
- Pouze záporné
- Kalkulace COB
- Kalkulace s dočasným cílem
- Smyčka povolena
- APS vybráno
- NSClient má povolení k zápisu
- Uzavřená smyčka povolena
- Maximální IOB nastaveno správně
- Glykémie dostupné z vybraného zdroje
- Bazální hodnoty nejsou zarovnané na celé hodiny: %s
- Chybný profil: %s
- Programování pumpy pro bolus
- Obnovit
- Stav
- Aktivita
- Žádné spojení %d min
- %1$d%% (%2$d min zbývá)
- Inicializace
- Vypnuto díky chybě
- Vypnuto uživatelem
- Beží
- Rušení dočasného bazálu
- Nastavování doč. bazálu (%1$d%% / %2$d min)
- Bolus (%.1f U)
- Obnovování
- Požadovaná operace není pumpou podporována
- Nebezpečné použití: extended nebo multiwave bolus je aktivní. Pumpa byla vypnuta jen na 6 hodin. Povolené jsou pouze normální bolusy.
- Nebezpečné použití: pumpa má nastavený jiný bazální profil než první. Smyčka byla zakázána. Nastavete první profil a znovu načtěte.
- Bolus stejné velikosti už byl během poslední minuty požadován. Jako preventivní ochrana před zdvojeným bolusem byla operace zakázána.
- Teď
- Načítání historie pumpy
- Nastavení bazálního profilu
- V zásobníku je málo inzulínu
- Slabá baterie v pumpě
- Pumpa hlásí chybu E%1$d: %2$s
- Provádění bolusu selhalo. Zdá se, že žádný bolus nebyl podán. Zkontrolujte pumpu a případně pošlete bolus znovu. Jako bezpečnostní opatření podání bolusu není opakováno.
- Pouze %1$.2f U z bolusu %2$.2f bylo podáno díky chybě. Zkontrolujte pumpu a proveďte nápravu.
- Varování o ukončeném dočasném bazálu bylo potvrzeno.
- Varování
- Prázdný
- Nízký
- Normální
- Je vyžadována aktualizace času na pumpě
- Nedostatek inzulínu pro takovýto bolus
- Chyba spuštění extended bolusu
- SMB
- OpenAPS SMB
- Povolit UAM
- Povolit SMB
- Použít super mikro bolusy místo dočasných bazálů pro zrychlení účinku
- Detekce neoznámených jídel
- Insight
- Insight
- Stav
- Změněno
- PUMPA ZASTAVENA
- Stav aktualizován
- zpět
- s
- Aktivní dočasný bazál
- min zbývá
- Historie
- Poslední vykonaný příkaz
- potřebuje
- SPOUŠTĚNÍ
- SYNCHRONIZOVÁNO
- ZANEPRÁZDNĚN
- SYNCHRONIZUJI
- NEČINNÝ
- Zůstat stále připojený
- Nepřipojen k podpůrné aplikaci!
- Podpůrná aplikace patrně není nainstalovaná!
- Nekompatibilní podpůrná aplikace, je požadována verze
- Neznámý
- Čekám na potrvzení kódu
- Kód odmítnut
- Připojování aplikace
- Neautorizován
- Nekompatibilní
- sekund
- minut
- hodin
- dní
- týdnů
- " "
- Vždy povolit SMB
- Povolit SMB se sacharidy
- Povolit SMB, pokud zbývají aktivní sacharidy
- Povolit SMB s dočasnými cíly
- Povolit SMB, pokud je aktivní dočasný cíl (aktivita, blížící se jídlo)
- Povolit SMB s vysokými dočasnými cíly
- Povolit SMB, pokud je aktivní vysoký dočasný cíl (aktivita)
- Povolit SMB po jídle
- Povolit SMB nezávisle na bolusech. Možno pouze se zdroji glykémií s dobrým filtrováním dat, jako např. G5
- Povolit SMB 6 hodin po bolusu i při nulovém COB. Možno pouze se zdroji glykémií s dobrým filtrováním dat, jako např. G5
- Francouzština
- Rumunština
- Čínština
- Dospělý s nízkou citlivostí
- %1$d vyprší %2$s
- Stav keep-alive
- Statistika
- Připojování dopředu
- Automaticky připojit při otevření obrazovky AndroidAPS, dříve než dojde k poslání příkazu, aby se omezila doba připojování
- Nedoporučeno kvůli vybíjení baterie
- Nechat běžet aktuální dočasný bazál
- Ztlumit
- Inzulín
- Sacharidy
- Tlačítka
- Odeslání kalibrace do xDripu+, nebo otevření kalibračního dialogu na G5
- Otevře xDrip+, tlačítko zpět vrátí do AndroidAPS
- Množství sacharidů přidané po stisknutí tlačítka
- Množství inzulínu přidané po stisknutí tlačítka
- Nelze spustit aplikace CGM. Ujistěte se, že je nainstalovaná
- CGM
- Prohlížeč historie
- Oznámení při SMB
- Ukazovat SMB na hodinkách jako normální bolus
- Vytvořit oznámení pro chyby
- Vytvořit oznámení v NS pro chyby a místní výstrahy (zobrazitelné v Péči pod Ošetřením)
- Zobrazovat predikce na hodinkách
- Predikce
- Možnosti dat
- Odesílání do Fabric
- Automatické odesílání chyb aplikace a statistiky používání vývojářům pomocí služby fabric.io
- Prosím aktualizujte G5 aplikaci na podporovanou verzi
- Spustit Dočasný cíl Aktivita
- Spustit Dočasný cíl Blížící se jídlo
- DoCíl
- min
- Nepouštět bolus, jen zaznamenat
- Podkategorie
- Kategorie
- Bolus bude pouze zaznamenán
- Automaticky doplňovat chybějící glykémie z NS
- Hypoglykémie
- Citlivost
- Odchylky
- Zbývající sacharidy
- Zbývající inzulín
- Bazály
- Žádná akce nevybrána, nic se neprovede
- Spustit doč. cíl Hypo
- Běží DEV verze. Uzavřená smyčka je zakázána.
- Expertní mód povolen
- Expertní mód není povolen a neběží vydaná verze
- Načítám bazální profil
- Historie v pumpě se změnila po spočítání bolusu. Bolus nebyl proveden. Prosím spočítejte ho znovu, pokud je to stále potřeba.
- Bolus úspěšne podán, ale zápis se nezdařil. To se může stát pokud jsou podány bolusy stejné velikosti během 2 minut. Zkontrolujte historii pumpy a zadejte chybějící položky do ošetření. Ujistěte se, že nezadáváte stejnou velikost v rámci 1 minuty.
- Odmítnut vysoký dočasný bazál, protože kalkulace neuvažovala poslední změny v historii pumpy
- Obnovuji stav pumpy
- Bazál na pumpě byl změnen a bude brzo aktualizován
- Bazál na pumpě byl změnen, ale čtení selhalo
- Kontroluji změny v historii
- Byly načteny bolusy stejné velikosti během jedné minuty. Do ošetření je možné přidat jen jeden. Zkontrolujte pumpu a přidejte bolus do ošetření ručně tak, aby čas nekolidoval.
- "\nhttp://www.androidaps.org\n\nfacebook: http://facebook.androidaps.org"
- Poslední bolus je starší než 24h nebo v budoucnu. Zkontrolujte čas v pumpě.
- Datum/čas podaného bolusu se zdá špatně. IOB bude chybné. Zkontrolujte čas v pumpě.
- Přepnutí profilu chybí. Proveďte přepnutí profilu nebo ho aktivujte na záložce lokálního profilu
- Počet bolusů
- Počet dočasných bazálů
- Varování W31: Nízký stav zásobníku
- Varování W32: Nízký stav baterie
- Varování W33: Chybný datum/čas
- Varování W34: Konec záruky
- Údržba M20: Není vložený zásobník
- Údržba M21: Zásobník prázdný
- Údržba M22: Prázdná baterie
- Údržba M23: Automatické vypnutí
- Údržba M24: Okluze
- Údržba M26: Výměna zásobníku nekompletní
- Údržba M27: Stažení dat selhalo
- Údržba M28: Vypršení pozastavení
- Údržba M29: Nenastaven typ baterie
- Údržba M30: Nenastaven typ zásobníku
- Chyba E6: Mechanická chyba
- Chyba E7: Chyba elektroniky
- Chyba E10: Chyba převíjení
- Chyba E13: Chyba jazyka
- MM640g
- %.2f U/h
- Pumpa nedostupná. Bolus nebyl podán
- Bolus zastaven
- Zastavování bolusu
- Pumpa zastavena
- Pumpa spuštěna
- Pumpa pozastavena
- Maximální počet minut bazálu, ke kterým se limituje SMB
- Úprava cílové glykémie pomocí Autosens
- Trvání dočasného cíle při hypoglykémii
- Cílová glykémie při hypoglykémii
- m
- h
- Výukový cíl %d nespuštěn
- Novorapid, Novolog, Humalog
- Výukový cíl %d nedokončen
- Pumpa nepodporuje dočasné bazály
- Z pumpy nepřečten žádný platný bazál
- Uzavřená smyčka zakázána v nastavení
- Autosens zakázán v nastavení
- SMB zakázáno v nastavení
- Max bazál omezen na %1$.2f U/h: %2$s
- limit pumpy
- pořadována kladná hodnota
- maximální násobek bazálu
- mazimální násobek nejvyššího bazálu
- Odeslán bolus během posledních 3 minut, SMB přeskočeno
- Bazál nastaven správně
- Bazál omezen na %1$d%%: %2$s
- Bolus omezen na %1$.1f U: %2$s
- Max IOB omezeno na %1$.1f U: %2$s
- Sacharidy omezeny na %1$d g: %2$s
- IOB omezeno na %1$.1f U: %2$s
- maximální hodnota v nastavení
- pevný limit
- nebezpečné použití
- Načtení stavu selhalo
- Zaznamenat výmenu setu
- Zaznamenat výmenu inzulínu
- \"SMB vždy\" a \"po jídle\" zakázáno protože zdroj glykémie nepodporuje rozšířené filtrování
- SBM není povoleno v otevřené smyčce
- Jídlo
- reset
- Čekání na synchronizaci času (%d s)
- Odpojeno (%d m)
- Automatické vkládání péče
- Automaticky vloží výměnu inzulínu, setu, baterie a alarmů pumpy do NS
- Maximální celkové IOB, které OpenAPS nemůže překročit [U]
- Tato hodnota je v kontextu OpenAPS nazývána Max IOB. OpenAPS nikdy nepřidá inzulín, pokud je současné IOB větší než tato hodnota
- Maximální doba absorbce sacharidů [h]
- Doba, po které jsou všechny sacharidy považovány za strávené. Zbylé budou oříznuty
- Čas
- Zobrazovat kolonku poznámky v dialozích ošetření
- Požadováno: %1$.2fU Doručeno: %2$.2fU Chyba: %3$d
- První přídavek izulínu
- Druhý přídavek inzulínu
- Třetí přídavek inzulínu
- První přídavek sacharidů
- Druhý přídavek sacharidů
- Třetí přídavek sacharidů
- CGM
- Používat pouze WiFi
- WiFi SSID
- Pouze při nabíjení
- Nastavení připojení
- Povolené SSID (oddělené středníkem)
- Povolit připojení pro roamingu
- Max hodnota autosens
- Min hodnota autosens
- Dělitel \"bolus snooze\"
- Max násobitel denního nejvyššiho bazálu
- Max násobitel současného bazálu
- ---
- Doplňování glykémíí z NS
- Přístup k běžně používaným úkonům
- Zadávání událostí pro management diabetu
- Nastavení konfigurace (povolování součástí systému)
- Výukový program
- Zobrazení jídel definovaných v NS
- Předvolba pro Novorapid
- Předvolba pro Fiasp
- Možnost definice vrcholu účinnosti insulínu pro pokročilé uživatele
- Povolení nebo zakázání smyčky
- Synchronizace dat s Nightscoutem
- Stav algoritmu v roce 2016
- Stav algoritmu v roce 2017
- Nejnovější algoritmus pro pokročilé uživatele
- Zobrazení stavu a informací. Přístup k nejběžnejším ovládacím prvkům
- Zobrazení průběžného oznámení v Androidu s krátkým přehledem, co smyčka právě dělá
- Definice profilu přístupného pouze v AndroidAPS (a i bez internetu)
- Použití profilu definovaného v Nightscoutu
- Jednoduchý profil s jedním časovým pásmem
- Ovladač pumpy pro Accu-Check Combo. Vyžaduje nainstalovanou aplikaci Ruffy
- Ovladač pumpy pro DanaR
- Ovladač pumpy pro korejskou verzi DanaR
- Ovladač pumpy pro DanaR s upgradovaným firmwarem
- Ovladač pumpy pro DanaRS
- Ovladač pumpy pro Accu-Check Insight. Vyžaduje nainstalovanou aplikaci SightRemote
- Ovladač pumpy pro uživatele inzulínových per
- Ovladač pumpy pro uživatele bez podporované pumpy (Otevřená smyčka)
- Citlivost je počítána stejným způsobem jako v Oref0, ale je možné specifikovat dobu do minulosti. Minimální absorbce sacharidů je počítána dynamicky z maximální doby absorbce definované v nastavení.
- Citlivost je počítána za 24h a sacharidy, pokud nejsou absorbované, jsou oříznuty po čase definovaném v nastavení.
- Citlivost je počítána za 8h a sacharidy, pokud nejsou absorbované, jsou oříznuty po čase definovaném v nastavení. Je také zároveň vyhodnocováno UAM (neoznámené jídlo)
- Citlivost je počítána jako vážený průměr z odchylek. Novější mají vyšší prioritu. Minimální absorbce sacharidů je počítána dynamicky z maximální doby absorbce definované v nastavení. Tento algoritmus sleduje nejrychlejí změny citlivosti.
- Příjem glykémií z modifikované Dexcom G5 aplikace
- Příjem glykémií z Glimpu
- Příjem glykémií z Uploaderu 640G
- Příjem glykémií z Nightscoutu
- Příjem glykémií z xDripu
- Ukládá všechny ošetření do databáze.
- Zobrazování stavu a řízení AndroidAPS z hodinek s WearOS
- Zobrazování informací o smyčce na xDrip+ watchfacu
- Vzdálené řizení pomocí SMS příkazů
- Jakou pumpu chcete používat s AndroidAPS?
- Jaký plugin chcete používat pro ukládání informací?
- Jaký profil má AndroidAPS používat?
- Jaký algorimus má AndroidAPS používat?
- Obecné pluginy, které by se Vám mohly hodit.
- Jaká omezení byla použita?
- Interagrace smyčky do AndroidAPS.
- Odkud má získávat AndroidAPS glykémie?
- Polština
- Přečíst si wiki a zvýšit maximání IOB, aby mohlo SMB fungovat. Pro začátek se dá použít velikost běžného bolusu + 3x maximální denní bazál
- Smazat události v budoucnosti
- Jaký druh inzulínu používáte?
- Jaký druh algoritmu pro detekci citlivosti chcete použít?
- Sensitivita Oref1
- Nechat obrazovku zapnutou
- Zabránit Androidu ve zhasínání obrazovky. Bez připojení do nabíječky vybije velice rychle baterii!
- Nastavení nahrávání z Poctech
- Hodnota bazálu nahrazena maximální možnou
- Podání bolusu a kontrola historie pumpy selhala. Zkontrolujte pumpu ručně. Pokus bolus proběhl, načte se při přístím připojení automaticky.
- Další
- Zpět
- Průvodce nastavením
- Dokončit
- Vyberte jazyk
- Irština
- Nastavení wizardu
- Nastavení zobrazení
- Kalkulace použité ve výsledku wizardu:
- Obecné nastavení
- Povolit NSClient
- Vítejte v průvodci nastavením. Provede Vás procesem nastavení programu.
- Nastavení pumpy
- Načíst status
- Změny musí být prováděny v NS
- Přeskočit průvodce
- Stikněte tlačitko níže pro povolení AndroidAPS navrhovat nebo provádět změny bazálu
- Stikněte tlačitko níže pro povolení Cílů. Po zkončení průvodce přejděte na záložku Cílů, abyste získali všechny funkce AndroidAPS.
- Povolit Cíle
- Nastavení APS
- Nastavení senzitivity
- Plugin senzitivita slouží k detekci změn v senzitivitě a k počítání COB. Více informací zde:
- NSClient slouží ke spojení s Nightscoutem. Nastavení můžete nyní přeskočit, ale nebudete schopni dokončit cíle, dokud nastavení neprovedete.
- Pozor: Nové inzulínové profily vyžadují DIA minimálně 5h. DIA 5–6 hodin odpovídá zhruba nastavení 3h na starších typech profilů nebo v pumpě.
- Konfigurace zdroje glykémií
- Vyberte zdroj profilů. Pokud jde o dítě, využijte nejspíše NS profil. Pokud Vás nikdo přes NS nesleduje, budete patrně preferovat Místní profil. Uvědomte si, že nastavujete pouze zdroj profilů. Na to aby se opravdu profil začal používat, je třeba provést aktivaci profilu použitím \"Přepnutí profilu\"
- Vyberte jeden z algoritmů. Jsou setříděné od nejstaršího po nejnovější. Novější je obvykle lepší a agresivnější, ale vyžaduje přesnější nastavení. Proto pokud se smyčkou začínáte, mely byste nejříve vybrat jen AMA a ne ten poslední. Nezapomeňte si přečíst dokumentaci k OpenAPS a provést nastavení, než ho začnete používat.
- Spusťte první cíl
- Povolení
- Získat povolení
- Aplikace vyžaduje povolení \"umístění\", aby mohla vyhledávat BT zařízení
- Aplikace vyžaduje přístup k úložišti, aby mohla ukládat logy.
- Požadavek
- Nastavení inzulínu
- Konec
- Uživatelská nastavení
- Formát času
- Posun při stisknutí tlačítka
- Zvuk při stisknutí tlačítka
- Alarm
- Zvuk
- Vibrace
- Oboje
- Čas před vypnutím dipleje [s]
- Podsvícení [s]
- Jednotky
- Uložit do pumpy
- ZAP
- VYP
- Nízký stav zásobníku [U]
- Vypnutí [h]
- Otevřít menu
- Zavřít menu
- Nastavení pluginu
- Hotovo, gratulujeme!
- Nedokončeno
- Čas
- %1$d. cíl
- Poctech
- Získávat glykémie z aplikace Poctech
- Vysoký dočasný cíl zvýší senzitivitu
- = 5.5]]>
- Nízký dočasný cíl zníží senzitivitu
-
- Chybné nastavení pumpy. Projděte si dokumentaci a presvědčete se, že menu Quick Info se zmenuje QUICK INFO, za použití 360 configuration software
- Volitelný
- Velký rozdíl v času
- "Velký rozdíl v času: Čas v pumpě se liší minimálně o 1,5 h. Prosím upravte čas v pumpě ručně a vymažte historii pumpy, pokud je to třeba, případně pozastavte smyčku alespoň na \"DIA\" hodin "
- Vyčistit události \"AndroidAPS restartován\"
- Nalezeno uložené nastavení
- POZOR: Pokud aktivuje a připojíte skutečnou pumpu, AndroidAPS nakopíruje (a bude udržovat) nastavení bazálu z aktivního profilu do pumpy. Nastavení bazálu v pumpě bude přepsáno. Pokud si nejste jistí nebo nechcete přepsat bazály v pumpě, stiskněte Zrušit a opakujte přepnutí na jinou pumpu později.
+ Bezpečnost zadání ošetřeni
+ Maximální povolený bolus [U]
+ Maximální počet sacharidů [g]
+ Nastavení
+ Obnovit ošetření z NS
+ Inicializovat databáze
+ Opravdu resetovat všechny databáze?
+ Konec
+ Použít prodloužené bolusy pro >200%
+ DanaR Bluetooth zařízení
+ Vždy použít absolutní hodnoty bazálu
+ Prosím restartujte Váš telefon nebo restartujte AndroidAPS z nastavení systému\njinak nebudou zaznamenány ladící informace (důležité pro sledování a kontrolu, zda algoritmus pracuje správně)!
+ Tlačítka k běžně používaným úkonům
+ Zadávání událostí pro management diabetu.
+ Nastavení konfigurace (povolování součástí systému)
+ Výukový program
+ Zobrazení jídel definovaných v NS
+ Předvolba pro Novorapid
+ Předvolba pro Fiasp
+ Možnost definice vrcholu účinnosti inzulínu pro pokročilé uživatele
+ Povolení nebo zakázání smyčky.
+ Synchronizace dat s NS
+ Stav algoritmu v roce 2016
+ Stav algoritmu v roce 2017
+ Nejnovější algoritmus pro pokročilé uživatele
+ Zobrazení stavu a informací. Přístup k nejběžnějším ovládacím prvkům
+ Zobrazení průběžného oznámení v Androidu s krátkým přehledem, co smyčka právě dělá
+ Definice profilu přístupného pouze v AndroidAPS (a i bez internetu).
+ Použití profilu definovaného v Nightscoutu
+ Jednoduchý profil s jedním časovým pásmem.
+ Ovladač pumpy pro Accu-Check Combo. Vyžaduje nainstalovanou aplikaci Ruffy
+ Ovladač pumpy pro DanaR
+ Ovladač pumpy pro korejskou verzi DanaR
+ Ovladač pumpy pro DanaR s upgradovaným firmwarem
+ Ovladač pumpy pro DanaRS
+ Ovladač pumpy pro Accu-Check Insight. Vyžaduje nainstalovanou aplikaci SightRemote
+ Ovladač pumpy pro uživatele inzulínových per
+ Ovladač pumpy pro uživatele bez podporované pumpy (Otevřená smyčka)
+ Citlivost je počítána stejným způsobem jako v Oref0, ale je možné specifikovat dobu do minulosti. Minimální absorpce sacharidů je počítána dynamicky z maximální doby absorpce definované v nastavení.
+ Citlivost je počítána za 24h a sacharidy, pokud nejsou absorbované, jsou oříznuty po čase definovaném v nastavení.
+ Citlivost je počítána za 8h a sacharidy, pokud nejsou absorbované, jsou oříznuty po čase definovaném v nastavení. Je také zároveň vyhodnocováno UAM (neoznámené jídlo).
+ Citlivost je počítána jako vážený průměr z odchylek. Novější mají vyšší prioritu. Minimální absorpce sacharidů je počítána dynamicky z maximální doby absorpce definované v nastavení. Tento algoritmus sleduje nejrychleji změny citlivosti.
+ Příjem glykémií z modifikované Dexcom G5 aplikace.
+ Příjem glykémií z Glimpu.
+ Příjem glykémií z Uploaderu 640G.
+ Příjem glykémií z Nightscoutu
+ Příjem glykémií z xDripu.
+ Ukládá všechny ošetření do databáze
+ Zobrazování stavu a řízení AndroidAPS z hodinek s WearOS
+ Zobrazování informací o smyčce na xDrip+ watchface.
+ Vzdálené řizení pomocí SMS příkazů
+ Začátek
+ Kontrola
+ Jednotky
+ Doba působnosti inzulínu
+ Inzulínosacharidový poměr
+ Citlivost
+ Bazál
+ Cíl
+ ŽÁDNÝ PROFIL NENASTAVEN
+ Inzulín:
+ Sacharidy:
+ IOB:
+ IOB:
+ Aktivita:
+ Celkové IOB:
+ Celková aktivita IOB:
+ Trv:
+ Hodn:
+ Inz:
+ IOB:
+ Celkové IOB:
+ Množství inzulínu
+ Množství sacharidů
+ Glykémie
+ DC
+ Sacharidy
+ Korekce
+ U
+ Bolusové IOB
+ Spustit teď
+ VIRTUÁLNÍ PUMPA
+ Základní hodnota bazálu
+ Dočasný bazál
+ Prodloužený bolus
+ Baterie
+ Zásobník
+ OK
+ Poslední spuštění
+ Vstupní parametry
+ Vstupní glykémie
+ Současný bazál
+ IOB data
+ Profil
+ Data o jídle
+ Výsledek
+ Nedostupná data o glykémiích
+ Změna nepožadována
+ Požadavek
+ Hodnota
+ Trvání
+ Zdůvodnění
+ Glykémie
+ Rozdíl
+ Rozdíl:
+ Konfigurace
+ Cíle
+ OpenAPS MA
+ Přehled
+ NS profil
+ Jednoduchý profil
+ DočasnýBazál
+ Ošetření
+ Virtuální pumpa
+ Péče
+ Pumpa
+ Jakou pumpu chcete používat s AndroidAPS?
+ Ošetření
+ Jaký plugin chcete používat pro ukládání informací?
+ Profil
+ Jaký profil má AndroidAPS používat?
+ APS
+ Jaký algoritmus má AndroidAPS používat?
+ Obecné
+ Obecné pluginy, které by se Vám mohly hodit.
+ Jaká omezení byla použita?
+ dnů
+ Omezení
+ Smyčka
+ Smyčka
+ Integrace smyčky do AndroidAPS.
+ APS
+ Po zpracování omezení
+ Bazál nastavený pumpou
+ Poslední provedení
+ OK
+ Zrušit
+ ŽÁDNÉ APS NEVYBRÁNO NEBO NEVRÁTILO VÝSLEDEK
+ Bezpečnost
+ Modul zakázán
+ Mimo povolený rozsah
+ Chyba podání bolusu
+ Chyba nastavování dočasného bazálu
+ Hodnota bazálu [%]
+ % (100% = současný)
+ Spustit nový dočasný bazál:
+ Bolus
+ Kalkulačka
+ Aplikováno omezení!
+ Potvrzení
+ Aplikovat bolus:
+ Bolus
+ Bolus:
+ Bazál
+ Bazál:
+ Sacharidy
+ Změňte zadání!
+ Spustit nový prodloužený bolus:
+ Zdroj glykémie
+ Odkud má získávat AndroidAPS glykémie?
+ xDrip
+ Typ smyčky
+ Uzavřená smyčka
+ Otevřená smyčka
+ Smyčka zakázána
+ Zakázat smyčku
+ Povolit smyčku
+ Dostupné nové doporučení
+ Nepodporovaná verze NSClient
+ Nepodporovaná verze Nightscoutu
+ NSClient není nainstalován. Záznam je ztracen!
+ Glykémie dostupná v NS
+ Stav pumpy dostupný v NS
+ Ručně spuštěno
+ SMYČKA ZAKÁZÁNA OMEZENÍM
+ Bazální IOB
+ Aplikováno omezení bolusu
+ Aplikováno omezení sacharidů
+ Kontrola glykémie
+ Oznámení
+ Poznámka
+ Otázka
+ Cvičení
+ Výměna setu
+ Výměna senzoru
+ Znovu spuštění senzoru
+ Výměna inzulínu
+ Přepnutí profilu
+ Bolus na svačinu
+ Bolus na jídlo
+ Korekční bolus
+ Kombinovaný bolus
+ Dočasný bazál začátek
+ Dočasný bazál konec
+ Přídavek sacharidů
+ OpenAPS vypnuto
+ Typ události
+ Jiné
+ Glukoměr
+ Senzor
+ Sacharidy
+ Inzulín
+ Čas jídla
+ Rozdělení
+ Trvání
+ Procenta
+ Absolutní
+ Poznámky
+ Čas
+ Profil
+ Zadal
+ Zadání glykémie
+ Dosud nebyl načten profil z NS
+ Dočasný bazál
+ Prodloužený bolus
+ Verze Nightscoutu:
+ Chybí
+ Nastavení exportováno
+ Exportovat nastavení do
+ Importovat nastavení z
+ Nastavení importováno
+ Soubor nenalezen
+ Exportovat nastavení
+ Importovat nastavení
+ Maximální povolený bazál [U/h]
+ Tato hodnota je v kontextu OpenAPS nazývána max basal
+ Maximální bazální IOB [U]
+ Tato hodnota je v kontextu OpenAPS nazývána max IOB
+ POTVRDIT
+ DanaR
+ Připojuji
+ Připojeno
+ Odpojeno
+ DanaR nastavení
+ Licenční ujednání
+ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+ ROZUMÍM A POTVRZUJI
+ Uložit
+ Nenalezen Bluetooth adaptér
+ Vybrané zařízení nenalezeno
+ Chyba připojování pumpy
+ IOB z pumpy
+ Jednotek za den
+ Poslední bolus
+ před %.1fh
+ Chybná vstupní data
+ Hodnota nenastavena správně
+ Obnovit profil
+ Zobrazit profil
+ Provedeno
+ Komentář
+ Úspěch
+ Procent
+ Absolutní
+ Zrušit dočasný bazál
+ SMS komunikátor
+ Čekání na výsledek
+ Povolená tel. čísla
+ +XXXXXXXXXX;+YYYYYYYYYY
+ K potvrzení bolusu %1$.2fU odpověz SMS s kódem %2$s
+ Odeslání kalibrace %1$.2f potvrďte kódem %2$s
+ Chyba při aplikování bolusu
+ Bolus %.2fU aplikován úspěšně
+ Spouštím dodávání %.2fU
+ Bolus %.2fU aplikován úspěšně
+ Aplikováno %.2fU
+ Povolit posílání příkazů přes SMS
+ Vzdálený bolus není momentálně povolen
+ Glukoměr
+ Senzor
+ Jiný
+ Dočasný cíl
+ Dočasný cíl konec
+ DanaR profil
+ DIA [h]
+ Celková doba aktivity inzulínu
+ Chyba při nastavení dočasného bazálu
+ Načíst
+ Nahrávám
+ E bolus
+ DS bolus
+ DE bolus
+ chyba
+ plnění
+ hodinový bazál
+ glykémie
+ sacharidy
+ alarm
+ Celkem nahráno %1$d záznamů
+ S bolus
+ Alarmy
+ Hodinové bazály
+ Bolusy
+ Sacharidy
+ Denní inzulín
+ Chyby
+ Glykémie
+ Plnění
+ Vypnutí
+ Připojování %1$d sec
+ Heslo k pumpě
+ Špatné heslo k pumpě!
+ Pumpa je zaneprázdněna
+ Podáno
+ Zastaveno
+ Bolus zastaven
+ Zastavování bolusu
+ Okluze
+ Stop
+ STISKNUTO STOP
+ Čekání na pumpu
+ Podávání %.2fU inzulínu
+ Nastavit vizualizaci a monitoring, analyzovat bazály a koeficienty
+ Zkontrolovat, zda jsou glykémie a údaje z pumpy viditelné v Nightscoutu
+ Začít s otevřenou smyčkou
+ Provozovat několik dní otevřenou smyčku a ručně potvrzovat doporučené dočasné bazály. Nastavovat a používat dočasné cíle (např. pro sport nebo hypo)
+ Porozumět otevřené smyčce a doporučeným dočasným bazálům
+ Na základě předchozích zkušeností rozhodnout, jaký je třeba maximální bazál a nastavit ho v pumpě a v aplikaci
+ Začít uzavřenou smyčku pouze s hlídáním nízké glykémie
+ Spustit uzavřenou smyčku s max IOB = 0 na několik dní s minimem nutných korekcí na nízkou glykémii
+ Zapnout uzavřenou smyčku, zvyšovat max IOB nad 0 a snižovat cílovou glykémii
+ Provozovat smyčku několik dní s alespoň jednou nocí bez alarmů na nízkou glykémii
+ Upravit bazály a koeficienty, když bude potřeba a povolit automatickou detekci citlivosti na inzulín
+ Jeden týden úspěšného používání s běžným příjmem sacharidů
+ Povolit další funkce pro běžné používání jako AMA
+ Povolit další funkce pro běžné používání jako SMB
+ Přečíst si dokumentaci a zvýšit maximání IOB, aby mohlo SMB fungovat. Pro začátek se dá použít velikost běžného bolusu + 3x maximální denní bazál
+ Dosaženo limitu
+ Není vybrán žádný profil
+ Smyčka byla zakázána
+ Smyčka byla povolena
+ Smyčka je zakázána
+ Smyčka je povolena
+ %1$.2f omezeno na %2$.2f
+ Hodnota %s je mimo přednastavený rozsah
+ Vzdálené posílání příkazů není povoleno
+ Vzdálený příkaz není povolen
+ Na spuštění bazálu %1$.2fU/h odpověz SMS s kódem %2$s
+ K pozastavení smyčky na %1$d minut odpověz SMS s kódem %2$s
+ Dočasný bazál %1$.2fU/h na %2$d minut spuštěn
+ Spuštění dočasného bazálu selhalo
+ Na ukončení bazálu odpověz SMS s kódem %s
+ Dočasný bazál zastaven
+ Rušení dočasného bazálu selhalo
+ Neznámý příkaz nebo chybná odpověď
+ Rychlý bolus
+ Nastavení rychlých bolusů
+ Text na tlačítku:
+ Sacharidy:
+ Platné:
+ Přidat
+ Upravit
+ Odstranit
+ Bolus
+ Korekce
+ Akce
+ AndroidAPS restartován
+ Pouze nahrávání do NS (zakázaná synchronizace)
+ Pouze nahrávání dat do NS. Neplatí pro glykémie, dokud není vybraný místní zdroj dat jako xDrip. Neplatí pro profily, pokud se používá NS profil.
+ Pumpa není inicializována!
+ Pumpa není inicializována, profil nenastaven!
+ Plnění/doplňování
+ Prosím ujistěte se, že hodnota odpovídá specifikaci Vašeho setu!
+ Jiné
+ Hodnoty plnění/doplňování.
+ Tlačítko 1
+ Tlačítko 2
+ Tlačítko 3
+ Jednotky:
+ mg/dL
+ mmol/L
+ DIA:
+ Cílový rozsah:
+ Rozsah pro zobrazení
+ Značka vysoké a nízké hodnoty v přehledu a na hodinkách Wear
+ Dolní značka
+ Horní značka
+ Wear
+ Znovu poslat všechna data
+ Otevřít nastavení na hodinkách Wear
+ Chyba pumpy
+ Nízký stav baterie
+ Pumpa vypnuta
+ Baterie v pumpě vybitá
+ Korejská DanaR
+ Bazál:
+ Nastavení bazálního profilu selhalo
+ Bazální profil aktualizován
+ Zakázat EasyUI režim v pumpě
+ Povolit kombo bolusy v pumpě
+ Změnit režim z U/d na U/h v pumpě
+ Hodnota bazálu pod povoleným minimem. Nenastaveno!
+ Glykémie:
+ Poslední glykémie:
+ Pera
+ MM640g
+ Průběžné oznámení
+ ZASTARALÉ
+ před %1$d min
+ před %1$d min
+ Místní profil
+ OpenAPS AMA
+ Krátkodobý průměr
+ Dlouhodobý průměr
+ Pole %1$d prvků.\nAktuální hodnota:
+ Data detekce senzitivity
+ Ladící informace
+ Používat autodetekci senzitivity
+ Obnovit události z NS
+ Smazat události v budoucnosti
+ Před jídlem
+ Hypoglykémie
+ Aktivita
+ Odstranit záznam:
+ Statistika z pumpy
+ Kumulativní TDD
+ Exponenciálně vážené TDD
+ Bazál
+ Bolus
+ CDD
+ Datum
+ Koef
+ Dní
+ Váha
+ Pravděpodobně nepřesné při používání bolusů k doplňování
+ Zastaralá data. Prosím načtěte je znovu
+ Celk. denní bazál
+ TBB * 2
+ Inicializuji ...
+ AKCE
+ KONF
+ SMYČ
+ JPRO
+ OAPS
+ MPRF
+ DANA
+ PŘEH
+ VPUM
+ PROF
+ OŠET
+ PÉČE
+ CÍLE
+ WEAR
+ SMS
+ Krátké názvy modulů
+ Vždy používat krátkodobý průměrný rozdíl glykémií místo rozdílu posledních 2 hodnot
+ Výhodné, pokud data z xDripu obsahují velký šum.
+ Rozšířené nastavení
+ Model: %1$02X Protokol: %2$02X Kód: %3$02X
+ Profil
+ Výchozí hodnota: 3 Toto je klíčová hodnota zabezpečení. Říká, že maximální nastavitelný bazál je trojnásobkem maximálního denního bazálu. Patrně to nebudete muset měnit, případně si přečtete o tématu \"3x max denní; 4x aktuální\".
+ Výchozí hodnota: 4 Toto je druhá klíčová hodnota. Říká, že maximální hodnota dočasného bazálu nikdy nebude větší, než čtyřnásobek aktuálního bazálu. Je to proto, aby se lidé nedostali do nebezpečných hodnot dříve, než pochopí jak OpenAPS pracuje. Znovu, výchozí hodnota je 4 a většina lidí ji nikdy nebude muset změnit. Pokud nestačí, obvykle je problém někde jinde.
+ Výchozí hodnota: 1.2 Toto je bezpečnostní nastavení pro detekci sensitivity. Říká, že autosens může zvýšit bazály, snížit ISF a snížit cílovou hodnotu glykémie o 20%
+ Výchozí hodnota: 0.7 Toto je bezpečnostní nastavení pro detekci sensitivity. Říká, že autosens může snížit bazály, zvýšit ISF a zvýšit cílovou hodnotu glykémie na 70%
+ Úprava cílové glykémie pomocí Autosens
+ Výchozí hodnota: zapnuto\nToto nastavení říká, že autosens může měnit také cílové hodnoty glykémií.
+ Výchozí hodnota: 2\nToto nastavení říká, po jakou část z hodnoty DIA smyčka po bolusu čeká a nereaguje na změny glykémií (zde 3DIA/2 = 1,5h).
+ Výchozí hodnota: 3.0 (AMA) nebo 8.0 (SMB) mg/dl/5min. Tato hodnota definuje minimální část strávených sacharidů za každých 5 min. Tato hodnota ovlivňuje výpočet COB.
+ Pozor!\nZa normálních okolností tyto hodnoty nemusíte měnit. Klikněte ZDE, PŘEČTĚTE si informace a UJISTĚTE se, že jim rozumíte dříve, než je začnete měnit.
+ Povoleny pouze číslice.
+ Povoleny pouze čísla v rozsahu %1$s - %2$s.
+ Toto pole nesmí být prázdné
+ Neplatné telefonní číslo
+ Špatné telefonní číslo
+ Kalibrace
+ Poslat do xDripu kalibraci %.1f ?
+ xDrip+ není nainstalován
+ Kalibrace odeslána do xDripu
+ Vzdálené kalibrace nejsou povoleny
+ Kalibrace odeslána. Příjem musí být v xDripu povolený.
+ xDrip nepřijímá kalibrace
+ Pumpa pozastavena
+ Nahrávám stav pumpy
+ Nastavuji dočasný bazál
+ Zastavuji dočasný bazál
+ Nastavuji extended bolus
+ Zastavuji extended bolus
+ Aktualizuji bazály
+ Odpojuji
+ Provádím
+ Nastavení virtuální pumpy
+ Nahrávat status do NS
+ Chybné heslo
+ Heslo do nastavení
+ Odemknout nastavení
+ Blíží se denní limit inzulínu
+ NSClient
+ NSCl
+ Adresa URL:
+ Posouvat
+ Restart
+ Interní NSClient
+ Adresa Nightscoutu
+ Vložte adresu Nightscoutu
+ NS heslo (API secret)
+ NS heslo
+ Vložte API secret (min 12. znaků)
+ Odeslat teď
+ Vymazat frontu
+ Zobrazit frontu
+ Fronta:
+ Status:
+ Pozastaveno
+ Vymazat log
+ NSClient nedostal oprávnění k zápisu. Špatné API secret?
+ Nastavení hodinek
+ Zobrazit detailní IOB
+ Rozepsat IOB do bolusového a bazálního na hodinkách
+ neúspěšně - zkontrolujte mobil
+ Nedostupný
+ Stáří pacienta
+ Dítě
+ Dospívající
+ Dospělý
+ Dospělý s nízkou citlivostí
+ Vyberte věk pacienta pro nastavení bezpečnostních limitů
+ Glimp
+ %s potřebuje vypnout optimalizace baterie pro optimální výkon
+ Smyčka pozastavena
+ Pozastaveno (%1$d min)
+ Superbolus (%1$d m)
+ Pozastavit smyčku na 1 h
+ Pozastavit smyčku na 2 h
+ Pozastavit smyčku na 3 h
+ Pozastavit smyčku na 10 h
+ Odpojit pumpu na 15 min
+ Odpojit pumpu na 30 min
+ Odpojit pumpu na 1 h
+ Odpojit pumpu na 2 h
+ Odpojit pumpu na 3 h
+ Uvolnit
+ Chybná doba trvání
+ Smyčka pozastavena
+ Smyčka obnovena
+ 15min trend
+ COB
+ Superbolus
+ Zaznamenávat spuštění aplikace do NS
+ Ukončuji aplikaci, aby se nastavení projevilo.
+ DanaRv2
+ Inzulín
+ Jaký druh inzulínu používáte?
+ Rychlý inzulín
+ Novorapid
+ Fiasp
+ INZ
+ Povolit superbolus
+ Povolení superbolusu v kalkulátoru. Nepovolujte, dokud se nenaučíte, co to opravdu dělá. MŮŽE ZPŮSOBIT PŘEDÁVKOVÁNÍ INZULÍNEM PŘI NESPRÁVNÉM POUŽITÍ!
+ IOB
+ COB
+ Firmware
+ Poslední spojení
+ Stav Bluetooth
+ O aplikaci
+ Chybějící povolení SMS
+ Status z xDripu (hodinky)
+ Statusový řádek xDripu (hodinky)
+ XDS
+ Zobrazovat BGI
+ Přidat BGI do stavové řádky
+ Zakázat nahrávání do NS
+ Všechna data odeslaná do NS jsou zahozena. AAPS je připojen k NS, ale nedělá do něj žádné změny
+ Krok bazálu
+ Krok bolusu
+ ProdlouženýBolus
+ DočasnýCíl
+ Zrušit prodloužený bolus
+ Stáří senzoru
+ Stáří kanyly
+ Stáří inzulínu
+ hodin
+ Typ bazálu
+ Chybný profil !!!
+ Přepnutí profilu
+ Stáří baterie v pumpě
+ Výměna baterie pumpy
+ Nastavení alarmů
+ Urgentně vysoká
+ Vysoká
+ Nízká
+ Urgentně nízká
+ Zastaralá data
+ Urgentně zastaralá data
+ Mezní hodnota pro zastaralá data [min]
+ Urgentní mezní hodnota pro zastaralá data [min]
+ Interval pro detekci senzitivity [h]
+ Počet hodin do minulosti pro detekci senzitivity
+ Pumpa
+ OpenAPS
+ Uploader
+ Detekce citlivosti
+ Jaký druh algoritmu pro detekci citlivosti chcete použít?
+ SENZ
+ Sensitivita Oref0
+ Sensitivita Oref1
+ Sensitivita AAPS
+ Nastavení absorpce sacharidů
+ Max. doba absorpce sacharidů [h]
+ Čas v hodinách, ve kterém předpokládáme, že všechny sacharidy budou strávené
+ Zobrazovat prodloužený bolus v %
+ SEN
+ INZ
+ KAN
+ BAT
+ OAPS
+ UPLD
+ BAZ
+ EXT
+ Nechat obrazovku zapnutou
+ Zabránit Androidu ve zhasínání obrazovky. Bez připojení do nabíječky vybije velice rychle baterii!
+ Při zapnuté detekci sensitivity nezapomeňte vkládat všechny sacharidy. Jinak budou odchylky mylně vyhodnocovány jako změna sensitivity !!
+ Sensitivita vážený průměr
+ OK
+ Zrušit
+ Všechny profily nenačteny!
+ Hodnoty nejsou uloženy!
+ Povolit odesílání do ostatních aplikací (jako xDrip)
+ Povolení odesílaní
+ AKTIVITA & ZPĚTNÁ VAZBA
+ SACHARIDY & BOLUSY
+ CGM & OPENAPS
+ PUMPA
+ Hodnota bazálu [U/h]
+ Trvání [min]
+ OpenAPS SMB
+ SMB
+ Povolit UAM
+ Povolit SMB
+ Použít super mikro bolusy místo dočasných bazálů pro zrychlení účinku
+ Detekce neoznámených jídel
+ Čas vrcholu IOB křivky
+ Vrchol křivky [min]
+ Volitelný vrchol - Oref
+ Rychle působící - Oref
+ Ultra rychlý - Oref
+ DIA %1$f je příliš krátké - použito %2$f !
+ Aktivovat profil
+ Datum
+ NEPLATNÝ
+ Čekání na spárování na pumpě
+ Spárováno
+ Vypršel časový limit pro párování
+ PÁROVÁNÍ
+ Prozatím žádné zařízení nenalezeno
+ Prázdný zásobník
+ Výstraha měření glykémie
+ Zbývající inzulín
+ DanaRS
+ Dana
+ Vybraná pumpa
+ Párování pumpy
+ Rychlost bolusu
+ Nastavte bazální krok 0.01U/h
+ Sériové číslo
+ % změna
+ Posun času
+ Výchozí nastavení dočasných cílů
+ Trvání \"blížícího se jídla\"
+ Cíl pro \"blížící se jídlo\"
+ Trvání aktivity
+ Cíl při aktivitě
+ Trvání dočasného cíle při hypoglykémii
+ Cílová glykémie při hypoglykémii
+ Doplňování
+ Nahrávám prodloužené bolusy
+ Nahrávám bolusy
+ Nahrávám dočasné bazály
+ Nahrávám nastavení pumpy
+ Nahrávám čas v pumpě
+ znovu použít
+ Řízení z hodinek Wear
+ Nastavování dočasných cílů a vkládání ošetření na hodinkách Wear.
+ Vypršel čas připojování
+ Jídlo
+ g
+ m
+ h
+ ]]>
+ kJ
+ En
+ Pr
+ Tuk
+ ]]>
+ Čekání na konec bolusu. Zbývá %1$d sek.
+ Zpracovávám
+ Spouštím bolus
+ Příkaz je právě prováděn
+ Ovladač pumpy opraven
+ Pumpa nedostupná
+ Chybějící glykémie
+ Používat systémové notifikace pro výstrahy a oznámení
+ Místní výstrahy
+ Výstraha při nedostupných glykémiích
+ Výstraha při nedostupné pumpě
+ Limit pro nedostupnost pumpy [min]
+ Urgentní alarm
+ INFO
+ Bluetooth
+ Hlídač BT
+ Vypne na 1 sek bluetooth v telefonu, pokud se nedaří připojit k pumpě. Může to pomoci u telefonů, které mají problémy s BT
+ DexcomG5 aplikace (upravená)
+ Nahrávat data do NS
+ Nastavení nahrávání z G5
+ Nastavení nahrávání z Poctech
+ Zobrazovat detailní změny
+ Zobrazovat rozdíl s jedním desetinným místem navíc
+ Maximální počet minut bazálu, ke kterým se limituje SMB
+ Nepodporovaný firmware v pumpě
+ Odesílat data do xDrip+
+ V xDrip+ vyberte zdroj dat 640g/Eversense
+ Glykémie z NS
+ Hodnota bazálu nahrazena minimální možnou: %s
+ Hodnota bazálu nahrazena maximální možnou: %s
+ Kalkulace glykémie
+ Kalkulace bolusového IOB
+ Kalkulace bazálního IOB
+ Kalkulace trendu
+ Kalkulace superbolusu
+ Ano
+ Ne
+ Pouze kladné
+ Pouze záporné
+ Kalkulace COB
+ Kalkulace s dočasným cílem
+ Smyčka povolena
+ APS vybráno
+ NSClient má povolení k zápisu
+ Uzavřená smyčka povolena
+ Maximální IOB nastaveno správně
+ Glykémie dostupné z vybraného zdroje
+ Bazální hodnoty nejsou zarovnané na celé hodiny: %s
+ Chybný profil: %s
+ Programování pumpy pro bolus
+ Obnovit
+ Stav
+ Aktivita
+ Žádné spojení %1$d min
+ %1$d%% (%2$d min zbývá)
+ Inicializace
+ Vypnuto díky chybě
+ Vypnuto uživatelem
+ Běží
+ Rušení dočasného bazálu
+ Nastavování doč. bazálu (%1$d%% / %2$d min)
+ Bolus (%.1f U)
+ Obnovování
+ Požadovaná operace není pumpou podporována
+ Nebezpečné použití: extended nebo multiwave bolus je aktivní. Pumpa byla vypnuta jen na 6 hodin. Povolené jsou pouze normální bolusy.
+ Nebezpečné použití: pumpa má nastavený jiný bazální profil než první. Smyčka byla zakázána. Nastavte první profil a znovu načtěte.
+ Bolus stejné velikosti už byl během poslední minuty požadován. Jako preventivní ochrana před zdvojeným bolusem byla operace zakázána.
+ Teď
+ Načítání historie pumpy
+ Historie
+ Nastavení bazálního profilu
+ V zásobníku je málo inzulínu
+ Slabá baterie v pumpě
+ Pumpa hlásí chybu E%1$d: %2$s
+ Nízký
+ Prázdný
+ Normální
+ Je vyžadována aktualizace času na pumpě
+ Varování
+ Varování o ukončeném dočasném bazálu bylo potvrzeno.
+ Pumpa nedostupná. Bolus nebyl podán
+ Provádění bolusu selhalo. Zdá se, že žádný bolus nebyl podán. Zkontrolujte pumpu a případně pošlete bolus znovu. Jako bezpečnostní opatření podání bolusu není opakováno.
+ Pouze %1$.2f U z bolusu %2$.2f bylo podáno díky chybě. Zkontrolujte pumpu a proveďte nápravu.
+ Podání bolusu a kontrola historie pumpy selhala. Zkontrolujte pumpu. Pokus bolus proběhl, načte se při příštím připojení automaticky.
+ Nedostatek inzulínu pro takovýto bolus
+ Chyba spuštění extended bolusu
+ Insight
+ Insight
+ Stav
+ Změněno
+ PUMPA ZASTAVENA
+ Stav aktualizován
+ zpět
+ s
+ Aktivní dočasný bazál
+ min zbývá
+ Historie
+ Poslední vykonaný příkaz
+ min
+ zůstává nad
+ celkem se
+ předem se s
+ Zůstat stále připojený
+ NEČINNÝ
+ SYNCHRONIZUJI
+ ZANEPRÁZDNĚN
+ SYNCHRONIZOVÁNO
+ SPOUŠTĚNÍ
+ potřebuje
+ Nepřipojen k podpůrné aplikaci!
+ Podpůrná aplikace patrně není nainstalovaná!
+ Nekompatibilní podpůrná aplikace, je požadována verze
+ Neznámý
+ Čekám na potvrzení kódu
+ Kód odmítnut
+ Připojování aplikace
+ Neautorizován
+ Nekompatibilní
+ sekund
+ minut
+ hodin
+ dní
+ týdnů
+
+ %1$d vyprší %2$s
+ Stav keep-alive
+ Statistika
+ Připojování dopředu
+ Automaticky připojit při otevření obrazovky AndroidAPS, dříve než dojde k poslání příkazu, aby se omezila doba připojování
+ Nedoporučeno kvůli vybíjení baterie
+ Vždy povolit SMB
+ Povolit SMB nezávisle na bolusech. Možno pouze se zdroji glykémií s dobrým filtrováním dat, jako např. G5
+ Povolit SMB po jídle
+ Povolit SMB 6 hodin po bolusu i při nulovém COB. Možno pouze se zdroji glykémií s dobrým filtrováním dat, jako např. G5
+ Povolit SMB se sacharidy
+ Povolit SMB, pokud zbývají aktivní sacharidy.
+ Povolit SMB s dočasnými cíli
+ Povolit SMB, pokud je aktivní dočasný cíl (aktivita, blížící se jídlo)
+ Povolit SMB s vysokými dočasnými cíli
+ Povolit SMB, pokud je aktivní vysoký dočasný cíl (aktivita)
+ Nechat běžet aktuální dočasný bazál
+ Ztlumit
+ Inzulín
+ Sacharidy
+ Tlačítka
+ Odeslání kalibrace do xDripu+, nebo otevření kalibračního dialogu na G5
+ Otevře xDrip+, tlačítko zpět vrátí do AndroidAPS
+ Množství sacharidů přidané po stisknutí tlačítka
+ Množství inzulínu přidané po stisknutí tlačítka
+ Nelze spustit aplikace CGM. Ujistěte se, že je nainstalovaná.
+ CGM
+ Prohlížeč historie
+ Oznámení při SMB
+ Ukazovat SMB na hodinkách jako normální bolus.
+ Vytvořit oznámení pro chyby
+ Vytvořit oznámení v NS pro chyby a místní výstrahy (zobrazitelné v Péči pod Ošetřením)
+ Zobrazovat predikce na hodinkách.
+ Predikce
+ Možnosti dat
+ Odesílání do Fabric
+ Automatické odesílání chyb aplikace a statistiky používání vývojářům pomocí služby fabric.io.
+ Prosím aktualizujte G5 aplikaci na podporovanou verzi
+ Spustit Dočasný cíl Aktivita
+ Spustit Dočasný cíl Blížící se jídlo
+ DoCíl
+ Nepouštět bolus, jen zaznamenat
+ Kategorie
+ Podkategorie
+ Bolus bude pouze zaznamenán
+ Automaticky doplňovat chybějící glykémie z NS
+ SMB provedené pumpou
+ Citlivost
+ Odchylky
+ Zbývající sacharidy
+ Zbývající inzulín
+ Bazály
+ Žádná akce nevybrána, nic se neprovede
+ Spustit dočas. cíl Hypo
+ Běží DEV verze. Uzavřená smyčka je zakázána.
+ Expertní mód povolen
+ Expertní mód není povolen a neběží vydaná verze
+ %.2f U/h
+ Načítám bazální profil
+ Historie v pumpě se změnila po spočítání bolusu. Bolus nebyl proveden. Prosím spočítejte ho znovu, pokud je to stále potřeba.
+ Bolus úspěšně podán, ale zápis se nezdařil. To se může stát pokud jsou podány bolusy stejné velikosti během 2 minut. Zkontrolujte historii pumpy a zadejte chybějící položky do ošetření. Ujistěte se, že nezadáváte stejnou velikost v rámci 1 minuty.
+ Odmítnut vysoký dočasný bazál, protože kalkulace neuvažovala poslední změny v historii pumpy
+ Obnovuji stav pumpy
+ Bazál na pumpě byl změněn a bude brzo aktualizován
+ Bazál na pumpě byl změněn, ale čtení selhalo
+ Kontroluji změny v historii
+ Byly načteny bolusy stejné velikosti během jedné minuty. Do ošetření je možné přidat jen jeden. Zkontrolujte pumpu a přidejte bolus do ošetření ručně tak, aby čas nekolidoval.
+ \nhttp://www.androidaps.org\n\nfacebook: \nhttp://facebook.androidaps.org
+ Poslední bolus je starší než 24h nebo v budoucnu. Zkontrolujte čas v pumpě.
+ Datum/čas podaného bolusu se zdá špatně. IOB bude chybné. Zkontrolujte čas v pumpě.
+ Přepnutí profilu chybí. Proveďte přepnutí profilu nebo ho aktivujte na záložce lokálního profilu.
+ Počet bolusů
+ Počet dočasných bazálů
+ Výukový cíl %1$d nespuštěn
+ Výukový cíl %1$d nedokončen
+ Pumpa nepodporuje dočasné bazály
+ Z pumpy nepřečten žádný platný bazál
+ Uzavřená smyčka zakázána v nastavení
+ Autosens zakázán v nastavení
+ SMB zakázáno v nastavení
+ Max bazál omezen na %1$.2f U/h: %2$s
+ limit pumpy
+ požadována kladná hodnota
+ maximální násobek bazálu
+ maximální násobek nejvyššího bazálu
+ Odeslán bolus během posledních 3 minut, SMB přeskočeno
+ Bazál nastaven správně
+ Bazál omezen na %1$d%%: %2$s
+ Bolus omezen na %1$.1f U: %2$s
+ Prodloužený bolus omezen na %1$.1f U: %2$s
+ Max IOB omezeno na %1$.1f U: %2$s
+ Sacharidy omezeny na %1$d g: %2$s
+ IOB omezeno na %1$.1f U: %2$s
+ maximální hodnota v nastavení
+ pevný limit
+ nebezpečné použití
+ Načtení stavu selhalo
+ Zaznamenat výměnu setu
+ Zaznamenat výměnu inzulínu
+ \"SMB vždy\" a \"po jídle\" zakázáno protože zdroj glykémie nepodporuje rozšířené filtrování
+ SBM není povoleno v otevřené smyčce
+ Jídlo
+ Resetovat
+ Čekání na synchronizaci času (%1$d s)
+ Odpojeno (%1$d m)
+ Automatické vkládání péče
+ Automaticky vloží výměnu inzulínu, setu, baterie a alarmů pumpy do NS
+ Maximální celkové IOB, které OpenAPS nemůže překročit [U]
+ Tato hodnota je v kontextu OpenAPS nazývána Max IOB.\nOpenAPS nikdy nepřidá inzulín, pokud je současné IOB větší než tato hodnota
+ Pumpa zastavena
+ Pumpa spuštěna
+ Pumpa pozastavena
+ Maximální doba absorpce sacharidů [h]
+ Doba, po které jsou všechny sacharidy považovány za strávené. Zbylé budou oříznuty.
+ Čas
+ Zobrazovat kolonku poznámky v dialozích ošetření
+ Další
+ Zpět
+ Průvodce nastavením
+ Dokončit
+ Vyberte jazyk
+ Požadováno: %1$.2fU Doručeno: %2$.2fU Chyba: %3$s
+ První přídavek inzulínu
+ Druhý přídavek inzulínu
+ Třetí přídavek inzulínu
+ První přídavek sacharidů
+ Druhý přídavek sacharidů
+ Třetí přídavek sacharidů
+ CGM
+ Používat pouze WiFi
+ WiFi SSID
+ Pouze při nabíjení
+ Nastavení připojení
+ Povolené SSID (oddělené středníkem)
+ Povolit připojení pro roamingu
+ Max hodnota autosens
+ Min hodnota autosens
+ Dělitel \"bolus snooze\"
+ Max násobitel denního nejvyššího bazálu
+ Max násobitel současného bazálu
+ ---
+ Typ virtuální pumpy
+ Definice pumpy
+ Bolus: Krok =%1$s\nProdl. bolus: [Krok=%2$s, Délka=%3$smin-%4$sh]\nBazál: Krok=%5$s\nDoč. bazál: %6$s (%7$s), Délka=%8$smin-%9$sh\n%10$s
+ * Rozdílné hodnoty podle rozsahu nejsou podporovány.
+ Doplňování glykémií z NS
+ Nastavení wizardu
+ Kalkulace použité ve výsledku wizardu:
+ Nastavení zobrazení
+ Obecné nastavení
+ Povolit NSClient
+ Vítejte v průvodci nastavením. Provede Vás procesem nastavení programu\n
+ Nastavení pumpy
+ Načíst status
+ Změny musí být prováděny v NS
+ Přeskočit průvodce
+ Stiskněte tlačítko níže pro povolení AndroidAPS navrhovat nebo provádět změny bazálu
+ Stiskněte tlačítko níže pro povolení Cílů. Po ukončení průvodce přejděte na záložku Cílů, abyste získali všechny funkce AndroidAPS.\n
+ Povolit Cíle
+ Nastavení APS
+ Nastavení senzitivity
+ Plugin senzitivita slouží k detekci změn v senzitivitě a k počítání COB. Více informací zde:
+ https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COB
+ NSClient slouží ke spojení s Nightscoutem. Nastavení můžete nyní přeskočit, ale nebudete schopni dokončit cíle, dokud nastavení neprovedete.
+ Pozor: Nové inzulínové profily vyžadují DIA minimálně 5h. DIA 5–6 hodin odpovídá zhruba nastavení 3h na starších typech profilů nebo v pumpě.
+ Konfigurace zdroje glykémií
+ Vyberte zdroj profilů. Pokud jde o dítě, využijte nejspíše NS profil. Pokud Vás nikdo přes NS nesleduje, budete patrně preferovat Místní profil. Uvědomte si, že nastavujete pouze zdroj profilů. Na to aby se opravdu profil začal používat, je třeba provést aktivaci profilu použitím \"Přepnutí profilu\"
+ Vyberte jeden z algoritmů. Jsou setříděné od nejstaršího po nejnovější. Novější je obvykle lepší a agresivnější, ale vyžaduje přesnější nastavení. Proto pokud se smyčkou začínáte, měli byste nejdříve vybrat jen AMA a ne ten poslední. Nezapomeňte si přečíst dokumentaci k OpenAPS a provést nastavení, než ho začnete používat.
+ Spusťte první cíl
+ Povolení
+ Získat povolení
+ Aplikace vyžaduje povolení \"umístění\", aby mohla vyhledávat BT zařízení
+ Aplikace vyžaduje přístup k úložišti, aby mohla ukládat logy
+ Požadavek
+ Nastavení inzulínu
+ Konec
+ Uživatelská nastavení
+ Formát času
+ Posun při stisknutí tlačítka
+ Zvuk při stisknutí tlačítka
+ Alarm
+ Zvuk
+ Vibrace
+ Oboje
+ Čas před vypnutím displeje [s]
+ Podsvícení [s]
+ Jednotky
+ Vypnutí [h]
+ Nízký stav zásobníku [U]
+ Uložit do pumpy
+ ZAP
+ VYP
+ Otevřít menu
+ Zavřít menu
+ Nastavení pluginu
+ Hotovo, gratulujeme!
+ Nedokončeno
+ Čas
+ %1$d. cíl
+ Poctech
+ Získávat glykémie z aplikace Poctech
+ Vysoký dočasný cíl zvýší senzitivitu
+ = 5.5]]>
+ Nízký dočasný cíl sníží senzitivitu
+
+ Chybné nastavení pumpy. Projděte si dokumentaci a přesvědčete se, že menu Quick Info se jmenuje QUICK INFO, za použití 360 configuration software.
+ Volitelný
+ Velký rozdíl v času
+ Velký rozdíl v času:\nČas v pumpě se liší minimálně o 1,5 h.\nProsím upravte čas v pumpě ručně a vymažte historii pumpy.\nPokud je to třeba, případně pozastavte smyčku alespoň na \"DIA\" hodin.
+ Vyčistit události \"AndroidAPS restartován\"
+ Nalezeno uložené nastavení
+ POZOR: Pokud aktivuje a připojíte skutečnou pumpu, AndroidAPS nakopíruje (a bude udržovat) nastavení bazálu z aktivního profilu do pumpy. Nastavení bazálu v pumpě bude přepsáno. Pokud si nejste jistí nebo nechcete přepsat bazály v pumpě, stiskněte Zrušit a opakujte přepnutí na jinou pumpu později.
+ Data ošetření neúplná
+ Nastavení údržby
+ E-mail
+ Neplatný e-mail
+ Počet logů k odeslání
+ Údržba
+ ÚDRŽBA
+ Poskytuje funkce pro údržbu (např. odesílání logů, čištění).
+ Poslat logy e-mailem
+ Smazat logy
+ Ošetření (inzulín: %1$.2f, sacharidy: %2$d, čas: %3$s) nelze přidat. Zkontrolujte a podle potřeby ručně přidejte záznam.
+ eCarbs: %1$d g (%2$d h), start: %3$d m
+ Nedostupná data o glykémiích
+ Nastavení logování
+ Obnovit výchozí
+ Chyba NSClienta. Zvažte restart NS a NSClienta.
+ SENS
+ Verze %1$s je k dispozici
+ Časový posun
+ Preferovaný režim APS
+ Výsledek
+ Kalk
+ Navazování spojení
+ Odešlete dnešní soubory protokolů vývojářům spolu s tímto časem. Neočekávaná situace.
+ Překročen maximální bolus
+ Chyba příkazu
+ Chyba rychlosti
+ Překročen limit inzulínu
+ Minimální změna pro výzvu [%]
+ Smyčka vytvoří novou žádost o změnu pouze v případě, že změna je větší než tato hodnota. Výchozí hodnota je 20 %
+
+ %1$d den
+ %1$d dnů
+ %1$d dnů
+ %1$d dnů
+
+
+ %1$d hodina
+ %1$d hodin
+ %1$d hodin
+ %1$d hodin
+
+
+ %1$d minuta
+ %1$d minut
+ %1$d minut
+ %1$d minut
+
diff --git a/app/src/main/res/values-de/insight_alerts.xml b/app/src/main/res/values-de/insight_alerts.xml
index 886122994d..ab0484beca 100644
--- a/app/src/main/res/values-de/insight_alerts.xml
+++ b/app/src/main/res/values-de/insight_alerts.xml
@@ -1,27 +1,26 @@
+
- Warnung W31: Ampulle fast leer
- Warnung W32: Batterie fast leer
- Warnung W33: Zeit/Datum ungültig
- Warnung W34: Garantie abgelaufen
- Warnung W36: TBR abgebrochen
- Warnung W38: Bolus abgebrochen
- Warnung W39: Leihdauer-Warnung
-
- Wartung M20: Keine Ampulle eingesetzt
- Wartung M21: Ampulle leer
- Wartung M22: Batterie leer
- Wartung M23: Sicherheitsabschaltung
- Wartung M24: Verstopfung
- Wartung M25: Leihdauer abgelaufen
- Wartung M26: Ampullenwechsel nicht abgeschlossen
- Wartung M27: Datenübertragung fehlgeschlagen
- Wartung M28: Zeitüberschreitung bei Pause
- Wartung M29: Batterietyp nicht eingestellt
- Wartung M30: Ampullentyp nicht eingestellt
-
- Fehler E6: Mechanikfehler
- Fehler E7: Elektronikfehler
- Fehler E10: Fehler beim Zurückfahren
- Fehler E13: Fehler in der Sprachanzeige
-
\ No newline at end of file
+ Warnung W31: Ampulle fast leer
+ Warnung W32: Batterie fast leer
+ Warnung W33: Zeit/Datum ungültig
+ Warnung W34: Garantie abgelaufen
+ Warnung W36: TBR abgebrochen
+ Warnung W38: Bolus abgebrochen
+ Warnung W39: Leihdauer-Warnung
+ Wartung M20: Keine Ampulle eingesetzt
+ Wartung M21: Ampulle leer
+ Wartung M22: Batterie leer
+ Wartung M23: Sicherheitsabschaltung
+ Wartung M24: Verstopfung
+ Wartung M25: Leihdauer abgelaufen
+ Wartung M26: Ampullenwechsel nicht abgeschlossen
+ Wartung M27: Datenübertragung fehlgeschlagen
+ Wartung M28: Zeitüberschreitung bei Pause
+ Wartung M29: Batterietyp nicht eingestellt
+ Wartung M30: Ampullentyp nicht eingestellt
+ Fehler E6: Mechanikfehler
+ Fehler E7: Elektronikfehler
+ Fehler E10: Fehler beim Zurückfahren
+ Fehler E13: Fehler in der Sprachanzeige
+
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index f3fd2e5986..3921dfc774 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -1,791 +1,1055 @@
+
- APS-Modus
- BZ verfügbar in Nightscout
- Abbrechen
- Kohlenhydrate
- Careportal
- Korrektur Bolus
- Messgerät
- Notiz
- Profil
- Sensor
- Profil
- Pumpe
- Bestätigung
- Tage
- OK
- Profil
- Nightscout-Profil
- IOB:
- Gesamt-IOB:
- Ins:
- Ratio:
- Dauer:
- Bolus-Abgabefehler
- Batterie
- OK
- Basal
- Bolus
- Mahlzeiten Bolus
- Bewegung
- Combo Bolus
- CGM-Sensor Start
- Absolut
- Kohlenhydrate
- Insulin
- Glukose-Art
- Ereignis-Typ
- Ereignis-Zeit
- Prozent
- Notiz
- OpenAPS offline
- Profilwechsel
- Pumpenkatheter Wechsel
- Frage
- Snack Bolus
- TBR Ende
- TBR Start
- Ändere deine Eingabe!
- Closed Loop
- APS
- BZ-Quelle
- Loop
- Nightscout-Version:
- Delta
- Dauer
- English
- APS
- Glukose
- Einstellungen
- Basal
- DIA
- IC
- ISF
- Ziel
- Einheiten
- Start
- Bestätigen
- OpenAPS MA
- Glukose-Status
- Eingabeparameter
- IOB-Daten
- Open Loop
- Bolus
- Rechner
- TBR
- Rate
- Grund
- Sicherheit
- Aktivität:
- Kohlenhydrate:
- Insulin:
- IOB:
- Aktives Gesamt-IOB:
- Gesamt-IOB:
- Basal-IOB
- IE
- Virtuelle Pumpe
- Reservoir
- xDrip
- VIRTUELLE PUMPE
- Verlängerter Bolus
- Basis-Basalrate
- Nicht unterstützte Version des Nightscout-Clients
- BZ
- Bolus-IOB
- Kohlenhydrate
- Korr
- Kohlenhydrat-Menge
- Insulin-Menge
- Behandlungen
- Max. erlaubter Bolus [IE]
- Max. erlaubte Kohlehydrate [g]
- Sicherheitseinstellungen Behandlungen
- Einfaches Profil
- 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
- Anfrage
- Ausführen
- Keine BZ-Werte verfügbar
- Mahlzeiten-Daten
- Letzte Ausführung
- Zuletzt abgegeben
- Plugin ist deaktiviert
- Aktuelle TBR
- Zielsetzungen
- KEIN PROFIL GESETZT
- 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
- KEIN APS AUSGEWÄHLT ODER KEIN ERGEBNIS VORHANDEN
- Bolus-Beschränkung angewendet
- Ankündigung
- BZ Test
- Kohlenhydrat Korrektur
- CGM-Sensor gesetzt
- Insulinreservoir Wechsel
- Dauer
- KH-Zeit
- Eingegeben durch
- Anderes
- Split
- Beschränkungen
- Generell
- Behandlungen
- Beschränkungen angewendet!
- Beschränkungen wurden verletzt oder Limit erreicht.
- Czech
- LOOP DEAKTIVIERT DURCH BESCHRÄNKUNGEN
- Beschränkungen angewendet
- Loop
- Manuelle Aktionen
- Kohlenhydrat-Beschränkung erreicht
- Datenbanken zurücksetzen
- Erneure Behandlungen von Nightscout
- Exit
- Fehlend
- Eingabe neuer Behandlung:
- Einstellungen exportieren nach
- Datei nicht gefunden
- Einstellungen exportiert
- Importiere Einstellungen von
- Einstellungen importiert
- Einstellungen exportieren
- Einstellungen importieren
- German
- Dieser Wert wird \"max basal\" in OpenAPS genannt.
- Maximale Menge von nicht Bolus-IOB, die OpenAPs abgeben kann.
- Bulgarian
- +XXXXXXXXXX;+YYYYYYYYYY
- Absolut
- Bolus fehlgeschlagen
- TBR abbrechen
- Temporäres Ziel
- Temporäres Ziel abbrechen
- Kommentar
- Verbunden
- Verbinden
- Pumpen-Verbindungsfehler
- DanaR Blueetooth Gerät
- Pumpen-IOB
- DanaR Pumpen-Einstellungen
- DanaR
- Getrennt
- Sensor
- Finger
- Sprache
- Prozent
- Profil neuladen
- Speichern
- Erfolgreich
- Letzte Verbindung
- Letzter Bolus:
- Profil anzeigen
- DanaR Profil-Einstellungen
- DIA [h]
- Manuell
- Einheiten (Tag)
- Ungültige Eingabe
- Wert nicht korrekt gesetzt
- Ausgewähltes Gerät nicht gefunden
- VERWERFEN
- Endbenutzervereinbarung
- Ich verstehe und stimme zu.
- 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
- SMS-Kommunikator
- Erlaubte Telefonnummern
- Auf Pumpenergebnis warten
- Kein Bluetooth-Adapter gefunden
- Ferngesteuerter Bolus ist nicht erlaubt.
- Um einen Bolus von %1$.2f IE abzugeben, antworte mit dem Code %2$s.
- Korean
- Limit erreicht
- Falsches Pumpen-Passwort!
- Korr
- Abgabe %.2f IE
- %.2f IE Bolus erfolgreich abgegeben
- Alarm
- Kohlenhydrate
- Fehler
- Glukose
- Alarme
- Bolus
- Kohlenhydrate
- Insulin-Tagesmengen
- Fehler
- Glukose
- Füllmenge
- Unterbrechungen
- Pumpen-Passwort
- Essensbolus
- Kein Profil ausgewählt
- Stopp
- Gestoppt
- STOPP GEDRÜCKT
- Löschen
- Hinzufügen
- Bearbeiten
- Basal-Stunden
- Verbindungsaufbau %1$d s
- Gültigkeit:
- Kohlenhydrate:
- QuickWizard-Einstellungen
- Aktionen
- AndroidAPS gestartet
- Loop deaktiviert
- 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
- %1$.2f IE werden abgegeben.
- Vorfüllen/Füllen
- Hochladen
- Spanish
- Basalrate:
- Pumpenbatterie entladen
- Neu laden
- Hoch-Markierung
- Niedrig-Markierung
- Niedriger Batteriestand
- Pumpe ist beschäftigt
- Pumpenfehler
- Zielbereich:
- Einheiten:
- Befüllen
- EasyUI-Modus in der Pumpe deaktivieren
- Basal-Stunde
- Button 1
- Button 2
- Button 3
- Konfiguration
- vor %d min
- AKT
- WEAR
- VP
- BEH
- SMS
- SP
- PROF
- HOME
- ZIEL
- OAPS
- LOOP
- LP
- DANA
- CONF
- CP
- Bitte verwende nur Ziffern.
- Pflichtfeld
- Telefonnummer ist nicht gültig.
- Bitte verwende nur Ziffern von %1$s - %2$s.
- Warte auf Pumpe
- Wear
- Verwende immer das kurze durchschnittliche Delta statt des einfachen Deltas.
- Das ist sinnvoll, wenn die Daten von einer ungefilterten Quelle Signalrauschen haben.
- Tagesinsulin-Limit wird bald erreicht.
- Kalibrierung an xDrip+ gesendet
- Kind
- Warteschlange leeren
- Logs leeren
- In den Zwischenspeicher kopiert
- In den Zwischenspeicher kopieren
- Bluetooth-Status
- Kumulative TDD
- Datum
- Exponentiell gewichtete TDD
- Veraltete Daten, bitte klicke auf \"Reload\".
- xds
- xDrip+ Statuszeile (Uhr)
- xDrip+ Status (Uhr)
- xDrip+ nicht installiert
- Zeige BGI
- Füge BGI zur Statuszeile hinzu.
- Wear-Einstellungen
- Zeige detailliertes IOB
- 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.
- Maximale Essens-Resorptionszeit [h]
- Resorptions-Einstellungen
- Aktivität
- Erwachsener
- Erweiterte Einstellungen
- BAS
- Basal-Schritt
- Wert der Basalrate unter Minimum. Profil nicht gesetzt!
- Bolus-Schritt
- Werde %.2f IE abgeben
- AKTIVITÄT & FEEDBACK
- Katheteralter
- CAGE
- CARBS & BOLUS
- CGM & OPENAPS
- Insulinalter
- Dauer [min]
- Pausiert
- Patientenalter
- Bitte wähle das Pateintenalter, um die Sicherheits-Limits festzulegen
- Teenager
- TBR Abgabe-Fehler
- Temporäres Ziel
- 15\'-Trend
- COB
- Nicht unterstütze Nightscout-Version
- Uploader
- UPLD
- EXT
- Firmware
- Einstellungen der virtuellen Pumpe
- Status zu Nightscout hochladen
- Superbolus
- Pausiere Loop für 10 h
- Insgesamt %d Einträge. Aktueller Wert:
- IAGE
- Batteriealter
- PUMP
- Pumpenbatterie Wechsel
- SAGE
- Insulin
- Es sind nicht alle Profile geladen!
- Werte nicht gespeichert!
- Aktiviere verlängerten Bolus in der Pumpe.
- DanaR Stats
- # Tage
- Basal
- Bolus
- Gewichtung
- Zeige verlängerten Bolus als % an.
- DanaR Korean
- DanaRv2
- Jetzt abgeben
- DIA:
- Deaktiviere Loop
- Verbindung wird getrennt
- Trenne Pumpe für 1 h
- Trenne Pumpe für 2 h
- Trenne Pumpe für 15 min
- Trenne Pumpe für 30 min
- Trenne Pumpe für 3 h
- Bald essen
- Greek
- Aktiviere Loop
- Aktiviere SuperBolus im Wizard
- Wird ausgeführt
- Verlängerter Bolus
- Fast Acting Insulin
- Novorapid, Novolog, Humalog
- Pumpenstatus wird geladen
- Stunden
- Initialisierung …
- Ungültiges oder defektes Profil!
- IOB
- Lokales Profil
- Superbolus (%1$d min)
- Loop pausiert
- Pausiert (%1$d min)
- Abbrechen
- OK
- mg/dl
- mmol/l
- Über
- Logs anzeigen
- Nicht erfolgreich - bitte Telefon prüfen
- Nicht verfügbar
- Nightscout-Client hat keine Schreibrechte. Falscher API-Key?
- Alarm-Optionen
- Aktiviere Broadcasts für andere Apps (z. B. xDrip+).
- Aktiviere lokale Broadcasts.
- Logge App-Start in Nightscout.
- Kein Upload zu Nightscout
- Alle an Nightscout gesendeten Daten werden verworfen. AAPS ist verbunden, aber Nightscout-Daten werden nicht geändert.
- Hoch
- Niedrig
- Sehr hoch
- Sehr niedrig
- Autoscroll
- Nightscout API-Key eingeben (min. 12 Zeichen)
- Nightscout API-Key
- Nightscout API-Key
- URL:
- 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. Richte temporäre Ziele ein und nutze sie (z.B. für Bewegung, unterstützend zur Hypobehandlung).
- Starte den Open Loop Modus
- VERALTETE DATEN
- Laufende Benachrichtigungen
- Öffne Einstellungen auf der Uhr
- OpenAPS
- OAPS
- OpenAPS AMA
- Skript Debug
- Wert %1$s ist außerhalb des festen Limits.
- Kalibrierung
- Button-Text:
- Verlängerten Bolus abbrechen
- Basal Wert [IE/h]
- Profil
- Setzen des Basal-Profils fehlgeschlagen
- Basal-Profil in der Pumpe aktualisiert
- Profilwechsel
- Pumpe
- Pumpe nicht initialisiert!
- Pumpe nicht initialisiert, Profil nicht gesetzt!
- Pumpe stoppen
- Pumpe pausiert
- Warteschlange:
- QuickWizard
- Aktualisiere Einträge von Nightscout
- Lösche Eintrag:
- Alle Daten erneut senden
- Möchtest du die Datenbank wirklich zurücksetzen?
- Neustart
- App wird beendet, um neue Einstellungen zu laden.
- Fortsetzen
- Russisch
- Kalibrierung %1$.1f an xDrip+ senden?
- Passwort für die Einstellungen
- TBR wird gesetzt
- Kurze Tab-Überschriften
- Zeige Warteschlange
- BZ:
- Basal:
- Bolus:
- Delta:
- IOB:
- Letzter BZ:
- Status:
- 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
- Basalraten werden aktualisiert
- Sensoralter
- Wechsle Modus von IE/d zu IE/h in der Pumpe
- Insgesamt %1$d Einträge erfolgreich hochgeladen
- Dauer der Insulinwirkung
- INS
- %1$s benötigt Batterie-Optimierungs-Whitelisting, um korrekt arbeiten zu können.
- Veraltete Daten
- Veraltete Daten seit [min]
- Autosens-Daten
- Max IE/h, die als TBR gesetzt werden können
- Maximales Basal-IOB, das OpenAPS abgeben darf [IE]
- Hoch- und Niedrig-Werte für die Übersicht- und die Smartwatch-Anzeige
- Zielbereich für die Grafikanzeige
- Stelle bei aktivierter Autosense-Funktion sicher, dass du alle gegessenen Kohlenhydrate eingibst. Ansonsten können die Kohlenhydrate-Abweichung zu falschen Resistenz-/Empfindlichkeitswerten führen!
- Sensitivität AAPS
- Sensitivität Oref0
- Durchschnittliche Sensitivität
- Verlängerter Bolus wird gesetzt
- vor %1$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 %1$.2f zu senden, antworte mit dem Code %2$s.
- 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.
- SMS-Steuerung nicht erlaubt.
- Ferngesteuerte Basal-Einstellungen sind nicht erlaubt.
- Fern-Kalibrierung ist nicht erlaubt.
- Ferngesteuerte Befehle sind nicht erlaubt.
- Erlaube externe Befehle per SMS.
- Um das Loopen für %1$d Minuten zu pausieren, antworte mit dem Code %2$s.
- TBR abgebrochen
- Das Abbrechen der TBR ist fehlgeschlagen.
- Das Starten der TBR ist fehlgeschlagen.
- TBR mitl %1$.2f IE/h für %2$d min wurde erfolgreich gestartet.
- Unbekannter Befehl oder falsche Antwort
- Falsche Dauer
- Einstellungen freischalten
- %1$.2f limitiert auf %2$.2f
- S-Bolus
- Model: %1$02X Protokoll: %2$02X Code: %3$02X
- Empfindlichkeitserkennung
- COB
- Verstehe den Open Loop und die TBR-Empfehlungen
- Verwende AMA Autosense
- Um eine BR mit %1$.2f IE/h zu starten, antworte mit dem Code %2$s.
- Fiasp
- Ultra-Rapid Oref
- Kurzes durchschnittl. Delta
- Rapid-Acting Oref
- Vorgabe: erlaubt. Erlaubt Autosense den Ziel-BZ-Bereich in Verbindung mit ISF und Basal anzupassen.
- Intervall für Autosense [h]
- 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 Werten
- Verwende es ein paar Tage und zumindest eine Nacht ohne Niedrig-Alarme (UZ), bevor du den BZ-Zielbereich senkst.
- Stelle den Closed Loop fein ein, erhöhe max IOB über 0 und setze den Zielbereich langsam herunter
- Loope eine Woche erfolgreich 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 Mahlzeitenassistenten
- Stark veraltete Daten
- Stark veraltete Daten seit [min]
- Dutch
- Peak Time [min]
- IOB Curve Peak Time
- Free-Peak Oref
- DIA von %1$f ist zu kurz - AAPS nutzt stattdessen %2$f!
- Möglicherweise ungenau, wenn zum Befüllen ein Bolus verwendet wurde!
- Verhältnis
- Aktiviere profil
- Aktivitätsdauer
- Aktivitätsziel
- BZ-Messung
- Bolus-Geschwindigkeit
- Prozentsatz
- Zeitverschiebung
- BAT
- Zeitüberschreitung der Verbindung
- Füllen
- DE-Bolus
- DS-Bolus
- E-Bolus
- Setzte Basalschritt zu 0.01 IE/h
- Tägl. Basalmenge
- Tägl. Basalmenge * 2
- TDD
- Gerät noch nicht gefunden
- DanaRS
- Dana
- Datum
- Vordefinierte temporäre Ziele
- Bald essen - Dauer
- Bald essen - Ziel
- Reservoir leer
- Ausgeführt
- Status des verzögerten Bolus wird ermittelt
- Pumpen-Einstellungen werden ermittelt
- Pumpenzeit wird ermittelt
- Status der TBR wird ermittelt
- Ungültig
- Langes durchschnittl. Delta
- ICT
- Nighscout-Client
- Basaltyp
- Zeitüberschreitung beim Pairing
- Verbinde neue Pumpe
- Restinsulin
- erneut verwenden
- Ausgewählte Pumpe
- Seriennummer
- Auf Verbindung warten
- Setze temporäre Ziele und Behandlungen mit der Uhr
- Steuerung durch die Uhr
- SENS
- Pairing OK
- 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]
- Aktualisieren
- TZ
- 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. %1$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
- Delta wird mit Dezimalstelle angezeigt.
- 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.
- APS ausgewählt
- Loop aktiviert
- Nightscout-Client hat Schreibrechte.
- Maximales IOB richtig gesetzt.
- Closed mode aktiviert
- Aktiviere zusätzliche Funktionen wie z. B. SMB
- BT Watchdog
- DexcomG5 App (patched)
- Aktivität
- %1$d%% (%2$d min verbleibend)
- Keine Verbindung zur Pumpe seit %1$d min
- Status
- Gestoppt (Benutzer)
- Gestoppt (Fehler)
- In Betrieb
- Bolusabgabe wird vorbereitet
- TBR wird abgebrochen
- TBR wird gesetzt (%1$d%% / %2$d min)
- Bolus (%1$.1f IE) wird abgegeben
- 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
- Ein gleich großer Bolus wurde in den letzten zwei Minuten angefordert. Dies ist nicht zulässig, um ungewollte Doppelboli zu verhindern und vor eventuellen Bugs zu schützen.
- Historie wird gelesen
- Basalratenprofil wird aktualisiert
- Der abgegebene Bolus konnte nicht bestätigt werden. Bitte prüfe auf der Pumpe, ob ein Bolus abgegeben wurde. Sofern ein Bolus abgegeben wurde, wird dieser zu den Behandlungen hinzugefügt, sobald erneut eine Verbindung zur Pumpe zustande kommt.
- Die Bolusabgabe ist fehlgeschlagen: Es wurde scheinbar kein Bolus abgegeben. Bitte prüfe auf der Pumpe, ob ein Bolus abgegeben wurde. Um doppelte Boli durch Programmfehler zu vermeiden, werden Boli nicht automatisch wiederholt.
- Wegen eines Fehlers wurden nur %1$.2f IE von den angeforderten %2$.2f IE abgegeben. Bitte prüfe den abgegebenen Bolus auf der Pumpe.
- Status wird aktualisiert
- Die Pumpe wird initialisiert
- Jetzt
- Der Alarm \"TBR ABBRUCH\" wurde bestätigt.
- Warnung
- Leer
- Niedrig
- Normal
- Diese Aktion wird von der Pumpe nicht unterstützt.
- Die Batterie in der Pumpe ist fast leer.
- Das Reservoir in der Pumpe ist fast leer.
- Die Pumpe zeigt einen Fehler an E%1$d: %2$s.
- Unsichere Verwendung: In der Pumpe ist nicht das erste Basalratenprofil gewählt. Der Loop wird deaktiviert, bis dies korrigiert ist.
- Unsichere Verwendung: Ein erweiterter oder Multiwave-Bolus ist aktiv. Der Loop wird für die nächsten 6 Stunden kein zusätzliches Insulin abgeben.
- Bitte aktualisiere die Uhrzeit der Pumpe.
- Nicht mehr genug Insulin im Reservoir für den Bolus
- 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.
- Basalratenprofil wird gelesen
- %.2f IE/h
- Keine Verbindung zur Pumpe: Es wurde kein Bolus abgegeben.
- Fehler bei der Abgabe eines verlängerten Bolus
- Nach der Berechnung des Bolus hat sich die Pumpenhistorie geändert. Daher wurde kein Bolus abgegeben. Bitte prüfe, ob überhaupt noch ein Bolus benötigt wird.
- Der Bolus wurde erfolgreich abgegeben, aber nicht als Behandlungseintrag gespeichert. Dies kann passieren, wenn zwei kleine, gleich große Boli innerhalb von zwei Minuten verabreicht werden. Bitte überprüfe die Pumpenhistorie und Behandlungseinträge. Verwende das Careportal, um fehlende Einträge hinzuzufügen. Stelle sicher, dass keine Einträge für genau dieselbe Minute und dieselbe Menge hinzugefügt werden.
- Status wird aktualisiert
- Die Basalrate in der Pumpe hat sich geändert und wird aktualisiert
- Das Einlesen der geänderten Basalrate in der Pumpe schlug fehl.
- Änderungen der Historie werden gesucht
- Der Import mehrerer Boli der gleichen Menge, abgegeben in der gleichen Minute, ist gescheitert: Nur ein Datensatz konnte den Behandlungen hinzugefügt werden. Bitte überprüfe die Pumpe und verwende das Careportal, um fehlende Einträge hinzuzufügen. Stelle sicher, dass keine Einträge für genau dieselbe Minute mit derselben Menge hinzugefügt werden.
- Alarm stoppen
- Bolus gestoppt
- Bolus wird gestoppt
- Basalraten beginnen nicht zur vollen Stunde: %s
- Ungültiges Profil: %s
- vor %.1f h
- Es wurde keine hohe TBR gesetzt, da nach der Berechnung Boluseinträge in der Pumpenhistorik gefunden wurden.
- Der letzte Bolus liegt mehr als 24 Stunden zurück oder liegt in der Zukunft. Prüfe bitte das Datum auf der Pumpe.
- Zeit/Datum des abgegebenen Boluses auf der Pumpe erscheint falsch, IOB ist wahrscheinlich nicht korrekt. Bitte prüfe Zeit/Datum der Pumpe.
- Anzahl TBRs
- Anzahl Boluse
- Pumpe gestoppt
- Pumpe gestartet
- Pumpe pausiert
- mit
- Wlan SSID
- Woche
- Warte auf Zeitsynchronisierung (%d Sek.)
- Warte auf Code-Bestätigung
- Benutze nur WLAN Verbindung
- Benutze Super Micro Bolus anstelle von temporären Basalraten, um eine schnellere Wirkung zu erreichen.
- Unsichere Benutzung
- Zeit
- Dritte KH-Erhöhung
- Dritte Insulin-Erhöhung
- Temp. Basal der Pumpe
- Unterkategorie
- Bleibe immer verbunden
- Starte Hypo TT
- Starte Essen TT
- Starte Aktivität TT
- Sensitivität
- Sendet eine Kalibierung an xDrip+ oder öffnet den G5 Kalibrierungs-Dialog.
- Zweite Insulin-Erhöhung
- Zweite KH-Erhöhung
- Sekunde
- Entwickler-Version. Closed Loop ist nicht verfügbar.
- Erfasse Katheter-Wechsel
- Erfasse Reservoir-Wechsel
- benötigt
- Abweichungen
- Tag
- Erlaubte SSIDs (Semikolon getrennt)
- Erlaube Verbindung bei Roaming
- Autosense passt Zielwerte an.
- Insulin resistenter Erwachsener
- Aktiviere UAM
- Aktiviere SMB
- Erkennung von unangekündigten Mahlzeiten
- Hypo-Dauer
- Hypo-Zielwert
- BZ verfügbar von gewählter Quelle.
- Geändert
- PUMPE GESTOPPT
- Aktive TBR
- Statistiken
- Aktiviere SMB immer
- Aktiviere SMB nach Mahlzeiten
- Aktiviere SMB während COB
- Aktiviere SMB während temporären Zielwerten
- Vorhersagen
- Daten-Auswahl
- SMB in Einstellungen deaktiviert.
- Mahlzeiten
- Hartes Limit
- Lesen des Status fehlgeschlagen
- Getrennt (%1$d m)
- Automatische Careportal-Ereignisse
- Erste Insulin-Erhöhung
- Erste KH-Erhöhung
- Nur wenn geladen wird
- Verbindungs-Einstellungen
- Zielsetzung %d nicht gestartet.
- Zielsetzung %d nicht abgeschlossen.
- Bolus nur erfassen
- Bolus wird nur erfasst.
+ Sicherheitseinstellungen der Behandlungen
+ Max. erlaubter Bolus [IE]
+ Max. erlaubte Kohlenhydrate [g]
+ Einstellungen
+ Erneure Behandlungen von Nightscout
+ Datenbanken zurücksetzen
+ Möchtest du die Datenbank wirklich zurücksetzen?
+ Schließen
+ Benutze verlängerten Bolus für hohe TBR (>200%).
+ DanaR Blueetooth--Gerät
+ Verwende absolute statt prozentuale Basalwerte beim Upload zu NightScout.
+ Bitte starte dein Telefon neu oder starte AndroidAPS in den System-Einstellungen neu.\nAndernfalls wird AndroidAPS nichts protokollieren (wichtig zum Nachverfolgen und Verifizieren, dass der Algorithmus korrekt funktioniert)!
+ Schaltflächen, um schnell auf geläufige Funktionen zugreifen zu können
+ Gib erweiterte Tagebuch-Einträge ein.
+ Dient zum Konfigurieren der aktiven Plugins
+ Das Programm kennenlernen
+ Zeigt die Essens-Vorlagen aus Nightscout an
+ Insulinprofil für Humalog und NovoRapid / NovoLog
+ Insulinprofil für Fiasp
+ Erlaubt dir, das Wirkmaximum der Insulinaktivität zu definieren, und sollte nur von erfahrenen Anwendern genutzt werden
+ Aktiviere oder deaktiviere die Anwendung, die den Loop ausführt.
+ Synchronisiert deine Daten mit Nightscout
+ Stand des Algorithmus in 2016
+ Stand des Algorithmus in 2017
+ Der aktuellste Algorithmus für erfahrene Nutzer
+ Zeigt den aktuellen Status deines Loops und Knöpfe für die geläufigsten Aktionen an
+ Zeigt eine fortlaufende Benachrichtigung mit einer kurzen Übersicht darüber, was dein Loop derzeit tut
+ Definiere ein Profil, das auch offline verfügbar ist.
+ Stellt das Profil zur Verfügung, das in Nightscout definiert ist
+ Definiere ein Profil mit nur einem Zeitblock.
+ Pumpen-Integration für Accu-Chek Combo Pumpen; erfordert, dass ruffy installiert ist
+ Pumpen-Integration für DANA Diabecare R Pumpen
+ Pumpen-Integration für koreanische DANA Diabecare R Pumpen
+ Pumpen-Integration für DANA Diabecare R Pumpen mit aktualisierter Firmware
+ Pumpen-Integration für Dana Diabecare RS Pumpen
+ Pumpen-Integration für Accu-Chek Insight Pumpen, erfordert, dass SightRemote installiert ist
+ Pumpen-Integration für Personen, die täglich mehrere Injektionen für ihre Diabetestherapie vornehmen
+ Pumpen-Integration für Pumpen, die noch nicht über einen Treiber verfügen (Open Loop)
+ Die Sensitivität wird genauso wie bei Oref0 berechnet, aber Du kannst dafür ein Zeitfenster bestimmen. Die minimale Kohlenhydrat-Absorptionsrate wird aus der maximalen Absorptionsdauer aus den Einstellungen abgeleitet.
+ Die Sensitivität wird aus den Daten der letzten 24 Stunden berechnet und Kohlenhydrate (falls nicht bereits absorbiert) werden nach der in den Einstellungen angegebenen Zeit als absorbiert betrachtet.
+ Die Sensitivität wird aus den Daten der letzten 8 Stunden berechnet und Kohlenhydrate (falls nicht bereits absorbiert) werden nach der in den Einstellungen angegebenen Zeit als absorbiert betrachtet. Das Plugin bezieht Zeiträume, in denen UAM annimmt, dass Kohlenhydrate aktiv waren, nicht mit in die Berechnung ein.
+ Die Sensitivität wird aus den Abweichungen errechnet. Dabei werden neuere Abweichungen stärker gewichtet als ältere. Die minimale Kohlenhydrat-Aufnahme wird aus der in den Präferenzen angegebenen maximalen Kohlenhydrat-Resorptionszeit abgeleitet. Dieser Algorithmus reagiert am schnellsten auf Änderungen der Empfindlichkeit.
+ Empfange Blutzucker-Werte von der gepatchten Dexcom G5-App.
+ Empfange Blutzucker-Werte von Glimp.
+ Empfange Blutzucker-Werte vom 600SeriesAndroidUploader.
+ Lade Blutzucker-Daten von Nightscout
+ Empfange Blutzucker-Werte von xDrip.
+ Speichert alle eingegebenen Behandlungen
+ Überwache und steuere AndroidAPS mit Deiner WearOS-Smartwatch.
+ Zeige Loop-Informationen auf Deinem xDrip+-Watchface.
+ Steuere AndroiAPS fern mittels SMS-Anweisungen.
+ Start
+ Bestätigen
+ Einheiten
+ DIA
+ IC
+ ISF
+ Basal
+ Ziel
+ KEIN PROFIL GESETZT
+ Insulin:
+ Kohlenhydrate:
+ IOB:
+ IOB:
+ Aktivität:
+ Gesamt IOB:
+ Ges. IOB Aktivität:
+ Dauer:
+ Verhältnis:
+ Ins:
+ IOB:
+ Gesamt IOB:
+ Insulin-Menge
+ Kohlenhydrat-Menge
+ BZ
+ TZ
+ Kohlenhydrate
+ Korr
+ IE
+ Bolus-IOB
+ Ausführen
+ VIRTUELLE PUMPE
+ Basis-Basalrate
+ TBR
+ Verzögerter Bolus
+ Batterie
+ Reservoir
+ OK
+ Letzte Ausführung
+ Eingabeparameter
+ Glukose-Status
+ Aktuelle TBR
+ IOB-Daten
+ Profil
+ Mahlzeiten-Daten
+ Ergebnis
+ Keine BZ-Werte verfügbar
+ Keine Anpassung benötigt
+ Anfrage
+ Rate
+ Dauer
+ Grund
+ Glukose
+ Delta
+ Delta:
+ Konfiguration
+ Zielsetzungen
+ OpenAPS MA
+ Übersicht
+ Nightscout-Profil
+ Einfaches Profil
+ TBR
+ Behandlungen
+ Virtuelle Pumpe
+ Careportal
+ Pumpe
+ Welche Pumpe möchtest Du mit AndroidAPS nutzen?
+ Behandlungen
+ Welches Plugin soll zum Verarbeiten von Behandlungen genutzt werden?
+ Profil
+ Welches Profil soll AndroidAPS nutzen?
+ APS
+ Welcher APS-Algorithmus soll Therapie-Anpassungen vornehmen?
+ Allgemein
+ Dies sind einige generelle Plugins, die Du vielleicht hilfreich findest.
+ Welche Beschränkungen werden angewendet?
+ Tage
+ Beschränkungen
+ Loop
+ Loop
+ Nutze dies, um die Loop-Integration von AndroidAPS zu aktivieren.
+ APS
+ Beschränkungen angewendet
+ Temp. Basal der Pumpe
+ Zuletzt abgegeben
+ OK
+ Abbrechen
+ KEIN APS AUSGEWÄHLT ODER KEIN ERGEBNIS VORHANDEN
+ Sicherheit
+ Plugin ist deaktiviert
+ Beschränkungen wurden verletzt oder Limit erreicht.
+ Bolus-Abgabefehler
+ TBR Abgabe-Fehler
+ Basal-Wert [%]
+ % (100% = aktuell)
+ Akzeptiere neue TBR:
+ Bolus
+ Rechner
+ Beschränkungen angewendet!
+ Bestätigung
+ Gebe neue Behandlung ein:
+ Bolus
+ Bolus:
+ Basal
+ Basal:
+ Kohlenhydrate
+ Ändere deine Eingabe!
+ Setze neuen verlängerten Bolus:
+ BZ-Quelle
+ Woher soll AndroidAPS seine Blutzuckerwerte beziehen?
+ xDrip
+ APS-Modus
+ Closed Loop
+ Open Loop
+ Loop deaktiviert
+ Deaktiviere Loop
+ Aktiviere Loop
+ Neue Empfehlung verfügbar
+ Nicht unterstützte Version des Nightscout-Clients
+ Nicht unterstütze Nightscout-Version
+ Nightscout-Client ist nicht installiert. Eintrag verloren!
+ BZ verfügbar in Nightscout
+ Pumpen-Status verfügbar in Nightscout
+ Manuelle Aktionen
+ LOOP DEAKTIVIERT DURCH BESCHRÄNKUNGEN
+ Basal-IOB
+ Bolus-Beschränkung angewendet
+ Kohlenhydrat-Beschränkung erreicht
+ BZ Test
+ Ankündigung
+ Notiz
+ Frage
+ Bewegung
+ Pumpenkatheter Wechsel
+ CGM-Sensor gesetzt
+ CGM-Sensor Start
+ Insulinreservoir Wechsel
+ Profil Wechsel
+ Snack Bolus
+ Mahlzeiten Bolus
+ Korrektur Bolus
+ Combo Bolus
+ TBR Start
+ TBR Ende
+ Kohlenhydrat Korrektur
+ OpenAPS offline
+ Ereignis Typ
+ Anderes
+ Messgerät
+ Sensor
+ Kohlenhydrate
+ Insulin
+ KH-Zeit
+ Split
+ Dauer
+ Prozent
+ Absolut
+ Notiz
+ Ereignis-Zeit
+ Profil
+ Eingegeben durch
+ Glukose-Art
+ Bisher noch kein Profil von Nightscout geladen
+ TBR
+ Verlängerter Bolus
+ Nightscout-Version:
+ Fehlend
+ Einstellungen exportiert
+ Einstellungen exportieren nach
+ Importiere Einstellungen von
+ Einstellungen importiert
+ Datei nicht gefunden
+ Einstellungen exportieren
+ Einstellungen importieren
+ Max IE/h, die als TBR gesetzt werden können
+ Dieser Wert wird \"max basal\" in OpenAPS genannt.
+ Maximales Basal-IOB, das OpenAPS abgeben darf [IE]
+ Maximale Menge von nicht Bolus-IOB, die OpenAPs abgeben kann.
+ VERWERFEN
+ DanaR
+ Verbinden
+ Verbunden
+ Getrennt
+ DanaR Pumpen-Einstellungen
+ Endbenutzervereinbarung
+ 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 ALLE NOTWENDIGEN KRANKHEITSKOSTEN, SERVICELEISTUNGEN, REPARATUREN ODER KORREKTUREN.
+ Ich verstehe und stimme zu.
+ Speichern
+ Kein Bluetooth-Adapter gefunden
+ Ausgewähltes Gerät nicht gefunden
+ Pumpen-Verbindungsfehler
+ Pumpen-IOB
+ Tägliche Einheiten
+ Letzter Bolus:
+ vor %.1f h
+ Ungültige Eingabedaten
+ Wert nicht korrekt gesetzt
+ Profil neuladen
+ Profil anzeigen
+ Ausgeführt
+ Kommentar
+ Erfolgreich
+ Prozent
+ Absolut
+ TBR abbrechen
+ SMS-Kommunikator
+ Auf Pumpenergebnis warten
+ Erlaubte Telefonnummern
+ +XXXXXXXXXX;+YYYYYYYYYY
+ Um einen Bolus von %1$.2f IE abzugeben, antworte mit dem Code %2$s.
+ Um die Kalibrierung %1$.2f zu senden, antworte mit dem Code %2$s.
+ Bolus fehlgeschlagen
+ %.2f IE Bolus erfolgreich abgegeben
+ Werde %.2f IE abgeben
+ Bolus %.2f IE erfolgreich abgegeben
+ Abgabe %1$.2f IE
+ Erlaube externe Befehle per SMS
+ Ferngesteuerter Bolus ist nicht erlaubt
+ Finger
+ Sensor
+ Manuell
+ Temporäres Ziel
+ Temporäres Ziel abbrechen
+ DanaR Profil-Einstellungen
+ DIA [h]
+ Dauer der Insulinwirkung
+ Fehler beim Aktualisieren der Basalrate
+ Neu laden
+ Hochladen
+ E-Bolus
+ DS-Bolus
+ DE-Bolus
+ Fehler
+ Befüllen
+ Basal-Stunde
+ Glukose
+ Kohlenhydrate
+ Alarm
+ Insgesamt %1$d Einträge hochgeladen
+ S-Bolus
+ Alarme
+ Basal-Stunden
+ Boli
+ Kohlenhydrate
+ Insulin-Tagesmengen
+ Fehler
+ Glukose
+ Füllmenge
+ Unterbrechungen
+ Verbindungsaufbau seit %1$d s
+ Pumpen-Passwort
+ Falsches Pumpen-Passwort!
+ Pumpe ist beschäftigt
+ Abgegeben
+ Gestoppt
+ Bolus gestoppt
+ Bolus wird gestoppt
+ Verstopfung
+ Stopp
+ STOPP GEDRÜCKT
+ Warte auf Pumpe
+ %1$.2f IE werden abgegeben.
+ Konfiguriere die Anzeige und das Monitoring (Nightscout) und analysiere Basal-Raten und Faktoren
+ Verifiziere, dass BZ- und Pumpen-Insulin-Daten in Nightscout erfolgreich hoch geladen werden.
+ Starte den Open Loop Modus
+ Erprobe den Open Loop Modus für ein paar Tage und setze manuell temporäre Basal-Raten. Richte temporäre Ziele ein und nutze sie (z.B. für Bewegung, unterstützend zur Hypobehandlung).
+ Verstehe den Open Loop und die TBR-Empfehlungen
+ Entscheide anhand von dieser Erfahrung, wie hoch max Basal sein sollte, und übernehme den Wert in die Pumpen- und AAPS-Einstellungen.
+ Starte den Closed Loop Modus mit Abschaltung bei niedrigen Werten
+ Erprobe den Closed Loop Modus mit max IOB = 0 für ein paar Tage, ohne zu viele Unterzuckerungen zu haben.
+ Stelle den Closed Loop fein ein, erhöhe max IOB über 0 und setze den Zielbereich langsam herunter
+ Verwende es ein paar Tage und zumindest eine Nacht ohne Niedrig-Alarme (UZ), bevor du den BZ-Zielbereich senkst.
+ Passe, falls notwendig, Basal und Faktoren an und aktiviere dann die Autosense-Funktion
+ Loope eine Woche erfolgreich am Tag mit regelmäßiger Kohlenhydrat-Eingabe.
+ Aktiviere zusätzliche Funktionen wie z. B. den Mahlzeitenassistenten
+ Aktiviere zusätzliche Funktionen wie z. B. SMB
+ Lies das Wiki und hebe maxIOB an, damit SMB funktioniert. Ein guter Startwert ist
+maxIOB = durchschnittlicher Essensbolus + 3 x maximale Basalrate
+ Limit erreicht
+ Kein Profil ausgewählt
+ Loop wurde deaktiviert.
+ Lopp wurde aktiviert
+ Loop ist deaktiviert.
+ Loop ist aktiviert.
+ %1$.2f limitiert auf %2$.2f
+ Wert %1$s ist außerhalb des festen Limits.
+ Ferngesteuerte Basal-Einstellungen sind nicht erlaubt.
+ Ferngesteuerte Befehle sind nicht erlaubt.
+ Um eine BR mit %1$.2f IE/h zu starten, antworte mit dem Code %2$s.
+ Um das Loopen für %1$d Minuten zu pausieren, antworte mit dem Code %2$s.
+ TBR mit %1$.2f IE/h für %2$d min wurde erfolgreich gestartet
+ Das Starten der TBR ist fehlgeschlagen.
+ Um die TBR abzubrechen, antworte mit dem Code %s.
+ TBR abgebrochen
+ Das Abbrechen der TBR ist fehlgeschlagen.
+ Unbekannter Befehl oder falsche Antwort
+ QuickWizard
+ QuickWizard-Einstellungen
+ Schaltflächen-Text:
+ Kohlenhydrate:
+ Gültigkeit:
+ Hinzufügen
+ Bearbeiten
+ Löschen
+ Essensbolus
+ Korr
+ Aktionen
+ AndroidAPS gestartet
+ Zu Nightscout nur hochladen (keine Synchronisation)
+ Zu Nightscout nur hochladen. Nicht wirksam bei BZ-Werten, wenn nicht eine lokale Quelle wie z. B. xDrip gewählt wird; nicht wirksam bei Profilen, wenn Nightscout-Profile verwendet werden.
+ Pumpe nicht initialisiert!
+ Pumpe nicht initialisiert, Profil nicht gesetzt!
+ Vorfüllen/Füllen
+ Bitte vergewissere Dich, dass die Füllmenge den Eigenschaften des Katheters entspricht!
+ Andere
+ Füll-/Vorfüll-Standardmengen
+ Schaltfläche 1
+ Schaltfläche 2
+ Schaltfläche 3
+ Einheiten:
+ mg/dL
+ mmol/l
+ DIA:
+ Zielbereich:
+ Zielbereich für die Grafikanzeige
+ Hoch- und Niedrig-Werte für die Übersicht- und die Smartwatch-Anzeige
+ Niedrig-Markierung
+ Hoch-Markierung
+ Wear
+ Alle Daten erneut senden
+ Öffne Einstellungen auf der Uhr
+ Pumpenfehler
+ Niedriger Batteriestand
+ Pumpe stoppen
+ Pumpenbatterie entladen
+ DanaR Korean
+ Basalrate:
+ Setzen des Basal-Profils fehlgeschlagen
+ Basal-Profil in der Pumpe aktualisiert
+ EasyUI-Modus in der Pumpe deaktivieren
+ Aktiviere verlängerten Bolus in der Pumpe.
+ Wechsel den Modus von IE/d zu IE/h in der Pumpe
+ Wert der Basalrate unter Minimum. Profil nicht gesetzt!
+ BZ:
+ Letzter BZ:
+ ICT
+ MM640g
+ Laufende Benachrichtigungen
+ VERALTETE DATEN
+ %1$d min her
+ %1$d\' her
+ Lokales Profil
+ OpenAPS AMA
+ Kurzes durchschnittl. Delta
+ Langes durchschnittl. Delta
+ Array mit %1$d elementen.\nWert:
+ Autosens-Daten
+ Skript Debug
+ Verwende AMA Autosense
+ Aktualisiere Einträge von Nightscout
+ Lösche Behandlungen in der Zukunft
+ Bald essen
+ Hypo
+ Aktivität
+ Lösche Eintrag:
+ DanaR Statistiken
+ Kumulative TDD
+ Exponentiell gewichtete TDD
+ Basal
+ Bolus
+ TDD
+ Datum
+ Verhältnis
+ # Tage
+ Gewichtung
+ Möglicherweise ungenau, wenn zum Befüllen ein Bolus verwendet wurde!
+ Veraltete Daten, bitte klicke auf \"RELOAD\"
+ Tägl. Basalmenge
+ Tägl. Basalmenge * 2
+ Initialisierung …
+ AKT
+ KONF
+ LOOP
+ EP
+ OAPS
+ LP
+ DANA
+ HOME
+ VP
+ PROF
+ BEH
+ CP
+ ZIEL
+ WEAR
+ SMS
+ Kurze Tab-Überschriften
+ Verwende immer das kurze durchschnittliche Delta statt des einfachen Deltas
+ Das ist sinnvoll, wenn die Daten von einer ungefilterten Quelle Signalrauschen haben.
+ Erweiterte Einstellungen
+ Model: %1$02X Protokoll: %2$02X Code: %3$02X
+ Profil
+ 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 (im Standardfall) vierfache 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äts-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 Basalraten abgesenkt und wie sehr ISF und BZ-Zielwerte erhöht werden können.
+ Autosense passt Zielwerte an
+ Vorgabe: erlaubt.\nErlaubt Autosense den Ziel-BZ-Bereich in Verbindung mit ISF und Basal anzupassen.
+ Standarwert: 2\nBolus snooze (\"Bolus-Schlummer\") bremst den Loop nach einem Mahleiten-Bolus, damit dieser nicht mit niedrigen TBR reagiert, wenn Du gerade gegessen hast. Beispiel: Der Standardwert 2 bewirkt, dass bei einem 3 Stunden DIA der Bolus snooze während 1.5 Stunden nach dem Bolus linear ausläuft (3 h Dia / 2 = 1.5 h Bolus snooze).
+ Standardwert: 3.0 (AMA) or 8.0 (SMB)\nDies ist eine Einstellung für die Standard-Kohlenhydrat-Absorptionswirkung pro 5 Minuten. Der Standardwert ist 3 mg/dl/5min (AMA) bzw. 8 mg/dl/5min (SMB). Dies wirkt sich darauf aus, wie schnell der COB-Wert fällt und wieviel KH-Absorption bei der Berechnung des vorhergesagten BZ angenommen wird, wenn der BZ stärker als erwartet fällt oder nicht so stark wie erwartet steigt.
+ Achtung!\nNormalerweise musst Du diese Werte nicht ändern. Bitte KLICKE HIER und LESE den Text. Verändere Werte erst, wenn Du den Inhalt des Textes verstanden hast.
+ Bitte verwende nur Ziffern.
+ Bitte verwende nur Ziffern von %1$s - %2$s.
+ Pflichtfeld
+ Telefonnummer ist nicht gültig
+ Falsche/ungültige Telefonnummer
+ Kalibrierung
+ Kalibrierung %1$.1f an xDrip+ senden?
+ xDrip+ nicht installiert
+ Kalibrierung an xDrip+ gesendet
+ Fern-Kalibrierung ist nicht erlaubt.
+ Kalibrierung gesendet. Das Empfangen von Kalbrierungen muss in xDrip+ aktiviert sein.
+ xDrip+ hat die Kalbrierung nicht erhalten
+ Pumpe pausiert
+ Pumpenstatus wird geladen
+ TBR wird gesetzt
+ TBR wird abgebrochen
+ Verlängerter Bolus wird gesetzt
+ Verlängerter Bolus wird abgebrochen
+ Basalraten werden aktualisiert
+ Verbindung wird getrennt
+ Wird ausgeführt
+ Einstellungen der virtuellen Pumpe
+ Status zu Nightscout hochladen
+ Falsches Passwort
+ Passwort für die Einstellungen
+ Einstellungen freischalten
+ Tagesinsulin-Limit wird bald erreicht
+ Nighscout-Client
+ NSCl
+ URL:
+ Auto-Scrollen
+ Neustart
+ Nightscout-Client
+ Nightscout-URL
+ Nightscout-URL eingeben
+ Nightscout API-Key
+ Nightscout API-Key
+ Nightscout API-Key eingeben (min. 12 Zeichen)
+ Jetzt abgeben
+ Warteschlange leeren
+ Zeige Warteschlange
+ Warteschlange:
+ Status:
+ Pausiert
+ Logs leeren
+ Nightscout-Client hat keine Schreibrechte. Falscher API-Key?
+ Wear-Einstellungen
+ Zeige detailliertes IOB
+ Differenziere IOB in Bolus- und Basal-IOB auf dem Watchface
+ Nicht erfolgreich - bitte Telefon prüfen
+ Nicht verfügbar
+ Patientenalter
+ Kind
+ Teenager
+ Erwachsener
+ Insulin resistenter Erwachsener
+ Bitte wähle das Patientenalter, um die Sicherheits-Limits festzulegen
+ Glimp
+ %s benötigt eine deaktivierte Akku-Leistungsoptimierung, um korrekt arbeiten zu können.
+ Loop pausiert
+ Pausiert (%1$d min)
+ Superbolus (%1$d m)
+ Pausiere Loop für 1 h
+ Pausiere Loop für 2 h
+ Pausiere Loop für 3 h
+ Pausiere Loop für 10 h
+ Trenne Pumpe für 15 min
+ Trenne Pumpe für 30 min
+ Trenne Pumpe für 1 h
+ Trenne Pumpe für 2 h
+ Trenne Pumpe für 3 h
+ Fortsetzen
+ Falsche Dauer
+ Loop pausiert
+ Loop wurde fortgesetzt
+ 15\'-Trend
+ COB
+ Superbolus
+ Logge App-Start in Nightscout
+ App wird beendet, um neue Einstellungen zu laden.
+ DanaRv2
+ Insulin
+ Welchen Insulin-Typen verwendest Du?
+ Schnell wirkendes Insulin
+ NovoRapid, NovoLog, Humalog
+ Fiasp
+ INS
+ Aktiviere Superbolus im Wizard
+ 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!
+ IOB
+ COB
+ Firmware
+ Letzte Verbindung
+ Bluetooth-Status
+ Über
+ SMS-Steuerung nicht erlaubt
+ xDrip+ Status (Uhr)
+ xDrip+ Statuszeile (Uhr)
+ xds
+ Zeige BGI
+ Füge BGI zur Statuszeile hinzu.
+ Kein Upload zu Nightscout
+ Alle an Nightscout gesendeten Daten werden verworfen. AAPS ist verbunden, aber Nightscout-Daten werden nicht geändert.
+ Basal-Schritt
+ Bolus-Schritt
+ Verlängerter Bolus
+ Temporäres Ziel
+ Verlängerten Bolus abbrechen
+ Sensoralter
+ Katheteralter
+ Insulinalter
+ Stunden
+ Basaltyp
+ Ungültiges oder defektes Profil!
+ Profilwechsel
+ Batteriealter
+ Pumpenbatterie Wechsel
+ Alarm-Optionen
+ Sehr hoch
+ Hoch
+ Niedrig
+ Sehr niedrig
+ Veraltete Daten
+ Stark veraltete Daten
+ Veraltete Daten seit [min]
+ Stark veraltete Daten seit [min]
+ Intervall für Autosense [h]
+ Anzahl der vergangenen Stunden, die verwendet werden, um die Sensitivität zu erkennen (Zeit, in der KH resorbiert werden, wird nicht berücksichtigt)
+ Pumpe
+ OpenAPS
+ Uploader
+ Sensitivitätserkennung
+ Welcher Sensitivitäts-Algorithmus soll verwendet werden?
+ SENS
+ Sensitivität Oref0
+ Sensitivität Oref1
+ Sensitivität AAPS
+ Resorptions-Einstellungen
+ Maximale Essens-Resorptionszeit [h]
+ Zeit in Stunden, in der zu erwarten ist, dass alle Kohlenhydrate resorbiert sein werden.
+ Zeige verlängerten Bolus als % an
+ SAGE
+ IAGE
+ CAGE
+ BAT
+ OASP
+ UPLD
+ BAS
+ EXT
+ Bildschirm aktiv lassen
+ Hindere Android daran, den Bildschirm abzuschalten. Dies erhöht den Energieverbrauch, wenn das Gerät nicht an einem Ladegerät angeschlossen ist.
+ Stelle bei aktivierter Autosense-Funktion sicher, dass du alle eingenommenen Kohlenhydrate eingibst. Ansonsten können die Kohlenhydrat-Abweichungen zu falschen Sensitivitätswerten führen!
+ Durchschnittliche Sensitivität
+ OK
+ Abbrechen
+ Es sind nicht alle Profile geladen!
+ Werte nicht gespeichert!
+ Aktiviere Broadcasts für andere Apps (z. B. xDrip+)
+ Aktiviere lokale Broadcasts
+ AKTIVITÄT & FEEDBACK
+ CARBS & BOLUS
+ CGM & OPENAPS
+ PUMPE
+ Basal Wert [IE/h]
+ Dauer [min]
+ OpenAPS SMB
+ SMB
+ Aktiviere UAM
+ Aktiviere SMB
+ Benutze Super Micro Bolus anstelle von temporären Basalraten, um eine schnellere Wirkung zu erreichen.
+ Erkennung von unangekündigten Mahlzeiten
+ Wirkungshoch der IOB-Kurve
+ Wirkungshoch [min]
+ Free-Peak Oref
+ Rapid-Acting Oref
+ Ultra-Rapid Oref
+ DIA von %1$f ist zu kurz - AAPS nutzt stattdessen %2$f!
+ Aktiviere Profil
+ Datum
+ Ungültig
+ Auf Verbindung warten
+ Kopplung OK
+ Zeitüberschreitung beim Pairing
+ KOPPLUNG
+ Pumpe noch nicht gefunden
+ Reservoir leer
+ Alarm BZ-Messung
+ Restinsulin
+ DanaRS
+ Dana
+ Ausgewählte Pumpe
+ Verbinde neue Pumpe
+ Bolus-Geschwindigkeit
+ Setze Basalschritt auf 0.01 IE/h
+ Seriennummer
+ Prozentsatz
+ Zeit Verschiebung
+ Vordefinierte temporäre Ziele
+ Bald essen - Dauer
+ Bald essen - Ziel
+ Aktivitätsdauer
+ Aktivitäts - Zielwert
+ Hypo-Dauer
+ Hypo - Zielwert
+ Füllen
+ Status des verzögerten Bolus wird ermittelt
+ Status des Bolus wird ermittelt
+ Status der TBR wird ermittelt
+ Pumpen-Einstellungen werden ermittelt
+ Zeiteinstellung der Pumpe wird ermittelt
+ Erneut verwenden
+ Steuerung durch die Uhr
+ Setze temporäre Ziele und Behandlungen mit der Uhr
+ Zeitüberschreitung der Verbindung
+ Essen
+ g
+ min
+ h
+ ]]>
+ kJ
+ En
+ Prot
+ Ft
+ ]]>
+ Warte auf Ende der Bolus-Abgabe. %1$d sec verbleiben.
+ Ereignis wird verarbeitet
+ Bolus-Abgabe gestartet
+ Befehl wird zurzeit ausgeführt
+ Pumpen-Treiber korrigiert
+ Pumpe ist nicht erreichbar
+ BZ-Werte fehlen
+ Benutze Systemmeldungen für Alarme und Meldungen
+ Lokale Alarme
+ Alarm, wenn keine Glukose-Daten empfangen werden
+ Alarm, wenn die Pumpe nicht erreichbar ist
+ Grenzwert Pumpe ist nicht erreichbar [min]
+ Wichtiger Alarm
+ INFO
+ Bluetooth
+ BT Watchdog
+ Deaktiviert Bluetooth kurzzeitig, falls keine Verbindung zur Pumpe besteht. Dies kann für Smartphones mit Verbindungsproblemen nützlich sein.
+ DexcomG5 App (gepatcht)
+ Speichere BZ-Werte in Nightscout
+ G5 Upload Einstellungen
+ Poctech-Upload-Einstellungen
+ Zeige detailliertes Delta
+ Delta wird mit Dezimalstelle angezeigt.
+ SMB-Basal-Limit in Minuten
+ 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: %s
+ Basal-Wert wurde durch größt möglichen Wert ersetzt: %s
+ BZ Berechnung
+ Bolus-IOB Berechnung
+ Basal-IOB Berechnung
+ Trend Berechnung
+ Superbolus Berechnung
+ Ja
+ Nein
+ Nur positive
+ Nur negative
+ COB Berechnung
+ Temporäres Ziel Berechnung
+ Loop aktiviert
+ APS ausgewählt
+ Nightscout-Client hat Schreibrechte
+ Closed mode aktiviert
+ Maximales IOB richtig gesetzt
+ BZ verfügbar von gewählter Quelle
+ Basalraten beginnen nicht zur vollen Stunde: %s
+ Ungültiges Profil: %s
+ Bolusabgabe wird vorbereitet
+ Aktualisieren
+ Status
+ Aktivität
+ Keine Verbindung seit %1$d min
+ %1$d%% (%2$d min verbleibend)
+ Die Pumpe wird initialisiert
+ Gestoppt (Fehler)
+ Gestoppt (Benutzer)
+ In Betrieb
+ TBR wird abgebrochen
+ TBR wird gesetzt (%1$d%% / %2$d min)
+ Bolus (%1$.1f IE) wird abgegeben
+ Status wird aktualisiert
+ Diese Aktion wird von der Pumpe nicht unterstützt
+ Unsichere Verwendung: Ein verlängerter oder Multiwave-Bolus ist aktiv. Der Loop wird für die nächsten 6 Stunden kein zusätzliches Insulin abgeben. Nur normale Boli werden vom Loop unterstützt.
+ Unsichere Verwendung: In der Pumpe ist nicht das erste Basalratenprofil gewählt. Der Loop wird deaktiviert, bis dies korrigiert ist.
+ Ein gleich großer Bolus wurde in den letzten zwei Minuten angefordert. Dies ist nicht zulässig, um ungewollte Doppelboli zu verhindern und vor eventuellen Bugs zu schützen.
+ Jetzt
+ Historie wird gelesen
+ Pumpen-Speicher
+ Basalratenprofil wird aktualisiert
+ Das Reservoir in der Pumpe ist fast leer
+ Die Batterie in der Pumpe ist fast leer
+ Die Pumpe zeigt einen Fehler an E%1$d: %2$s
+ Niedrig
+ Leer
+ Normal
+ Bitte aktualisiere die Uhrzeit der Pumpe
+ Warnung
+ Der Alarm \"TBR ABBRUCH\" wurde bestätigt
+ Keine Verbindung zur Pumpe: Es wurde kein Bolus abgegeben.
+ Die Bolusabgabe ist fehlgeschlagen: Es wurde scheinbar kein Bolus abgegeben. Bitte prüfe auf der Pumpe, ob ein Bolus abgegeben wurde. Um doppelte Boli durch Programmfehler zu vermeiden, werden Boli nicht automatisch wiederholt.
+ Wegen eines Fehlers wurden nur %1$.2f IE von den angeforderten %2$.2f IE abgegeben. Bitte prüfe den abgegebenen Bolus auf der Pumpe.
+ Die Abgabe des Bolus und das Verifizieren der Pumpen-Historie ist fehlgeschlagen. Bitte überprüfe deine Pumpe. Falls ein Bolus abgeben wurde, wird dieser bei der nächsten Verbindung zu den Behandlungen hinzugefügt.
+ Nicht mehr genug Insulin im Reservoir für den Bolus
+ Fehler bei der Abgabe eines verlängerten Bolus
+ Insight
+ Insight Pumpe
+ Status
+ Geändert
+ PUMPE GESTOPPT
+ Status aktualisiert
+ her
+ mit
+ Aktive TBR
+ min übrig
+ Logbuch
+ Letzte abgeschlossene Aktion
+ min
+ verbleibend über
+ insgesamt mit
+ insgesamt mit
+ Bleibe immer verbunden
+ LEERLAUF
+ SYNCHRONISIERUNG
+ BESCHÄFTIGT
+ SYNCHRONISIERT
+ START
+ benötigt
+ Keine Verbindung zur Begleit-App!
+ Begleit-App scheint nicht installiert zu sein!
+ Nicht kompatible Begleit-App, wir benötigen Version
+ Unbekannt
+ Warte auf Code-Bestätigung
+ Code abgelehnt
+ Verbinden zur App
+ Nicht autorisiert
+ Inkompatibel
+ Sekunde
+ Minute
+ Stunde
+ Tag
+ Woche
+ n
+ %1$ds läuft ab in %2$s
+ Keep-Alive Status
+ Statistiken
+ Vorausschauend verbinden
+ Automatisch verbinden, wenn AndroidAPS geöffnet ist und bevor Befehle an die Pumpe angefragt gesendet, um die Dauer des Verbindungsaufbaus zu verringern
+ Wegen des hohen Energieverbrauchs nicht empfohlen
+ SMB immer aktivieren
+ Aktiviere SMB immer, unabhängig von Boli. Dies ist nur möglich, wenn eine BZ-Quelle genutzt wird, die die Daten besonders gut filtert wie z. B. G5.
+ Aktiviere SMB nach Mahlzeiten.
+ Aktiviere SMB für sechs Stunden nach der Einnahme von Kohlenhydraten, auch mit 0 COB. Dies ist nur möglich, wenn eine BZ-Quelle genutzt wird, die die Daten besonders gut filtert wie z. B. G5.
+ Aktiviere SMB während aktiver Kohlenhydrate.
+ SMB aktivieren, wenn Kohlenhydrate aktiv sind.
+ Aktiviere SMB bei aktiven temporären Zielen
+ Aktiviere SMB, wenn ein temporäres Ziel aktiv ist (bald essen, Aktivität)
+ Aktiviere SMB bei temporären Zielen oberhalb des regulären Ziels
+ Aktiviere SMB bei temporären Zielen oberhalb des regulären Ziels (Aktivität).
+ Temporäre Basalrate aktiv lassen
+ Alarm stoppen
+ Insulin
+ Kohlenhydrate
+ Schaltflächen
+ Sendet eine Kalibierung an xDrip+ oder öffnet den G5 Kalibrierungs-Dialog.
+ Öffnet xDrip+, mit der Zurück-Schaltfläche gelangst du zurück zu AndroidAPS.
+ Menge der Kohlenhydrate, die hinzugefügt werden soll, wenn die Schaltfläche gedrückt wird.
+ Menge an Insulin, die hinzugefügt werden soll, wenn die Schaltfläche gedrückt wird
+ CGM-Anwendung konnte nicht geöffnet werden. Stelle sicher, dass diese installiert ist.
+ CGM
+ Verlauf-Browser
+ Bei SMB benachrichtigen
+ Zeige SMB auf der Uhr wie einen normalen Bolus an.
+ Ankündigungen aus Fehlern generieren
+ Erstelle Nightscout-Ankündigungen für Fehler-Dialoge und lokale Alarme (auch einsehbar im Careportal unter \"Behandlungen\").
+ Zeige Vorhersagen auf dem Watchface.
+ Vorhersagen
+ Datenübermittlung
+ Fabric-Upload
+ Erlauben, dass automatische Fehler-Berichte und Nutzungsstatistiken an die Entwickler über den Service von Fabric.io gesendet werden
+ Bitte aktualisiere deine G5-App auf eine unterstützte Version.
+ Starte TZ Aktivität
+ Starte TZ Essen
+ TT
+ Bolus nur erfassen
+ Kategorie
+ Unterkategorie
+ Bolus wird nur erfasst.
+ Lade fehlende Blutzuckerwerte automatisch aus Nightscout nach.
+ SMB von der Pumpe abgegeben
+ Sensitivität
+ Abweichungen
+ Aktive Kohlenhydrate
+ Aktives Insulin
+ Basal
+ Keine Aktion ausgewählt, nichts wird geschehen.
+ Starte TZ Hypo
+ Entwickler-Version, Closed Loop ist nicht verfügbar.
+ Entwickler-Modus aktiviert
+ Entwickler-Modus nicht aktiviert und keine Release-Version
+ %1$.2f IE/h
+ Basalratenprofil wird gelesen
+ Nach der Berechnung des Bolus hat sich die Pumpenhistorie geändert. Daher wurde kein Bolus abgegeben. Bitte prüfe, ob überhaupt noch ein Bolus benötigt wird.
+ Der Bolus wurde erfolgreich abgegeben, aber nicht als Behandlungseintrag gespeichert. Dies kann passieren, wenn zwei kleine, gleich große Boli innerhalb von zwei Minuten verabreicht werden. Bitte überprüfe die Pumpenhistorie und Behandlungseinträge. Verwende das Careportal, um fehlende Einträge hinzuzufügen. Stelle sicher, dass keine Einträge für genau dieselbe Minute und dieselbe Menge hinzugefügt werden.
+ Es wurde keine hohe TBR gesetzt, da nach der Berechnung neue Boluseinträge in der Pumpenhistorik gefunden wurden.
+ Status wird aktualisiert
+ Die Basalrate in der Pumpe hat sich geändert und wird aktualisiert
+ Das Einlesen der geänderten Basalrate in der Pumpe schlug fehl
+ Änderungen der Historie werden gesucht
+ Der Import mehrerer Boli der gleichen Menge, abgegeben in der gleichen Minute, ist gescheitert: Nur ein Datensatz konnte den Behandlungen hinzugefügt werden. Bitte überprüfe die Pumpe und verwende das Careportal, um fehlende Einträge hinzuzufügen. Stelle sicher, dass keine Einträge für genau dieselbe Minute mit derselben Menge hinzugefügt werden.
+ \n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de)
+ Der letzte Bolus liegt mehr als 24 Stunden zurück oder liegt in der Zukunft. Prüfe bitte das Datum auf der Pumpe.
+ Zeit/Datum des abgegebenen Boluses auf der Pumpe erscheint falsch, IOB ist wahrscheinlich nicht korrekt. Bitte prüfe Zeit/Datum der Pumpe.
+ Profil-Wechsel fehlt, bitte nimm einen Profil-Wechsel vor oder drücke \"AKTIVIERE PROFIL\" im lokalen Profil.
+ Anzahl Boli
+ Anzahl TBR
+ Zielsetzung %1$d nicht gestartet
+ Zielsetzung %1$d nicht abgeschlossen
+ Pumpe verfügt nicht über temporäre Basalraten
+ Von der Pumpe konnte keine gültige Basalrate eingelesen werden.
+ Closed-Loop-Modus in den Einstellungen deaktiviert
+ Autosens in den Einstellungen deaktiviert
+ SMB in Einstellungen deaktiviert
+ Begrenzung der max. Basalrate auf %1$.2f IE/h wegen %2$s
+ Limit der Pumpe
+ Es muss ein positiver Wert sein.
+ max basal multiplier
+ max daily basal multiplier
+ Aufgrund eines Bolus in den letzten 3 Minuten wird kein SMB abgegeben.
+ Basalrate richtig eingestellt
+ Begrenzung des max. Prozentsatzes auf %1$d%% wegen %2$s
+ Begrenze Bolusmenge auf %1$.1f IE wegen %2$s
+ Begrenze max. IOB auf %1$.1f IE wegen %2$s
+ Begrenze Kohlenhydrate auf %1$d g wegen %2$s
+ Begrenze IOB auf %1$.1f IE wegen %2$s
+ Max. Wert in den Einstellungen
+ Fester Grenzwert
+ Unsichere Benutzung
+ Lesen des Status fehlgeschlagen
+ Katheter-Wechsel erfassen
+ Reservoir-Wechsel erfassen
+ SMB wird immer und nach Kohlenhydraten deaktiviert, weil die aktive BZ-Quelle keine geeignete Filterung der Werte unterstützt.
+ SMB sind im Open Loop Modus nicht erlaubt
+ Essen
+ Zurücksetzen
+ Warte auf Zeitsynchronisierung (%1$d Sek.)
+ Getrennt (%1$d m)
+ Automatische Careportal-Ereignisse
+ Automatischer Nightscout-Upload von Reservoir-, Katheter- und Batteriewechseln
+ Maximales Gesamt-IOB, das nicht überschritten werden darf [IE]
+ Diesen Wert nennt OpenAPS MaxIOB.\nSolange dieser Wert überschritten wird, wird AndroidAPS kein Insulin abgeben.
+ Pumpe gestoppt
+ Pumpe gestartet
+ Pumpe pausiert
+ Maximale Dauer der Essens-Resorption [h]
+ Zeit, nach der jede Mahlzeit mit Sicherheit absorbiert ist. Verbleibende Kohlenhydrate werden danach nicht mehr berücksichtigt.
+ Zeit
+ Zeige Feld für Notizen in den Behandlungsdialogen
+ Weiter
+ Zurück
+ Einrichtungsassistent
+ FERTIG
+ Wähle Deine Sprache.
+ Angefragt: %1$.2f IE. Abgegeben: %2$.2f IE. Fehlercode: %3$s
+ Erste Insulin-Erhöhung
+ Zweite Insulin-Erhöhung
+ Dritte Insulin-Erhöhung
+ Erste KH-Erhöhung
+ Zweite KH-Erhöhung
+ Dritte KH-Erhöhung
+ CGM
+ Benutze nur WLAN Verbindung
+ WLAN SSID
+ Nur während des Ladens
+ Verbindungs-Einstellungen
+ Erlaubte SSIDs (durch Semikolon getrennt)
+ Erlaube Verbindung bei Roaming
+ Max. Autosens-Faktor
+ Min. Autosens-Faktor
+ Bolus-Snooze-DIA-Divisor
+ Sicherheitsmultiplikator des Basalhöchstwertes
+ Sicherheitsmultiplikator der aktuellen Basalrate
+ N/A
+ BZ automatisch auffüllen
+ Einrichtungsassistent
+ Berechnungen, die im Assistenten berücksichtigt werden:
+ Anzeigeeinstellungen
+ Allgemeine Einstellungen
+ Aktiviere Nightscout-Client
+ Willkommen im Setup-Assistenten. Er führt Dich durch den Setup-Prozess\n
+ Pumpen-Einrichtung
+ Status lesen
+ Änderungen müssen in Nightscout vorgenommen werden.
+ Einrichtungsassistenten überspringen
+ Drücke die Schaltfläche unten, um AndroidAPS zu erlauben, Basal-Änderungen vorzuschlagen/vorzunehmen
+ Drücken Sie die Taste unten, um die Zielsetzungen zu aktivieren. Nachdem Sie den Assistenten beendet haben, navigieren Sie zur Registerkarte Zielsetzungen, um alle AndroidAPS-Funktionen anzuzeigen.\n
+ Zielsetzungen aktivieren
+ APS Plugin konfigurieren
+ Sensitivitäts Plugin konfigurieren
+ Das Sensitivitäts-Plugin wird für die Sensitivitäts- und COB-Berechnung verwendet. Für weitere Informationen siehe:
+ http://androidaps.readthedocs.io/en/latest/DE/konfigurations-generator.html#empfindlichkeitserkennung
+ Nightscout-Client ist für die Verbindung zu Nightscout zuständig. Du kannst diesen Teil jetzt überspringen, aber Du wirst nicht in der Lage sein, Zielsetzungen zu erfüllen, bis Du diesen eingerichtet hast.
+ Bitte beachte: Neue Insulin-Profile benötigen einen DIA von mind. 5 Stunden. Eine DIA von 5-6 Stunden im neuen Insulin-Profil entspricht einem DIA von 3 Stunden bei alten Insulin-Profilen.
+ BZ-Quelle konfigurieren
+ Wähle eine Profilquelle aus. Verwende für ein Kind das NS-Profil. Wenn Dir niemand auf Nightscout folgt, wirst Du wahrscheinlich das lokale Profil bevorzugen. Beachte, dass hier nur die Profilquelle festgelegt wird. Damit das Profil verwendet werden kann, muss es mit einem \"Profil-Wechsel\" aktiviert werden.
+ Wähle einen der verfügbaren Algorithmen aus. Sie sind vom Ältesten zum Neuesten sortiert. Neuere Algorithmen sind meist stärker und aggressiver. Wenn du ein Anfänger bist, solltest du nicht mit dem Neuesten sondern mit AMA starten. Vergiss nicht, die OpenAPS-Dokumentation zu lesen und die entsprechenden Einstellungen vor der Benutzung vorzunehmen.
+ Starte deine erste Zielsetzung
+ Berechtigung
+ Nach Berechtigung fragen
+ AndroidAPS benötigt die Standortfreigabe für den BT-Scan.
+ AndroidAPS benötigt Zugriff auf den Speicher, um Log-Dateien speichern zu können.
+ Anfordern
+ Insulin Plugin konfigurieren
+ Verlassen
+ Benutzerdefinierte Einstellungen
+ Zeitmodus
+ Scrollfunktion
+ Piepen (Tastentöne)
+ Alarm
+ Töne
+ Vibration
+ Beides
+ LCD-Einschaltdauer [s]
+ Einschaltdauer der Hintergrundbeleuchtung [s]
+ BZ-Einheit
+ Abschalten (h)
+ Reservoir fast leer (IE)
+ In Pumpe speichern
+ Ein
+ Aus
+ Menü öffnen
+ Menü schließen
+ Plugin-Einstellungen
+ Abgeschlossen, gut gemacht!
+ Noch nicht vollständig ausgefüllt
+ Verstrichene Zeit
+ %1$d. Ziel
+ Poctech
+ Empfange Blutzucker-Werte von der Poctech-App.
+ Hohe temporäre Ziele erhöhen die Sensitivität
+ = 100.]]>
+ Niedrige temporäre Ziele senken die Sensitivität
+
+ Ungültige Pumpen-Einstellungen. Lies das Wiki und stelle mit der 360° Konfigurations-Software sicher, dass das Quick-Info-Menü \"QUICK INFO\" heißt.
+ Benutzerdefiniert
+ Große Zeitdifferenz
+ Großer Zeitunterschied:\nDie Zeit in der Pumpe weicht um mindestens 1,5 Stunden ab.\nPasse die Zeit auf der Pumpe manuell an und lösche zuvor - falls möglich - die Pumpenhistorie.\nAlternativ kannst Du den Loop für die Stunden der Insulinwirkzeit (DIA) deaktivieren.
+ \"AndroidAPS gestartet\" Ereignisse löschen
+ Gespeicherte Einstellungen gefunden
+ WARNUNG: Wenn Du eine echte Pumpe aktivierst und anschließt, kopiert AndroidAPS die Basaleinstellungen vom aktiven Profil zur Pumpe (und behält sie bei). Die Einstellungen in der Pumpe werden hierbei überschrieben. Wenn Du Dir nicht sicher bist oder die Basaleinstellungen in der Pumpe nicht überschreiben möchten, drücke \"Abbrechen\" und vollziehe den Wechsel zur Pumpe später.
+ Behandlungsdaten unvollständig
+ Wartungseinstellungen
+ E-Mail
+ Ungültige E-Mail
+ Anzahl der zu sendenden Logs
+ Wartung
+ WRTNG
+ Stellt mehrere Wartungsfunktionen zur Verfügung (z.B. das Versenden von Logs oder Löschen dieser)
+ Logs als E-Mail versenden
+ Logs löschen
+ Der Eintrag (Insulin: %1$.2f, Kohlenhydrate: %2$d, um: %3$s) konnte nicht als Behandlung gespeichert werden. Bitte überprüfe die aktuelle Liste und füge, falls notwendig, den Datensatz manuell hinzu.
+ eCarbs: %1$d g (%2$d h), Verzögerung: %3$d m
+ Keine Autosens-Daten verfügbar
+ Log-Einstellungen
+ Auf Standardwerte zurücksetzen
+ NSClient Störung. Ziehe einen Neustart von NS und NSClient in Betracht.
+ AS
+ Version %1$s ist verfügbar.
+ Zeit Verschiebung
+ Bevorzugter APS-Modus
+ Gesamt
+ Sende die heutigen Logdateien unter Angabe dieser Uhrzeit an die Entwickler.
+Unerwartetes Verhalten.
+ Fehler bei Befehl
+
+ %1$d Tag
+ %1$d Tage
+
+
+ %1$d Stunde
+ %1$d Stunden
+
+
+ %1$d Minute
+ %1$d Minuten
+
diff --git a/app/src/main/res/values-el/insight_alerts.xml b/app/src/main/res/values-el/insight_alerts.xml
new file mode 100644
index 0000000000..70489fbc5e
--- /dev/null
+++ b/app/src/main/res/values-el/insight_alerts.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index 3ccc0ef424..70489fbc5e 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -1,617 +1,3 @@
-
- Ασφάλεια Θεραπειών
- Μέγιστο Επιτρεπτό bolus[U]
- Μέγιστο Επιτρεπτό υδατ.[g]
- Επιλογές
- Αναννέωση Θεραπειών από NS
- Επαναφορά Βάσεων Δεδομένων
- Θέλετε πραγματικά να επαναφέρετε την βάση δεδομένων?
- Έξοδος
- Χρήση Εκτεταμμένου Bolus για >200%
- DanaR συσκευή Bluetooth
- "Χρησιμοποιείτε πάντα απόλυτες τιμές βασικού "
- "Παρακαλώ κάντε reboot στο τηλέφώνο ή restart στο AndroidAPS από τις Ρυθμίσεις Συστήματος, αλλιώς το AndroidAPS δεν θα έχει καταγραφή (επαληθεύστε ότι οι αλγόριθμοι δουλεύουν σωστά)! "
- Έναρξη
- Επικύρωση
- Μονάδες
- DIA (Διάρκεια Ενεργής Ινσουλίνης)
- IC (αναλογία υδατ.)
- Δ.Π. (Διορθωτικός Παραγοντας)
- Βασικός ρυθμός
- Στόχος
- Δεν ορίστηκε προφίλ
- Ινσουλίνη:
- Υδατάνθρακες:
- Ενερ.Ινσουλ:
- IOB:
- Δραστηριότητα:
- Συνολική Ενεργή:
- Δραστηριότητα Συνολικής Ενεργής:
- Διάρκεια:
- Αναλογία:
- Ins:
- Ενεργή Ινσουλίνη:
- Συνολική Ενεργή Ινσουλίνη:
- Ινσουλίνη
- Υδατάνθρακες
- BG
- TT
- Υδατάνθρακες
- Διόρθωση
- U
- Bolus IOB
- Έναρξη τώρα
- ΕΙΚΟΝΙΚΗ ΑΝΤΛΙΑ
- Βάση Βασικού Ρυθμού
- Προσωρ. Ρυθμός
- Εκτετεμμένο bolus
- Μπαταρία
- Ρεζερβουάρ
- ΟΚ
- Τελευταίος Υπολογισμός
- Εισαγωγή Παραμέτρων
- Κατάσταση Γλυκόζης
- Τρέχων Προσ.Ρυθμός
- Δεδομένα IOB
- Προφίλ
- Δεδομένα Γεύματος
- Αποτέλεσμα
- Μη διαθέσιμα δεδομένα γλυκόζης
- Δεν απαιτείται αλλαγή
- Αίτημα
- Αξία
- Διάρκεια
- Γλυκόζη
- Υπολογισμός
- Διαφορά
- Διαφορά:
- Διαμόρφωση
- Στόχοι
- OpenAPS MA
- Επισκόπηση
- Προφίλ NS
- Απλό Προφίλ
- Προσ.Ρυθμός
- Θεραπείες
- Εικονική Αντλία
- Φροντίδα
- Αντλία
- Θεραπείες
- Προφίλ
- APS
- Γενικά
- ημέρες
- Περιορισμοί
- Κύκλωμα
- Κύκλωμα
- APS
- Μετά από επεξεργασία περιορισμών
- Τελευταία Εφαρμογή
- ΟΚ
- Ακύρωση
- ΔΕΝ ΕΠΙΛΕΧΘΗΚΕ APS Ή ΠΑΡΟΧΗ ΑΠΟΤΕΛΕΣΜΑΤΟΣ
- Ασφάλεια
- Προσθήκη απενεργοποιημένη
- Παραβίαση Περιορισμών
- Σφάλμα Παράδοσης Bolus
- Σφάλμα παράδοσης Προσ.Ρυθμ.
- Αξία Βασικού[%]
- % (100% = τρέχον)
- Αποδοχή νέου Προσ.Ρυθμ:
- Bolus
- Υπολογιστής
- Εφαρμοσμένοι Περιορισμοί!
- Αποδοχή
- Εισάγετε νέα Θεραπεία:
- Bolus
- Bolus:
- Βασικός
- Βασικός:
- Υδατάνθρακες
- "Αλλάξτε την αντιστοίχηση! "
- Θέστε νέο εκτεταμμένο bolus:
- Πηγή BG
- xDrip
- APS Mode
- Κλειστό Κύκλωμα
- Ανοιχτό Κύκλωμα
- Κύκλωμα απενεργοποιημένο
- Απενεργοποιήστε κύκλωμα
- Ενεργοποιήστε κύκλωμα
- Νέα πρόταση διαθέσιμη
- Μη υποστηριζόμενη έκδοση NSClient
- Μη υποστηριζόμενη έκδοση Nightscout
- NSClient δεν εγκαταστάθηκε. Μετρήσεις χάθηκαν!
- BG διαθέσιμες στο NS
- Το status αντλίας διαθέσιμο στο NS
- Ξεκινήστε χειροκίνητα
- Κύκλωμα απενεργοποιημένο από περιορισμούς
- Τσέχικα
- Αγγλικά
- Βασική Ενερ.Ινσουλ.
- Ενεργός Περιορισμός Bolus
- Ενεργός περιορισμός Υδατ.
- Έλεγχος BG
- Ανακοίνωση
- Σημείωση
- Ερώτηση
- Άσκηση
- Αντικατάσταση Αντλίας
- Εισαγωγή Αισθητήρα CGM
- Έναρξη Αισθητήρα CGM
- Αλλαγή Δεξαμενής Ινσουλίνης
- Αλλαγή Προφίλ
- Snack Bolus
- Bolus Γεύματος
- Διορθωτικό Bolus
- Συνδυαστικό Bolus
- Έναρξη Προσ.Ρυθμ.
- Τέλος Προσ.Ρυθμ.
- Διόρθωση Υδατανθρακων
- OpenAPS εκτός σύνδεσης
- Τύπος Συμβάντος
- Άλλο
- Μετρητής
- Αισθητήρας
- Υδατάνθρακες
- Ινσουλίνη
- Ώρα γεύματος
- Διαχωρισμός
- Διάρκεια
- Ποσοστό
- Απόλυτο
- Σημειώσεις
- Ώρα Συμβάντος
- Προφίλ
- Εισαγωγή από
- Τύπος Γλυκόζης
- Δεν φορτώθηκε προφίλ από το NS
- Προσ.Ρυθμ.
- Εκτεταμμένο Bolus
- Nightscout Έκδοση:
- Λείπει
- Επιλογές εξήχθησαν
- Εξαγωγή ρυθμίσεων σε
- Εισαγωγή ρυθμίσεων από
- Ρυθμίσεις εισήχθησαν
- Μη εύρεση φακέλου
- Εξαγωγή ρυθμίσεων
- Εισαγωγή ρυθμίσεων
- Ελληνικά
- Μέγιστο U/hr Προσ.Ρυθμ.μπορεί να είναι
- Αυτή η τιμή ονομάζεται max basal στο περιεχόμενο του OpenAPS
- Μέγιστη δόση Ενεργής Ινσουλίνης[U]
- Αυτή η τιμή ονομάζεται max basal στο πλαίσιο του OpenAPS.Αυτή θα γίνει μηδέν.Μετά από αρκετές μέρες ή εβδομάδες, ανάλογα με το επίπεδο άνεσής σας, μπορείτε να επιλέξετε να ρυθμίσετε αυτό το νούμερο
- ΑΠΟΡΡΙΨΗ
- Γλώσσα
- DanaR
- Σύνδεση
- Συνδέθηκε
- Αποσύνδεση
- Ρυθμίσεις αντλίας DanaR
- Άδεια χρήσης τελικού χρήστη
- ΔΕΝ ΠΡΕΠΕΙ ΝΑ ΧΡΗΣΙΜΟΠΟΙΗΘΕΙ ΓΙΑ ΝΑ ΚΑΝΕΤΕ ΙΑΤΡΙΚΗ ΑΠΟΦΑΣΗ ΔΕΝ ΥΠΑΡΧΕΙ ΕΓΓΥΗΣΗ ΓΙΑ ΤΟ ΠΡΟΓΡΑΜΜΑ, ΣΤΟ ΒΑΘΜΟ ΠΟΥ ΕΠΙΤΡΕΠΕΤΑΙ ΑΠΟ ΤΟ ΕΦΑΡΜΟΣΤΕΟ ΔΙΚΑΙΟ. ΕΚΤΟΣ ΟΠΟΙΑΣΔΗΠΟΤΕ ΔΙΑΒΑΘΜΙΣΜΕΝΗ ΚΑΤΑ ΤΗΝ ΕΓΓΡΑΦΗ ΤΩΝ ΚΑΤΟΧΟΙ ΠΝΕΥΜΑΤΙΚΩΝ ΔΙΚΑΙΩΜΑΤΩΝ ΚΑΙ / Η ΑΛΛΑ ΜΕΡΗ ΠΑΡΕΧΟΝΤΑΙ ΤΟ ΠΡΟΓΡΑΜΜΑ \"ΩΣ ΕΧΕΙ\" ΧΩΡΙΣ ΕΓΓΥΗΣΗ ΟΠΟΙΟΥΔΗΠΟΤΕ ΕΙΔΟΥΣ, ΕΞΑΙΡΟΥΜΕΝΕΣ Ή ΣΙΩΠΗΡΕΣ, ΣΥΜΠΕΡΙΛΑΜΒΑΝΟΜΕΝΩΝ, ΕΝΔΕΙΚΤΙΚΑ, ΤΩΝ ΣΙΩΠΗΡΩΝ ΕΓΓΥΗΣΕΩΝ ΕΜΠΟΡΕΥΣΙΜΟΤΗΤΑΣ ΚΑΙ ΚΑΤΑΛΛΗΛΟΤΗΤΑΣ ΓΙΑ ΣΥΓΚΕΚΡΙΜΕΝΟ ΣΚΟΠΟ . Ο ΟΛΟΚΛΗΡΩΜΕΝΟΣ ΚΙΝΔΥΝΟΣ ΟΣΟΝ ΑΦΟΡΑ ΤΗΝ ΠΟΙΟΤΗΤΑ ΚΑΙ ΤΗΝ ΑΠΟΔΟΣΗ ΤΟΥ ΠΡΟΓΡΑΜΜΑΤΟΣ ΕΙΝΑΙ ΔΙΚΟ ΣΑΣ. ΕΑΝ ΤΟ ΠΡΟΓΡΑΜΜΑ ΔΕΝ ΕΙΝΑΙ ΕΛΑΤΤΩΜΑΤΙΚΟ, ΠΡΕΠΕΙ ΝΑ ΕΞΕΤΑΣΤΕ ΤΟ ΚΟΣΤΟΣ ΟΛΩΝ ΤΩΝ ΑΠΑΡΑΙΤΗΤΩΝ ΣΥΝΤΗΡΗΣΕΩΝ, ΕΠΙΣΚΕΥΩΝ Ή ΔΙΟΡΘΩΣΕΩΝ
- ΚΑΤΑΛΑΒΑ ΚΑΙ ΣΥΜΦΩΝΩ
- Αποθήκευση
- Δεν βρέθηκε συσκευή Bluetooth
- Δεν βρέθηκε η επιλεγμένη συσκευή
- Λάθος σύνδεσης αντλίας
- IOB αντλίας
- "Μονάδες ανά ημέρα "
- Τελευταίο Bolus:
- Μη έγκυρα δεδομένα
- Η τιμή δεν μπήκε σωστά
- Ξαναφορτώστε το προφίλ
- Δείτε το προφίλ
- Υλοποιήθηκε
- Σχόλιο
- Επιτυχία
- Ποσοστό
- Απόλυτο
- Ακύρωση Προσ.Ρυθμ.
- SMS Επικοινωνία
- Περιμέντε για αποτέλεσμα
- Επιτρεπτά τηλεφωνικά νούμερα
- +XXXXXXXXXX;+YYYYYYYYYY
- "Για έγχυση bolus %1$.2fU SMS με κώδικα %2$s "
- "Για αποστολή βαθμονόμησης %1$.2f SMS με κώδικο %2$s "
- Αποτυχία Bolus
- Bolus %.2fU παραδόθηκε επιτυχώς
- Πάει να παραδόσει %.2fU
- Bolus %.2fU παραδόθηκε επιτυχώς
- Παράδοση %.2fU
- Άδεια για απομακρυσμένες εντολές μέσω SMS
- Δεν επιτρέπεται απομακρυσμένο bolus
- Δάκτυλο
- Αισθητήρας
- Χειροκίνητα
- Προσωρινός Στόχος
- Ακύρωση Προσωρινού Στόχου
- Ρυθμίσεις προφίλ DanaR
- DIA [h]
- Διάρκεια Ενεργής Ινσουλίνης
- Αποτυχία αναβάθμισης βασικού προφίλ
- Ιστορικό
- Γέμισμα
- Ανέβασμα
- E bolus
- DS bolus
- DE bolus
- σφάλμα
- ξαναγέμισμα
- βασικός ώρες
- γλυκόζη
- υδατάνθρακες
- συναγερμός
- "Σύνολο %d εγγραφών φορτώθηκαν "
- S bolus
- Συναγερμοί
- Ώρες Βασικού
- Boluses
- Υδατάνθρακες
- Ημερήσια Ινσουλίνη
- Σφάλματα
- Γλυκόζη
- Ξαναγέμισμα
- Κλείσιμο
- Σύνδεση με %d s
- Κωδικός αντλίας
- Λάθος κωδικός αντλίας!
- Αντλία απασχολημένη
- Παραδόθηκε
- Σταμάτησε
- Έμφραξη
- Stop
- STOP Πιέζεται
- Αναμονή για αντλία
- Προς έγχυση %.2fU
- Δημιουργία παρακολούθησης και ανάλυση βασικού ρυθμού και αναλογιών
- Επιβεβαιώστε ότι η BG φαίνεται στο Nightscout και τα δεδομένα της DanaR φορτώθηκαν
- Ξεκινήστε σε ανοιχτό κύκλωμα
- Τρέξτε σε ανοιχτό κύκλωμα για λίγες ημέρες και χειροκίνητα κάντε πολλούς Προσ.Ρυθμ. Set up and use temporary and default temporary targets (e.g. for activity or hypo treatment carbs)
- Κατανοήστε το ανοιχτό κύκλωμα, περιλαμβάνοντας τις προτάσεις για Προσ.Ρυθμ.
- Βάση της εμπειρίας σας, αποφασίστε ποιο είναι το μέγιστο βασικής δόσης και αποθηκεύστε το στην αντλία και στις Επιλογές
- "Ξεκινήστε να κλείσετε το κύκλωμα με Σταμάτημα Χαμηλής Γλυκόζης (Low Glucose Suspend) "
- Τρέξτε σε κλειστό κύκλωμα με μέγ. IOB = 0 για μερικές ημέρες χωρίς πολλά LGS.
- Ρυθμίζοντας το κλειστό κύκλωμα, αυξήστε το μεγ. IOB πάνω από 0 και σταδιακά μειώστε τους στόχους BG
- Τρέξτε το για λίγες ημέρες, και τουλάχιστον μία νύχτα χωρίς χαμηλό συναγερμό BG, πριν χαμηλώσετε τα όρια
- Ρυθμίστε τον βασικό ρυθμό και τις αναλογίες αν χρειάζεται, και μετά ενεργοποιήστε το auto-sens
- 1 πειτυχής εβδομάδα ημερήσιου κυκλώματος με κανονική εισαγωγή υδατανθράκων
- Ενεργοποιώντας επιπρόσθετα χαρακτηριστικά για χρήση κατά την μέρα, όπως τον Βοηθός Γεύματος
- Φτάσατε το επιτρεπτό όριο
- ΔΕν επηλέχθηκε προφίλ
- Το κύκλωμα απενεργοποιήθηκε
- Το κύκλωμα ενεργοποιήθηκε
- Κύκλωμα απενεργοποιημένο
- Κύκλωμα ενεργοποιημένο
- %1$.2f limited to %2$.2f
- Τιμή %s είναι έξω από τα όρια
- "Δεν επιτρέπεται η απομακρυσμένη ρύθμιση βασικού ρυθμού "
- Δεν επιτρέπεται απομακρυσμένη εντολή
- Για έναρξη βασικού %1$.2fU/h SMS με κωσικό %2$s
- Για αναστολή κυκλκώματος για %1$d λεπτών SMS με κωδικό %2$s
- Προσ.Ρυθμ.%1$.2fU/h για %2$d λεπτά ξεκίνησε επιτυχώς
- "Προσ.Ρυθμ.απέτυχε "
- Για να σταματήσετε Προσ.Ρυθμ.SMS με κωδικό %s
- Προσ.Ρυθμ.ακυρώθηκε
- Ακύρωση Προσ.Ρυθμ.απέτυχε
- Άγνωστη εντολή ή λάθος απάντηση
- Γρήγορος Οδηγός
- Ρυθμίσεις Γρήγορου Οδηγού
- Κείμενο στο πλήκτρο:
- Υδαταν:
- Ισχύς:
- Προσθήκη
- Διαμόρφωση
- Μετακίνηση
- Γεύμα
- Διορθ
- Korean
- Ενέργειες
- AndroidAPS ξεκίνησε
- NS αναπαραγωγή μόνο (απενεργοποίηση συγχρ.)
- NS αναπαραγωγή μόνο.Δεν είναι αποτελεσματικό στο SGV εκτός εάν έχει επιλεγεί τοπική πηγή όπως xDrip. Δεν είναι αποτελεσματικό στα Προφίλ ενώ χρησιμοποιούνται NS-Profiles.
- Η αντλία δεν έχει αρχικοποιηθεί!
- Η αντλία δεν έχει αρχικοποιηθεί, δεν ορίστηκε προφίλ!
- Πλήρωση/Γέμισμα
- Παρακαλώ ελένξτε ότι η ποσότητα ταιριάζει με τις προδιαγραφές του σετ έγχυσης!
- Άλλα
- Πλήρωση/Γέμισμα στανταρ ποσότητες ινσουλίνης
- Πλήκτρο 1
- Πλήκτρο 2
- Πλήκτρο 3
- Μονάδες:
- mg/dl
- mmol/l
- DIA:
- Εύρος στόχου:
- Εύρος εμφάνισης
- Υψηλό και Χαμηλό σημείο για την γραφική στην Επισκόπηση και Smartwatch
- ΧΑΜΗΛΟ σημείο
- ΥΨΗΛΟ σημείο
- Wear
- Ξαναστείλτε όλα τα Δεδομένα
- Ρυθμίσεις στο Wear
- Σφάλμα Αντλίας
- Χαμηλή Μπαταρία
- Αντλία κλειστή
- Μπαταρία αντλίας Αποφορτίστηκε
- DanaR Korean
- Βασικός Ρυθμός:
- Αποτυχία ρύθμισης βασικού προφίλ
- "Το Βασικό προφίλ ενημερώθηκε "
- Απενεργοποιήστε την λειτουργία EasyUI στην αντλία
- Ενεργοποιήστε εκτεταμμένο bolus στην αντλία
- Αλλάξτε επιλογή από U/d σε U/h στην αντλία
- Τιμή βασικού κάτω από το ελάχιστο. Δεν έχει ρυθμιστεί!
- BG:
- Τελευταία BG:
- MDI
- MM640g
- Συνεχής Ειδοποίηση
- Παλιά Δεδομένα
- %dλεπτά πριν
- %dλεπτά πριν
- Τοπικό Προφίλ
- OpenAPS AMA
- Βραχυπρόθεσμος Μέσος Όρος
- ΜΑκροπρόθεσμος Μέσος Όρος
- Πίνακας στοιχείων %d.Τρέχουσα Τιμή
- Δεδομένα Autosens
- Πληροφορίες συντονισμού
- Χρήση τοy AMA autosense
- Ανανέωσε συμβάντα από NS
- Πριν από τα Γεύματα
- Άσκηση
- Διαγραφή εγγραφής:
- Στατιστικά DanaR
- Άθροισμα TDD
- Εκθετικά Σταθμισμένο TDD
- Βασικός
- Bolus
- TDD
- Ημερομηνία
- Αναλογία
- # Ημέρες
- Βάρος
- Πιθανώς ανακριβής όταν χρησιμοποιείτε bolus για αναπλήρωση
- Παλιά Δεδομένα Παρακαλώ Πατήστε Ξαναφόρτωση
- "Συνολικός Βασικός "
- TBB * 2
- Παραμετροποίηση...
- ΔΡΑΣΗ
- ΚΥΚΛΩΜΑ
- ΕΠΙΛ
- SP
- OAPS
- LP
- DANA
- HOME
- VPUMP
- NSPROFILE
- ΘΕΡΑΠ
- CP
- ΣΤΟΧ
- WEAR
- SMS
- Σύντομα ονόματα ενοτήτων
- Χρησιμοποιείτε πάντα τη βραχυπρόθεσμη μέση γλυκεμική διαφορά αντί της διαφοράς των δύο τελευταίων τιμών
- Χρήσιμο όταν δεδομένα από μη φιλτραρισμένες πηγές όπως το xDrip αποκτούν θόρυβο
- Ρυθμίσεις για Προχωρημένους
- Model: %1$02X Protocol: %2$02X Code: %3$02X
- Προφίλ
- "Προεπιλεγμένη τιμή: 3 Αυτό είναι ένα κλειδί ασφαλείας OpenAPS.Αυτό περιορίζει την αύξηση του βασικού x3 από την μεγαλύτερη τιμή του.Δεν χρειάζεται να το αλλάξετε "
- Μόνο αριθμητικά ψηφία επιτρέπονται.
- "Μόνο αριθμητικά ψηφία μέσα στο εύρος %1$s - %2$s επιτρέπονται. "
- Το πεδίο αυτό δεν πρέπει να είναι κενό
- "Αριθμός τηλεφώνου μη έγκυρος "
- Μη έγκυρος αριθμός τηλεφώνου για SMS
- Αντιγράφή στο Πρόχειρο
- Αντιγράφτηκε στο Πρόχειρο
- Εμφάνιση αρχείου καταγραφής
- Βαθμονόμηση
- "Να στείλω την βαθμονόμηση %.1f στο xDrip? "
- xDrip+ μη εγκατεστημένο
- Η βαθμονόμηση εστάλει στο xDrip
- Απομακρυσμένη βαθμονόμηση δεν επιτρέπεται
- Η Βαθμονόμηση στάλθηκε.Η λήψη πρέπει να είναι ενεργοποιημένη στο xDrip.
- Το xDrip δεν λαμβάνει βαθμονομήσεις
- Η αντλία είναι σε παύση
- Φόρτωση κατάστασης αντλίας
- Ρύθμιση Προσ.Ρυθμ.
- Stop Προσ.Ρυθμ.
- Ρύθμιση εκτεταμμένου bolus
- Stop εκτεταμμένο bolus
- Ενημέρωση Βασικού ρυθμού
- Αποσυνδέεται
- Εκτέλεση
- Ρυθμίσεις Εικονικής αντλίας
- Φόρτωση κατάστασης στο NS
- Λάθος κωδικός
- Κωδικός για ρυθμίσεις
- Ξεκλείδωμα ρυθμίσεων
- Φτάνετε το ημερήσιο όριο ινσουλίνης
- NSClient
- NSCI
- URL:
- Αυτόματη κύλιση
- Επανεκκίνηση
- NSClient
- Διεύθυνση Nightscout
- Βάλτε διεύθυνση Nightscout
- Μυστικός κωδικός API secret
- 12ψήφιος μυστικός κωδικός
- Βάλτε 12ψήφιο μυστικό κωδικό
- Έγχυση τώρα
- Διαγραφή σειράς
- Δείξε σειρά
- Σειρά:
- ΚΑτάσταση:
- Παύση
- Διαγραφή αρχείου καταγραφής
- Ο NSCLIENT δεν έχει άδεια εγγραφής. Λάθος κωδικός API?
- Ρυθμίσεις Wear
- Δείξε αναλυτικά IOB
- Χώρισε την IOB σε bolus και βασικό στο ρολόι
- αποτυχία - ελέγξτε τηλέφωνο
- Μη διαθέσιμο
- Ηλικία χρήστη
- Παιδί
- Έφηβος
- Ενήλικας
- Παρακαλώ επιλέξτε ηλικία χρήστη για να ορισθούν όρια ασφαλείας
- Glimp
- Το %s πρέπει να απενεργοποιήσει τη βελτιστοποίηση της μπαταρίας για βέλτιστη απόδοση
- Κύκλωμα σε παύση
- Παύση (%d m)
- Superbolus (%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
- Firmware
- Τελευταία σύνδεση
- Κατάσταση Bluetooth
- Σχετικά με
- Λείπει εξουσιοδότηση SMS
- Κατάσταση xDrip (ρολόι)
- Γραμμή Κατάστασης xDrip (ρολόι)
- xds
- Δείξε BGI
- Πρόσθεσε BGI στην γραμμή κατάστασης
- Μη φόρτωση στο NS
- Όλα τα δεδομένα που αποστέλλονται στην NS έχουν καταργηθεί. Το AAPS συνδέεται με NS, αλλά δεν γίνεται καμία αλλαγή στα NS
- Βήμα Βασικού
- Βήμα Bolus
- Εκτεταμμένο Bolus
- Στόχος Προσ.Ρυθμ.
- Ακύρωση Εκτεταμμένου bolus
- Χρόνος ζωής Αισθητήρα
- Χρόνος ζωής Κάνουλας
- Χρόνος ζωής Ινσουλίνης
- ώρες
- Τύπος Βασικού
- Μη έγκυρο προφίλ!!!
- ΜΕταβείτε στο προφίλ
- Χρόνος ζωής μπαταρίας αντλίας
- Αλλαγή μπαταρίας αντλίας
- Επιλογές συναγερμού
- Επείγον υψηλό
- Υψηλό
- Χαμηλό
- Επείγον χαμηλό
- Ανεπεξέργαστα δεδομένα
- Επειγον ανεπεξέργαστα δεδομένα
- Οριακή τιμή για ανεπεξέργαστα δεδομένα [min]
- Επείγουσα οριακή τιμή για ανεπεξέργαστα δεδομένα [min]
- "Εσωτερικά διαστήματα για autosense [h] "
- Ποσότητα ωρών κατά το παρελθόν για ανίχνευση ευαισθησίας (εξαιρείται ο χρόνος απορρόφησης υδατανθράκων)
- Αντλία
- OpenAPS
- Uploader
- Ανίχνευση ευασισθησίας
- SENS
- Ευασισθησία Oref0
- Ευαισθησία AAPS
- Ρύθμιση απορρόφησης Υδατανθράκων
- Μέγ.χρόνος απορρόφησης σακχάρου [h]
- Χρόνος σε ώρες που περιμένουμε να απορροφηθούν όλοι οι υδατάνθρακες γεύματος
- Εμφάνιση εκτεταμμένου bolus σε %
- SAGE
- IAGE
- CAGE
- PBAGE
- OAPS
- UPLD
- BAS
- EXT
- Ενεργοποιώντας το autosense θυμιθείτε να εισάγετε όλους τους υδατ. Διαφορετικά, οι αποκλίσεις των υδατανθράκων θα εντοπιστούν λανθασμένα ως αλλαγή ευαισθησίας
- Σταθμισμένος μέσος όρος ευαισθησίας
- OK
- Ακύρωση
- Δεν έχουν φορτωθεί όλα τα προφίλ
- Οι τιμές δεν αποθηκεύτηκαν!
- Ενεργοποιήστε την αποστολή σε άλλες εφαρμογές (όπως xDrip)
- Ενεργοποιήστε τις αποστολές
- ΔΡΑΣΤΗΡΙΟΤΗΤΑ & FEEDBACK
- ΥΔΑΤ. & BOLUS
- CGM & OPENAPS
- ΑΝΤΛΙΑ
- "Τιμή Βασικού ρυθμού [U/h] "
- Διάρκεια [min]
- Μέγιστη τιμή καμπύλης IOB
- Μέγιστο καμπύλης [λεπτά]
- Free-Peak Oref
- Γρήγορη δράση - Oref
- Έξτρα Γρήγορη δράση - Oref
- "DIA για %1$f πολύ μικρή - χρησιμοποιήστε %2$f! "
- ΕΝΕΡΓΟΠΟΙΗΣΗ ΠΡΟΦΙΛ
- Ημερομηνία
- ΜΗ ΕΓΚΥΡΟ
- Περιμένετε για ζεύξη με αντλία
- Ζεύξη ΟΚ
- "Τέλος χρόνου ζεύξης "
- ΖΕΥΞΗ
- Δεν βρέθηκε συσκευή
- Άδειο ρεζερβουάρ
- Ειδοποίηση υψηλής τιμής σακχάρου
- Υπόλοιπο Ινσουλίνης
- DanaRS
- Dana
- Επιλογή αντλίας
- Ζεύξη νέας αντλίας
- Ταχύτητα Bolus
- "Ρυθμίστε βήμα βασικού στο 0.01 U/h "
- Serial number
- Ποσοστό
- Χρονική μετατόπιση
- Προκαθορισμένος Στόχος-Προσ.Ρυθμ.
- Διάρκεια πλησιέστερου γεύματος
- Στόχος για προσέγγιση των τροφίμων
- διάρκεια άσκησης
- στόχος άσκησης
- Πλήρωση
- Κατάσταση εκτετεμμένου bolus
- Κατάσταση bolus
- Κατάσταση Προσ.Ρυθμ.
- Λήψη ρυθμίσεων αντλίας
- Λήψη ώρας αντλίας
- επαναχρησιμοποίηση
- Έλεγχος από ρολόι
- Ρυθμίστε Στόχους-Προσ. και βάλτε Θεραπείες από το ρολόι
- Ο χρόνος σύνδεσης έληξε
- Περιμένετε το τέλος του bolus. Απομένουν %d sec
- Επεξεργασία
- Έναρξη bolus
- Η εντολή εκτελείται τώρα
- Χαμέτη μέτρηση BG
- "Χρησιμοποιήστε ειδοποιήσεις συστήματος για ειδοποιήσεις "
- Τοπικές Ειδοποιήσεις
- Ειδοποίησε αν δεν ληφθούν δεδομένα μετρήσεων BG
- Απενεργοποιεί το bluetooth του τηλεφώνου για ένα δευτερόλεπτο αν δεν είναι δυνατή η σύνδεση με την αντλία.Αυτό μπορεί να βοηθήσει σε ορισμένα τηλέφωνα όπου το bluetooth παγώνει
-
+
+
diff --git a/app/src/main/res/values-es/insight_alerts.xml b/app/src/main/res/values-es/insight_alerts.xml
new file mode 100644
index 0000000000..70489fbc5e
--- /dev/null
+++ b/app/src/main/res/values-es/insight_alerts.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 3a0eb9de6e..90053a8c4b 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -1,926 +1,1046 @@
+
+
- Seguridad tratamientos
- Máximo Bolo permitido [U]
- Máximos carbohidratos permitidos [g]
- Preferencias
- Refrescar tratamientos desde NS
- Restablecer las bases de datos
- ¿Realmente quiere resetear la base de datos?
- Salida
- Usar bolos extendidos para> 200%
- DanaR dispositivo Bluetooth
- Usar siempre valor basal absoluto
- Por favor reinicia el teléfono o AndroidAPS desde ajustes de sistema, sino AndroidAPS no guardará registros (importantes para trazar y verificar que el algoritmo funcione correctamente)
- Inicio
- Verificar
- Unidades
- DIA (Duración Insulina Activa)
- IC (Insulina/Carbohidratos Ratio)
- ISF (Factor Sensibilidad Insulina)
- Dosis Basal
- Objetivo
- PERFIL NO ACTIVO
- Insulina:
- Carbohidratos:
- IOB:
- IOB:
- Actividad:
- Total IOB:
- Actividad total IOB:
- Dur:
- Dosis:
- Ins:
- IOB:
- IOB Total:
- Insulina [U]
- Carbohidratos [g]
- Glucosa
- TT
- Hidratos Carbono
- Corrección
- U
- Bolo IOB
- Ejecutar ahora
- BOMBA VIRTUAL
- Dosis Basal Base
- Basal Temporal
- Bolo extendido
- Batería
- Depósito:
- OK
- Última ejecución
- Parámetros de entrada
- Estado de glucosa
- Basal temporal actual
- IOB datos
- Perfil
- Datos de comidas
- Resultado
- No hay disponibles datos de glucosa
- Ninguna acción requerida
- Solicitud
- Dosis
- Duración
- Razón
- Glucosa
- Delta
- Delta:
- Config Builder
- Objetivos
- OpenAPS MA
- Sinopsis
- Perfil NS
- Perfil simple
- Basal temporal
- Tratamientos
- Bomba virtual
- Careportal
- Bomba
- Tratamientos
- Perfil
- APS
- General
- días
- Restricciones
- Loop
- Loop
- APS
- Tras procesar limitaciones
- Basal temporal en la bomba
- Última aceptada
- OK
- Cancelar
- NO APS Seleccionado
- Seguridad
- Plugin está desactivado
- Violación restricciones
- Error de administración del bolo
- Basal Temporal no emitida
- Valor basal [%]
- % (100% = actual)
- Aceptar nueva basal temporal:
- Bolo
- Calculadora
- Restricción aplicada!
- Confirmación
- Introduzca nuevo tratamiento:
- Bolo
- Bolo:
- Basal
- Basal:
- Carbohidratos
- Cambiar datos!
- Establecer nuevo bolo extendido:
- Origen BG
- xDrip
- Modo APS
- Loop cerrado
- Loop abierto
- Loop Inactivo
- Desactivar loop
- Activar loop
- Nueva propuesta disponible
- Versión de NSClient no soportada
- Versión no acceptada de Nightscout
- NSClient no instalado. Registro perdido!
- BG disponible en NS
- Estado de la bomba disponible en NS
- Aceptados
- LOOP DESACTIVADO POR RESTRICCIONES
- Czech
- English
- Basal IOB
- Restricción aplicada en bolo
- Restricción aplicada en carbohidratos
- MEDIR GLUCOSA
- ANUNCIO
- NOTA
- Pregunta
- Ejercicio
- Cambio Lugar Bomba
- Insertar sensor
- Iniciar sensor
- Cambio Cartucho insulina
- Cambio de perfil
- Bolo de aperitivo
- Bolo de comida
- Bolo de corrección
- Combo bolo
- Basal Temporal Inicio
- Basal Temporal Fin
- Hidratos Carbono Corrección
- OpenAPS Offline
- Tipo de evento
- Otro
- Medidor
- Sensor
- Hidratos Carbono
- Insulina
- Tiempo absorción
- Dividir
- Duración
- Dosis
- Absoluto
- Notas
- Fecha Hora
- Perfil
- Introducido por
- Tipo de glucosa
- Pendiente carga perfil NS
- Basal Temporal
- Bolo extendido
- Nightscout versión:
- Faltan
- Preferencias exportadas
- Exportar ajustes a
- Importar configuración de
- Ajustes importados
- Archivo no encontrado
- Exportar ajustes
- Importar ajustes
- Frances
- Chino
- German
- Este valor es llamado max basal en el contexto OpenAPS
- Este valor es llamado Max Iob en el contexto OpenAPS\nEsta es la máxima insulina en [U] APS puede entregar a la vez.
- Bulgarian
- DESCARTAR
- Idioma
- DanaR
- Conectando
- Conectado
- Desconectado
- Ajustes de la bomba DanaR
- Acuerdo de licencia de usuario final
- No deben utilizarse para tomar decisiones médicas. NO HAY GARANTÍA PARA EL PROGRAMA, la extensión permitida por la legislación aplicable. Excepto cuando se indique de otra forma por escrito, los tenedores del copyright y / u otras partes proporcionan el programa \"tal cual\" sin garantía de ningún tipo, ya sea expresa o implícita, incluyendo, pero no limitado a, las garantías implícitas de COMERCIALIZACIÓN E IDONEIDAD PARA UN FIN DETERMINADO . TODO EL RIESGO EN CUANTO A LA CALIDAD Y RENDIMIENTO DEL PROGRAMA ES CON USTED. SI EL PROGRAMA TIENE UN ERROR, asume el coste de cualquier servicio, reparación o corrección.
- Entiendo y acepto
- Salvar
- No se encuentra adaptador Bluetooth
- El dispositivo seleccionado no se encuentra
- Error de conexión de la bomba
- Última conexión
- Bomba IOB
- Unidades diarias
- Último bolo:
- Hace %.1fh
- Datos invalidos
- Valor no establecido correctamente
- Recargar Perfil
- Ver perfil
- Aceptada
- Comentario
- Correcto
- Porciento
- Absoluto
- Cancelar basal temporal
- SMS Communicator
- Esperando resultado
- Números de teléfono permitidos
- XXXXXXXXXX +; + YYYYYYYYYY
- Para entregar bolo %1$.2fU responder con código %2$s
- Bolo falló
- Bolo %.2fU entregado con éxito
- Bolo %.2fU enviado correctamente
- Entregando %.2fU
- Permitir comandos remotos vía SMS
- Bolo remoto no permitido
- Dedo
- Sensor
- Manual
- Objetivo temporal
- Cancelar Objetivo temporal
- Configuración perfil DanaR
- DIA [h]
- No se pudo actualizar el perfil basal
- Recargar
- Subiendo
- E bolo
- bolo DS
- DE bolo
- error
- rellenar
- basal hora
- glucosa
- carbohidratos
- alarma
- Total %d registros subidos
- S bolo
- alarmas
- Basal Horas
- bolos
- Carbohidratos
- Insulina Diaria
- Errores
- Glucosa
- Rellenar
- Suspender
- Conexión de %d s
- Contraseña de la bomba
- Contraseña de la bomba incorrecta!
- Bomba ocupada
- Entregado
- Detenido
- Bolo interrumpido
- Deteniendo bolo
- Oclusión
- Detener
- Parar pulsado
- Se entregará %.2fU
- Configuración de visualización y monitoreo, y el análisis de los basales y ratios
- Comprobar que los datos de BG están disponibles en Nightscout, y que los datos de la bomba de insulina se están subiendo
- Empezar con bucle abierto
- Ejecutar en modo de Loop abierto durante unos días, y aceptar manualmente las basales temporales. Set up and use temporary and default temporary targets (e.g. for activity or hypo treatment carbs)
- Entender el Loop abierto, incluidas las recomendaciones de basales temporales
- Sobre la base de esa experiencia, decidir valores de máximo basal, y ajustar la bomba y preferencias
- Iniciar el bucle cerrado con suspensión con baja glucosa
- Ejecutar en Loop cerrado con max IOB=0 durante unos días sin demasiados valores bajos de glucosa
- Ajuste del bucle cerrado, aumento máximo IOB por encima de 0 y bajando gradualmente objetivos BG
- Funcionando unos cuantos días, y al menos una noche sin alarmas bajas BG, y bajar gradualmente BG
- Ajustar los basales y ratios, si es necesario, y luego activar auto-sens
- 1 semana Loop cerrado completado con entrada regular de carbohidratos
- Habilitar funciones adicionales para su uso durante el día, como asistente de comida avanzado
- Habilitar funciones adicionales para uso durante el día como SMB
- Alcanzado el límite permitido
- Sin perfil seleccionado
- Loop se ha desactivado
- Loop se ha activado
- Loop inactivo
- loop activo
- Valor %s fuera de limites
- Botón Texto:
- Carbs:
- Validar:
- Añadir
- Editar
- Eliminar
- Asistente
- Asistente configuración
- No permitidos ajustes basales remotos
- Para iniciar basal %1$.2fU/h responder con código %2$s
- Basal temporal %1$.2fU/h para %2$d min iniciada correctamente
- Fallo inicio basal temporal
- Para parar basal temporal responder con código %s
- Basal temporal cancelada
- Fallo cancelación basal temporal
- Comando desconocido o respuesta incorrecta
- Bolo Comida
- Corr
- Korean
- Acciones
- AndroidAPS iniciado
- NS solo subida (sinc. inactiva)
- NS solo subida. No efectivo con SGV salvo que este seleccionada una fuente local como xDrip. No efectivo en perfiles usando perfiles NS
- ¡Bomba no iniciada!
- Bomba no iniciada, ¡perfil no ajustado!
- ¡Por favor asegurar que la cantidad coincide con la especificación del set de infusión!
- Otros
- Botón 1
- Botón 2
- Botón 3
- Unidades:
- Sólo se permiten caracteres numéricos
- Sólo se permiten dígitos en el rango %1$s - %2$s
- Este campo no puede estar vacío
- Número de teléfono inválido
- Esperando bomba
- Italian
- hollandes
- Griego
- Ruso
- Sueco
- Max U/h para el perfil base
- "Max IOB basal OpenAPs puede emitir "
- Para enviar calibracion %1$.2f responder con código %2$s
- Entregaré %.2fU
- Duración de acitividad de insulina
- %1$.2f limitado a %2$.2f
- no permitido el mando remoto
- Para cancelar loop por %1$d minutos responde con código %2$s
- Rellenar/Llenar
- Llenar/Rellenar cantidad de insulina estándar
- mg/dl
- mmol/l
- DIA:
- Rango Objetivo:
- Rango de visualización
- Marcas Alta y Baja para graficos en Sinopsis y Smartwatch
- Marca BAJO
- Marca ALTA
- Reloj
- Enviar todos los datos
- Abrir ajustes en reloj
- Error en bomba
- Batería Baja
- Apagando Bomba
- Batería de la bomba descargada
- DanaR Korean
- Ratio Basal:
- Error al activar perfil basal
- Perfil basal actualizado en bomba
- Inhabilitar EasyUI modo en bomba
- Habilitar bolos extendidos en bomba
- Cambio de modo de U/d a U/h en bomba
- Valor Basal por debajo del mínimo. Perfil NO aplicado!
- BG:
- Último BG:
- MDI
- MM640g
- Avisos permanentes
- DATOS CADUCADOS
- %dmin antes
- %dmin antes
- Perfil Local
- OpenAPS AMA
- Delta media corta
- Delta media larga
- Matriz de %d elementos. Valor actual:
- Datos Autosens
- Script debug
- Usar característica AMA autosens
- Renovar datos desde NS
- ComidendoPronto
- Hipo
- Actividad
- Eliminar registro:
- DanaR Stats
- TDD acumulativa
- "TDD ampliada exponencialmente "
- Basal
- Bolo
- Dosis diaria
- Fecha
- Cuota
- # Días
- Peso
- Probablemente impreciso usando bolo para llenar/rellenar!
- Datos caducados pro favor pincha RELOAD
- Basal total
- Basal diaria *2
- Inicializando
- "ACC"
- "CONF"
- "LOOP"
- "PERFSIM"
- OAPS
- "PERFLOC"
- "DANA"
- "GENERAL"
- "BOMBAV"
- "PERF"
- "TRAT"
- "CP"
- "OBJ"
- RELOJ
- "SMS"
- Tab titulo corto
- Usa siempre delta media corto en vez de delta simple
- Recomendado si los datos de origen no filtrados como xDrip son inestables.
- Ajustes avancados
- Modelo: %1$02X Protocolo: %2$02X Codigo: %3$02X
- Perfiles
- "Valor por defecte: 3 Esto es valor de seguridad establecido pos OpenAPS. Limita tu base al máximo de x3 de tu base máxima. No necesitas cambiar esto, pero debes tener en cuenta, que esto se esta discutiento sobre „3 x max diario; 4x actual“ pro razones de seguridad. "
- "Ajuste pro defecto: 4 Esto es la otra mitad de los ajustes de seguridad de OpenAPS y la otra mitad de \"3x max diario, 4x actual\". Esto significa, que tu base no puede ser mas alta que el numero que multiplica tu base. Esto es para evitar que las personas se encuentren en situaciones peligrosas por aumentar mucho la base sin entender el algoritmo del sistema. El ajuste por defecto es x4. La mayoría de las personas nunca tendra que cambiar estos ajustes, si no debe modificar otros ajustes en la terapia. "
- "Ajuste por defecto: 1.2\nEsto es un multilicador para autosens (y pronto autotune) para poner un 20% limite máximo a la cota de autosens ratio, la que determina cuantos ajustes autosens puede hacer a la base, a cuanto puede ajustar ISF y a cuanto puede bajar el objective de glucosa. "
- Ajuste pro defecto: 0.7\nEl otro lade de limitaciones de seguridad de autosens, limitando a cuanto puede bajar la base y a cuanto puede subir ISF y BG objectivos.
- Ajuste por defecto: true\nEsto se usa para permitir autosens a ajustar objectivos BG ademas de ISF y bases.
- Ajuste por defecto: 2 \nDormir bolo es iniciado después de proveder un bolo para comida, así el loop no interactuará con low temps cuando acabas de comer. El ajuste pro defecto es 2; quiere decir con el DIA de 3 h el bolo será dormido por fases por 1.5 h (3DIA/2).
- "Ajustes pro defecto: 3.0\nEsto es un ajuste pro defecto para la absorción de carbohidratos pro 5 minutos. Por defecto se espera 3mg/dl/5min. Esto afecta la velocidad de reducción de COB y cuanta absorción se usa para calcular el BG futuro previsto, si la glucosa diminua mas de lo previsto o aumenta mas de lo previsto. "
- "Atención!\nNormalment no tienes que editar los valores a continuación. Por favor PINCHA AQUI y LEE el texto y PROCURA ENTENDER antes de cambiar alguno de los valores. "
- numero de telefonp incorrecto
- Copiar al Clipboard
- Copiado al clipboard
- mostrar log
- Calibración
- Mandar calibración %.1f a xDrip?
- xDrip+ no instalado
- Calibración mandada a xDrip
- Calibración remota no admitida
- Mandar calibración tiene que ser activada en xDrip.
- xDrip no recibe calibraciones
- bomba parada
- recibir estado de bomba
- iniciando base temporal
- parando base temporal
- iniciando bolo prolongado
- parando bolo prolongado
- actualizando cuota base
- Desconectando
- Efectuando
- Ajustes bomba virtual
- Subiendo estado a NS
- Contrasena invalida
- Contrasena para ajustes
- desbloquear ajustes
- llegando al limite de insulina diario
- NSClient
- NSCI
- URL:
- Autoscroll
- Reiniciar
- NSClient
- Nightscout URL
- Indica Nightscout URL
- NS API secret
- NS API secret
- Indica NS API secret (min 12 chars)
- entregar ahora
- borrar cola
- mostrar cola
- Cola:
- Estado:
- Pausado
- Borrar log
- NSCLIENT no tiene derecho para editar. API secret incorrecto?
- Ajustes reloj
- mostrar detalles IOB
- Separar IOB en bolo y base en el reloj
- sin efecto - por favor controlar en móvil
- no disponible
- Edad paciente
- Menor de edad
- Adolescente
- Adulto
- Por favor elige edad del paciente para emplear limites de seguridad
- Glimp
- %s necesita optimización de bateria whitelisting para funcionar bien
- Loop desactivado
- desactivado (%d m)
- Superbolus (%d m)
- Desactivar loop por 1h
- Desactivar loop por 2h
- Desactivar loop por 3h
- Desactivar loop por 10 h
- Desconectar bomba por 15 min
- Desconectar bomba por 30 min
- Desconectar bomba por 1 h
- Desconectar bomba por 2 h
- Desconectar bomba por 3 h
- Reiniciar
- duración incorrecta
- Loop desactivado
- Loop reiniciado
- Tendencia 15 min
- COB
- Superbolo
- Indica app start en NS
- Saliendo de la aplicación para aplicar ajustes.
- DanaRv2
- Insulina
- Insulina acción rápida
- Novorapid, Novolog, Humalog
- Fiasp
- INS
- activar superbolo en wizard
- Activar función superbolo en wizard. No lo actives hasta que hayas aprendido lo que realmente hace. PUEDE CAUSAR SOBREDOSIS DE INSULINA usandolo sin precaución!
- IOB
- COB
- Firmware
- Estado de bluetooth
- Sobre
- "Falta permitir SMS "
- xDrip Status (reloj)
- xDrip Statusline (reloj)
- xds
- Mostrar BGI
- agregar BGI a status line
- Datos no mandados a NS
- Todos los datos mandados a NS son borrados. AAPS esta conectado a NS pero no hay cambios en NS
- Nivel base
- Nivel bolo
- Bolo prolongado
- "Objectivo temporal "
- cancelar bolo prolongado
- Edad sensor
- Edad cánula
- Edad insulina
- horas
- Tipo base
- Perfil invalido !!!
- CambioPerfil
- Edad bateria bomba
- Cambio bateria bomba
- Opciones alama
- Urgente alto
- Alto
- Bajo
- Urgente bajo
- Stale data
- Urgent stale data
- Stale data threshold [min]
- Urgent stale data threshold [min]
- Interval para autosens [h]
- Horas en el pasado para detectar sensibilidad (tiempo de absorción de carbohidratos no incluidos)
- Bomba
- OpenAPS
- Uploader
- Detección sensibilidad
- SENS
- Sensibilidad Oref0
- Sensibilidad AAPS
- Ajustes absorción
- Tiempo max absorción comida [h]
- Tiempo esperado en el que todos los carbohidratos son absorbados
- mostrar bolo prolongado en %
- SAGE
- IAGE
- CAGE
- PBAGE
- OAPS
- UPLD
- BAS
- EXT
- Al activar autosens recuerda editar todos carbohidratos comidos. Si no, sensibilidad será calculada incorrectamente !!!
- Sensitivity WeightedAverage
- OK
- Cancelar
- Faltan perfiles!
- Valores no guardados!
- Activar mensajes a otras aplicaciones (como xDrip).
- Activar mensajes locales.
- ACTIVITY Y FEEDBACK
- CARBS Y BOLUS
- CGM Y OPENAPS
- BOMBA
- Valor base [U/h]
- Duración [min]
- IOB Curve Peak Time
- Peak Time [min]
- Free-Peak Oref
- Rapid-Acting Oref
- Ultra-Rapid Oref
- DIA de %1$f demasiado corto - usando %2$f!
- ACTIVAR PERFIL
- Fecha
- INVALIDO
- Esperando para conectar con bomba
- conexión OK
- conexión fuera de tiempo
- CONECTANDO
- aparato no encontrado
- Deposito vacio
- Alerta de control de BG
- Insulina restante en deposito
- DanaRS
- Dana
- Bomba seleccionada
- Conectar bomba nueva
- Velocidad bolo
- Poner paso base a 0.01 U/h
- Numero de serie
- Porcientos
- Cambio de tiepmo
- Ojbectivo temporal por defecto
- duración comiendopronto
- objectivo comiendopronto
- duración actividad
- objectivo actividad
- Cebado
- recibiendo estado de bolo prolongado
- recibiendo estado bolo
- recibiendo estado bolo temporal
- recibiendo ajustes bomba
- recibiendo hora bomba
- usar otra vez
- Control desde reloj
- editar y emitir abjectivos temp. y tratamientos por reloj
- Fuera tiempo conexión
- comida
- g
- ]]>
- kJ
- En
- Pr
- Grasa
- ]]>
- Esperando terminar bolo. Faltan %d seg.
- Processando
- "Iniciando emisión bolo "
- Orden se esta efectuando en este momento
- control de la bomba corigido
- bomba no alcanzable
- "Falta lectura BG "
- Usa avisos del sistema para alarmas y avisos
- Alarma local
- Alarma si no llegan datos BG
- Alarma si bomba no es alcanzable
- Alarma urgente
- INFO
- Bluetooth
- BT Watchdog
- Apaga el bluetooth del móvil por un segundo si no hay conexión con la bomba. Esto ayuda con algunos moviles con problemas de establecer conexión bluetooth estable.
- DexcomG5 App (patched)
- Envias datos BG a NS
- G5 upload ajustes
- "mostrar detalles delta "
- mostrar delta con una plaza decimal mas
- firmware de la bomba no apoyada
- mandar BG a xDrip
- En xDrip elige 640g/Eversense date source
- NSClient BG
- Valor base remplazado por valor mínimo
- Cálculo BG
- Cálculo bolo IOB
- Cálculo basal IOB
- Cálculo tendencia
- Cálculo superbolo
- Si
- No
- Solo positivo
- Solo negativo
- Cálculo COB
- Cálculo objectivo temporal
- Loop activado
- APS seleccionado
- NSClient tiene permiso para escribir
- Modo cerrado activado
- Máximo IOB puesto correctamente
- BG adquirible del origen seleccionado
- Valores base no asignados a las horas: %s
- Perfil invalido: %s
- Programando bomba para emitir bolo
- Actualizar
- Estado
- Actividad
- Ninguna conexión por %d min
- %1$d%% (%2$d min restan)
- Apagado por error
- Apagado por usario
- Funcionando
- Cancelando TBR
- Poniendo TBR (%1$d%% / %2$d min)
- Emitiendo bolo (%.1f U)
- Actualizando
- "Acción no disponible en la bomba "
- Uso inseguro: bolo prolongado o multiwave activo. Modo Loop ha sido puesto a baja emisión para solo 6 horas. Solo bolo normal se puede emitir en modo loop.
- "Uso inseguro: la bomba usa base diferente a la primera. El loop ha sido apagado. Elige primero perfil en la bomba y acualiza. "
- Un bolo de mismo valor ha sido dado durante el pasado minuto. Para evitar bolos dobles y asegurarse contra bugs esto no es permitido.
- Ahora
- Leiendo historia bomba
- " Activando perfil base "
- "Nivel del deposito bajo "
- Bateria casi agotada
- La bomba muesta el error E%1$d: %2$s
- Bajo
- Vacio
- Historial
- Normal
- Se necesita actualizar reloj de la bomba
- Alerta
- TBR cancelada, advertencia acceptada
- Emisión del bolo fallada. Ningún bolo se ha emitido. Para asegurarse, por favor controle la bomba para evitar bolo doble. Para evitar bugs no se reinician bolos automaticamente.
- "Solo %1$.2f U del bolo mandado de %2$.2f U ha sido emitido por causa de un error. Por favorn controla la bomba para confirmar y toma acciones apropiadas. "
- "No hay suficiente insulina en el deposito para emitir bolo. "
- "Error al emitir bolo prolongado. "
- Bomba no alcanzable durante [min]
- Múltiples bolos con la misma cantidad en el mismo minuto fueron importados. Solo se puede agregar un registro a los tratamientos. Verifique la bomba y agregue manualmente un registro de bolo usando la pestaña Careportal. Asegúrese de crear un bolo con un tiempo que no use otro bolo.
- Comprobando cambios en el historial
- Tasa Basal cambiada en bomba, pero falló al leer
- La tasa Basal en la bomba ha cambiado y será actualizada pronto
- Actualizando estado bomba
- Rechazando temporal alta ya que el calculo no consideró los cambios recientes en el historial de la bomba
- El bolus se administró con éxito, pero no se pudo agregar la entrada al tratamiento. Esto puede suceder si se administran dos bolos pequeños del mismo tamaño en los últimos dos minutos. Verifique el historial de la bomba y las entradas de tratamiento y use Careportal para agregar entradas faltantes. Asegúrese de no agregar ninguna entrada para el mismo minuto exacto y la misma cantidad.
- El historial de la bomba ha cambiado después de que se realizó el cálculo del bolo. El bolo no fue entregado. Por favor, vuelva a calcular si aún se necesita un bolo.
- Leyendo perfil basal
- Inicio TT Hipo
- Ninguna acción seleccionada, nada sucederá
- Basales
- Carbohidratos activos COB
- Insulina activa IOB
- Desviaciones
- Sensibilidad
- El Bolo solo será anotado
- Categoría
- Subcategoría
- No administrar Bolo, solo anotar
- min
- TT
- Inicio TT Actividad
- Inicio TT ComiendoPronto
- Por favor actualiza la app G5, a una soportada
- Permita que los informes automáticos de errores y los datos de uso de funciones se envíen a los desarrolladores a través del servicio fabric.io.
- Fabric Upload
- Opciones de datos
- Predicciones
- Mostrar predicciones en el reloj
- Crear notificaciones en Nightscout para diálogos de error y alertas locales (también visibles en Careportal en Tratamientos)
- "Crear notificaciones de los errores"
- Muestre SMB en el reloj como un bolo estándar.
- Notificar cada SMB
- Historial
- CGM
- No se pudo iniciar la aplicación CGM. Asegúrate de que está instalada.
- Cantidad de insulina que se agrega cuando se presiona el botón
- "Cantidad de Carbohidratos que se agregan cuando se presiona el botón "
- Abre xDrip+, los botones Atrás regresan a AAPS
- Envía una calibración a xDrip + o abre el diálogo de calibración G5
- Botones
- Carbohidratos
- Insulina
- Silenciar
- Dejar Basal Temporal correr
- No recomendado por agotar batería
- Conectar de forma preventiva
- Conectar automáticamente cuando se abre AndroidAPS, antes de solicitar ningún comando de bomba, para reducir el retraso de la conexión
- Estadísticas
- Estado de Mantener-Activo
- %1$ds expira en %2$s
- Adulto resistente a la insulina
- Habilitar SMB durante 6 h después de Carbohidratos, incluso con 0 COB. Solo posible con fuente BG con buen filtrado de datos como G5
- Habilitar SMB siempre de forma independiente a los Bolos. Solo posible con fuente BG con buen filtrado de datos como G5
- Habilitar SMB después de Carbohidratos
- Habilitar SMB cuando hay un Objetivo Temporal (TT) ALTO activo (Actividad)
- Habilitar SMB con Objetivo Temporal Alto
- Habilitar SMB cuando hay un Objetivo Temporal (TT) activo (ComerPronto, Actividad)
- Habilitar SMB con Objetivos Temporales
- Habilitar SMB cuando hay Carbohidratos Activo COB.
- Habilitar SMB con COB
- Habilitar SMB siempre
- s
- Semana
- Día
- Hora
- minuto
- segundo
- Incompatible
- No autorizado
- Vinculación aplicación
- Código rechazado
- Esperando código de confirmación
- Desconocido
- Aplicación Companion incompatible, necesitamos la versión
- Companion app parece no instalada!
- ¡La aplicación Companion no parece estar instalada!
- Permanecer siempre conectado
- Advertencia W31: Cartucho insulina bajo
- Advertencia W32: Bateria baja
- Advertencia W33: Fecha/hora inválida
- Advertencia W34: Final de garantía
- Warning W39: Adevertencia tiempo de prestamo
- SMB administrado por bomba
- Inicializando
- SMB
- Activar UAM
- Activar SMB
- Usar Super Micro Bolus en lugar de Basal Temporal para una acción más rápida
- Detección Comidas No Anunciadas UAM
- Insight
- Bomba Insight
- Estado
- Modificado
- BOMBA PARADA
- Estado actualizado
- hace
- con
- Basal Temporal TBR Activa
- minutos faltan
- Libro de registros
- Última acción completada
- necesita
- PUESTA EN MARCHA
- SINCRONIZADO
- OCUPADO
- SINCRONIZANDO
- DESOCUPADO
- Contador Bolos
- Contador TBR
- Minutos máximos de basal para limitar SMB a
- restan sobre
- total con
- Bomba inalcanzable. No se administró ningún Bolo
- Autosens también ajusta los objetivos
- Duración Hipo
- Objetivo Hipo
- m
- h
- Objetivo %d no iniciado
- Objetivo %d no finalizado
- La bomba no tiene capacidad basal temporal
- Tasa Basal no valida en la bomba
- Loop cerrado desabilitado en preferencias
- Autosens desabilitado en preferencias
- SMB desabilitado en preferencias
- limitando max basal rate a %1$.2f U/h debido a %2$s
- Limite de la bomba
- Tiene que ser un valor positivo
- Multiplicador basal máximo
- Multiplicador diario basal máximo
- Un Bolo entregado en los últimos 3 minutos
- Basal establecida correctamente
- Limitando porcentaje máximo de tasa a %1$d%% debido a %2$s
- "Limitando el bolo a %1$.1f U debido a %2$s "
- Limitando max IOB to %1$.1f U debido a %2$s
- Limitando carbs to %1$d g debido a %2$s
- Limitando IOB to %1$.1f U debido a %2$s
- Valor máximo en preferencias
- Limite estricto
- uso no seguro
- Error al leer estado
- Anotar cambio sitio bomba
- Anotar cambio cartucho de insulina
- "SMB siempre y después de que los carbohidratos deshabilitados porque la fuente activa de BG no admite el filtrado avanzado "
- "SMB no permitido en modo de Loop abierto "
- Comida
- reset
- Esperando para sincronización de tiempo (%d sec)
- Desconectado (%d m)
- Eventos Careportal automáticos
- "Subi automáticamente la insulina, la cánula y los cambios de batería y las alarmas de bombeo a Nightscout "
- Este valor se denomina IOB máx. En el contexto de OpenAPS. OpenAPS no agregará más insulina si el IOB actual es mayor que este valor.
- Tiempo máximo de absorción de la comida [h]
- "Tiempo en el que cualquier comida se considera absorbida. Los carbohidratos restantes serán cortados. "
- Tiempo
- Mostrar el campo notas en dialogos de tratamientos
- Solicitado: %1$.2fU Entregado: %2$.2fU Codigo de error: %3$d
- Primer incremento insulina
- Segundo incremento insulina
- Tercer incremento insulina
- Primer incremento carbohidratos
- Segundo incremento carbohidratos
- Tercer incremento carbohidratos
- CGM
- Usar solo WIFI
- WIFI SSID
- Ajustes conexión
- SSID\'s permitido (separados por punto y coma)
- Permitir conexión en roaming
- "Proporción de autosens máximos "
- "Proporción autosens mínima "
- Máximo multiplicador diario de seguridad
- "Multiplicador de seguridad basal actual "
- DIA Divisor para suspensión de bolos
- El máximo total de IOB OpenAPS no puede rebasar [U]
- n/a
- Bomba parada
- Bomba iniciada
- Bomba pausada
- por adelantado con
- %.2f U/h
- OpenAPS SMB
- " http://www.androidaps.org http://www.androidaps.de (de) facebook: http://facebook.androidaps.org http://facebook.androidaps.de (de)"
- El último bolo tiene más de 24 horas o está en el futuro. Compruebe la fecha en que la bomba está configurada correctamente.
- La hora / fecha del bolo administrado en la bomba parece incorrecta; es probable que la IOB sea incorrecta. Verifique la hora / fecha de la bomba.
- Falta Cambio de Perfil. Haga un Cambio de Perfil o presione \"Activar perfil\" en PerfilLocal.
- Error E13: error de idioma
- "Error E10: error de rebobinado "
- "Error E7: error electrónico "
- "Error E6: error mecánico "
- "Mantenimiento M30: Tipo de cartucho no configurado "
- "Mantenimiento M29: tipo de batería no configurada "
- "Mantenimiento M28: tiempo de pausa del modo de pausa "
- "Mantenimiento M27: Error en la descarga de datos "
- "Mantenimiento M20: Cartucho no insertado "
- "Mantenimiento M21: Cartucho vacío "
- "Mantenimiento M22: Batería agotada "
- "Mantenimiento M23: Apagado automático "
- "Mantenimiento M26: cambio de cartucho no completado "
- "Mantenimiento M25: tiempo de prestamo finalizado - final de la operación "
- "Mantenimiento M24: Oclusión "
- Español
- Solo si cargando
- Autobackfill BG
- Asistente configuración
- Calculos incluidos en el resultado del asistente
- Mostrar configuración
- Configuración general
- Rumano
+ Seguridad de tratamientos
+ Máximo Bolo permitido [U]
+ Máximos carbohidratos permitidos [g]
+ Preferencias
+ Actualizar tratamientos de NS
+ Restablecer las bases de datos
+ ¿Realmente quiere restablecer la base de datos?
+ Salir
+ Usar bolos extendidos para >200%
+ Dispositivo Bluetooth DanaR
+ Usar siempre valor basal absoluto
+ 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.
+ 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
+ Condición del algoritmo en 2016
+ Condición 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.
+ Usa el perfil introducido 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
+ Integración de bombas de insulina domésticas de DANA Diabecare R
+ Integración para bombas de insulina DANA Diabecare R con el firmware actualizado
+ Integración de bombas de insulina de DANA Diabecare RS
+ Integración de bombas de insulina Accu-Check Insight, necesita tener SightRemote instalado
+ Integración de bomba de insulina para personas que usan varias inyecciones diarias para su terapia de diabetes
+ Integración para bombas de insulina que aún no tienen ningún controlador/driver (lazo abierto)
+ 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.
+ 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.
+ Guarda todos los tratamientos que se realizaron
+ Observar y controlar AndroidAPS usando tu reloj WearOs.
+ 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)
+ ISF (Factor Sensibilidad Insulina)
+ Dosis Basal
+ Objetivo
+ NINGUN PERFIL ACTIVO
+ Insulina:
+ Carbohidratos:
+ IOB:
+ IOB:
+ Actividad:
+ IOB total:
+ Actividad total IOB:
+ Dur:
+ Dosis:
+ Ins:
+ IOB:
+ IOB Total:
+ Insulina [U]
+ Carbohidratos [g]
+ BG
+ OT
+ Carbohidratos
+ Corrección
+ Uds
+ Bolo IOB
+ Ejecutar ahora
+ BOMBA VIRTUAL
+ Dosis Basal Base
+ Basal Temporal
+ Bolo extendido
+ Batería
+ Depósito
+ Ok
+ Última ejecución
+ Parámetros de entrada
+ Estado de glucosa
+ Basal temporal actual
+ IOB datos
+ Perfil
+ Datos de comidas
+ Resultado
+ No hay disponibles datos de glucosa
+ Ninguna acción requerida
+ Solicitud
+ Dosis
+ Duración
+ Razón
+ Glucosa
+ Variación
+ Variación:
+ Tabla de configuraciones
+ Objetivos
+ OpenAPS AMA
+ Inicio
+ Perfil NS
+ Perfil simple
+ Basal temporal
+ Tratamientos
+ Bomba virtual
+ Portal Tratamientos
+ Bomba
+ ¿Qué bomba quieres utilizar con AndroidAPS?
+ Tratamientos
+ ¿Que complemento quieres usar para el manejo del tratamiento?
+ Perfil
+ ¿Qué perfil debe usar AndroidAPS?
+ APS
+ ¿Que algoritmo APS debe hacer ajustes en la terapia?
+ Ajustes generales
+ Complementos genéricos que pueden serte útiles.
+ ¿Qué restricciones se aplican?
+ días
+ Restricciones
+ Lazo
+ Lazo
+ Utiliza esto para activar la integración del lazo de AndroidAPS.
+ APS
+ Tras procesar restricciones
+ Basal temporal en la bomba
+ Última aceptada
+ Ok
+ Cancelar
+ NO APS Seleccionado o resultado entregado
+ Seguridad
+ Complemento desactivado
+ Violación restricciones
+ Error de administración del bolo
+ Basal Temporal no emitida
+ Valor basal [%]
+ % (100% = actual)
+ Aceptar nueva basal temporal:
+ Tratamiento
+ Calculadora
+ Restricción aplicada!
+ Confirmación
+ Introduzca nuevo tratamiento:
+ Bolo
+ Bolo:
+ Dosis Basal
+ Dosis Basal:
+ Carbohidratos
+ ¡Cambiar datos!
+ Establecer nuevo bolo extendido:
+ Origen BG
+ ¿De donde debe AndroidAPS obtener sus datos?
+ xDrip
+ Modo APS
+ Lazo cerrado
+ Lazo abierto
+ Lazo Inactivo
+ Desactivar lazo
+ Activar lazo
+ Nueva propuesta disponible
+ Versión de NSClient no soportada
+ Versión no aceptada de Nightscout
+ NSClient no instalado. ¡Registro perdido!
+ BG disponible en NS
+ Estado de la bomba disponible en NS
+ Aprobación Manual
+ LOOP DESACTIVADO POR RESTRICCIONES
+ Basal IOB
+ Restricción aplicada en bolo
+ Restricción aplicada en carbohidratos
+ MEDIR GLUCOSA
+ ANUNCIO
+ NOTA
+ Pregunta
+ Ejercicio
+ Cambio Lugar Bomba
+ Insertar sensor
+ Iniciar sensor
+ Cambio Cartucho insulina
+ Cambio de perfil
+ Bolo de aperitivo
+ Bolo de comida
+ Bolo de corrección
+ Combo bolo
+ Basal Temporal Inicio
+ Basal Temporal Fin
+ Corrección Carbohidratos
+ OpenAPS sin conexión
+ Tipo de evento
+ Otro
+ Medidor
+ Sensor
+ Carbohidratos
+ Insulina
+ Tiempo absorción
+ Dividir
+ Duración
+ Dosis
+ Absoluto
+ Notas
+ Fecha Hora
+ Perfil
+ Introducido por
+ Tipo de glucosa
+ Pendiente carga perfil NS
+ Basal Temporal
+ Bolo extendido
+ Nightscout versión:
+ Faltan
+ Preferencias exportadas
+ Exportar ajustes a
+ Importar configuración de
+ Ajustes importados
+ Archivo no encontrado
+ Exportar ajustes
+ Importar ajustes
+ Max U/h para el perfil base
+ Este valor es llamado max basal en OpenAPS
+ Max IOB basal que OpenAPs puede emitir [U]
+ Este valor es llamado Max Iob en el OpenAPS\nEsta es la máxima insulina en [U] que APS puede entregar a la vez.
+ DESCARTAR
+ DanaR
+ Conectando
+ Conectado
+ Desconectado
+ Ajustes de la bomba DanaR
+ Acuerdo de licencia de usuario final
+ NO DEBE UTILIZARSE PARA TOMAR DECISIONES MÉDICAS. NO HAY NINGUNA GARANTÍA PARA EL PROGRAMA, EN LA MEDIDA PERMITIDA POR LA LEY APLICABLE. EXCEPTO CUANDO SE INDIQUE LO CONTRARIO POR ESCRITO, LOS TITULARES DE LOS DERECHOS DE AUTOR Y/O OTRAS PARTES PROPORCIONAN EL PROGRAMA \"TAL CUAL\" SIN GARANTÍA DE NINGÚN TIPO, YA SEA EXPRESA O IMPLÍCITA, INCLUIDAS, ENTRE OTRAS, LAS GARANTÍAS IMPLÍCITAS DE COMERCIABILIDAD Y ADECUACIÓN PARA UN PROPÓSITO EN PARTICULAR. TODO EL RIESGO EN CUANTO A LA CALIDAD Y EL RENDIMIENTO DEL PROGRAMA ES SUYA. SI EL PROGRAMA TUVIERA UN ERROR, USTED ASUME EL COSTE DE TODO SERVICIO, REPARACIÓN O CORRECCIÓN NECESARIOS.
+ ENTIENDO Y ACEPTO
+ Guardar
+ No se encuentra adaptador Bluetooth
+ El dispositivo seleccionado no se encuentra
+ Error de conexión de la bomba
+ Bomba IOB
+ Unidades diarias
+ Último bolo
+ Hace %.1fh
+ Datos inválidos
+ Valor no establecido correctamente
+ Recargar Perfil
+ Ver perfil
+ Aprobado
+ Comentario
+ Correcto
+ Porciento
+ Absoluto
+ Cancelar basal temporal
+ Comunicador SMS
+ Esperando resultado
+ Números de teléfono permitidos
+ XXXXXXXXXX +; + YYYYYYYYYY
+ Para entregar bolo %1$.2fU responder con código %2$s
+ Para enviar calibración %1$.2f responder con código %2$s
+ Bolo falló
+ Bolo %.2fU entregado con éxito
+ Entregaré %.2fU
+ Bolo %.2fU enviado correctamente
+ Entregando %.2fU
+ Permitir comandos remotos vía SMS
+ Bolo remoto no permitido
+ Dedo
+ Sensor
+ Manualmente
+ Objetivo temporal
+ Cancelar Objetivo temporal
+ Configuración perfil DanaR
+ Tiempo de acción de la insulina [h]
+ Duración de actividad de insulina
+ No se pudo actualizar el perfil basal
+ Recargar
+ Subiendo
+ E bolo
+ bolo DS
+ DE bolo
+ error
+ rellenar
+ basal hora
+ glucosa
+ carbohidratos
+ alarma
+ Total %1$d registros cargados
+ S bolo
+ Alarmas
+ Basal Horas
+ Bolos
+ Carbohidratos
+ Insulina Diaria
+ Errores
+ Glucosa
+ Rellenar
+ Suspender
+ Conexión por %1$d s
+ Contraseña de la bomba
+ ¡Contraseña de la bomba incorrecta!
+ Bomba ocupada
+ Entregado
+ Detenido
+ Bolo interrumpido
+ Deteniendo bolo
+ Oclusión
+ Detener
+ DETENER PULSADO
+ Esperando bomba
+ Se entregará %.2fU
+ Configuración de visualización y monitorización, y análisis de basales y ratios
+ Comprobar que los datos de BG están disponibles en Nightscout, y que los datos de la bomba de insulina se están subiendo
+ Empezar con lazo abierto
+ Ejecutar en modo de lazo abierto durante unos días, y aceptar manualmente las basales temporales. Configure y use objetivos temporales y predeterminados (por ejemplo, para actividad o carbohidratos para hipoglucemia)
+ Entender el lazo abierto, incluidas las recomendaciones de basales temporales
+ Sobre la base de esa experiencia, decidir valores de máximo basal, y ajustar la bomba y preferencias
+ Iniciando el lazo cerrado con suspensión con baja glucosa
+ Ejecutar en lazo cerrado con max IOB=0 durante unos días sin demasiados valores bajos de glucosa
+ Ajuste del lazo cerrado, aumentando máximo IOB por encima de 0 y bajando gradualmente objetivos BG
+ Funcionando unos cuantos días, y al menos una noche sin alarmas de glucosa baja, antes de bajar valor de glucosa
+ Ajustar los basales y ratios, si es necesario, y luego activar auto-sens
+ Una semana con éxito en lazo cerrado durante el día con entrada regular de carbohidratos
+ Habilitar funciones adicionales para su uso durante el día, como asistente de comida avanzado
+ Habilitar funciones adicionales para uso durante el día como SMB
+ ¡Debes leer el wiki y subir maxIOB para que SMB funcione bien! Para comenzar un buen valor sería maxIOB = bolo de comida medio + 3 x máximo basal diario
+ Alcanzado el límite permitido
+ Sin perfil seleccionado
+ Lazo se ha desactivado
+ Lazo se ha activado
+ Lazo inactivo
+ Lazo activo
+ %1$.2f limitado a %2$.2f
+ Valor %s fuera de limites
+ No permitidos ajustes basales remotos
+ Comando remoto no permitido
+ Para iniciar basal %1$.2fU/h responder con código %2$s
+ Para cancelar lazo por %1$d minutos responde con código %2$s
+ Basal temporal %1$.2fU/h para %2$d min iniciada correctamente
+ Fallo inicio basal temporal
+ Para parar basal temporal responder con código %s
+ Basal temporal cancelada
+ Fallo cancelación basal temporal
+ Comando desconocido o respuesta incorrecta
+ Asistente
+ Asistente configuración
+ Botón Texto:
+ Carbohidratos:
+ Validar:
+ Añadir
+ Editar
+ Eliminar
+ Bolo Comida
+ Corrección
+ Acciones
+ AndroidAPS iniciado
+ NS solo subida (sinc. inactiva)
+ NS solo subida. No efectivo con SGV salvo que este seleccionada una fuente local como xDrip. No efectivo en perfiles usando perfiles NS.
+ ¡Bomba no iniciada!
+ Bomba no iniciada, ¡perfil no ajustado!
+ Rellenar/Llenar
+ ¡Por favor asegurar que la cantidad coincide con la especificación del set de infusión!
+ Otros
+ Llenar/Rellenar cantidad de insulina estándar.
+ Botón 1
+ Botón 2
+ Botón 3
+ Unidades:
+ mg/dl
+ mmol/l
+ DIA (Duración Insulina Activa):
+ Rango Objetivo:
+ Rango de visualización
+ Marcas Alta y Baja para gráficos en pantalla Inicio y Smartwatch
+ Marca BAJA
+ Marca ALTA
+ Reloj
+ Reenviar todos los datos
+ Abrir ajustes en reloj
+ Error en bomba
+ Batería Baja
+ Apagar Bomba
+ Batería de la bomba descargada
+ DanaR Korean
+ Ratio Basal:
+ Error al activar perfil basal
+ Perfil basal actualizado en bomba
+ Inhabilitar modo EasyUI en bomba
+ Habilitar bolos extendidos en bomba
+ Cambio de modo de U/d a U/h en bomba
+ Valor Basal por debajo del mínimo. Perfil NO aplicado!
+ BG:
+ Último BG:
+ MDI
+ MM640g
+ Avisos permanentes
+ DATOS CADUCADOS
+ %1$d min antes
+ hace %1$d min
+ Perfil Local
+ OpenAPS AMA
+ Delta media corta
+ Delta media larga
+ Matriz de %1$d elementos.\nValor actual:
+ Datos Autosens
+ Depurar script
+ Usar característica AMA autosens
+ Renovar datos desde NS
+ Borrar tratamientos en el futuro
+ ComidendoPronto
+ Hipo
+ Actividad
+ Eliminar registro:
+ Estadísticas de DanaR
+ TDD acumulativa
+ TDD ampliada exponencialmente
+ Basales
+ Bolo
+ Dosis diaria
+ Fecha
+ Ratio
+ # Días
+ Peso
+ Probablemente impreciso si se usan bolos para llenar/rellenar!
+ Datos caducados por favor pulsa RELOAD
+ Basal total
+ Basal diaria *2
+ Inicializando...
+ ACC
+ CONF
+ LAZO
+ PERFSIM
+ OAPS
+ PERFLOC
+ DANA
+ INICIO
+ BOMBAV
+ NSPERF
+ TRAT
+ CP
+ OBJ
+ RELOJ
+ SMS
+ Título corto en pestaña
+ Usa siempre delta media corto en vez de delta simple
+ Útil cuando los datos de fuentes sin filtrar como los de xDrip son inestables.
+ Ajustes avanzados
+ Modelo: %1$02X Protocolo: %2$02X Codigo: %3$02X
+ Perfiles
+ Valor predeterminado: 3 Esta es una protección de seguridad en OpenAPS. Lo que esto hace es limitar tus basales a 3x (en este caso) tu mayor índice basal. Probablemente no necesites cambiar esto, pero debes tener en cuenta las discusiones sobre \"3x max diaria; 4x actual\" para protecciones de seguridad.
+ Ajuste pro defecto: 4 Esto es la otra mitad de los ajustes de seguridad de OpenAPS y la otra mitad de la protección de seguridad de \"3x max diaria, 4x actual\". Esto significa, que tu basal, independientemente de tu máxima basal ajustada en la bomba, no puede ser mas alta que este número de veces el actual nivel de basal. Esto es para evitar que las personas se encuentren en situaciones peligrosas por aumentar mucho la basal sin entender como trabaja el algoritmo. El ajuste por defecto es 4x; la mayoría de las personas nunca tendrá que cambiar estos ajustes, sino que debe modificar otros ajustes en la terapia si se encuentran cerca de este límite de seguridad.
+ Ajuste por defecto: 1.2\nEste es un límite multiplicador para autosens (y pronto autotune) para establecer un límite máximo del 20% sobre lo alto que puede ser el ratio autosens, que a su vez determina como de altos puede ajustar autosens los ratios basales, como de bajos puede ajustar el ISF y como de bajo establecer el objetivo de glusosa en sangre (BG).
+ Ajuste por defecto: 0.7\nEl otro lado de los límites de seguridad de autosens, limitando a cuanto puede autosens bajar la basal y a cuanto puede subir ISF y objetivo de glucosa en sangre (BG).
+ 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).
+ 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
+ Este campo no puede estar vacío
+ Número de teléfono inválido
+ Número de teléfono incorrecto para SMS
+ Calibración
+ ¿Mandar calibración %.1f a xDrip?
+ xDrip+ no instalado
+ Calibración mandada a xDrip
+ Calibración remota no admitida
+ Calibración enviada. La recepción debe estar habilitada en xDrip.
+ xDrip no recibe calibraciones
+ Bomba parada
+ Recibir estado de bomba
+ Ajustando basal temporal
+ Parando basal temporal
+ Iniciando bolo extendido
+ Parando bolo extendido
+ Actualizando dosis basales
+ Desconectando
+ Ejecutando
+ Ajustes bomba virtual
+ Subir estado a NS
+ Contraseña incorrecta
+ Contraseña para ajustes
+ Desbloquear ajustes
+ Alcanzando el limite de insulina diario
+ NSClient
+ NSCI
+ URL:
+ Desplazamiento automático
+ Reiniciar
+ NSClient
+ URL de Nightscout
+ Introduce tu Nightscout URL
+ NS API secret
+ NS API secret
+ Introcuce contraseña de NS API (min 12 chars)
+ Entregar ahora
+ Borrar cola
+ Mostrar cola
+ Cola:
+ Estado:
+ Pausado
+ Borrar log
+ NSCLIENT no tiene permiso de escritura. ¿Contraseña API incorrecta?
+ Ajustes reloj
+ Mostrar detalles IOB
+ Separar IOB en bolo y base en el reloj
+ sin efecto - por favor verificar en móvil
+ No disponible
+ Edad paciente
+ Menor de edad
+ Adolescente
+ Adulto
+ Adulto resistente a la insulina
+ Por favor elige la edad del paciente para ajustar los límites de seguridad
+ Glimp
+ %s necesita optimización de batería lista blanca para funcionar bien
+ Loop desactivado
+ Desactivado (%1$d m)
+ Superbolo (%1$d m)
+ Desactivar lazo por 1h
+ Desactivar lazo por 2h
+ Desactivar lazo por 3h
+ Desactivar lazo por 10 h
+ Desconectar bomba por 15 min
+ Desconectar bomba por 30 min
+ Desconectar bomba por 1 h
+ Desconectar bomba por 2 h
+ Desconectar bomba por 3 h
+ Reanudar
+ Duración incorrecta
+ Lazo desactivado
+ Lazo reiniciado
+ Tend. 15 min
+ COB
+ Superbolo
+ Registrar el inicio de la aplicación en NS
+ Saliendo de la aplicación para aplicar ajustes.
+ DanaRv2
+ Insulina
+ ¿Qué tipo de insulina está utilizando?
+ Insulina acción rápida
+ Novorapid, Novolog, Humalog
+ Fiasp
+ INS
+ Activar superbolo en asistente
+ Activar función superbolo en asistente. No lo actives hasta que hayas aprendido lo que realmente hace. ¡PUEDE CAUSAR SOBREDOSIS DE INSULINA usándolo sin precaución!
+ IOB
+ COB
+ Firmware
+ Última conexión
+ Estado de bluetooth
+ Acerca de
+ Falta permiso SMS
+ xDrip Status (reloj)
+ Linea de estado xDrip (reloj)
+ xds
+ Mostrar BGI
+ Agregar BGI a línea de estado
+ Datos no mandados a NS
+ Todos los datos mandados a NS son borrados. AAPS esta conectado a NS pero no hay cambios en NS
+ Nivel base
+ Nivel bolo
+ Bolo extendido
+ Objectivo temporal
+ Cancelar bolo extendido
+ Edad sensor
+ Edad cánula
+ Edad insulina
+ horas
+ Tipo basal
+ Perfil invalido !!!
+ Cambio Perfil
+ Edad batería bomba
+ Cambio batería bomba
+ Opciones alarma
+ Urgente alto
+ Alto
+ Bajo
+ Urgente bajo
+ Datos anticuados
+ Datos antiguos urgentes
+ Datos antiguos limite [min]
+ Datos antiguos urgentes limite [min]
+ Intervalo para autosens [h]
+ Horas en el pasado para detectar sensibilidad (tiempo de absorción de carbohidratos no incluidos)
+ Bomba
+ OpenAPS
+ Cargador datos
+ Detección sensibilidad
+ ¿Que algoritmo de sensibilidad se debe usar?
+ SENS
+ Sensibilidad Oref0
+ Sensibilidad Oref1
+ Sensibilidad AAPS
+ Ajustes absorción
+ Tiempo max absorción comida [h]
+ Tiempo en horas en el que se espera que todos los carbohidratos hayan sido absorbidos
+ Mostrar bolo extendido en %
+ SAGE
+ IAGE
+ CAGE
+ PBAGE
+ OAPS
+ UPLD
+ BAS
+ EXT
+ Mantener pantalla activa
+ Evitar que Android apague la pantalla. Consume mucha energía cuando no esta enchufado.
+ Al activar Autosens recuerda introducir todos carbohidratos comidos. Sino las desviaciones de carbohidratos serán identificadas incorrectamente como un cambio de sensibilidad !!
+ Sensibilidad promedio ponderada
+ Ok
+ Cancelar
+ Faltan perfiles por cargar!
+ Valores no guardados!
+ Permitir emisión de mensajes a otras aplicaciones (como xDrip).
+ Permitir emisión de mensajes localmente.
+ ACTIVIDAD Y FEEDBACK
+ CARBS Y BOLUS
+ CGM Y OPENAPS
+ BOMBA
+ Dosis basal [U/h]
+ Duración [min]
+ OpenAPS SMB
+ SMB
+ Activar UAM
+ Activar SMB
+ Usar Super Micro Bolus en lugar de Basal Temporal para una acción más rápida
+ Detección comidas no anunciadas (UAM)
+ Pico de la curva de IOB
+ Tiempo del pico [min]
+ Free-Peak Oref
+ Rapid-Acting Oref
+ Ultra-Rapid Oref
+ DIA de %1$f demasiado corto - usando %2$f!
+ ACTIVAR PERFIL
+ Fecha
+ INVALIDO
+ Esperando para conectar con bomba
+ Conexión OK
+ Conexión fuera de tiempo
+ CONECTANDO
+ Aparato no encontrado
+ Deposito vacío
+ Alerta de control de BG
+ Insulina restante en deposito
+ DanaRS
+ Dana
+ Bomba seleccionada
+ Conectar bomba nueva
+ Velocidad bolo
+ Ajustar paso basal a 0.01 U/h
+ Número de serie
+ Porcentaje
+ Cambio de tiempo
+ Objetivo temporal por defecto
+ duración comiendopronto
+ objectivo comiendopronto
+ duración actividad
+ objetivo actividad
+ Duración Hipo
+ Objetivo Hipo
+ Cebado
+ Recibiendo estado de bolo extendido
+ Recibiendo estado bolo
+ Recibiendo estado bolo temporal
+ Recibiendo ajustes bomba
+ Recibiendo hora bomba
+ usar otra vez
+ Control desde reloj
+ Editar y emitir objetivos temp. y tratamientos desde reloj.
+ Fuera tiempo conexión
+ Comida
+ g
+ m
+ h
+ ]]>
+ kJ
+ En
+ Pr
+ Grasa
+ ]]>
+ Esperando terminar bolo. Faltan %1$d seg.
+ Procesando evento
+ Iniciando emisión bolo
+ Orden se esta efectuando en este momento
+ Control de la bomba corregido
+ Bomba no alcanzable
+ Faltan lecturas BG
+ Usa avisos del sistema para alarmas y avisos
+ Alarma local
+ Alarma si no llegan datos BG
+ Alarma si bomba no es alcanzable
+ Bomba no alcanzable durante [min]
+ Alarma urgente
+ INFO
+ Bluetooth
+ Vigilante de BT
+ Apaga el bluetooth del móvil por un segundo si no hay conexión con la bomba. Esto ayuda con algunos móviles con problemas de establecer conexión bluetooth estable.
+ Aplicación de DexcomG5 (parcheada)
+ Subir datos BG a NS
+ Ajuste de subida datos G5
+ Configuración de carga Poctech
+ Mostrar detalles delta
+ Mostrar delta con un decimal mas
+ Minutos máximos de basal para limitar SMB
+ Firmware de la bomba no soportado
+ Mandar datos BG a xDrip+
+ En xDrip+ elige 640g/Eversense como fuente de datos
+ NSClient BG
+ Valor basal reemplazado por el valor mínimo soportado: %s
+ Valor basal reemplazado por valor máximo soportado: %s
+ Cálculo BG
+ Cálculo bolo IOB
+ Cálculo basal IOB
+ Cálculo tendencia
+ Cálculo superbolo
+ Si
+ No
+ Solo positivo
+ Solo negativo
+ Cálculo COB
+ Cálculo objetivo temporal
+ Lazo activado
+ APS seleccionado
+ NSClient tiene permiso para escribir
+ Lazo cerrado activado
+ Máximo IOB ajustado correctamente
+ BG disponible desde la fuente seleccionada
+ Valores basales no alineados a las horas: %s
+ Perfil inválido: %s
+ Programando bomba para emitir bolo
+ Actualizar
+ Estado
+ Actividad
+ Ninguna conexión por %1$d min
+ %1$d%% (%2$d min restan)
+ Inicializando
+ Suspendido debido a un error
+ Suspendido por el usuario
+ Funcionando
+ Cancelando TBR
+ Poniendo TBR (%1$d%% / %2$d min)
+ Emitiendo bolo (%.1f U)
+ Actualizando
+ Acción requerida no disponible por la bomba
+ Uso inseguro: bolo extendido o multionda activo. El modo del lazo ha sido fijado a sólo suspensión en baja glucosa durante 6 horas. En modo lazo sólo se soportan los bolo estándar.
+ Uso inseguro: la bomba usa un perfil basal diferente al primero. El lazo ha sido apagado. Elige el primer perfil basal en la bomba y acualiza.
+ Un bolo de mismo valor ha sido dado durante el pasado minuto. Para evitar bolos dobles y prevenir fallos de programa esto no está permitido.
+ Ahora
+ Leyendo historia bomba
+ Historial
+ Activando perfil base
+ Nivel del depósito bajo
+ Batería casi agotada
+ La bomba muesta el error E%1$d: %2$s
+ Bajo
+ Vacío
+ Normal
+ Se necesita actualizar reloj de la bomba
+ Alerta
+ TBR CANCELADA, advertencia aceptada
+ Bomba inalcanzable. No se administró ningún Bolo
+ Emisión del bolo fallada. Ningún bolo se ha emitido. Para asegurarse, por favor controle la bomba para evitar bolo doble. Para evitar bugs no se reinician bolos automáticamente.
+ Sólo %1$.2f U del bolo mandado de %2$.2f U ha sido suministrado a causa de un error. Por favor verifica esto en la bomba y toma las acciones apropiadas.
+ Entrega del bolo y verificación del historial de la bomba falló, por favor, revise la bomba. Si un bolo fue puesto por la bomba, se añadirá a los tratamientos en la próxima conexión a la bomba.
+ No hay suficiente insulina en el depósito para emitir bolo
+ Error al emitir bolo extendido
+ Insight
+ Bomba Insight
+ Estado
+ Modificado
+ BOMBA PARADA
+ Estado actualizado
+ hace
+ con
+ Basal Temporal TBR Activa
+ minutos faltan
+ Libro de registros
+ Última acción completada
+ min
+ restan sobre
+ total con
+ por adelantado con
+ Permanecer siempre conectado
+ DESOCUPADO
+ SINCRONIZANDO
+ OCUPADO
+ SINCRONIZADO
+ PUESTA EN MARCHA
+ necesita
+ No conectado a la aplicación companion!
+ ¡La aplicación Companion no parece estar instalada!
+ Aplicación Companion incompatible, necesitamos la versión
+ Desconocido
+ Esperando código de confirmación
+ Código rechazado
+ Vincular con aplicación
+ No autorizado
+ Incompatible
+ segundo
+ minuto
+ hora
+ Día
+ Semana
+ s
+ %1$ds expira en %2$s
+ Estado de Mantener-Activo
+ Estadísticas
+ Conectar de forma preventiva
+ Conectar automáticamente cuando se abre AndroidAPS, antes de solicitar ningún comando de bomba, para reducir el retraso de la conexión
+ No recomendado por agotar batería
+ Habilitar SMB siempre
+ Habilitar SMB siempre de forma independiente a los Bolos. Solo posible con fuente BG con buen filtrado de datos como G5
+ Habilitar SMB después de Carbohidratos
+ Habilitar SMB durante 6 h después de Carbohidratos, incluso con 0 COB. Solo posible con fuente BG con buen filtrado de datos como G5
+ Habilitar SMB con COB
+ Habilitar SMB cuando hay Carbohidratos Activo COB.
+ Habilitar SMB con Objetivos Temporales
+ Habilitar SMB cuando hay un Objetivo Temporal (TT) activo (ComerPronto, Actividad)
+ Habilitar SMB con Objetivo Temporal Alto
+ Habilitar SMB cuando hay un Objetivo Temporal (TT) ALTO activo (Actividad)
+ Dejar Basal Temporal correr
+ Silenciar
+ Insulina
+ Carbohidratos
+ Botones
+ Envía una calibración a xDrip+ o abre el diálogo de calibración G5
+ Abre xDrip+, el botón atrás regresará a AAPS
+ Cantidad de Carbohidratos que se agregan cuando se presiona el botón
+ Cantidad de insulina que se agrega cuando se presiona el botón
+ No se pudo iniciar la aplicación CGM. Asegúrate de que está instalada.
+ CGM
+ Historial
+ Notificar SMB
+ Mostrar SMB en el reloj como un bolo estándar.
+ Crear notificaciones de los errores
+ Crear notificaciones en Nightscout para diálogos de error y alertas locales (también visibles en Careportal en Tratamientos)
+ Mostrar predicciones en el reloj
+ Predicciones
+ Opciones de datos
+ Reporte fallos a Fabric.io
+ Permita que los informes automáticos de errores y los datos de uso de funciones se envíen a los desarrolladores a través del servicio fabric.io.
+ Por favor actualiza la aplicación G5 a una soportada
+ Inicio OT Actividad
+ Inicio OT ComiendoPronto
+ OT
+ No administrar Bolo, solo anotar
+ Categoría
+ Subcategoría
+ El Bolo sólo será anotado
+ Rellenar BGs perdidos desde NS
+ SMB administrado por bomba
+ Sensibilidad
+ Desviaciones
+ Carbohidratos activos COB
+ Insulina activa IOB
+ Basales
+ Ninguna acción seleccionada, nada sucederá
+ Inicio OT Hipo
+ Ejecutando versión dev. Lazo cerrado no disponible.
+ Modo de ingeniería activado
+ Modo de ingeniería no está activado y no disponible en esta rama
+ %.2f U/h
+ Leyendo perfil basal
+ El historial de la bomba ha cambiado después de que se realizó el cálculo del bolo. El bolo no fue entregado. Por favor, vuelva a calcular si aún se necesita un bolo.
+ El bolo se administró con éxito, pero falló la incorporación de la entrada del tratamiento. Esto puede suceder si se administran dos bolos pequeños del mismo tamaño en los últimos dos minutos. Verifique el historial de la bomba y las entradas de tratamiento y use el portal de tratamientos para agregar entradas faltantes. Asegúrese de no agregar ninguna entrada para el mismo minuto exacto y la misma cantidad.
+ Rechazando temporal alta ya que el calculo no consideró los cambios recientes en el historial de la bomba
+ Actualizando estado bomba
+ La tasa Basal en la bomba ha cambiado y será actualizada pronto
+ Tasa Basal cambiada en bomba, pero falló al leer
+ Comprobando cambios en el historial
+ Múltiples bolos con la misma cantidad en el mismo minuto fueron importados. Sólo se puede agregar un registro a los tratamientos. Verifique la bomba y agregue manualmente un registro de bolo usando la pestaña Careportal. Asegúrese de crear un bolo con un tiempo que no use otro bolo.
+ \n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de)
+ El último bolo tiene más de 24 horas o está en el futuro. Comprueba que la fecha en la bomba está configurada correctamente.
+ La hora / fecha del bolo administrado en la bomba parece incorrecta; es probable que la IOB sea incorrecta. Verifique la hora / fecha de la bomba.
+ Falta Cambio de Perfil. Haga un Cambio de Perfil o presione \"Activar perfil\" en PerfilLocal.
+ Contador Bolos
+ Contador TBR
+ Objetivo %1$d no iniciado
+ Objetivo %1$d no finalizado
+ La bomba no tiene capacidad basal temporal
+ Tasa Basal no valida en la bomba
+ Lazo cerrado deshabilitado en preferencias
+ Autosens deshabilitado en preferencias
+ SMB deshabilitado en preferencias
+ Limitando max basal rate a %1$.2f U/h debido a %2$s
+ límite de la bomba
+ tiene que ser un valor positivo
+ Multiplicador basal máximo
+ Multiplicador diario basal máximo
+ Un Bolo ha sido entregado en los últimos 3 minutos, omitiendo SMB
+ 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 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
+ Valor máximo en preferencias
+ Límite estricto
+ uso no seguro
+ Error al leer estado
+ Anotar cambio sitio bomba
+ Anotar cambio cartucho de insulina
+ SMB siempre y tras carbohidratos deshabilitados porque la fuente activa de BG no admite filtro avanzado
+ SMB no permitido en modo de lazo abierto
+ Comida
+ reestablecer
+ Esperando para sincronización de tiempo (%1$d sec)
+ Desconectado (%1$d m)
+ Eventos portal tratamientos automáticos
+ Subir automáticamente los cambios de insulina, cánula y batería y las alarmas de la bomba a Nightscout
+ Máximo IOB total que OpenAPS no puede superar [U]
+ Este valor se denomina IOB máx. En el contexto de OpenAPS\nOpenAPS no agregará más insulina si el IOB actual es mayor que este valor
+ Bomba parada
+ Bomba iniciada
+ Bomba pausada
+ Tiempo máximo de absorción de la comida [h]
+ Tiempo en el que cualquier comida se considera absorbida. Los carbohidratos restantes serán cortados.
+ Tiempo
+ Mostrar el campo notas en diálogos de tratamientos
+ Siguiente
+ Ant
+ Asistente de configuración
+ FINALIZAR
+ Selecciona tu idioma
+ Primer incremento insulina
+ Segundo incremento insulina
+ Tercer incremento insulina
+ Primer incremento carbohidratos
+ Segundo incremento carbohidratos
+ Tercer incremento carbohidratos
+ CGM
+ Usar solo WiFi
+ WiFi SSID
+ Sólo si cargando
+ Ajustes conexión
+ SSID\'s permitidos (separados por punto y coma)
+ Permitir conexión en roaming
+ Ratio máximo autosens
+ Ratio mínimo autosens
+ DIA Divisor para suspensión de bolos
+ Máximo multiplicador diario de seguridad
+ Multiplicador de seguridad basal actual
+ n/a
+ Auto Rellenar mediciones perdidas
+ Configuración del Asistente
+ Cálculos incluidos en el resultado del asistente:
+ Ajustes pantalla
+ Configuración general
+ Activar NSClient
+ Bienvenido al asistente de instalación. Le guiará a través del proceso de configuración\n
+ Ajustes de la bomba
+ Leer estado
+ Cambios deben hacerse en NS
+ Saltar asistente de configuración
+ Presiona el botón de abajo para permitir a AndroidAPS sugerir/hacer cambios en basales
+ Presionar el botón de abajo para habilitar Objetivos. Ver pestaña de Objetivos, después de finalizar este asistente, para hacer AndroidAPS completamente funcional. \n
+ Habilitar objetivos
+ Configurar complemento APS
+ Configurar complemento Sensibilidad
+ El complemento de sensibilidad es usado para detectar la sensibilidad y cálculo de COB. Para más info ver:
+ https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COB
+ NSCliente controla la conexión con Nightscout. Puedes saltar esta parte ahora pero no podrás pasar los objetivos hasta que lo configures.
+ Por favor, recuerde: nuevos perfiles de insulina requieren DIA de al menos 5h. DIA de 5-6h en nuevos perfiles es lo mismo que DIA de 3h en perfiles antiguos.
+ Configurar origen de BG
+ Selecciona origen de perfil. Si el usuario es un niño debe seleccionar perfil NS. Si no hay nadie siguiendo tu Nightscout probablemente preferirás perfil Local. Recuerde que sólo está seleccionando el origen del perfil. Para usarlo debe activarlo ejecutando \"Cambio Perfil\"
+ Selecciona uno de los algoritmos disponibles. Están ordenados de más antiguos a más recientes. Los nuevos son más potentes y agresivos. Por ello, si eres usuario nuevo, se recomienda empezar con AMA y no con el último. No olvides leer la documentación de OpenAPS y configurarlo antes de usarlo.
+ Comienza tu primer objetivo
+ Permiso
+ Pedir permiso
+ La aplicación necesita permiso de localización para el escaneo de BT
+ La aplicación necesita permiso para guardar los logs
+ Solicitar
+ Configurar complemento de insulina
+ Salir
+ Opciones de usuario
+ Mostrar formato de tiempo
+ Botones de desplazamiento
+ Señal sonora de pulsación
+ Alarma
+ Sonido
+ Vibrar
+ Ambos
+ Tiempo LCD encendido [s]
+ Tiempo luz fondo encendida [s]
+ Unidades de glucosa
+ Apagar (horas)
+ Deposito bajo (unidades)
+ Guardar las opciones en la bomba
+ Activado
+ Desactivado
+ Abrir navegación
+ Cerrar navegación
+ Preferencias del complemento
+ ¡Logrado, bien hecho!
+ No logrado
+ Tiempo agotado
+ %1$d. Objetivo
+ Poctech
+ Recibir valores de glucosa de Poctech
+ Objetivo temporal elevado aumenta sensibilidad
+ = 100]]>
+ Objetivo temporal bajo reduce sensibilidad
+
+ Configuración de la bomba incorrecta, leer la documentación y comprobar que el menú de Quick Info se llama QUICK INFO usando el software de configuración 360.
+ Personalizado
+ Diferencia de tiempo grande
+ Gran diferencia de tiempo: \nLa bomba esta desincronizada más de 1,5 horas. \npor favor ajusta la hora manualmente en la bomba y asegúrate de que la lectura del histórico de la bomba no causa comportamiento inesperado. \nSi es posible, borra la historia de la bomba antes de cambiar la hora o desactiva el lazo cerrado durante un DIA (duracion insulina activa) después de la última entrada errónea del histórico pero mínimo un DIA a partir de ahora.
+ Limpiar eventos AndroidAPS iniciado
+ Ajustes guardados encontrados
+ Atención: si activas y conectas al hardware de la bomba, AndroidAPS copiará los ajustes basales del perfil de la bomba, sobrescribiendo el actual perfil basal de la bomba. Comprueba que tengas el perfil basal correcto en AndroidAPS. Si no estás seguro o no quieres sobrescribir los ajustes basales en la bomba, presiona cancelar y repite cambio de la bomba más tarde.
+ Datos de tratamiento incompletos
+ Ajustes de mantenimiento
+ Email
+ Email inválido
+ Ningún registro para enviar
+ Mantenimiento
+ MANT
+ Facilita varias funciones para el mantenimiento (ej. envío de registro, borrado de registro).
+ 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.
+ Sin datos autosens disponibles
+ Ajustes del registro
+ Restablecer valores predeterminados
+ NSClient fallando. Considera reiniciar NS y NSClient.
+ AS
+ Versión %1$s disponible
+ Retardo
+
+ %1$d día
+ %1$d días
+
+
+ %1$d hora
+ %1$d horas
+
+
+ %1$d minuto
+ %1$d minutos
+
diff --git a/app/src/main/res/values-fr/insight_alerts.xml b/app/src/main/res/values-fr/insight_alerts.xml
new file mode 100644
index 0000000000..70489fbc5e
--- /dev/null
+++ b/app/src/main/res/values-fr/insight_alerts.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 8524b72624..8663b79978 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -1,766 +1,105 @@
+
- Traitements de sécurité
- Bolus max. autorisé [U]
- Glucides max. autorisés [g]
- Préférences
- Actualiser les données depuis NS
- "Réinitialiser les Bases de Données "
- Voulez-vous vraiment réinitialiser les bases de données ?
- Quitter
- Utiliser les bolus étendus à > 200%
- Dispositif Bluetooth DanaR
- utiliser toujours les valeurs absolues du basal
- Rebootez votre smartphone ou redémarrez AndroidAPS depuis les paramètres système sinon AndroidAPS ne sera pas connecté ( important de suivre et vérifier que les algorithmes fonctionnent correctement)!
- Activer
- Vérifier
- Unités
- Durée d’Action
- "I:G (Ratio Insuline/Glucides)"
- "Facteur SI"
- Basal
- Cible
- Insuline:
- PAS DE PROFIL PRÉDÉFINI
- Glucides:
- IR:
- IR:
- Activité:
- IR Totale:
- Activité IR Totale:
- Dur:
- Ratio:
- Ins:
- IR:
- IR Totale:
- Insuline:
- Glucides:
- G
- CT
- Glucides
- Corr
- U
- Bolus IR
- "Exécuter maintenant "
- POMPE VIRTUELLE
- Bolus étendu
- OK
- Dérnière exécution
- Paramètres de saisie
- État de la glycémie
- Débit temporaire actuel
- Données IR
- Profil
- Données repas
- Résultat
- Pas de données glycémiques dispo
- Requête
- "Taux "
- Durée
- Raison
- Glucose
- Delta
- Delta:
- Config Builder
- Objectifs
- OpenAPS MA
- Aperçu
- Profil NS
- Profil simple
- Basal Tempo
- Traitements
- Pompe virtuelle
- Careportal
- Pompe
- Traitements
- Profil
- APS
- Général
- Jours
- Restrictions
- Loop
- Loop
- APS
- Après traitement des restrictions
- Dérnière mise en marche
- OK
- Annuler
- Pas d\'APS séléctionné ou résultat fourni
- Sécurité
- Plugin désactivé
- Violation des restrictions
- Erreur administration bolus
- Erreur administration temporaire
- Valeur Basal [%]
- % (100% = current)
- Acceptez nouveau basal temp
- Bolus
- Calculateur de Bolus
- Restriction appliquée!
- Confirmation
- Entrez nouveau traitement
- Bolus
- Bolus:
- Basal
- Basal:
- Glucides
- Changez vos entrées!
- Définir un nouveau bolus étendu
- Source de glycémie
- xDrip
- Mode APS
- Boucle fermée
- Boucle ouverte
- "Loop Désactivé "
- Désactiver Loop
- Activer Loop
- "Nouvelle recommendation dispo "
- Version Nightscout incompatible
- NSClient non installé. Enregistrement perdu!
- G disponible sur NS
- état pompe non dispo sur NS
- Activation manuelle
- "LOOP DÉSACTIVÉ PAR RÉSTRICTIONS "
- Czech
- English
- Basal IR
- "Réstriction du Bolus appliquée "
- Réstriction des Glucides appliquée
- Contrôle de Glycémie
- Notification
- Remarque
- Activité Physique
- Changement Zone D\'insertion
- Insertion Capteur CGM
- Début Capteur CGM
- Changement du Réservoir
- Changement de Profile
- "Bolus Goûter "
- Bolus Repas
- Bolus de correction
- "Bolus Combiné "
- "Lancer Débit Temporaire "
- Fin du Débit Temporaire
- Correction Glucides
- OpenAPS Offline
- "Type d'événement "
- Autre
- Lecteur
- Capteur
- Glucides
- Insuline
- Durée glucides
- "Diviser "
- Durée
- "Pour cent "
- Absolu
- Remarques
- "Heure de l'événement "
- Profil
- Entré par
- Source de Glycémie
- Pas de profil téléchargé encore depuis NS
- Basal Tempo
- Bolus étendu
- Version Nightscout:
- Manquants
- Préférences exportées
- Exporter les paramètres au
- Importer les paramètres depuis
- Paramètres importés
- Fichier introuvable
- Exporter les paramètres
- Importer les paramètres
- Hollandais
- Allemand
- Espagnol
- Grec
- Italien
- Russe
- Suédois
- "U/hr Max avec laquelle le débit temp pourra être programmé "
- Cette valeur est appelée basal maximum dans le contexte OpenAPS
- Le Basal IR maximum que l\'OpenAPS pourra délivrer [U]
- Cette valeur est appelée Max IOB dans le contexte OpenAPS
- Bulgare
- DanaR
- REJETER
- Langue
- Connection en cours
- Connectée
- Déconnectée
- Paramètres pompe DanaR
- Contrat de Licence pour Utilisateur Final
- MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
- JE COMPRENDS ET J\'ACCEPTE LES CONDITIONS DU CONTRAT
- Sauvegarder
- L\'adaptateur bluetooth est introuvable
- L\'appareil sélectionné est introuvable
- Erreur connection pompe
- IR affichée sur pompe
- Unités Journalières
- h passées
- Données saisies invalides
- Valeur n\'est pas reglée correctement
- Actualiser le profil
- Consulter le profil
- Activée
- Commentaire
- Pour cent
- Absolu
- Annuler basal tempo
- Communicateur SMS
- Attente de résultat
- Numéros de tél autorisés
- +XXXXXXXXXX;+YYYYYYYYYY
- Administrer bolus %1$.2fU retour avec un code %2$s
- Envoyer calibrage %1$.2fU retour avec un code %2$s
- Bolus interrompu
- Bolus %.2fU administré avec succès
- " %.2fU va être administré"
- %.2fU de bolus administré avec succès
- Entrain d\'administrer %.2fU
- Autoriser les commandes à distance par SMS
- Bolus à distance non autorisé
- Doigt
- Capteur
- Manuel
- Cible Temporaire
- Annulation Cible Temporaire
- Paramètres du profil DanaR
- "Durée d'Action [h] "
- Durée d\'Action d\'Insuline
- La mise à jour du profil basal a échouée
- Historique
- Actualiser
- Téléchargement en cours
- Bolus e
- Bolus DS
- Bolus DE
- Erreur
- Remplir
- Heure basal
- Glucose
- Glucides
- Alarme
- Total %d des enregistrements téléchargés
- Bolus S
- Alarmes
- Heures Basal
- Bolus
- Glucides
- Insuline quotidienne
- Erreurs
- Glucose
- Remplir
- Arrêter
- Mot de passe pompe
- "Mot de passe pompe incorrect "
- Pompe occupée
- Délivré
- Arrêté
- Occlusion
- Stop
- Boutton Stop Activé
- Attente connection pompe
- %.2fU va être administré
- Paramétrez la visualisation et la surveillance des données, analysez les débits de base et les ratios
- Vérifiez que la G est disponible sur Nightscout, et les données d’insuline sur pompe ont été téléchargées
- Commencez par le système boucle ouverte
- Utilisez le système Open Loop pour quelques jours, et activez manuellement plusieurs débits de base tempo. Set up and use temporary and default temporary targets (e.g. for activity or hypo treatment carbs)
- Comprendre votre système boucle ouverte, y compris ses recommandations de débit de base tempo
- "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 Low Glucose Suspend
- Pas de changement demandé
- Version Nightscout incompatible
- Utiliser le système de boucle fermée avec max IOB = 0 pour quelques jours sans avoir beaucoup d’événements LGS
- Ajustez votre système boucle fermée, augmentez la fonction « max IOB » au dela 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 les débits de base et les ratios si besoin, ensuite activez « auto-sens »
- Une semaine réussie avec des journées en boucle fermée, avec un entrée normale de glucides
- Activez d’autres fonctionalités pour l’utilisation journalière, tel que advanced meal assist
- Vous avez atteint la limite maximale
- Aucun profil séléctionné
- Loop a été désactivé
- Loop a été désactivé
- "Loop est désactivé "
- Loop est activé
- %1$.2f limité à %2$.2f
- La valeur %s est hors limites strictes
- Le réglage du basal à distance n\'est pas autorisé
- La commande à distance n\'est pas autorisée
- Lancer le basal %1$.2fU/h retour avec un code %2$s
- Suspendre Loop pour %1$d minutes retour avec un code %2$s
- Démarrage réussi pour %1$.2fU/h de basal tempo pour %2$d min
- Démarage échoué pour basal tempo
- Arrêter basal tempo retour avec un code %s
- Basal tempo annulé
- Annulation basal tempo échouée
- "Commande inconnue ou fausse réponse "
- Assistant Bolus Rapide
- Paramètres assistant bolus rapide
- Titre sur la touche:
- Glucides:
- Valide:
- Ajouter
- Éditer
- Retirer
- Repas
- Corr
- Coréenne
- Actions
- AndroidAPS est lancé
- Uniquement téléchargement NS (sync désactivée)
- Uniquement téléchargement NS. Ceci n’est pas efficace pour les SGV à moins qu’une source locale comme xDrip soit sélectionnée. Ceci n’est pas efficace sur les profils lorsque les profils NS sont utilisés
- Pompe non initialisée!
- Pompe non initialisée, profil non prédéfini
- Amorcer/Remplir
- Veuillez à ce que la quantité corresponde à la spécification de votre KT!
- Autres
- Remplir/Amorcer des quantités standard d’insuline
- Touche 1
- Touche 2
- Touche 3
- Unités
- mg/dl
- mmol/l
- Durée d\'Action d\'Insuline
- Fourchette cible:
- Écart de visualisation
- Les repères hauts et bas sur les graphiques pour l’apercu et la montre
- Repère BAS
- Repère HAUT
- Wear
- Retransmettre toutes les données
- Afficher les Paramètres sur la Montre
- Erreur Pompe
- Niveau Batterie Bas
- Arrêt de la Pompe
- Baterie Pompe déchargée
- DanaR Coréenne
- Taux du Débit de Base:
- Réglage du profil de base a échoué
- Mise à jour du profil de base dans la pompe
- Désactiver le mode Facile UI dans la pompe
- Activer les bolus étendus dans la pompe
- "Modifier le mode U/d au U/h dans la pompe "
- Le débit de base est en dessous du minimum. Profil non prédéfini!
- G:
- Dernière G:
- MIQ (Multiples Injections Quotidiennes)
- MM640g
- Notification En Cours
- DONNÉES ANCIENNES
- %d min passées
- %dmin passées
- Profil Local
- OpenAPS AMA
- Courte moyenne delta
- Longue moyenne delta
- Panoplie de %d d\'élements. Valeur réelle
- Données autosens
- Script de débogage
- Utiliser la fonction AMA autosens
- Actualiser les événements depuis NS
- Manger Bientôt
- Activité
- Retirer l\'enregistrement:
- Dana Stats
- DTQ Cumulative
- DTQ avec Pondération Exponentielle
- Basal
- Bolus
- DTQ
- Date
- Ratio
- # Jours
- Pondération
- Peut-être inexact(e) si les bolus sont utilisés pour l’amorçage et le remplissage!
- Pour les anciennes données appuyez sur Actualiser svp
- Débit de Base Total
- DBT*2
- En cours d\'initialisation...
- ACT
- CONF
- LOOP
- SP
- OAPS
- LP
- DANA
- HOME
- POMPEV
- PROFIL NS
- TRAITER
- CP
- OBJ
- WEAR
- SMS
- Raccourcir les titres des onglets
- Toujours utilisez une moyenne (delta) courte au lieu d’une moyenne normale
- Utile quand les données provenant de sources non filtrées lorsque xDrip devient bruyant
- Paramètres Avancés
- Modèle: %1$02X Protocole: %2$02X Code: %3$02X
- Profil
- Valeur par défaut : true
- Seuls les chiffres numériques qui se trouvent dans la fourchette %1$s - %2$s sont autorisés
- Le champs ne doit pas être vide
- Num de tél est invalide
- "Num tél du SMS invalide "
- Copier dans le Presse-Papiers
- Copier dans le Presse-Papiers
- Afficher le journal
- Étalonnage
- Transmettre l\'étalonnage %.1f à xDrip?
- xDrip+ n\'est pas installé
- Étalonnage envoyé à xDrip
- L\'étalonnage à distance n\'est pas autorisé
- "Étalonnage envoyé. La récepetion doit être activée dans xDrip. "
- xDrip ne reçoit pas les étalonnages
- Pompe suspendue
- Obtenir l\'état de pompe
- Définir basal tempo
- Arrêter basal tempo
- Définir bolus étendu
- Arrêter bolus étendu
- Mettre à jour les taux de debit de base
- Déconnexion en cours
- Exécution en cours
- "Paramètres pompe virtuelle "
- Téléchargement d\'état sur NS
- Mauvais mot de passe
- Mot de passe pour paramètres
- Déverrouiller
- L\'insuline journalière s\'approche de la limite
- NSClient
- NCSI
- URL:
- Défilement automatique
- Redémarrer
- NSClient
- URL Nightscout
- Entrez L’URL Nightscout
- 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:
- État
- Interrompu
- Effacer l\'histo
- NSCLIENT ne possède pas la permission d\'écriture. Mauvais API secret?
- Paramètres Wear
- Afficher l\'IR détaillée
- Décomposer l’IR dans l\'IR du bolus et basal sur la montre
- Sans succès - vérifiez votre téléphone
- Non disponible
- l\'Age du patient
- " Enfant"
- Adolescent
- Adulte
- Veuillez sélectionner l’âge du patient pour paramétrer les limites de sécurité svp
- Glimp
- %s a besoin de la liste blanche de l\’optimisation batterie pour une bonne performance
- Loop suspendu
- Suspendu (%d m)
- Superbolus (%d m)
- Suspendre Loop pour 1h
- Suspendre Loop pour 2h
- Suspendre Loop pour 3h
- Suspendre Loop pour 10h
- Déconnecter la pompe 15min
- Déconnecter la pompe 30min
- Déconnecter la pompe 1h
- Déconnecter la pompe 2h
- Déconnecter la pompe 3h
- Reprendre
- Durée incorrecte
- Loop suspendu
- Loop relancé
- Tendance 15 min
- GR
- Superbolus
- Entrer le démarrage de l\'app dans NS
- Sortir de l’application pour modifier les réglages
- DanaRv2
- Insuline
- Insuline à action rapide
- Novorapid, Humalog, Apidra
- Fiasp
- INS
- Activer les Superbolus dans l’assistant
- Activer la fonctionalité superbolus dans l’assistant. Ne pas l’activez jusqu’au moment où vous appreniez comment il fonctionne réellement. IL PEUT PROVOQUER UNE OVERDOSE D’INSULINE SI UTILISÉ AVEUGLÉMENT!
- " IR"
- GR
- Firmware
- État Bluetooth
- à propos de
- Autorisation SMS manquante
- État Xdrip (hr)
- Barre d\'état pour xDrip (Montre)
- xds
- Afficher l’IG
- Ajouter l’IG sur la barre d\'état
- Pas de téléchargement sur NS
- Toutes les données envoyées à NS sont abandonées. AAPS est connecté à NS mais aucun changement dans NS n’est fait
- Incrément Basal
- Incrément Bolus
- Bolus étendu
- Cible Tempo
- Annuler Bolus étendu
- Durée capteur
- Durée canule
- Durée d\'insuline
- Heures
- Type du Basal
- Profile incorrect!!!
- Changement de Profil
- Durée batterie pompe
- Changement Batterie Pompe
- Options d\'alarme
- "Haute urgent "
- Haute
- Basse
- Basse urgent
- "Données obsolètes "
- Données obsolètes urgent
- "Seuil des données obsolètes [min] "
- Seuil d\'urgence pour les données obsolètes [min]
- "l’intervalle pour autosens [h] "
- Le nombre d’heures écoulées pour la détection de sensibilité (le temps d’absorption des glucides est exclu)
- Pompe
- OpenAPS
- Uploader
- Détection de sensibilité
- SENS
- Sensibilité Oref0
- "Sensibilité AAPS "
- Paramètres d’absorption
- Durée maximale d’absorption pour un repas
- Le temps estimé en heures pour une absorbption totale des glucides d’un repas
- Afficher le bolus étendu en %
- SAGE
- IAGE
- CAGE
- PBAGE
- OAPS
- UPLD
- BAS
- EXT
- En activant la fonction Autosens, n’oubliez pas de rentrer tout les glucides consommés. Sinon les déviations de glucides seront incorrectement identifiées alors que la sensibilité change !!
- Sensibilité avec moyenne pondérée
- OK
- Annuler
- Pas tous les profils sont téléchargés!
- Valeurs non enregistrées!
- Activer les transmissions de données sur d\'autres app. (ex. Xdrip)
- Activer les transmissions locales.
- ACTIVITÉ et FEEDBACK
- Question
- Succès
- Se connecter pour %d s
- POMPE
- "Valeur Basal [U/h] "
- Durée [min]
- Durée du Pic de la Courbe IR
- Réglage Durée Insuline Post Prandiale Oref
- "Durée du Pic [min] "
- "Insuline à Action Rapide Oref "
- Insuline à Action Ultra Rapide Oref
- Durée d’Action pour %1$f trop courte - utiliser %2$f à la place!
- ACTIVER LE PROFIL
- " Date"
- INVALID
- Attente pour le jumelage avec la pompe
- Jumelage réussi
- Jumelage interrompu
- JUMELAGE
- Jusqu\'à présent aucun appareil n\'a été trouvé
- Réservoir vide
- Alerte de mesure de glycémie
- Niveau d\'insuline restant
- DanaRS
- Dana
- Pompe selectionée
- Jumeler nouvelle pompe
- Vitesse bolus
- Régler incrément basal à 0.01 U/h
- numéro de série
- Pourcentage
- Time shift
- Cibles Temporaires par défaut
- Durée pour le prochain repas
- Cible pour le prochain repas
- Durée d\'activité
- Cible pour l\'activité
- Amorcer
- Obtenir l\'état du bolus étendu
- Obtenir l\'état du bolus
- Obtenir l\'état du basal tempo
- Obtenir les paramètres pompe
- Obtenir l\'heure sur la pompe
- réutiliser
- Commandes depuis la montre
- Définir les Cibles Temp et entrer les Traitements depuis la montre
- Connexion interrompue
- Aliments
- Attendre la fin du bolus. %d sec. restants
- Traitement d\'événement
- Administration du bolus lancée
- Commande exécutée à l\'instant
- Pilote pompe corrigé
- "Pompe hors de portée "
- Léctures de glycémie qui manquent
- Utiliser le système de notifications pour les alertes et les notifications
- Alertes locales
- Alerte si aucune donnée glycémique n’est reçue
- Alerte si la pompe est hors portée
- Seuil de \"hors portée\" à la pompe
- Bluetooth
- BT Watchdog
- Ceci va arrêter le Bluetooth du tel pour une seconde si la pompe n’est pas connectée. Cela pourrait aider dans certains tél où la connexion Bluetooth reste bancale.
- App Dexcom G5 (adaptée)
- Télécharger Les données glycémiques sur NS
- Paramètres de téléchargement du G5
- Afficher le delta détaillé
- Afficher delta avec une décimale supplémentaire
- "Firmware pompe incompatible "
- Transmettre les données G sur xDrip+
- Dans xDrip+ veuillez séléctionner 640g/Eversense comme source de données
- "Glycémie NSClient"
- "Valeur du basal remplacée par la valeur minimale supportée "
- Calcul de G
- Calcul IR du Bolus
- Calcul IR du Basal
- Calcul de tendance
- Calcul SuperBolus
- Oui
- Non
- Caclcul GR
- Dernière connexion
- GLUCIDES et BOLUS
- CGM et OPENAPS
- Basal Tempo
- Dernier bolus
- INFO
- Cible temporaire
- Activer des fonctionalités suplémentaires pour l’usage diurne, telle que la fonction SMB
- Normalement vous ne devez pas changer les valeurs mentionnées ci-dessous. CLIQUEZ ICI et LISEZ bien le texte et assurez-vous de bien le COMPRENDRE avant de changer n’importe quelle valeur
- Valeur par Défaut : 3.0. Ceci est le réglage par défaut de l\'impact d\'absorption de glucides pendant 5 minutes. Le réglage par défaut représente 3mg/dl/5min. Ceci aura des répercussions sur quelle vitesse les GR (Glucides Restants) seront décomposés dans le sang, et combien d\'absorption de glucides sera prise en considération pour évaluer la prochaine glycémie envisagée, quand la glycémie sera en baisse plus que prévu, ou ne sera pas en hausse comme c\'était prévu
- "Valeur par défaut : 3 Ceci est la clé de paramètre de limite de sécurité de l’OpenAPS. Ceci va limiter vos débits de base à une limite 3x, cela va être votre débit de base maximum (Pour ces personnes). Il est probable que vous n’auriez pas besoin de changer cela, mais vous devrez être conscient de ce qui a est évoqué pour le “3x max daily; 4x current” pour les limites de sécurité. "
- Valeur par défaut : 4 Ceci est l’autre moitié de la clé de paramètre de limite de sécurité pour l’OpenAPS, et l’autre moitié de “3x max daily, 4x current” des paramètres limites 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 taux de base actuel. Ceci est fait pour ne pas mettre l’utilisateur en danger en programmant excessivement des débits de base 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 besoin d’ajuster d’autres paramètres s’ils voient qu’ils se retrouvent dans ce paramètre de limite de sécurité.
- Valeur par défaut: 1.2 Ceci est la limite du multiplicateur pour autosens (ensuite autotune) pour être programmé à 20% en limite maximale, ceci dit va définir sur quel seuil maximum le ratio autosens pourra être programmé, à son tour va déterminer à partir de quelle valeur maximale autosens pourra ajuster les débits de base, et à partir de quelle valeur minimale va -t -il ajuster le Facteur SI (Facteur de sensibilité à l\'insuline), et à partir de quelle valeur minimale pourra t-il déterminer la cible glycémique
- Valeur par défaut: 0.7 l’autre aspect pour les limites de sécurité pour autosens, choisir une limite qui détermine à partir de quelle valeur minimale autosens va -t -il ajuster le basal , et à partir de quelle valeur maximale pourra t-il (autosens) ajuster le Facteur SI (Facteur de sensibilité à l\'insuline) et cible glycémiques.
- g
- ]]>
- kJ
- En
- Proteines
- Gras (Lipides)
- ]]>
- "Alarme d'urgence "
- Minutes maximales de basal pour limiter le SMB de
- Seulement positif
- Seulement négatif
- Loop activé
- APS Séléctionné
- NSClient possède la permission d\'écriture
- Le mode boucle fermée activé
- "IR Maximale reglée correctement "
- Glycémie dispo depuis la source selectionnée
- Les valeurs du basal ne sont pas alignées sur la valeur heure : %s
- Profile incorrect: %s
- Programmer la pompe pour administrer un bolus
- Actualiser
- État
- Activité
- Pas de connexion depuis %d min
- %1$d%% (%2$d min restantes)
- Suspendu pour cause d\'erreur
- Suspendu par l\'utilisateur
- En cours d\'exécution
- OpenAPS SMB
- SMB
- Activer UAM
- Activer SMB
- Utiliser les Super Micro Bolus au lieu des débits de base temporaires pour une action rapide
- Détection des repas non annoncés
- Annulation en cours du TBR
- "Paramétrer TBR (%1$d%% / %2$d min) "
- "Administration du bolus en cours (%.1f U) "
- Actualisation en cours
- L\'opération demandée n\'est pas prise en charge par la pompe
- Utilisation dangereuse : les bolus étendus ou carrés sont actifs. Le mode Loop a été programmé pour le low suspend seulement pour 6 heures. Uniquement les bolus normaux sont pris en charge par le mode Loop
- Utilisation dangereuse : la pompe utilise un profile taux basal différent de celui du premier. Le Loop a été désactivé
- Un bolus avec la même quantité d’insuline a été demandé au cours de la dernière minute. Pour prévenir l’administration accidentelle de deux bolus à la fois et pour protéger contre les bugs quand ceci (bolus) non autorisé
- Maintenant
- Lecture historique pompe
- Définir le profil basal
- Niveau cartouche pompe bas
- Niveau batterie pompe bas
- La pompe affiche l’erreur E%1$d: %2$s
- Bas
- Vide
- Normal
- Mise à jour nécessaire pour l\'heure de la pompe
- Warning
- TBR ANNULÉ warning confirmé
- Administration bolus échouée. Il semble qu’aucun bolus n’a été administré. Pour être sûr, Veuillez vérifier la pompe pour éviter un double bolus ensuite re bolusez une nouvelle fois
- Seulement %1$.2f U de %2$.2f U du bolus demandé a été administré dû à une erreur. Veuillez svp vérifier la pompe pour contrôler cela et prendre les mesures appropriées
- Pas assez d\'insuline restante dans le réservoir pour le bolus
- Erreur administration bolus étendu
- Insight
- Pompe Insight
- État
- Modifié
- POMPE ARRÊTÉE
- L\'état du programme mis à jour
- passé(e)s
- avec
- TBR actif
- il vous reste min
- Carnet
- Dernière action completée
- min
- Restant supérieur
- total
- en amont avec
- Rester toujours connectée
- EN VEILLE
- SYNCHRONISATION
- CHARGÉ
- SYNCHRONISÉ
- STARTUP
- besoins
- Non connectée à l\'application compagnon
- L\'application compagnon ne semble pas être installée
- "Application compagnon incompatible, besoin de version "
- Inconnue
- Attente du code de confirmation
- Code rejeté
- Liaison avec app
- Non authorisé
- Incompatible
- Deuxième
- minute
- heure
- jour
- semaine
- s
- Activer toujours SMB
- Activer SMB avec les glucides
- Activer SMB lorsque les GR sont actifs
- Activer SMB avec les cibles tempo
- "Activer SMB lorsqu'il y a une cible tempo active "
- Activer SMB avec des cibles tempo hautes
- Activer SMB lorsqu\'il y a une cible tempo active (exercice)
- Activer SMB après les glucides
- "Activer toujours SMB de manière autonome pour les bolus. Ceci est possible uniquement avec une source de glycémie ayant un filtrage de données parfait comme le G5 "
- Activer SMB pour 6h après les glucides, même s’il y a 0 GR (Glucides Restants). Ceci est possible uniquement avec une source de glycémie ayant un filtrage de données parfait comme le G5
- Français
- "Seulement les chiffres numériques sont authorisés "
- Niveau Batterie
- Niveau Réservoir
- Taux du Débit de Base
+ Bolus max. autorisé [U]
+ Glucides max. autorisés [g]
+ Réinitialiser les Bases de Données
+ Utiliser les bolus étendus pour > 200%
+ Dispositif Bluetooth DanaR
+ Utiliser toujours les valeurs absolues du basal
+ Quelques boutons pour accéder rapidement aux fonctions communes
+ Affiche les aliments définis par défaut dans Nightscout
+ Réglages pour l\'insuline Fiasp
+ Permet de définir le pic de l’activité de l’insuline et ne doit être utilisé que par les utilisateurs avancés
+ État de l’algorithme en 2017
+ Définir un profil avec un seul bloc de temps.
+ Intégration pour les pompes Diabecare DANA R
+ Intégration pour les pompes Diabecare DANA RS
+ Surveillez et contrôlez AndroidAPS en utilisant votre montre WearOS.
+ Insuline:
+ Glucides :
+ Activité :
+ Paramètres de saisie
+ Profil
+ Données repas
+ Résultat
+ Pas de données glycémiques disponibles
+ Durée
+ Raison
+ Glucose
+ OpenAPS MA
+ Careportal
+ Pompe
+ Quelle pompe souhaitez-vous utiliser avec AndroidAPS ?
+ Traitements
+ Profil
+ Quel profil doit utiliser AndroidAPS ?
+ APS
+ Quel algorithme APS doit faire les ajustements de thérapie?
+ Général
+ jours
+ Boucle
+ Boucle
+ APS
+ Dernière activation
+ Annuler
+ Sécurité
+ Plugin désactivé
+ Calculateur de Bolus
+ Restriction appliquée !
+ Confirmation
+ Entrez le nouveau traitement :
+ Bolus
+ Glucides
+ Définir un nouveau bolus étendu
+ Quelle source de données doit être utilisée par AndroidAPS?
+ xDrip
+ Mode APS
+ Boucle désactivée
+ Désactiver la Boucle
+ Activer la Boucle
+ Version incompatible du NSClient
+ Version incompatible de Nightscout
+ NSClient non installé. Enregistrement perdu !
+ Activation manuelle
+ OpenAPS hors ligne
+ Activé
+ Utiliser le système Boucle Ouverte pour quelques jours, et activer manuellement de nombreux débits de basal temporaires. Définir et utiliser des objectifs temporaires (ex : activités ou utilisation de glucides pour traiter des hypos)
+ OAPS
+ 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).
+ OpenAPS
+ Sensibilité AAPS
+ OAPS
+ OpenAPS SMB
+ APS Sélectionné
+ Parametres d\'affichage
+ Paramètres généraux
+ Activer NSClient
+ Bienvenue à l\'assistant de configuration. Je vais vous guider à travers le processus de configuration\n
+ Configuration pompe
+ Statut de lecture
+ Activez les objectifs
+ Configurer le plugin APS
+ Temps écoulé
+ Poctech
+ Recevoir les glycémies depuis l\'app Poctech
+ Personnalisé
+ Différence horaire importante
+ AndroidAPS reinitialisé
+ Données de traitement incomplètes
+ Paramètres de maintenance
+ E-mail
+ Adresse E-mail invalide
+ Nombre de journaux (Logs) à envoyer
+ Maintenance
+ MAINT
+ Le traitement (insuline : %1$.2f, glucides : %2$d, à : %3$s) n\'a pas pu être ajouté aux traitements. Vérifiez et ajoutez SVP manuellement ce traitement.
+ eCarbs : %1$d g (%2$d h), retard : %3$d m
+ Dysfonctionnement du NSClient. Considérerez une réinitialisation de NS et de NSClient.
+ AS
+ Version %1$s disponible
+ Décalage horaire
+ Total
+ Calc
+ Poignée de main
diff --git a/app/src/main/res/values-ga/insight_alerts.xml b/app/src/main/res/values-ga/insight_alerts.xml
new file mode 100644
index 0000000000..70489fbc5e
--- /dev/null
+++ b/app/src/main/res/values-ga/insight_alerts.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-ga/strings.xml b/app/src/main/res/values-ga/strings.xml
index e7d78ec815..70489fbc5e 100644
--- a/app/src/main/res/values-ga/strings.xml
+++ b/app/src/main/res/values-ga/strings.xml
@@ -1,298 +1,3 @@
-
- OAPS
- MM640g
- mmol/l
- mg/dl
- Tá
- Níl
- Anois
- Gaeilge
- Bia
- Dana
- DanaRS
- OAPS
- Ard
- Íseal
- # Lá
- xDrip
- aláraim
- Ceallraí
- Bluetooth
- Cnaipe 1
- Cnaipe 2
- Cnaipe 3
- Cuir ar ceal
- Cuir ar ceal
- Nasctha
- Ag nascadh
- DANA
- DanaR
- lá
- Dáta
- Dínasctha
- In eagar
- Bearla (English)
- earráid
- Scoir
- BAILE
- Íseal
- Balbh
- NSClient
- NSClient
- OK
- OK
- OK
- OpenAPS
- OpenAPS AMA
- OpenAPS MA
- Eile
- Eile
- Athnuachan
- Atosaigh
- SAGE
- Sábháil
- Tosaigh
- Stad
- URL:
- Toradh
- Gréigis
- Ginearálta
- glúcóis
- Glúcóis
- Glúcóis
- g
- Fiasp
- Saill
- Cleachtadh
- Folamh
- Fad:
- Fad
- Fad
- Fad [nóim.]
- DanaRv2
- Dáta
- Próifíl
- Próifíl
- Próifíl
- Próifíl
- PBAGE
- Caidéil
- Caidéil
- CAIDÉIL
- Ráta
- Cóimheas
- Cóimheas:
- Cúis
- Taiscumar
- Atosú
- Reáchtáil anois
- Ag reáchtáil
- Braiteoir
- Braiteoir
- Braiteoir aois
- Rathúlacht
- Aonaid
- Aonaid:
- Fionraí lúb do 10 u
- Fionraí lúb do 1 u
- Fionraí lúb do 2 u
- Fionraí lúb do 3 u
- Fionraí
- Ceist
- Teanga
- Inslin
- Ins:
- INS
- Inslin
- Inslin
- Inslin:
- Inslin aois
- IAGE
- Páiste
- Áireamhán
- CAGE
- Bluetooth stádas
- APS
- APS
- AndroidAPS thosaigh
- %dnóim ó shin
- %d nóim ó shin
- %.1fu ó shin
- %.2f A/u
- %1$d%% (%2$d nóim fágtha)
- Gníomhartha
- GNÍ
- Cuir
- Duine fásta
- Calabrú
- carbaihiodráit
- Carbaihiodráití
- Lúb dúnta
- Cear
- Cear
- Seachadta
- Seachadadh %.2fA
- Seachadadh anois
- Dhícheangal Caidéil do 1 u
- Dhícheangal Caidéil do 2 u
- Dhícheangal Caidéil do 3 u
- Dhícheangal Caidéil do 30 nóim
- Dícheangal
- Ollainnis
- Free-Peak Oref
- " http://www.androidaps.org http://www.androidaps.de (de) facebook: http://facebook.androidaps.org http://facebook.androidaps.de (de)"
- Iodáilis
- Cóiréis
- Lúb
- Lúb
- LÚB
- Taiscumar folamh
- Glúcóis stádas
- Gearmáinis
- Glimp
- Lúb cumasaithe
- ns_create_announcements_from_errors
- NSCI
- NS API secret
- NS API secret
- Lúb oscailte
- Faoin gcéad
- Faoin gcéad
- Rapid-Acting Oref
- athlán
- Athlán
- Athlódáil
- Athlódáil próifíl
- Rómáinis
- Rúisis
- Sensitivity Oref0
- Spainnis
- Sualainnis
- Déagóirí
- Cóireálacha
- Cóireálacha
- Bailí:
- Fhíorú
- Ar fionraí (%d n)
- Ar fionraí ag úsáideoir
- Tosaigh ag lúb oscailte
- Stádas:
- Stáit
- Stopadh
- Sraithuimhir
- Athnuaigh
- Athnuaigh caidéil stáit
- Tosaithe
- Gnáth
- Ar fionraí ag earráid
- Tosaithe ...
- Léigh próifíl bunaidh
- Léigh stair caidéil
- Socrú BRS (%1$d%% / %2$d nóim)
- Cealú BRS
- Is ceallraí Caidéil íseal
- Is leibhéal cartús íseal
- Ag bólas (%.1f A)
- Carbí
- Carbí
- Carbí
- Carbí
- Carbí:
- Carbí:
- CARBÍ & BÓLAS
- Ag nascadh le %d s
- Tuairim
- DanaR Bluetooth gléas
- Seice
- DanaR Cóiréis
- DanaR staiti
- Lúb atógáil
- Is lúb cumasaithe
- Is lúb cumasaithe
- Is lúb díchumasaithe
- Is lúb díchumasaithe
- Lúb ar fionraí
- Lúb ar fionraí
- Lúb díchumasaithe
- LÚB DÍCHUMASAITHE LE SRIANTA
- Ceallraí Íseal
- Nightscout URL
- Novorapid, Novolog, Humalog
- Nóta
- Nótaí
- DexcomG5 App (patched)
- Díchumasaigh lúb
- Cumasaigh lúb
- Glúcóis cineál
- Athrú Cartús Inslin
- Próifíl neamhbhailí !!!
- Próifíl neamhbhailí: %s
- Bólas deiridh
- Reáchtáil deiridh
- Achtaíodh deiridh
- Nasc deiridh
- GF deiridh:
- Méar
- Fast Acting Insulin
- Earráidí
- Inslin lá
- Aonaid lá
- Deilte
- Deilte:
- AndroidAPS
- Bólas
- Bólas stopadh
- Ag stopadh bólas
- Ag dul a sheachadadh %.2fA
- Socrú próifíl bunaidh
- Ag féachaint d\'athruithe stair
- Níl nasc le haghaidh %d nóim
- Is nuashonrú gá clog Caidéil
- Cláir Caidéil bólas
- Gníomhaíocht
- Gníom.:
- Gníomhaíocht
- Gníomhaíocht fad
- Gníomhaíocht sprioc
- Rabhadh
- Stair le Caidéil
- Feidhmiú
- Firmware
- MDI
- Faoi
- Iomlán
- Iomlán
- Aláraim
- APS mód
- APS roghnaithe
- Bunaidh
- Bunaidh
- Bunaidh
- Bunaidh:
- BUN
- xds
- Bólas:
- Bólas
- Bólas E
- Ag dul a sheachadadh %.2fA
- Bólas DS
- Bólas DE
- Bólas S
- SMS
- Bunaidh ráta
- Bunaidh Céim
- Bunaidh cineál
- Bunaidh luach [%]
- Bunaidh luach [A/u]
- Bunaidh ráta bonn
- Seachadta %.2fA Bólas go rathúil
- Seachadta %.2fA Bólas go rathúil
- Bólas Céim
- Bólasi
- Cealú BRS
- Cealú BRS teip
- Inslin
- Insight
- Bia
-
\ No newline at end of file
+
+
diff --git a/app/src/main/res/values-he/insight_alerts.xml b/app/src/main/res/values-he/insight_alerts.xml
new file mode 100644
index 0000000000..70489fbc5e
--- /dev/null
+++ b/app/src/main/res/values-he/insight_alerts.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml
new file mode 100644
index 0000000000..24003c9946
--- /dev/null
+++ b/app/src/main/res/values-he/strings.xml
@@ -0,0 +1,12 @@
+
+
+
+ רענן טיפול מ-Nightscout
+ השתמש בבולוס מורחב של 200%
+ בבקשה אתחל את הסמרטפון שלך או תרענן את אפלקצית AndroidAPS בהגדרות המערכת
+אחרת AndroidAPS לא יוכל לבצע רישום (חשוב לעקוב אחר ולוודא כי האלגוריתמים פועלים כראוי)!
+ מציג את ההגדרות הקבועות מראש עבור מזון המוגדר ב-Nightscout
+ להפעיל או לכבות את הלולאה.
+ מסנכרן את הנתונים שלך עם Nightscout
+ יבא פרופיל מ- Nightscout
+
diff --git a/app/src/main/res/values-it/insight_alerts.xml b/app/src/main/res/values-it/insight_alerts.xml
new file mode 100644
index 0000000000..70489fbc5e
--- /dev/null
+++ b/app/src/main/res/values-it/insight_alerts.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index fec70c4992..70489fbc5e 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -1,455 +1,3 @@
-
- Glimp
- Italiano
- MM640g
- assoluto
- azioni
- attivita\'
- adulto
- settaggi avanzati
- "per favore riavvia il tuo telefonoo riavvia AndroidAPS dalle Impostazioni di Sistema o Android APS non lo registrera\' "
- Utilizzare sempre delta medio breve invece del delta semplice
- Utile quando i dati provenienti da sorgenti non filtrate come xdrip sono rumorose
- AndroidAPS è stato avviato
- Si avvicina il limite giornaliero di insulina
- Modalità APS
- Basale
- Valore base inferiore al minimo, Profilo non impostato
- Batteria della pompa scarica
- Bolo
- Vincolo bolo applicato
- Tasto 1
- Tasto 2
- Tasto 3
- Invio calibrazione xDrip
- Cancella
- Cancella Basale Temporale
- Carboidrati
- Applicazione del conteggio Carboidrati
- Accesso portale
- Controllo Glicemia
- Correzione carboidrati
- Attivazione del sensore
- Avvio Sensore
- Bolo doppio
- Correzione Bolo
- Sport
- Cambio serbatoio insulina
- Bolo pasto
- Assoluto
- Carboidrati
- Tempo di assorbimento Carboidrati
- Durata
- Ingresso
- Data Evento
- Tipo di evento
- Tipo di glucosio
- Insulina
- Glucometro
- Note
- Altro
- Percentuale
- Profilo
- Sensore
- Frazionare
- Note
- OpenAPS Offline
- Cambio profilo
- Cambio posizione ago
- Domanda
- CP
- Bolo Spuntino
- Fine Basale temporanea
- Inizio Basale Temporanea
- Target Temporanea
- Cancellare Target Temporanea
- Cambia il tuo imput
- Ragazzi
- Chiusura Loop
- Commenti
- Configurazione Strutturale
- APS
- Origine glicemia
- Costrizione
- Generale
- Insulina
- Loop
- Versione Nightscout
- Profilo
- Microinfusore
- Configurazione
- Trattamento
- Conferma
- Collegato
- Connesso
- Errore connessione Microinfusore
- Vincolo Applicato
- Vincolo Violato
- Allarme
- Basale Oraria
- Stato Bluetooh
- Dispositivo Bluetooh DanaR
- Carboidrati
- Unita\' giornaliera
- Bolo De
- Bolo DS
- Bolo E
- Bolo esteso abilitato
- Errore
- Glucosio
- Storia
- Allarmi
- Basale oraria
- Boli
- Carboidrati
- Connessione %d s
- Insulina Giornaliea
- Errore
- Glucosio
- Ricarica
- Sospensione
- Ricaricare
- Data Errata
- IOB Microinfusore
- Ultimo Bolo
- Password Microinfusore
- Setting Micro
- ricarica
- Bolo S
- Stato DanaR
- # Days
- Basale
- Bolo
- TDD totale
- Data
- TBB * 2
- TDD
- Usa esteso sup. 200%
- DanaR Korean
-
- Profilo Impostazioni DanaR
- DIA (H)
- Durata Insulina Attiva
- DanaR
- DANA
- giorno
- Delta
- Sistema selezionato non trovato
- DIA:
- Loop Disabilitato
- Disabilta Loop
- Scollegato
- Sconnetti Micro per 1 H
- Sconnetti Micro per 2 H
- Sconnetti Micro per 15min
- Sconnetti Micro per 30min
- Sconnetti Micro per 3 H
- Respingere
- Durata
- Pranzo
- Greco
- English
- Abilitare Loop
-
- Abilitare super bolus
- ontratto di licenza
- Inserimento nuovo trattamento
- Digitare solo numeri
- "Digitare solo numeri nel range %1$s - %2$s"
- Numero di telefono non corretto
- Spagnolo
- Esecuzione
- Esportazione impostazione to
- Esportare Preferenze
- Errore caricamento profilo Basal
- Novorapid, Novolog, Humalog
- Velocita\' insulina
- File non coretto
- Stato Micro
- Glucosio
- Sensore
- Importa impstazioni da
- Inizzializzazione
- INS
- IOB
- Koreano
- Lingua
- Profilo attuale
- LP
- Delta acg. esteso
- Loop
- APS
- Loop
- Loop disabilitato da vincolo
- Superbolo (%d m)
- Sospensione Loop
- Sospendi (%d m)
- Batteria scarica
- Manuale
- MDI
- Pasto
- mg/dl
- %dmin fa
-
- Mancante
- mmol/l
- Spegnere
- Uscita
- Esporta impostazioni
- Importa impostazioni
- Preferenze
- Ricaricare
- Reset Databases
- APS selezionato o Provaider non corretto
- No bluetooth riconosciuto
- Non cambiare requisiti
- Nessun profilo caricato da NS
- Nessun profilo selezionato
- Profilo non impostato
- nessun successo - cerca telefono
- Non disponibile
- NSClient non ha il permesso. errata Pss?
- Caricare App in NS
- Nessun caricamento in NS
- Utilizzare sempre valori assoluti basali
- NSClient
- Inserisci Ns Pss (minimo 12 caratteri)
- NS Password
- NS Password
- NSCI
- NsClient
- URL:
- Digita Nightscout URL
- Nightscout URL
- NsClient non istallato. Record perduto
- Basale
- Durata Insulina attiva
- IC(insulina/Carb)
- ISF (Fatt. Semsibilita\' insulinica)
- Target
- Unita\'
- OAPS
- Obbiettivo
- Partenza con Open loop
- BG disponibile in NS
- Avvio
- Verificato
- Micro disponibile in NS
- OBJ
- Occlusione
- OK
- OpenAPS MA
- Plugin e\' disabilitato
- Stato glucosio
- Entrata parametro
- Il valore e\' chiamati basale in OpenAPS
- Basale Massima in IOB OpenAPS
- IOB dati
- Ultimo attuato
- Ultimo corsa
- Verifica che Bg sia disponibile in Nightscout, e la data micro e\' ben allineata
- Valore nn disponibile in quella data
- Profilo
- Copiato negli appunti
- Copia in appunti
- Disattiva la modalità EasyUI in pompa
- TDD esponenzialmente ponderato
- Vecchi dati Si prega di premere \"RELOAD\"
- Rapporto
- Totale Base basale
- Probabilmente inesatto se si usano bolus per l\'innesco / riempimento!
- Peso
- Cambia da U/d in U/h nel micro
- Valore non impostato correttamente
- Visualizza Profilo
- Germania
- Disconnetti
- Abilita funzionalità superbolus nella procedura guidata. Non abilitare fino a quando non impari quello che realmente fa. PUÒ CAUSARE L\'INVERTIMENTO INSULINO SE USATO BLINDLY!
- Richiesta
- Esito
- Avvia ora
- Apertura Loop
- Altro
- Boli
- Stop
- Calcolatore
- Calibrazione
- Tasto testo:
- Carboidrati:
- Valido:
- Aggiungere
- Bolo Esteso
- Valore Basale [%]
- Uscire
- Eliminare
- HOME
- Basale Temporale
- Pausa
- percentuale
- Riempimento
- Profilo
- NsProfilo
- Micro non avviato
- Micro non avviato, profilo non inserito
- Micro occupato
- Errore Micro
- Arresto Micro
- Sospensione Micro
- Aggiorna Profilo
- Eliminare campo:
- Riavvio
- Storia
- Salva
- Accettare il nuovo basale temp
- Impostare il nuovo bollo esteso
- Impostazioni importate
- Impostazioni aggiuntive bolus
- Password per l\'impostazione
- Impostare il basal tempo
- Abbreviare i titoli delle schede
- Semplice profilo
- Impostazione di visualizzazione, monitoraggio e analisi basali e rapporti
- Eseguire in modalità Open Loop per alcuni giorni e impostare manualmente la basale tempor. Set up and use temporary and default temporary targets (e.g. for activity or hypo treatment carbs)
- Script debug
- Comunicazioni SMS
- Numero di telefono acettato
- Bolo fallito
- xDrip non ha ricevuto la calibrazione
- Numero non valido per SMS
- Disattivazione Loop corretta
- Lopp abilitato correttamente
- Loop e\' disabilitato
- Loop abilitato
- Storia del Loop
- Loop sospeso
- Invio SMS permesso
- Impostare basale da remoto non e\' permesso
- Il bolo da remoto non e\' permesso
- La calibrazione da remoto non e\' permesso
- il comando da remoto non e\' permesso
- Consenti comandi remoti tramite SMS
- SMS
- Baasale temporanea cancellata
- Cancellazione temporanea fallita
- Avvio Basale temporanea fallita
- Comando errato
- Durata errata
- Stato:
- Stoppa bolo esteso
- Stoppa basale temporanea
- OK
- Super bolo
- Sospendi loop per 10h
- Sospendi loop per 1h
- Sospendi loop per 2h
- Sospendi loop per 3h
- Target range:
- Adolescente
- IOB:
- Totale IOB:
- Ins:
- Valore basale
- Impostazione Basale
- Bulgaria
- Impostazioni Bolo
- log chiaro
- Correzione
- Ceco
- Spostati
- Inviata
- Il campo non deve essere vuoto
- Assicurarsi che il valore corrisponda alla specifica del tuo set di infusione!
- Dito
- Segno basso
- Sulla base di quell\'esperienza, decidere quale basale massimo dovrebbe essere e impostarlo sulla pompa e le preferenze
- Comprensione del tuo ciclo aperto, incluse le relative raccomandazioni basali del tempo
- Basale temporanea attuale
- Questo valore si chiama Max IOB in contesto OpenAPS. Questo valore sara\' zero. Dopo diversi giorni o settimane, a seconda del livello di comfort, puoi scegliere di regolare questo numero.
- Data Pranzo
- Stoppato
- rapporto:
- Errore di erogazione del bolo
- attività
- Carboidrati:
- Insulina:
- Esegui in ciclo chiuso con IOB max = 0 per pochi giorni senza troppi eventi LGS
- Iniziare a chiudere il ciclo con Low Glucose Suspend
- Funziona per alcuni giorni e almeno una notte senza allarmi BG, prima di lasciare BG
- Avviare il ciclo chiuso, sollevando il massimo IOB sopra 0 e gradualmente abbassando gli obiettivi BG
- 1 settimana ciclo di successo diurno con entrata regolare dei carb
- Regolare i basali e i rapporti se necessario, quindi attivare l\'autocontrollo
- Abilitazione di funzioni aggiuntive per l\'uso quotidiano, ad esempio assistenza avanzata del pasto
-
- Basale temporale
- Pompa Virtuale
- In attesa del micro
- Attendere risultato
- Visualizza BGI
- Password Errata
- Password Micro Errata
- Xdrip
- xDrip non installato
- XDrip in linea
- Stato xDripe
- xds
- Hai raggiunto il limite consentito
- Indossare
- Aggiungi BGI alla linea di stato
- Impostazioni usura
- Vei dettaglio IOB
- Ridurre IOB nel bolo e basale IOB sulla guardia
- Indossare
- Caricare stato in NS
- VPUMP
- Impostazioni del Micro virtuale
- ok
- Serbatoio
- Ultima conessione
- Firmware
- Bolo Esteso
- Batteria
- Base basale
- Micro Virtuale
- UpLoading
- Aggiornamento basale
- Versione NsClient non supportata
- impostazioni sbloccate
- Unita\':
- Sicurezza delle prestazioni
- Valore massimo carbo (g)
- Bolo massimo (U)
- U
- Correzione
- COB
- Carboidrati
- Boli IOB
- Glicemia
- Basale IOB
- Totale insulina
- Totale Carboidrati
- Totale IOB
- Totale IOB attiva:
- IOB:
- Trattamento
- DUR:
- Errore di somministrazione basale temporale
- Basale temporanea %1$.2fU/h for %2$d min avviata con successo
- Sospendi il loop per %1$d minuti riprendi %2$s
- La calibrazione è stata inviata. La ricezione deve essere abilitata in xDrip.
- Per interrompere la risposta basale della temperatura con il codice %s
- +XXXXXXXXXX;+YYYYYYYYYY
- Ultima Glicemia
- IOB:
- Delta:
- Bolo:
- Basale
- Glicemia:
- SP
- QuickWizard
- Impostazioni QuickWizard
- Profilo NS
- Profilo Basale aggiornato nel Micro
- Impostazione Profilo Basale fallito
-
-
+
+
diff --git a/app/src/main/res/values-ko/insight_alerts.xml b/app/src/main/res/values-ko/insight_alerts.xml
new file mode 100644
index 0000000000..ccea80c49f
--- /dev/null
+++ b/app/src/main/res/values-ko/insight_alerts.xml
@@ -0,0 +1,26 @@
+
+
+
+ 경고 W31: 주사기양 낮음
+ 경고 W32: 배터리양 낮음
+ 경고 W33: 시간/날짜 유효하지 않음
+ 경고 W34: 보증만료
+ 경고 W36: 임시Basal 취소
+ 경고 W38: Bolus 취소
+ 경고 W39: Loantime 경고
+ 정비 M20: 주사기가 삽입되지 않았습니다.
+ 정비 M21: 주사기가 비었습니다.
+ 정비 M22: 배터리가 방전되었습니다.
+ 정비 M23: 자동 OFF
+ 정비 M24: 막힘
+ 정비 M25: Loantime 종료 - 작업 종료
+ 정비 M26: 주사기 교체가 완료되지 않았습니다.
+ 정비 M27: 데이터 다운로드가 실패하였습니다.
+ 정비 M28: 일시정지모드 시간만료
+ 정비 M29: 배터리 타입이 설정되지 않았습니다.
+ 정비 M30: 주사기 타입이 설정되지 않았습니다.
+ 에러 E6: 기계적 에러
+ 에러 E7: 전기적 에러
+ 에러 E10: Rewind 에러
+ 에러 E13: 언어 에러
+
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index d518aadb0d..634dffe18b 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -1,675 +1,1062 @@
+
- 관리 안전설정
- 최대 허용 식사주입인슐린 [U]
- 최대 허용 탄수화물 [g]
- 설정
- NS에서 관리 새로고침
- 데이터베이스 초기화
- 데이터 베이스를 정말 초기화하시겠습니까?
- 종료
- >200% 주입위한 확장식사주입
- 다나R 블루투스
- 기초주입량 절대값 사용하기
- 폰을 재부팅하고나 AndroidAPS를 재시작하세요 \n그렇지 않으면 로그가 기록이되지 않습니다.(알고리즘이 제대로 작동하는지 확인하기 위해 로그가 필요합니다.)!
- 시작
- 확인
- 단위
- 인슐린활동시간(DIA):
- 인슐린 대 탄수화물 비율(IC):
- 인슐린 민감도(ISF):
- 기초주입:
- 목표:
- NO PROFILE SET
- 인슐린:
- 탄수화물:
- IOB:
- IOB:
- 활동:
- IOB 총량:
- 활동 IOB 총량:
- 기간:
- 비율:
- 인슐린:
- IOB:
- IOB 총량:
- 인슐린 양
- 탄수화물 양
- 혈당
- 탄수화물
- 교정
- U
- 식사주입 IOB
- 지금 실행
- 가상 펌프
- 기본 기초주입량
- 임시기초주입
- 확장식사주입
- 배터리
- 인슐린 잔량
- OK
- 최근 실행
- 입력 변수
- 혈당 상태
- 현재 임시기초
- IOB 데이터
- 프로파일
- 식사 데이터
- 결과
- 혈당 데이터 없음
- 변경사항 없음
- 요청
- 주입량
- 기간
- 근거
- 혈당
- Delta
- Delta:
- 구성 관리자
- 목표
- OpenAPS MA
- 개요
- NS 프로파일
- Simple 프로파일
- 임시기초
- 관리
- 가상펌프
- 케어포털
- 펌프
- 관리
- 프로파일
- APS
- 일반
- 일
- 제한
- Loop
- Loop
- APS
- 제약 적용 후
- 최근 주입
- OK
- 취소
- NO APS SELECTED OR PROVIDED RESULT
- Safety
- 플러그인이 사용불가능 합니다
- 제한 위반
- 식사주입 전송 에러
- 임시기초주입 전송 에러
- 기초주입 값 [%]
- % (100% = 현재)
- 새 임시기초주입 적용:
- 식사주입
- 계산기
- 제한!
- 확인
- 새 Treatment 입력:
- 식사주입
- Bolus:
- 기초주입
- Basal:
- 탄수화물
- 입력값 변경!
- 새 확장식사주입 설정:
- 혈당 소스
- xDrip
- APS 모드
- Closed Loop
- Open Loop
- Loop 중지됨
- Loop 중지하기
- Loop 실행하기
- 새로운 제안이 있습니다
- 지원하지 않는 NSClient 버전입니다
- 지원하지 않는 Nightscout 버전입니다
- NSClient 가 설치되지 않았습니다. 기록이 삭제됩니다!
- NS에서 혈당데이터가 확인 가능합니다.
- NS에서 펌프상태가 확인 가능합니다.
- 수동 주입
- 제한으로 인해 LOOP가 사용불가합니다.
- Czech
- English
- 기초주입 IOB
- 식사주입 제한이 적용되었습니다
- 탄수화물 제한이 적용되었습니다
- 혈당 체크
- 알림
- 노트
- 의문
- 운동
- 펌프 위치 변경
- CGM 센서 삽입
- CGM 센서 시작
- 인슐린 카트리지 교체
- 프로파일 변경
- 간식 주입
- 식사 주입
- 교정 주입
- 콤보 주입
- 임시 기초 시작
- 임시 기초 종료
- 탄수화물 교정
- OpenAPS 오프라인
- 이벤트 종류
- 기타
- 측정기
- 센서
- 탄수화물
- 인슐린
- 탄수화물 시간
- 분할
- 기간
- 퍼센트
- 절대값
- 노트
- 이벤트 시간
- 프로파일
- Entered By
- 혈당 종류
- 아직 NS에서 프로파일을 로드하지 못했습니다.
- 임시기초주입
- 확장식사주입
- Nightscout 버전:
- Missing
- 설정이 저장되었습니다
- 다음 위치에 설정을 저장하시겠습니까
- 다음 위치에서 설정을 불러오시겠습니까
- 설정을 불러왔습니다
- 파일을 찾을 수 없습니다
- 설정 저장하기
- 설정 불러오기
- Dutch
- German
- Spanish
- Greek
- Italian
- Russian
- Swedish
- 임시기초주입 최대량 [U/hr]
- 이 값은 OpenAPS에서 Max Basal(임시기초주입 최대량)로 설정되는 값입니다
- OpenAPS가 주입할수 있는 최대 기초주입 IOB [U]
- 이 값은 OpenAPS에서 Max IOB라고 부르는 값입니다\n기본값은 0으로 설정되어 있습니다. 몇일 혹은 몇주 정도 사용 후 적절한 값으로 변경할 수 있습니다.
- Bulgarian
- 닫기
- 언어
- 다나R
- 연결중
- 연결됨
- 연결 끊김
- 다나R 펌프 설정
- 최종 사용자 라이선스 동의서
- MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
- 모두 이해하였고 동의합니다.
- 저장
- 블루투스 어댑터를 찾지 못했습니다
- 선택된 기기를 찾지 못했습니다
- 펌프 연결 에러
- 펌프 IOB
- 일 인슐린 총량
- 최근 식사주입:
- 사용할수 없는 입력 데이터
- 값이 제대로 설정되지 않았습니다
- Reload profile
- 프로파일 보기
- Enacted
- Comment
- Success
- 퍼센트
- Absolute
- 임시기초주입 취소하기
- SMS 전송
- 결과 기다리는 중
- 허가된 전화번호
- +XXXXXXXXXX;+YYYYYYYYYY
- 식사주입 %1$.2fU 을 실행하려면 %2$s 를 입력하고 답장하세요
- 보정값 %1$.2f을 전송하려면 %2$s 를 입력하고 답장하세요
- Bolus failed
- Bolus %.2fU delivered successfully
- %.2fU 주입 예정입니다.
- Bolus %.2fU delivered successfully
- %.2fU 주입중
- SMS 원격 명령 사용하기
- 원격 식사주입 허용되지 않음
- Finger
- Sensor
- Manual
- 임시목표
- 임시목표 취소
- DanaR 프로파일 설정
- 인슐린활동시간(DIA) [h]
- Duration of Insulin Activity
- 기초주입 프로파일 갱신 실패
- 새로고침
- 업로드중
- E bolus
- DS bolus
- DE bolus
- 에러
- 교체
- basal hour
- 혈당
- 탄수화물
- 알람
- 총 %d 기록들이 업로드되었습니다.
- S bolus
- 알람
- 기초주입 시간
- 식사주입
- 탄수화물
- 일일 인슐린
- 에러
- 혈당
- 교체
- 중지
- %d 초 동안 연결중
- 펌프 비밀번호
- 펌프 비밀번호가 잘못되었습니다!
- 펌프가 바쁩니다
- 주입됨
- 정지됨
- 막힘
- 정지
- 정지 누름
- 펌프를 기다리는 중
- %.2fU을 주입합니다
- 표시설정과 모니터링설정을 완료하고, 기초주입과 비율을 분석한다.
- 나이트스카우트에서 혈당 데이터가 잘 들어오는지, 펌프데이터가 업로드 되는지 확인한다.
- Open Loop를 시작한다.
- Open Loop 모드에서 몇일간 사용하여보고, 임시기초주입을 여러번 수동으로 실행하여본다. Set up and use temporary and default temporary targets (e.g. for activity or hypo treatment carbs)
- 임시기초주입 추천기능을 포함해서, Open Loop에 대해 이해한다.
- 이 경험을 토대로, 최대 기초주입량을 결정하고 이를 펌프와 설정에 입력한다.
- Closed Loop를 시작하고 저혈당인슐린 중지 기능을 사용해본다.
- 최대 IOB = 0 인 상태로 Closed Loop를 몇일동안 실행시켜 본다. 저혈당 인슐린일시중지가 많이 발생하지 않도록 한다.
- Closed Loop를 조정하여 최대 IOB를 0 이상으로 올려서 서서히 혈당 목표치를 낮춘다.
- 혈당을 낮추기 전에 몇일간 사용해보되 최소한 하루는 저혈당 혈당 알람이 발생하지 않도록 해본다.
- 필요하면 기초주입과 비율을 조절하고, auto-sens를 활성화한다.
- 평소의 탄수화물을 입력하면서 1주일동안 낮시간대에 loop를 성공적으로 사용해본다.
- AMA(Advanced Meal Assist)같은 낮시간대를 위한 추가적인 기능들을 실행하여 본다.
- 낮시간대에 SMB(Super Micro Bolus)같은 추가기능을 활성화해 사용해본다.
- 허용된 제한값에 도달하였습니다
- 프로파일이 선택되지 않았습니다
- Loop가 중지되었습니다.
- Loop가 실행되었습니다.
- Loop가 중지중입니다.
- Loop가 실행중입니다.
- %1$.2f, %2$.2f으로 제한됨
- %s값이 하드리밋(Hard Limit)를 벗어났습니다
- 원격 기초주입설정이 허가되지 않았습니다
- 원격 명령이 허가되지 않았습니다
- 기초주입 %1$.2fU/h 을 실행하려면 %2$s 를 입력하고 답장하세요
- %1$d분동안 Loop 일시중지하려면 %2$s 를 입력하고 답장하세요
- Temp basal %1$.2fU/h for %2$d min started successfully
- Temp basal start failed
- 임시기초주입을 중지하려면 %s 를 입력하고 답장하세요
- Temp basal canceled
- Canceling temp basal failed
- 알려지지 않은 명령이거나 잘못된 답장입니다.
- 빠른마법사
- 빠른마법사 설정
- 버튼명:
- 탄수화물:
- 유효기간:
- 추가
- 수정
- 삭제
- Meal
- Corr
- 한국어
- 실행
- AndroidAPS 시작
- NS에 업로드만 하기(동기화 불능)
- NS에 업로드만 하기. 로컬소스(xDrip)가 선택되지 않으면 SGV에는 효력이 없습니다. NS프로파일이 사용중이라면 프로파일에는 효력이 없습니다.
- 펌프가 초기화 되지 않았습니다!
- 펌프가 초기화와 프로파일 설정이 되지 않았습니다!
- 교체/채움
- 양이 인퓨전세트의 사양과 일치하는지 확인하세요!
- 기타
- 교체/채움 기본 인슐린양
- 버튼1
- 버튼2
- 버튼3
- Units:
- mg/dl
- mmol/l
- DIA:
- 목표 범위:
- 차트 표시 범위
- 개요/스마트워치 차트 표시용 고/저혈당 선
- 저혈당 선
- 고혈당 선
- 웨어
- 모든 데이터 다시 보내기
- 웨어에서 설정 열기
- 펌프 에러
- 배터리 부족
- 펌프 중지
- 펌프배터리 방전
- 다나R 한글
- 기초주입량:
- 기초주입 프로파일 설정이 실패하였습니다
- 기초주입 프로파일이 펌프에 업데이트 되었습니다
- 펌프에서 EasyUI모드를 해제하세요
- 펌프에서 확장식사기능을 활성화 하세요
- 펌프에서 U/d에서 U/h로 모드를 변경하세요
- 기초주입값이 최소값 이하입니다. 프로파일이 설정되지 않습니다!
- BG:
- Last BG:
- MDI
- MM640g
- 연속 알림
- OLD DATA
- %d분전
- %dmin ago
- Local Profile
- OpenAPS AMA
- Short avg. delta
- Long avg. delta
- Array of %d elements.\nActual value:
- Autosens 정보
- Script debug
- AMA autosens 기능 사용하기
- NS에서 이벤트 새로고침
- Eating Soon
- Activity
- 기록 삭제:
- DanaR 통계
- 누적 일총량
- 지수가중 일총량
- 기초주입
- 식사주입
- 일총량
- 날짜
- 비율
- #일
- 가중
- 교체/채움을 위해 식사주입을 사용한 경우 부정확할 수 있습니다!!
- 오래된 데이터입니다. "새로고침"을 누르세요.
- 총기초량
- 총기초량 * 2
- 초기화중 ...
- ACT
- CONF
- LOOP
- SP
- OAPS
- LP
- DANA
- HOME
- VPUMP
- NSPROFILE
- TREAT
- CP
- OBJ
- WEAR
- SMS
- 탭 이름 단축
- 단순델타값 대신 단기평균델타값을 항상 사용합니다.
- xDrip의 혈당데이터에 노이즈가 심할경우 유용합니다.
- 고급 설정
- 모델: %1$02X 프로토콜: %2$02X 코드: %3$02X
- 프로파일
- 기본값: 3\n이 값은 중요한 OpenAPS 안전장치입니다. 이 값의 역할은 펌프에 설정되어 있는 최대기초주입량보다 3배를 초과할 수 없게 제한하는 것입니다. 이 값을 변경할 필요는 없을 것이지만, 안전을 위해 "3x max daily; 4x current"이 의미하는 바를 알고 있어야 합니다.
- 기본값: 4\n이 값은 "3x max daily; 4x current"의 나머지 절반에 해당하는 또 다른 중요한 OpenAPS 안전장치입니다. 이 값은 펌프에 설정된 최대기초주입량과 관계없이, 설정된 현재시간의 기초주입량에 이 값을 곱한 양을 초과할 수 없게됩니다. 이는 알고리즘의 작동 방식을 이해하기 전에 과도하게 높은 최대 기본을 설정하여 위험한 상황에 빠지지 않도록 보호하기 위한 것입니다. 다시한번, 기본 값은 4배인 것을 알아두세요; 일반적으로 이것을 조정할 필요는 전혀 없으며, 대신 이 안전장치를 변경해야할것처럼 생각이 된다면, 다른 설정을 변경해야 할 가능성이 더 큽니다.
- 기본값: 1.2\n이 값은 autosens가 autosens 비율을 얼마나 높게 할 수 있는지에 대한 최대 한계를 20%로 설정하는 승수장치입니다. 이는 autosens가 얼마나 높게 기초주입량을 조절할수 있는지, ISF를 얼마나 낮게 조절할수 있는지, 혈당 목표범위를 얼마나 낮게 설정할수 있는지를 결정합니다.
- 기본값: 0.7\nautosens 안전 제한의 나머지 부분입니다. 이는 기초주입량을 얼마나 낮게 조절할 수 있는지, ISF와 혈당 목표범위를 얼마나 높게 설정할 수 있는지를 결정합니다.
- 기본값: 활성\n이것은 autosens가 ISF와 기초주입뿐만 아니라, 혈당 목표범위를 조절할 수 있게 합니다.
- 기본값: 2\n식사주입 후 Bolus snooze가 수행되게 되고, 따라서 식사주입 직후엔 loop가 low temp에 대응하지 않게 됩니다. 기본값이 2일때 예제는 다음과 같습니다; DIA가 3시간일 경우 bolus snooz는 점차적으로 1.5시간에 걸쳐 단계적으로 사라지게 됩니다.(3DIA/2).
- 기본값: 3\n이것은 5분당 기본 탄수화물 흡수량에 대한 설정입니다. 예상되는 기본값은 3mg/dl/5min입니다. 이는 혈당이 예상보다 빨리 떨어지거나 오를때, 얼마나 빨리 COB가 감쇠하는지와 혈당예측을 위한 계산시 탄수화물 흡수량이 얼마나 될것으로 예상되는지에 영향을 미치게 됩니다.
- 주의!\n보통의 경우 아래의 값을 변경하면 안됩니다. 이 값들을 변경하기 전에 반드시 이곳을 클릭하고 글을 정독해서 확실하게 이해를 하여야 합니다.
- 숫자만 입력가능합니다.
- 이 범위(%1$s - %2$s)안에 해당하는 숫자만 입력가능합니다.
- 필수 입력 항목입니다.
- 폰번호가 유효하지 않습니다
- SMS폰번호가 유효하지 않습니다
- 클립보드에 복사
- 클립보드에 복사되었습니다
- 로그 보기
- 보정
- 보정값 %.1f을 xDrip에 전송하시겠습니까?
- xDrip+가 설치되지 않았습니다
- 보정이 xDrip으로 전송되었습니다
- 원격보정이 허용되지 않았습니다
- 보정 전송됨. xDrip에서 수신이 되도록 설정되어 있어야 합니다.
- xDrip에서 보정을 받지 못합니다.
- 펌프 일시중지됨
- 펌프 상태 가져오는중
- 임시기초주입 설정중
- 임시기초주입 취소중
- 확장식사주입 설정중
- 확장식사주입 취소중
- 기초주입량 업데이트중
- 연결끊기중
- 실행중
- 가상펌프 설정
- NS에 상태 업로드하기
- 잘못된 비밀번호
- 설정 비밀번호
- 설정 잠금해제
- 인슐린 일 허용량에 근접중
- 내장 NSClient
- NSCI
- URL:
- 자동스크롤
- Restart
- 내장 NSClient
- Nightscout URL
- Nightscout URL 입력
- NS API secret
- NS API secret
- NS API secret 입력(최소 12글자)
- Deliver now
- Clear queue
- Show queue
- Queue:
- Status:
- 일시중지
- Clear log
- NSCLIENT이 쓰기 권한이 없습니다. 잘못된 API secret인지 확인해보세요
- 웨어 설정
- IOB 자세하게 보여주기
- 워치페이스에 IOB를 식사주입IOB와 기초주입IOB로 나누어서 보여줍니다.
- 성공하지 못했습니다. 폰을 확인하세요
- 알수없음
- 나이
- 어린이
- 청소년
- 성인
- 안전제한을 설정하기 위해 당뇨인의 나이를 선택하세요
- Glimp
- Loop 일시중지
- 일시중지중 (%d분)
- 수퍼 식사주입 (%d분)
- 1시간동안 Loop 일시중지
- 2시간동안 Loop 일시중지
- 3시간동안 Loop 일시중지
- 10시간동안 Loop 일시중지
- 15분동안 펌프 일시중지
- 30분동안 펌프 일시중지
- 1시간동안 펌프 일시중지
- 2시간동안 펌프 일시중지
- 3시간동안 펌프 일시중지
- 재실행
- 기간이 잘못되었습니다.
- Loop가 일시중지 되었습니다.
- Loop가 재실행 되었습니다.
- 15분 추이
- COB
- 수퍼 식사주입
- 앱시작을 NS에 기록하기
- 설정을 적용하기위해 앱을 종료합니다.
- 다나Rv2
- 인슐린
- Fast Acting Insulin
- 노보래피드, 휴마로그, 에피드라
- 피아스프(Fiasp)
- INS
- 마법사에서 수퍼 식사주입 활성화하기
- 마법사에서 수퍼 식사주입 기능을 활성화합니다. 어떤 기능인지 확실히 알기전까지 활성화 하지 마세요. 제대로 알지 못하고 사용하면 일슐린이 과다 주입될 수 있습니다!
- IOB
- COB
- 펌웨어
- 최근 연결
- 블루투스 상태
- 버전정보
- SMS 권한 누락
- xDrip 상태(워치)
- xDrip 상태표시라인(워치)
- xds
- BGI 보기
- BGI를 상태라인에 추가하기
- NS에 업로드하지 않기
- NS로 보낼 모든 데이터가 버려집니다. AAPS는 NS에 연결되어 있지만 NS에는 변화가 없을것입니다.
- 기초주입 최소단위
- 식사주입 최소단위
- 확장식사
- 임시목표
- 확장 식사주입 취소
- 센서 사용기간
- 캐뉼라 사용기간
- 인슐린 사용기간
- 시간
- 기초주입 종류
- 프로파일이 잘못되었습니다 !!!
- 프로파일변경
- 펌프배터리사용기간
- 펌프 배터리 교체
- 알람 옵션
- 위험 고혈당
- 고혈당
- 저혈당
- 위험 저혈당
- 누락 데이터
- 위험 누락 데이터
- 누락 데이터 기준값[분]
- 위험 누락 데이터 기준값[분]
- autosens 시간 [h]
- 민감도를 감지하기 위해 계산될 총 시간 (탄수화물 흡수 시간은 제외됩니다.)
- Pump
- OpenAPS
- Uploader
- 민감도 감지
- SENS
- 민감도 Oref0
- 민감도 AAPS
- 흡수 설정
- 식사 최대 흡수 시간 [h]
- 식사로 섭취한 탄수화물이 모두 흡수될기까지 예상되는 시간
- 확장식사주입을 %로 표시하기
- SAGE
- IAGE
- CAGE
- PBAGE
- OAPS
- UPLD
- BAS
- EXT
- Autosense 기능을 켜면 모든 섭취된 탄수화물양을 입력하십시오. 그렇지 않으면 탄수화물 편차(deviations)가 민감도 변화로 잘못 인식될것입니다!!
- 민감도 가중평균
- OK
- Cancel
- Not all profiles loaded!
- Values not stored!
- (xDrip 같은) 다른 앱으로의 브로드캐스트를 활성화합니다.
- Local Broadcasts 활성화하기
- 활동 & 조절
- 탄수화물 & 식사주입
- CGM & OPENAPS
- 펌프
- Basal value [U/h]
- Duration [min]
- IOB 커브 피크 시간
- 피크 시간[분]
- Free-Peak Oref
- Rapid-Acting Oref
- Ultra-Rapid Oref
- "DIA %1$f는 너무 짧습니다. 대신 %2$f을 사용하세요!"
- 프로파일 활성화하기
- Date
- INVALID
- 펌프연동 대기중
- 연동완료
- 연동시간초과
- 연동중
- 현재까지 발견된 기기가 없습니다.
- 빈 주사기
- 혈당측정알람
- 남은 인슐린 양
- 다나RS
- Dana
- 선택된 펌프
- 새 펌프와 연동
- 식사주입 속도
- 기초주입 단위를 0.01 U/h로 설정하세요
- 시리얼번호
- 퍼센트
- 시간 이동
- 임시목표 기본값
- eatingsoon 기간
- eatingsoon 목표
- activity 기간
- activity 목표
- 교체
- 확장식사주입 상태 가져오는중
- 식사주입상태 가져오는중
- 임시기초주입상태 가져오는중
- 펌프설정 가져오는중
- 펌프시간 가져오는중
- 재사용
- 워치로 작동하기
- 임시목표와 관리입력을 워치로 설정합니다.
- 연결시간초과
- 음식
- g
- ]]>
- kJ
- En
- Pr
- Fat
- ]]>
- 식사주입 종료를 기다리고 있습니다. %d초 남았습니다.
- 이벤트 처리중
- 식사주입을 시작합니다.
- 명령을 지금 실행합니다.
- 펌프 드라이버가 수정되었습니다.
- 펌프에 연결할 수 없습니다.
- 혈당 읽기가 누락되었습니다.
- 경고와 알림시 시스템 알림 사용하기
- 자체 경고 기능
- 혈당 데이터 누락시 경고하기
- 펌프와 연결불가시 경고하기
- 펌프 연결불가 기준시간[분]
- 긴급 알람
- 정보
- 블루투스
- 블루투스 감시기능
- 펌프에 연결이 되지 않을때 폰의 블루투스를 1초간 껐다 켭니다. 블루투스 스택이 정지되는 일부폰에 이 기능이 도움이 됩니다.
- (패치된) DexcomG5 앱
- NS에 혈당데이터 업로드하기
- G5업로드 세팅
- 델타(혈당증분값) 자세히 보여주기
- 소수점 한자리 더 추가된 델타 보여주기
- 지원되지 않는 펌프 펌웨어
- 혈당 데이터를 xDrip+에 전송하기
- xDrip+ 데이터 소스에서 640g/Eversense을 선택하세요
- 지원되는 최소값으로 기초주입량이 대체되었습니다.
- 혈당 계산
- 식사주입 IOB 계산
- 기초주입 IOB 계산
- 추세계산
- 수퍼 식사주입 계산
- 네
- 아니오
- 양수만
- 음수만
- COB 계산
- 임시목표 계산
- Loop 활성화됨
- APS 선택됨
- NSClient가 쓰기권한이 있습니다
- Closed 모드가 활성화됨
- 최대 IOB가 바르게 설정됨
- 선택한 소스에서 혈당이 들어옵니다.
- 기초주입값이 시간단위로 설정되지 않았습니다: %s
- 유효하지 않은 프로파일: %s
- 펌프 이력
- 확장식사주입 에러
+ 관리 안전설정
+ 최대 허용 Bolus [U]
+ 최대 허용 탄수화물 [g]
+ 설정
+ NS에서 관리 새로고침
+ 데이터베이스 초기화
+ 데이터 베이스를 정말 초기화하시겠습니까?
+ 종료
+ >200% 주입위한 확장Bolus 사용
+ 다나R 블루투스
+ Basal 절대값 사용하기
+ 폰을 재부팅하거나 AndroidAPS를 재시작하세요 \n그렇지 않으면 로그 기록이 되지 않습니다.(알고리즘이 정상적인 작동하는지 확인하기 위해 로그가 필요합니다.)!
+ 일반 기능을 빠르게 실행시킬 버튼
+ 고급 로그 항목을 입력합니다.
+ 활성화된 플러그인을 구성하는 데 사용됩니다.
+ 프로그램 배우기
+ Nightscout에서 정의된 음식 설정을 표시합니다.
+ 휴마로그와 노보래피드에 대한 인슐린 설정
+ 피아스프에 대한 인슐린 설정
+ 인슐린활동의 피크를 직접 정의할 수 있습니다. 고급 사용자만 사용해야 합니다.
+ Loop를 활성화 혹은 비활성화합니다.
+ Nightscout과 데이터 동기화하기
+ 2016년의 알고리즘
+ 2017년의 알고리즘
+ 고급사용자를 위한 가장 최신의 알고리즘
+ 현재 Loop 상태와 기본 기능 버튼을 표시합니다.
+ Loop가 어떤 작동하는지에 대한 간략한 개요를 연속 알림으로 보여줍니다.
+ 인터넷 연결없이 사용가능한 프로파일
+ Nightscout에서 정의한 프로필을 사용합니다.
+ 하나의 시간대만 설정 가능한 단순 프로파일
+ 아큐-첵 Combo 펌프와 연동, ruffy 설치 필요
+ 다나R 펌프와 연동(다나 RN)
+ 내수용 다나R 펌프와 연동(다나 R)
+ 업그레이드 펌웨어가 설치된 다나R 펌프와 연동
+ 다나RS 펌프와 연동
+ 아큐-첵 Insight 펌프와 연동, SightRemote 설치 필요
+ 다회요법으로 관리하는 사용자를 위한 설정
+ 가상용 펌프를 위한 설정(Open Loop)
+ Oref0와 동일한 방법으로 민감도가 계산되지만, 과거 시간을 지정할 수 있습니다. 최소 탄수화물 흡수는 설정에서 최대 탄수화물 흡수 시간으로 부터 계산됩니다.
+ 민감도가 과거 24시간의 데이터로 부터 계산됩니다. (흡수되지 않은 경우) 탄수화물은 설정에서 설정된 시간이 지나면 없어집니다.
+ 민감도가 과거 8시간의 데이터로 부터 계산됩니다. (흡수되지 않은 경우) 탄수화물은 설정에서 설정된 시간이 지나면 없어집니다. UAM(알리지 않은 음식)도 계산합니다.
+ 민감도가 편차의 가중평균으로 계산됩니다. 최근의 편차가 더 가중됩니다. 최소 탄수화물 흡수는 설정에서 최대 탄수화물 흡수 시간으로 부터 계산됩니다. 이 알고리즘의 민감도가 가장 빠릅니다.
+ 패치된 DexcomG5 앱에서 혈당값 받기
+ Glimp에서 혈당값 받기
+ 600SeriesAndroidUploader에서 혈당값 받기
+ Nightscout에서 다운로드하여 혈당값 받기
+ xDrip에서 혈당값 받기
+ 모든 관리를 저장합니다.
+ WearOS 워치를 이용하여 AndroidAPS를 모니터하고 제어합니다.
+ xDrip+ 워치페이스에서 Loop정보 보여주기
+ SMS 전송을 이용하여 AndroidAPS를 원격 제어합니다.
+ 시작
+ 확인
+ 단위
+ 인슐린활동시간(DIA):
+ 인슐린 대 탄수화물 비율(IC):
+ 인슐린 민감도(ISF):
+ Basal
+ 목표:
+ 프로파일이 설정되지 않았습니다.
+ 인슐린:
+ 탄수화물:
+ IOB:
+ IOB:
+ 활동:
+ IOB 총량:
+ 활동 IOB 총량:
+ 기간:
+ 비율:
+ 인슐린:
+ IOB:
+ IOB 총량:
+ 인슐린 양
+ 탄수화물 양
+ 혈당
+ 임시목표
+ 탄수화물
+ 교정
+ U
+ Bolus IOB
+ 지금 실행
+ 가상 펌프
+ 기본 Basal양
+ 임시Basal
+ 확장Bolus
+ 배터리
+ 인슐린 잔량
+ 네
+ 최근 실행
+ 입력 변수
+ 혈당 상태
+ 현재 임시기초
+ IOB 데이터
+ 프로파일
+ 식사 데이터
+ 결과
+ 혈당 데이터 없음
+ 변경사항 없음
+ 요청
+ 주입량
+ 기간
+ 근거
+ 혈당
+ 증분
+ 증분:
+ 구성 관리자
+ 목표
+ OpenAPS MA
+ 개요
+ NS 프로파일
+ Simple 프로파일
+ 임시Basal
+ 관리
+ 가상펌프
+ 케어포털
+ 펌프
+ 어떤 펌프를 AndroidAPS에서 사용하시겠습니까?
+ 관리
+ 관리를 위해서 어떤 플러그인을 사용합니까?
+ 프로파일
+ 어떤 프로파일을 AndroidAPS에서 사용합니까?
+ APS
+ 어떤 APS 알고리즘을 사용합니까?
+ 일반
+ 유용한 여러가지 플로그인
+ 어떤 제약을 적용합니까?
+ 일
+ 제한
+ Loop
+ Loop
+ AndroidAPS의 Loop를 활성하기 위해서 이것을 사용하세요.
+ APS
+ 제약 적용 후
+ 펌프에 의한 임시Basal 설정
+ 최근 실행
+ 네
+ 취소
+ APS가 선택되지 않았거나 계산된 결과가 없습니다.
+ 안전성
+ 플러그인이 사용불가능 합니다
+ 제한 위반
+ Bolus 주입 에러
+ 임시Basal 주입 에러
+ Basal값[%]
+ % (100% = 현재)
+ 새 임시Basal 적용:
+ 관리
+ 계산기
+ 제한 적용!
+ 확인
+ 새 Treatment 입력:
+ Bolus
+ Bolus:
+ Basal
+ Basal:
+ 탄수화물
+ 입력값을 변경하세요!
+ 새 확장Bolus 설정:
+ 혈당 소스
+ AndroidAPS가 어디에서 데이터를 가져옵니까?
+ xDrip
+ APS 모드
+ Closed Loop
+ Open Loop
+ Loop 중지됨
+ Loop 중지하기
+ Loop 실행하기
+ 새로운 제안이 있습니다
+ 지원하지 않는 NSClient 버전입니다
+ 지원하지 않는 Nightscout 버전입니다
+ NSClient 가 설치되지 않았습니다. 기록이 삭제됩니다!
+ NS에서 혈당데이터가 확인 가능합니다.
+ NS에서 펌프상태가 확인 가능합니다.
+ 수동 주입
+ 제한으로 인해 LOOP가 사용불가합니다.
+ Basal IOB
+ Bolus 제한이 적용되었습니다
+ 탄수화물 제한이 적용되었습니다
+ 혈당 체크
+ 알림
+ 노트
+ 의문
+ 운동
+ 펌프 위치 변경
+ CGM 센서 삽입
+ CGM 센서 시작
+ 인슐린 카트리지 교체
+ 프로파일 변경
+ 간식Bolus
+ 식사Bolus
+ 교정Bolus
+ 콤보Bolus
+ 임시Basal 시작
+ 임시Basal 종료
+ 탄수화물 교정
+ OpenAPS 오프라인
+ 이벤트 종류
+ 기타
+ 측정기
+ 센서
+ 탄수화물
+ 인슐린
+ 탄수화물 시간
+ 분할
+ 기간
+ 퍼센트
+ 절대값
+ 노트
+ 이벤트 시간
+ 프로파일
+ 입력자
+ 혈당 종류
+ 아직 NS에서 프로파일을 로드하지 못했습니다.
+ 임시Basal
+ 확장 Bolus
+ Nightscout 버전:
+ 누락
+ 설정이 저장되었습니다
+ 다음 위치에 설정을 저장하시겠습니까
+ 다음 위치에서 설정을 불러오시겠습니까
+ 설정을 불러왔습니다
+ 파일을 찾을 수 없습니다
+ 설정 저장하기
+ 설정 불러오기
+ 임시Basal 최대량 [U/hr]
+ 이 값은 OpenAPS에서 Max Basal(최대 Basal)로 설정되는 값입니다
+ OpenAPS가 주입할수 있는 최대 Basal IOB [U]
+ 이 값은 OpenAPS에서 Max IOB라고 부르는 값입니다\n기본값은 0으로 설정되어 있습니다. 몇일 혹은 몇주 정도 사용 후 적절한 값으로 변경할 수 있습니다.
+ 무시
+ 다나R
+ 연결중
+ 연결됨
+ 연결 끊김
+ 다나R 펌프 설정
+ 최종 사용자 라이선스 동의서
+ 이 프로그램을 의학적 결정을 내리는 데 사용해서는 안되며, 여기에 대한 어떠한 보증도 없습니다. 이 프로그램의 품질과 성능에 관한 모든 위험은 사용자에게 있습니다.\nMUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+ 모두 이해하였고 동의합니다.
+ 저장
+ 블루투스 어댑터를 찾지 못했습니다
+ 선택된 기기를 찾지 못했습니다
+ 펌프 연결 에러
+ 펌프 IOB
+ 일 인슐린 총량
+ 최근 Bolus:
+ %.1f시간 전
+ 사용할수 없는 입력 데이터
+ 값이 제대로 설정되지 않았습니다
+ 프로파일 새로고침
+ 프로파일 보기
+ 실행
+ 의견
+ 성공
+ 퍼센트
+ 절대값
+ 임시Basal 취소하기
+ SMS 통신기
+ 결과 기다리는 중
+ 허가된 전화번호
+ +XXXXXXXXXX;+YYYYYYYYYY
+ Bolus %1$.2fU 을 주입하려면 %2$s 를 입력하고 답장하세요
+ 보정값 %1$.2f을 전송하려면 %2$s 를 입력하고 답장하세요
+ Bolus failed
+ Bolus %.2fU이 주입되었습니다.
+ %.2fU 주입 예정입니다.
+ Bolus %.2fU delivered successfully
+ %.2fU 주입중
+ SMS 원격 명령 사용하기
+ 원격 Bolus 허용되지 않음
+ 체혈
+ 센서
+ 수동
+ 임시목표
+ 임시목표 취소
+ DanaR 프로파일 설정
+ 인슐린활동시간(DIA) [h]
+ 인슐린 활동 기간
+ Basal 프로파일 갱신 실패
+ 새로고침
+ 업로드중
+ E bolus
+ DS bolus
+ DE bolus
+ 에러
+ 교체
+ Basal 시간
+ 혈당
+ 탄수화물
+ 알람
+ 총 %1$d 기록들이 업로드되었습니다.
+ S bolus
+ 알람
+ Basal 시간
+ Boluses
+ 탄수화물
+ 일일 인슐린
+ 에러
+ 혈당
+ 교체
+ 중지
+ %1$d 초 동안 연결중
+ 펌프 비밀번호
+ 펌프 비밀번호가 잘못되었습니다!
+ 펌프가 바쁩니다
+ 주입됨
+ 정지됨
+ Bolus 중지됨
+ Bolus 중지중
+ 막힘
+ 정지
+ 정지 누름
+ 펌프를 기다리는 중
+ %.2fU을 주입합니다
+ 표시설정과 모니터설정을 완료하고, Basal과 비율을 분석한다.
+ 나이트스카우트에서 혈당 데이터가 잘 들어오는지, 펌프데이터가 업로드 되는지 확인한다.
+ Open Loop를 시작한다.
+ Open Loop 모드에서 몇일간 사용하여보고, 임시Basal을 여러번 수동으로 주입해 본다. 임시목표와 기본임시목표(\'식사직전\', \'활동\',\'저혈당\' 임시목표)를 설정하고 사용해 본다.
+ 임시Basal 추천기능을 포함해서, Open Loop에 대해 이해한다.
+ 이 경험을 토대로, 최대 Basal을 결정하고 이를 펌프와 설정에 입력한다.
+ Closed Loop를 시작하고 저혈당인슐린 중지 기능을 사용해본다.
+ 최대 IOB = 0 인 상태로 Closed Loop를 몇일동안 실행시켜 본다. 저혈당 인슐린일시중지가 많이 발생하지 않도록 한다.
+ Closed Loop를 조정하여 최대 IOB를 0 이상으로 올려서 서서히 혈당 목표치를 낮춘다.
+ 혈당을 낮추기 전에 몇일간 사용해보되 최소한 하루는 저혈당 혈당 알람이 발생하지 않도록 해본다.
+ 필요하면 Basal과 비율을 조절하고, auto-sens를 활성화한다.
+ 평소의 탄수화물을 입력하면서 1주일동안 낮시간대에 loop를 성공적으로 사용해본다.
+ AMA(Advanced Meal Assist)같은 낮시간대를 위한 추가적인 기능들을 실행하여 본다.
+ 낮시간대에 SMB(Super Micro Bolus)같은 추가기능을 활성화해 사용해본다.
+ SMB가 잘 작동하게 하기위해서 wiki를 반드시 읽은다음 maxIOB를 올려주세요. maxIOB=평균 식사 Bolus + 3 x 최대하루 Basal이면 괜찮은 시작값입니다.
+ 허용된 제한값에 도달하였습니다
+ 프로파일이 선택되지 않았습니다
+ Loop가 중지되었습니다.
+ Loop가 실행되었습니다.
+ Loop가 중지중입니다.
+ Loop가 실행중입니다.
+ %1$.2f, %2$.2f으로 제한됨
+ %s값이 하드한계(Hard Limit)를 벗어났습니다
+ 원격 Basal 설정이 허가되지 않았습니다
+ 원격 명령이 허가되지 않았습니다
+ Basal %1$.2fU/h 을 주입하려면 %2$s 를 입력하고 답장하세요
+ %1$d분동안 Loop 일시중지하려면 %2$s 를 입력하고 답장하세요
+ Temp Basal %1$.2fU/h for %2$d min started successfully
+ Temp Basal start failed
+ 임시Basal을 중지하려면 %s 를 입력하고 답장하세요
+ Temp Basal canceled
+ Canceling Temp Basal failed
+ 알려지지 않은 명령이거나 잘못된 답장입니다.
+ 빠른마법사
+ 빠른마법사 설정
+ 버튼명:
+ 탄수화물:
+ 유효기간:
+ 추가
+ 수정
+ 삭제
+ 식사
+ 교정주입
+ 실행
+ AndroidAPS 시작
+ NS에 업로드만 하기(동기화 안됨)
+ NS에 업로드만 하기. 로컬소스(xDrip)가 선택되지 않으면 SGV에는 효력이 없습니다. NS프로파일이 사용중이라면 프로파일에는 효력이 없습니다.
+ 펌프가 초기화 되지 않았습니다!
+ 펌프가 초기화와 프로파일 설정이 되지 않았습니다!
+ 교체/채움
+ 양이 인퓨전세트의 사양과 일치하는지 확인하세요!
+ 기타
+ 교체/채움 기본 인슐린양
+ 버튼1
+ 버튼2
+ 버튼3
+ 유닛:
+ mg/dl
+ mmol/l
+ DIA:
+ 목표 범위:
+ 차트 표시 범위
+ 스마트워치 차트 고/저혈당 선
+ 저혈당 선
+ 고혈당 선
+ 워치
+ 모든 데이터 다시 보내기
+ 워치에서 설정 열기
+ 펌프 에러
+ 배터리 부족
+ 펌프 종료
+ 펌프배터리 방전
+ 다나R 한글
+ Basal양:
+ Basal 프로파일 설정이 실패하였습니다
+ Basal 프로파일이 펌프에 업데이트 되었습니다
+ 펌프에서 이지모드(EasyUI)를 해제하세요
+ 펌프에서 확장Bolus를 활성화 하세요
+ 펌프에서 U/d에서 U/h로 모드를 변경하세요
+ Basal값이 최소값 이하입니다. 프로파일이 설정되지 않습니다!
+ BG:
+ Last BG:
+ MDI
+ 미니메드640g
+ 연속 알림
+ 오래된 데이터
+ %d분전
+ %dmin ago
+ 로컬 프로파일
+ OpenAPS AMA
+ 단기 평균 증분
+ 장기 평균 증분
+ %1$d 요소의 배열.\n실제 값:
+ Autosens 정보
+ 스크립트 디버그
+ AMA Autosens 기능 사용하기
+ NS에서 이벤트 새로고침
+ 미래시점의 관리 삭제
+ 식사직전
+ 저혈당
+ 활동
+ 기록 삭제:
+ DanaR 통계
+ 누적 일총량
+ 지수가중 일총량
+ Basal
+ Bolus
+ 일총량
+ 날짜
+ 비율
+ #일
+ 가중
+ 교체/채움을 위해 Bolus를 사용한 경우 부정확할 수 있습니다!!
+ 오래된 데이터입니다. \"새로고침\"을 누르세요.
+ 총 기본 Basal
+ 총기초량 * 2
+ 초기화중 ...
+ ACT
+ CONF
+ LOOP
+ SP
+ OAPS
+ LP
+ DANA
+ 홈
+ VPUMP
+ NSPROFILE
+ TREAT
+ CP
+ OBJ
+ WEAR
+ SMS
+ 탭 이름 단축
+ 단순증분값 대신 단기평균증분값을 항상 사용합니다.
+ xDrip의 혈당데이터에 노이즈가 심할경우 유용합니다.
+ 고급 설정
+ 모델: %1$02X 프로토콜: %2$02X 코드: %3$02X
+ 프로파일
+ 기본값: 3\n이 값은 중요한 OpenAPS 안전장치입니다. 이 값의 역할은 펌프에 설정되어 있는 최대Basal보다 3배를 초과할 수 없게 제한하는 것입니다. 이 값을 변경할 필요는 없을 것이지만, 안전을 위해 \"3x max daily; 4x current\"이 의미하는 바를 알고 있어야 합니다.
+ 기본값: 4\n이 값은 \"3x max daily; 4x current\"의 나머지 절반에 해당하는 또 다른 중요한 OpenAPS 안전장치입니다. 이것은, 펌프에 설정된 최대 Basal과는 관계없이, Basal이 설정된 현재시간의 Basal에 이 값을 곱한 양을 초과할 수 없다는 것을 의미합니다. 이는 알고리즘의 작동 방식을 이해하기 전에 과도하게 높은 최대 기본을 설정하여 위험한 상황에 빠지지 않도록 보호하기 위한 것입니다. 다시한번, 기본 값은 4배인 것을 알아두세요; 일반적으로 이것을 조정할 필요는 전혀 없으며, 대신 이 안전장치를 변경해야할것처럼 생각이 된다면, 다른 설정을 변경해야 할 가능성이 더 큽니다.
+ 기본값: 1.2\n이 값은 autosens가 autosens 비율을 얼마나 높게 할 수 있는지에 대한 최대 한계를 20%로 설정하는 승수장치입니다. 이는 autosens가 얼마나 높게 Basal을 조절할수 있는지, ISF를 얼마나 낮게 조절할수 있는지, 혈당 목표범위를 얼마나 낮게 설정할수 있는지를 결정합니다.
+ 기본값: 0.7\nautosens 안전 제한의 나머지 부분입니다. 이는 Basal을 얼마나 낮게 조절할 수 있는지, ISF와 혈당 목표범위를 얼마나 높게 설정할 수 있는지를 결정합니다.
+ Autosens가 목표도 조절합니다.
+ 기본값: 활성\n이것은 autosens가 ISF와 Basal뿐만 아니라, 혈당 목표범위를 조절할 수 있게 합니다.
+ 기본값: 2\n식사주입 후 Bolus snooze가 수행되게 되고, 따라서 식사주입 직후엔 loop가 low temp에 대응하지 않게 됩니다. 기본값이 2일때 예제는 다음과 같습니다; DIA가 3시간일 경우 bolus snooz는 점차적으로 1.5시간에 걸쳐 단계적으로 사라지게 됩니다.(3DIA/2).
+ 기본값: 3.0 (AMA) 또는 8.0 (SMB). 5분당 탄수화물이 얼만큼 흡수되었는지에 대한 기본값 설정입니다. 기본값은 3mg/dl / 5분 입니다. 이는 혈당이 예상보다 빨리 떨어지거나 혹은 예상보다 오르지 않을때, COB가 얼마나 빨리 사라지게 되는지에 영향을 주게 되고, 추정된 탄수화물 흡수량이 미래 혈당 예측 계산시에도 영향을 주게 됩니다.
+ 주의!\n보통의 경우 아래의 값을 변경하면 안됩니다. 이 값들을 변경하기 전에 반드시 이곳을 클릭하고 글을 정독해서 확실하게 이해를 하여야 합니다.
+ 숫자만 입력가능합니다.
+ 이 범위(%1$s - %2$s)안에 해당하는 숫자만 입력가능합니다.
+ 필수 입력 항목입니다.
+ 폰번호가 유효하지 않습니다
+ SMS폰번호가 유효하지 않습니다
+ 보정
+ 보정값 %.1f을 xDrip에 전송하시겠습니까?
+ xDrip+가 설치되지 않았습니다
+ 보정이 xDrip으로 전송되었습니다
+ 원격보정이 허용되지 않았습니다
+ 보정 전송됨. xDrip에서 수신이 되도록 설정되어 있어야 합니다.
+ xDrip에서 보정을 받지 못합니다.
+ 펌프 일시중지됨
+ 펌프 상태 가져오는중
+ 임시Basal 설정중
+ 임시Basal 취소중
+ 확장Bolus 설정중
+ 확장Bolus 취소중
+ Basal양 업데이트중
+ 연결끊기중
+ 실행중
+ 가상펌프 설정
+ NS에 상태 업로드하기
+ 잘못된 비밀번호
+ 설정 비밀번호
+ 설정 잠금해제
+ 인슐린 일 허용량에 근접중
+ 내장 NSClient
+ NSCI
+ URL:
+ 자동스크롤
+ 재시작
+ NSClient
+ Nightscout URL
+ Nightscout URL 입력
+ NS API secret
+ NS API secret
+ NS API secret 입력(최소 12글자)
+ 즉시전송
+ 대기열 지우기
+ 대기열 보여주기
+ 대기열:
+ 상태:
+ 일시중지
+ 기록 지우기
+ NSCLIENT이 쓰기 권한이 없습니다. 잘못된 API secret인지 확인해보세요
+ 워치 설정
+ IOB 자세하게 보여주기
+ 워치페이스에 IOB를 Bolus IOB와 Basal IOB로 나누어서 보여줍니다.
+ 성공하지 못했습니다. 폰을 확인하세요
+ 알수없음
+ 나이
+ 어린이
+ 청소년
+ 성인
+ 인슐린 저항성 높은 성인
+ 안전제한을 설정하기 위해 당뇨인의 나이를 선택하세요
+ Glimp
+ 최적의 성능을 위해 %s에서 배터리 최적화를 해제해야합니다.
+ Loop 일시중지
+ 일시중지중 (%d분)
+ Superbolus (%1$d 분)
+ 1시간동안 Loop 일시중지
+ 2시간동안 Loop 일시중지
+ 3시간동안 Loop 일시중지
+ 10시간동안 Loop 일시중지
+ 15분동안 펌프 일시중지
+ 30분동안 펌프 일시중지
+ 1시간동안 펌프 일시중지
+ 2시간동안 펌프 일시중지
+ 3시간동안 펌프 일시중지
+ 재실행
+ 기간이 잘못되었습니다.
+ Loop가 일시중지 되었습니다.
+ Loop가 재실행 되었습니다.
+ 15분 추이
+ COB
+ Superbolus
+ 앱시작을 NS에 기록하기
+ 설정을 적용하기위해 앱을 종료합니다.
+ 다나R v2
+ 인슐린
+ 어떤 종류의 인슐린을 사용합니까?
+ 초속형 인슐린
+ 노보래피드, 휴마로그, 에피드라
+ 피아스프(Fiasp)
+ INS
+ 마법사에서 Superbolus 활성화하기
+ 마법사에서 Superbolus 기능을 활성화합니다. 어떤 기능인지 확실히 알기전까지 활성화 하지 마세요. 제대로 알지 못하고 사용하면 일슐린이 과다 주입될 수 있습니다!
+ IOB
+ COB
+ 펌웨어
+ 마지막 접속
+ 블루투스 상태
+ 버전정보
+ SMS 권한 누락
+ xDrip 상태(워치)
+ xDrip 상태표시라인(워치)
+ xds
+ BGI 보기
+ BGI를 상태라인에 추가하기
+ NS에 업로드하지 않기
+ NS로 보낼 모든 데이터가 버려집니다. AAPS는 NS에 연결되어 있지만 NS에는 변화가 없을것입니다.
+ Basal 단위
+ Bolus 단위
+ 확장Bolus
+ 임시목표
+ 확장Bolus 취소
+ 센서 사용기간
+ 캐뉼라 사용기간
+ 인슐린 사용기간
+ 시간
+ Basal 종류
+ 프로파일이 유효하지 않습니다!!!
+ 프로파일변경
+ 펌프배터리사용기간
+ 펌프 배터리 교체
+ 알람 옵션
+ 위험 고혈당
+ 고혈당
+ 저혈당
+ 위험 저혈당
+ 누락 데이터
+ 위험 누락 데이터
+ 누락 데이터 기준값[분]
+ 위험 누락 데이터 기준값[분]
+ autosens 시간 [h]
+ 민감도를 감지하기 위해 계산될 총 시간 (탄수화물 흡수 시간은 제외됩니다.)
+ 펌프
+ OpenAPS
+ 업로더
+ 민감도 감지
+ 어떤 민감도 알고리즘을 사용하겠습니까?
+ 민감도
+ 민감도 Oref0
+ 민감도 Oref1
+ 민감도 AAPS
+ 흡수 설정
+ 식사 최대 흡수 시간 [h]
+ 식사로 섭취한 탄수화물이 모두 흡수될기까지 예상되는 시간
+ 확장Bolus를 %로 표시하기
+ SAGE
+ IAGE
+ CAGE
+ PBAGE
+ OAPS
+ UPLD
+ BAS
+ EXT
+ 화면을 켜진 상태로 유지
+ 안드로이드의 화면이 꺼지는 것을 방지합니다. 전원이 공급되어 있지 않으면 전력소모가 큽니다.
+ Autosense 기능을 켜면 모든 섭취된 탄수화물양을 입력하십시오. 그렇지 않으면 탄수화물 편차(deviations)가 민감도 변화로 잘못 인식될것입니다!!
+ 민감도 가중평균
+ 네
+ 취소
+ 모든 프로파일이 로드되지 않았습니다.
+ 값이 저장되지 않았습니다!
+ (xDrip 같은) 다른 앱으로의 브로드캐스트를 활성화합니다.
+ Local Broadcasts 활성화하기
+ 활동 & 피드백
+ 탄수화물 & Bolus
+ CGM & OPENAPS
+ 펌프
+ Basal값 [U/h]
+ 기간 [min]
+ OpenAPS SMB
+ SMB
+ UAM 활성화하기
+ SMB 활성화하기
+ 더 빠른 작용을 위해 임시Basal 대신 Super Micro Bolus 사용
+ 알리지 않은 식사 감지
+ IOB 커브 피크 시간
+ 피크 시간 [min]
+ 자유-피크 Oref
+ 초속효성 Oref
+ 초-초속효성 Oref
+ DIA %1$f는 너무 짧습니다. 대신 %2$f을 사용하세요!
+ 프로파일 활성화하기
+ 날짜
+ 유효하지 않음
+ 펌프연동 대기중
+ 연동완료
+ 연동시간초과
+ 연동중
+ 현재까지 발견된 기기가 없습니다.
+ 빈 주사기
+ 혈당측정알람
+ 남은 인슐린 양
+ 다나RS
+ Dana
+ 선택된 펌프
+ 새 펌프와 연동
+ Bolus 속도
+ Basal 단위를 0.01 U/h로 설정하세요
+ 시리얼번호
+ 퍼센트
+ 시간 이동
+ 임시목표 기본값
+ 식사직전 기간
+ 식사직전 목표
+ activity 기간
+ 활동 목표
+ 저혈당 기간
+ 저혈당 목표
+ 교체
+ 확장Bolus 상태 가져오는중
+ Bolus 상태 가져오는중
+ 임시Basal 상태 가져오는중
+ 펌프설정 가져오는중
+ 펌프시간 가져오는중
+ 재사용
+ 워치로 제어하기
+ 임시목표와 관리입력을 워치로 설정합니다.
+ 연결시간초과
+ 음식
+ g
+ 분
+ 시간
+ ]]>
+ kJ
+ En
+ 단백질
+ 지방
+ ]]>
+ Bolus 종료를 기다리고 있습니다. %d초 남았습니다.
+ 이벤트 처리중
+ Bolus 주입을 시작합니다.
+ 명령을 지금 실행합니다.
+ 펌프 드라이버가 수정되었습니다.
+ 펌프에 연결할 수 없습니다.
+ 혈당 읽기가 누락되었습니다.
+ 경고와 알림시 시스템 알림 사용하기
+ 자체 경고 기능
+ 혈당 데이터 누락시 경고하기
+ 펌프와 연결불가시 경고하기
+ 펌프 연결불가 기준시간 [min]
+ 긴급 알람
+ 정보
+ 블루투스
+ 블루투스 감시기능
+ 펌프에 연결이 되지 않을때 폰의 블루투스를 1초간 껐다 켭니다. 블루투스 스택이 정지되는 일부폰에 이 기능이 도움이 됩니다.
+ DexcomG5 앱(패치버전)
+ NS에 혈당데이터 업로드하기
+ G5업로드 세팅
+ Poctech 업로드 설정
+ 델타(혈당증분값) 자세히 보여주기
+ 소수점 자리 추가된 증분값 보여주기
+ SMB가 Basal을 제한할 수 있는 최대 시간(분)
+ 지원되지 않는 펌프 펌웨어
+ 혈당 데이터를 xDrip+에 전송하기
+ xDrip+ 데이터 소스에서 640g/Eversense을 선택하세요
+ NSClient 혈당
+ 지원되는 최소값으로 Basal값이 대체되었습니다:%s
+ 지원되는 최대값으로 Basal값이 대체되었습니다:%s
+ 혈당 계산
+ Bolus IOB 계산
+ Basal IOB 계산
+ 추세계산
+ Superbolus 계산
+ 네
+ 아니오
+ 양수만
+ 음수만
+ COB 계산
+ 임시목표 계산
+ Loop 활성화됨
+ APS 선택됨
+ NSClient가 쓰기권한이 있습니다
+ Closed 모드가 활성화됨
+ 최대 IOB가 바르게 설정됨
+ 선택한 소스에서 혈당이 들어옵니다.
+ Basal값이 시간단위로 설정되지 않았습니다: %s
+ 유효하지 않은 프로파일: %s
+ Bolus 주입을 위한 펌프 프로그래밍
+ 새로고침
+ 상태
+ 활동
+ %1$d분 동안 연결되지 않음
+ %1$d%% (%2$d분 남음)
+ 초기화중
+ 에러로 인해 중지됨
+ 사용자로 인해 중지됨
+ 실행중
+ 임시기초주입 취소중
+ 임시기초주입 설정중 (%1$d%% / %2$d분)
+ Bolus 주입중(%.1f U)
+ 새로고침중
+ 요청하신 동작은 펌프에서 지원하지 않습니다.
+ 위험한 사용: 확장Bolus 혹은 멀티웨이브Bolus가 활성화 됩니다. Loop 모드가 저혈당 방지로 오직 6시간만 설정됩니다. Loop 모드에선 일반 Bolus만 지원합니다.
+ 위험한 사용: 펌프의 Basal양 프로파일이 펌프의 첫번째 Basal양 프로파일과 다릅니다. Loop가 비활성화되었습니다. 첫 번째 프로파일을 설정하고 새로 고침하십시오.
+ 2개의 동일한 양의 Bolus 주입이 요청되었습니다. 이중으로 Bolus가 주입 되는 사고를 막고 버그로부터 보호하기 위하여 이는 금지됩니다.
+ 현재
+ 펌프 이력 읽기
+ 펌프 이력
+ Basal 프로파일 설정
+ 펌프 카트리지 레벨이 낮습니다.
+ 펌프배터리가 부족합니다.
+ 펌프가 E%1$d: %2$s 에러를 보여줍니다.
+ 낮음
+ 비어 있음
+ 보통
+ 펌프 시간 업데이트가 필요합니다.
+ 경고
+ 임시기초주입 취소 경고가 확인되었습니다.
+ 펌프를 사용할 수 없습니다. Bolus 주입이 실행되지 않았습니다.
+ Bolus 주입이 실패하였습니다. 주입된 Bolus가 없는 것으로 보입니다. 이중으로 Bolus가 주입되는 것을 방지하기 위해 펌프를 확인한 다음 다시 Bolus를 주입하세요. 버그를 방지하기 위해 Bolus 주입이 자동으로 재시도되지 않습니다.
+ 에러로 인해 요청된 Bolus %2$.2f U중 오직 %1$.2f U만 주입되었습니다. 펌프에서 직접 확인후 적절한 조치를 취하세요.
+ Bolus를 주입하고 펌프 이력을 확인하는데 실패하였습니다. 펌프를 확인해보세요. 만약 Bolus 주입이 되었다면 펌프와 다음번 연결시 그 내용이 관리에 추가될 것입니다.
+ Bolus 주입 위한 인슐린이 주사기에 부족합니다.
+ 확장Bolus 주입 에러
+ Insight
+ Insight 펌프
+ 상태
+ 변경됨
+ 펌프 중지됨
+ 상태 업데이트
+ 전
+ with
+ 활성 임시기초량
+ 분 남음
+ 로그북
+ 최근 완료된 액션
+ 분
+ 남은
+ total with
+ upfront with
+ 항상 연결상태로 있기
+ 대기
+ 동기화중
+ 바쁨
+ 동기화됨
+ 시작
+ 필요
+ 앱에 연결되지 않았습니다.
+ 앱이 설치되지 않았습니다.
+ 호환되지 않는 앱입니다. 이 버전이 필요합니다
+ 알 수 없는
+ 코드 승인 대기중
+ 코드가 거부되었습니다.
+ 앱 연결중
+ 승인되지 않은
+ 비호환
+ 초
+ 분
+ 시간
+ 일
+ 주
+ s
+ %1$ds 만료 %2$s
+ 활성 상태
+ 통계
+ 우선 연결
+ AndroidAPS 화면을 열면 펌프 명령이 요청되기 전에 자동으로 연결하여 연결 지연을 줄입니다.
+ 배터리 소모때문에 추천하지 않습니다.
+ 항상 SMB를 사용합니다.
+ Bolus와 독립적으로 항상 SMB를 사용합니다. G5처럼 잘 필터된 혈당소스와만 사용이 가능합니다.
+ 탄수화물 이후 SMB를 사용합니다.
+ 탄수화물 이후 6시간동안 SMB를 사용합니다, 0 COB이라도 적용됩니다. G5처럼 잘 필터된 혈당소스와만 사용이 가능합니다.
+ COB와 SMB를 사용합니다.
+ 활성화된 COB가 있으면 SMB를 사용합니다.
+ 임시 목표와 SMB를 사용합니다.
+ 활성화된 임시 목표(식사직전, 운동)가 있으면 SMB를 사용합니다.
+ 높은임시 목표와 SMB를 사용합니다.
+ 활성화된 높은 임시 목표(운동)가 있으면 SMB를 사용합니다.
+ 임시Basal 허용
+ 음소거
+ 인슐린
+ 탄수화물
+ 버튼
+ xDrip+에 보정값을 전송하거나 G5 보정창을 엽니다.
+ xDrip+를 열고, 뒤로 버튼을 누르면 AAPS로 돌아갑니다.
+ 버튼을 누를 때 추가되는 탄수화물 양
+ 버튼을 누를때 추가될 인슐린 양
+ CGM앱을 실행할 수 없습니다. 앱이 설치되어 있는지 확인하세요.
+ CGM
+ 이력 브라우저
+ SMB 알림
+ 일반 Bolus처럼 워치에 SMB 표시
+ 에러 발생시 알림 생성
+ 에러 발생에 대한 Nightscout 알림과 자체 경고를 생성합니다. (케어포털 관리에서도 표시됩니다.)
+ 워치페이스에서 예측치를 보여줍니다.
+ 예측
+ 데이터선택
+ Fabric 업로드
+ fabric.io 서비스를 통해 개발자에게 앱 오류 및 특정 데이터를 자동 전송합니다.
+ G5앱을 지원가능한 버전으로 업데이트하세요.
+ 활동 임시목표 시작
+ 식사직전 임시목표 시작
+ TT
+ 실제 Bolus 주입않고, 기록만 하기
+ 분류
+ 하위 분류
+ Bolus가 기록만 됩니다.
+ NS에서 누락된 혈당이 자동으로 채워집니다.
+ 펌프에 의한 SMB 설정
+ 민감도
+ 편차
+ 체내탄수화물양(COB)
+ 체내인슐린양(IOB)
+ Basal
+ 선택한 실행이 없습니다. 아무런 실행이 되지 않습니다.
+ 저혈당 임시목표 시작
+ 개발자버전을 실행중입니다. Closed Loop는 비활성화 됩니다.
+ 전문가 모드 사용
+ 전문가 모드가 활성화되어 있지 않고 Release 버전이 실행되고 있지 않습니다.
+ %.2f U/h
+ Basal 프로파일 읽는중
+ Bolus 계산이 수행된 후 펌프 이력이 변경되었습니다. Bolus가 주입되지 않았습니다. Bolus가 여전히 필요하다면 다시 계산하세요.
+ Bolus가 성공적으로 주입되었지만, 관리 항목에 추가하지 못했습니다. 이것은 동일한 양의 소량의 2개의 Bolus가 최근 2 분 이내에 주입되는 경우에 발생할 수 있습니다. 펌프 이력과 관리 항목을 확인하고 손실된 항목을 추가하기위해 케어포털을 이용하세요. 동일한 시간과 인슐린양의 항목을 추가하지 마세요.
+ 계산기가 최근 변경된 펌프 이력을 고려하지 못해 임시기초주입 추가를 거절했습니다.
+ 펌프상태 새로고침중
+ 펌프의 Basal 양이 변경되었고 곧 업데이트됩니다.
+ 펌프의 Basal 양이 변경되었지만 읽기를 실패했습니다.
+ 이력 변경 확인중
+ 동일한 시간(분)에 동일한 양의 2개이상의 Bolus가 주입되었습니다. 오직 하나의 기록만이 관리에 입력될 수 있습니다. 펌프를 확인한 후 케어포털 탭에서 Bolus 기록을 수동으로 추가하세요. 동일한 시간에 동일한 양의 Bolus를 주입하지 않도록 하세요.
+ \n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de)
+ 최근 Bolus가 24시간 전 혹은 미래에 있습니다. 펌프의 날짜가 제대로 설정되어 있는지 확인해보세요.
+ 펌프에서 주입된 Bolus의 시간/날짜가 잘못되었습니다. IOB가 부정확할 수 있습니다. 펌프 시간/날짜를 확인하세요.
+ 프로파일변경 누락. 로컬 프로파일에서 프로파일 변경을 하거나 \"프로파일 활성화하기\"를 누르세요.
+ Bolus 수
+ 임시기초주입 수
+ 목표%1$d이 시작되지 않았습니다.
+ 목표%1$d이 완료되지 않았습니다.
+ 이 펌프 임시Basal을 지원하지 않습니다.
+ 펌프에서 유효한 Basal양을 읽을 수 없습니다.
+ 설정에서 Closed Loop 모드가 비활성화되었습니다.
+ 설정에서 Autosens가 비활성화 되었습니다.
+ 설정에서 SMB가 비활성화 되었습니다.
+ %2$s로 인해 최대 Basal양이 %1$.2f U/h으로 제한됩니다.
+ 펌프 제한
+ 양의 값이어야 합니다.
+ 최대 Basal 승수
+ 최대 일 Basal 승수
+ 최근 3분 이내에 Bolus가 주입되었습니다. SMB를 건너뜁니다.
+ Basal이 정상적으로 설정되었습니다.
+ %2$s로 인해 최대 비율이 %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으로 제한됩니다.
+ 설정에서의 최대값
+ 하드한계
+ 위험한 사용
+ 상태를 읽지 못했습니다.
+ 펌프 위치 변경 기록
+ 인슐린 카트리지 변경 기록
+ 선택한 BG 소스가 고급 필터링을 지원하지 않기 때문에 SMB가 항상 비활성화됩니다.
+ Open Loop모드에선 SMB가 허용되지 않습니다.
+ Food
+ 재설정
+ 시간 동기화 대기중 (%1$d 초)
+ 연결 끊어짐 (%1$d분)
+ 케어포털 이벤트 자동기록
+ 인슐린, 캐뉼라, 배터리교체, 펌프알람을 Nightscout에 자동으로 업로드합니다.
+ OpenAPS가 초과 할 수 없는 총 IOB의 최대량 [U]
+ 이 값은 OpenAPS에서 Max IOB라고 합니다\n현재 IOB가 이 값보다 크면 OpenAPS는 인슐린을 추가로 주입하지 않습니다.
+ 펌프 중지
+ 펌프 시작
+ 펌프 일시중지
+ 식사 최대 흡수 시간[h]
+ 식사가 모두 흡수되었다고 간주되는 시간. 나머지 탄수화물은 모두 없어집니다.
+ 시간
+ 관리창에 노트 영역 보여주기
+ 다음
+ 이전
+ 설정 마법사
+ 완료
+ 언어를 선택하세요
+ 요청: %1$.2fU 전송: %2$.2fU 에러코드: %3$s
+ 1차 인슐린 증분
+ 2차 인슐린 증분
+ 3차 인슐린 증분
+ 1차 탄수화물 증분
+ 2차 탄수화물 증분
+ 3차 탄수화물 증분
+ CGM
+ 와이파이 연결만 사용하기
+ 와이파이 SSID
+ 충전중일때만
+ 연결 설정
+ 허가된 SSIDs(세미콜론으로 구분)
+ 로밍에서 연결 허용
+ 최대 autosens 비율
+ 최저 autosens 비율
+ Bolus snooze DIA 나눗수
+ 최대 일 안전 승수
+ 현재 Basal 안전 승수
+ 사용불가
+ 가성펌프 종류
+ 펌프 정의
+ 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가 지원되지 않습니다.
+ 혈당 자동채움
+ 마법사 설정
+ 마법사 결과에 사용 된 계산:
+ 화면 설정
+ 일반 설정
+ NSClient 활성화하기
+ 설정 마법사에 오신것을 환영합니다. 설정 마법사가 설정 과정을 안내하여 줄것입니다.
+ 펌프 설정
+ 상태 불러오기
+ 오직 NS에서 변경해야합니다.
+ 설정 마법사 건너뛰기
+ AndroidAPS가 Basal 변화를 제안 혹은 실행하게 하려면 아래 버튼을 누르세요.
+ 목표를 활성화하기 위해 아래 버튼을 누르세요. 이 마법사를 종료된 다음 AndroidAPS의 모든 기능을 이용하기 위해 목표 탭을 확인하세요.\n
+ 목표 활성화하기
+ APS 플러그인 설정하기
+ 민감도 플러그인 설정하기
+ 민감도 플러그인은 민감도감지와 COB 계산을 위해 사용됩니다. 더 많은 정보는 다름 링크를 방문하세요.
+ https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COB
+ NSClient는 Nightscout에 대한 연결을 처리합니다. 이 부분을 건너 뛸 수 있지만 설정하기 전까지는 목표를 통과하지 못합니다.
+ 새로운 인슐린 프로파일은 최소 5시간의 DIA가 요구됩니다. 새로운 프로파일의 DIA 5-6시간은 구식 인슐린 프로파일의 DIA 3시간과 동일합니다.
+ 혈당소스 설정하기
+ 프로파일 소스를 선택해주세요. 당뇨인이 어린이라면 NS 프로파일을 선택하여야 합니다. Nightscout으로 관리해줄 사람이 없다면 당신은 로컬 프로파일을 선호할 수도 있습니다. 여기선 프로파일의 소스를 선택할 뿐이라는 것을 명심하세요. 그 프로파일을 실제 사용하려면 \"프로파일 변경\"을 실행하여 프로파일을 활성화 시켜야합니다.
+ 사용 가능한 알고리즘 중 하나를 선택하세요. 과거부터 최신의 순으로 정렬이 되어 있습니다. 일반적으로 새로운 알고리즘은 보다 강력하고 공격적입니다. 따라서 당신이 신규 사용자라면 최신의 알고리즘보단 AMA로 시작하는것이 나을 수 있습니다. 사용 전에 OpenAPS 문서를 읽어보고 설정하는 것을 잊지마세요.
+ 첫번째 목표를 시작하세요.
+ 권한
+ 권한 요청하기
+ 블루투스 스캔을 위해 위치 권한이 필요로 합니다.
+ 로그 파일을 저장하기 위해 저장공간 권한이 필요로 합니다.
+ 요청
+ 인슐린 플러그인 설정하기
+ 종료
+ 사용자 옵션
+ 시간형식
+ 버튼 스크롤
+ 버튼 누르면 소리가 납니다.
+ 알람
+ 소리
+ 진동
+ 모두
+ LCD 시간[s]
+ 화면조명 시간[s]
+ 혈당 단위
+ 종료(시간)
+ 낮은 주사기량(단위)
+ 펌프로 옵션 저장
+ 켜짐
+ 꺼짐
+ 메뉴 열기
+ 메뉴 닫기
+ 플러그인 설정
+ 훌륭합니다. 완료되었습니다!
+ 아직 완료되지 않았습니다.
+ 경과 시간
+ %1$d. 목표
+ Poctech
+ Poctech 앱에서 혈당값 받기
+ 높은 임시목표는 민감도를 올립니다.
+
+ 낮은 임시목표는 민감도를 내립니다.
+
+ 유효하지 않은 펌프 설정, 문서를 확인하고 360 구성 소프트웨어를 사용하여 Quick Info menu의 이름이 QUICK INFO인지 확인하십시오.
+ 사용자 정의
+ 큰 시간 차이
+ 큰 시간 차이:\n펌프의 시간과 1.5시간 이상 차이가 납니다.\n펌프의 이력에서 잘못된 시간을 읽어들임으로써 예상치 못한 행동이 발생하지 않도록 펌프의 시간을 수동으로 변경하세요.\n가능하면 시간을 변경하기 전에 펌프의 이력을 삭제하거나, 설정된 DIA 시간동안 Closed Loop를 비활성화 하세요.
+ \"AndroidAPS 시작\" 기록 삭제하기
+ 저장된 설정이 있습니다.
+ 주의: 활성화하고 펌프에 연결하게되면, AndroidAPS는 프로파일의 Basal설정을 복사해서 기존에 펌프에 저장되어 있던 Basal설정을 덮어쓰게 될것입니다. AndroidAPS의 Basal설정이 올바른지 반드시 확인하세요. 만약 확실치 않거나 Basal설정을 덮어씌우길 원치않는다면, 취소버튼을 누르고 나중에 다시 연결하세요.
+ 관리 데이터가 불완전합니다
+ 정비 설정
+ Email
+ 유효하지 않은 Email
+ 전송할 로그 수
+ 정비
+ MAINT
+ 정비를 위한 여러가지 기능을 제공합니다.(예, 로그 전송,로그 삭제 등)
+ Email로 로그 전송하기
+ 로그 삭제하기
+ 관리 데이터 (인슐린: %1$.2f, 탄수화물: %2$d, at: %3$s) 가 추가되지 못하였습니다. 확인해본 다음 적절한 데이터를 수동으로 입력하세요..
+ 확장탄수화물: %1$d g (%2$d 시간), 지연: %3$d 분
+ 사용할 수 있는 Autosens 데이터가 없습니다.
+ 로그 설정
+ 기본값으로 초기화
+ NSClient가 정상적으로 작동하지 않습니다. Nightscout와 NSClient를 재시작 해보세요.
+ AS
+ %1$s 버전이 사용 가능합니다.
+ 시간 이동
+ 선호하는 APS 모드
+ 합계
+ Calc
+ 통신 확인
+ 예상치 못한 상황 보고를 위해 오늘의 로그 파일을 개발자에게 전송합니다.
+ 최대 Bolus 위반
+ 명령 오류
+ 속도 오류
+ 인슐린 제한 위반
+ 최소 요청 변화 [%]
+ 이 값보다 변화가 클때만 Loop가 새 변화 요청창을 띄울것 입니다. 기본 값은 20%입니다.
+
+ %1$d 일
+
+
+ %1$d 시간
+
+
+ %1$d 분
+
diff --git a/app/src/main/res/values-nl/insight_alerts.xml b/app/src/main/res/values-nl/insight_alerts.xml
new file mode 100644
index 0000000000..70489fbc5e
--- /dev/null
+++ b/app/src/main/res/values-nl/insight_alerts.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 9cb91508e7..4f4657d6a7 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -1,932 +1,1057 @@
+
- Glimp
- MM640g
- Absoluut
- Verwachte tijd in uren vooraleer alle koolhydraten opgenomen zijn
- Max absorbtietijd maaltijd [u]
- Opname instellingen
- Acties
- ACT
- Actief
- Volwassene
- Uitgebreide instellingen
- Herstart je telefoon of herstart AndroidAPS vanuit de systeem instellingen a.u.b. anders zal AndroidAPS geen logboek hebben (Belangrijk om te controleren of de algoritmes correct werken)!
- Nuttig wanneer gegevens van niet gedempte bronnen zoals Xdrip wispelturig zijn
- AndroidAPS gestart
- Insuline daglimiet bereikt
- APS Mode
- Limiet bereikt
- xds
- xDrip Status (Horloge)
- xDrip Statuslijn (Horloge)
- xDrip+ niet geïnstalleerd
- xDrip
- Verkeerd pomp wachtwoord!
- Verkeerd wachtwoord
- Toon BGI
- Voeg BGI toe aan status lijn
- WEAR
- Wear instellingen
- Toon gedetailleerde IOB
- Splits IOB in bolus en basaal op de watchface
- Wear
- Wacht op het resultaat
- Wacht op pomp
- VIRTUELE POMP
- Upload status naar NS
- Tijdelijk basaal
- VP
- Virtuele pomp instellingen
- OK
- Reservoir
- Laatste verbinding
- Firmware
- EXT
- Vertraagde bolus
- Batterij
- Virtuele Pomp
- Uploaden
- UPLD
- Uploader
- Bijwerken basaal patroon
- Niet ondersteunde versie van Nightscout
- Niet ondersteunde versie van NSClient
- Instellingen ontgrendelen
- Eenheden:
- Max toegestaane koolhydraten [g]
- Basaal
- BAS
- Pomp Batterij Leeg
- български
- Bolus
- Bolus Stap
- Bolus %.2fU succesvol toegediend
- Toedienen %.2fU
- Klaar om %.2fE toe te dienen
- Knop 1
- Knop 2
- Knop 3
- Kalibratie naar xDrip verzonden
- Annuleer
- Annuleer tijdelijk basaal
- Koolhydraten
- Careportal
- Mededeling
- BG Controle
- Ouderdom katheter
- CAGE
- KOOLHYDRATEN & BOLUS
- Koolhydraten correctie
- CGM & OPENAPS
- CGM Sens. ingebracht
- CGM Sens. Start
- Correctie bolus
- Sport
- Ouderdom insuline
- IAGE
- Insuline ampul wissel
- Maaltijd bolus
- Absoluut
- Koolhydraten
- Tijdsduur
- Tijdsduur [min]
- Ingegeven door
- Gebeurtenis tijdstip
- Gebeurtenis type
- Glucose type
- Insuline
- Meter
- Notities
- Andere
- Percent
- Profiel
- Sensor
- Splitzen
- Notitie
- OpenAPS Offline
- Ouderdom batterij
- Profiel wissel
- Pomp
- Pomp bat. wissel
- Infuus wissel
- Vraag
- Ouderdom sensor
- SAGE
- CP
- Snack bolus
- Einde tijd. basaal
- Start tijd. basaal
- Tijd. streefdoel
- Tijdelijk streefdoel annuleren
- Wijzig het ingegevene!
- Kind
- Logboek wissen
- Closed loop
- COB
- Commentaar
- Configurator
- APS
- BG bron
- Beperkingen
- Algemeen
- Insuline curve
- Ledig wachtrij
- Loop
- Nightscout versie:
- Profiel
- Pomp
- Gevoeligheid detectie
- CONF
- Behandelingen
- Bevestiging
- Verbonden
- Verbinden
- Pomp verbindings storing
- Beperking toegepast
- In strijd met beperkingen
- Gekopieerd naar klembord
- Kopieren naar klembord
- Correctie
- Niet alle profielen zijn geladen!
- Waarden niet opgeslagen!
- Čeština
- Alarm
- Basaal uur
- Bluetooh status
- DanaR Bluetooth toestel
- Koolhydraten
- Dag totaal
- EasyUI modus in pomp deactiveren
- Activeer vertraagde bolussen op de pomp
- Storing
- glucose
- Historiek
- Alarm
- Herstart
- Resultaat
- Hervatten
- Opslaan
- Veiligheid
- Verzend calibratie %.1f naar xDrip?
- Vergeet niet alle opgenomen koolhydraten in te geven. Anders zullen BG wijzigingen door maaltijden foutief geïnterpreteerd worden!!
- Gevoeligheid AAPS
- Gevoeligheid Oref0
- Accepteer nieuw tijdelijk basaal:
- Stel nieuwe vertraagde bolus in:
- Instellingen geïnporteerd
- Instellingen vertraagde bolus
- Wachtwoord voor instelligen
- Instellingen tijdelijk basaal
- Toon wachtrij
- Eenvoudig profiel
- EP
- BG:
- Basaal:
- Bolus:
- IOB
- Laatste BG:
- SMS Communicator
- Geautoriseerde telefoon nummers
- +XXXXXXXXXX;+YYYYYYYYYY
- Om het basaal %1$.2fU/u te starten antwoord met de code %2$s
- Om het tijdelijke basaal te stoppen antwoord met de code %s
- Bolus %.2fU succesvol toegediend
- Bolus mislukt
- Om de bolus %1$.2fU toe te dienen antwoord met de code %2$s
- XDrip ontvangt geen callibraties
- Om calibratie %1$.2f te verzenden antwoord met de code %2$s
- Kalibratie verzonden. Het ontvangen van kalibraties moet actief zijn in xDrip.
- 한국어
- Taal
- Lokaal profiel
- LP
- Loop
- APS
- Berekening met toepassing van limieten
- LOOP
- Italiano
- Nederlands
- Vingerprik
- Sensor
- Hoog grens
- Uren
- Importeer instellingen van
- Initialisering
- Bulossen
- Koolhydraten
- Storing
- Glucose
- Hervullen
- Onderbreken
- Vernieuw
- Dagen
- Deutsch
- Toedienen
- Geselecteerd toestel niet gevonden
- Loop gedeactiveerd
- Loop deactiveren
- Niet verbonden
- Verbreken
- Verbreek verbinding 1u met pomp
- Verbreek verbinding 2u met pomp
- Verbreek verbinding 15min met pomp
- Verbreek verbinding 30min met pomp
- Verbreek verbinding 3u met pomp
- NEGEER
- IOB
- Ongeldig profiel !!!
- INS
- Glucose
- Opvragen pomp status
- English
- Activeer Loop
- Eind gebruiker overeenkomst
- Activeer de superbolus functie in de wizard. Activeer deze niet tot je begrijpt wat dit doet. OVERDOSISEN ZIJN MOGELIJK BIJ ONWETENDHEID
- Activeer superbolus in de wizard
- Eet binnenkort
- Oude gegevens
- OpenAPS
- OAPS
- OpenAPS AMA
- Laatste bolus
- Pomp wachtwoord
- DanaR pomp instellingen
- Hervullen
- # Dagen
- Begrepen en goedgekeurd
- Nieuwe behandeling ingeven:
- Veld mag niet leeg zijn
- Vertraagde bolus
- Update basaal profiel mislukt
- Snel werkende insuline
- Novorapid, Novolog, Humalog
- Bestand niet gevonden
- Vull standaard hoeveelheid.
- Verzeker u dat de vulhoeveelheid overeenkomt met de infusieset!
- Voorkeuren geexporteerd
- Español
- Uitvoeren
- Exporteer instellingen naar
- Telefoon nummer niet conform
- Alleen numerike waarden binnen het bereik %1$s - %2$s toegelaten.
- Alleen numerieke waarden toegelaten.
- Ελληνικά
- NS API geheim
- NSCI
- NSClient
- URL:
- Nightscout URL ingeven
- Nightscout URL
- Streefdoel
- ISF
- NS API geheim
- Verkeerde ingave
- Pomp IOB
- Basaal:
- Dagtotaal insuline
- Datum
- Totaal basaal
- Gewicht
- Wijzig de mudus U/d naar U/u op de pomp
- Gebruik vertraagde bolussen voor >200%
- Waarde niet correct ingesteld
- Profiel bekijken
- Toon vertraagde bolussen in % aan
- DanaR Korean
- DanaR profiel instellingen
- PIA [u]
- Periode van insuline activiteit
- DanaR
- DANA
- DanaRv2
- Geen bluetooth adapter gevonden
- Geen aanpassing noodzakelijk
- Nog geen profiel geladen van NS
- Geen profiel geselecteerd
- Geen profiel ingesteld
- Niet geslaagd - controleer de telefoon
- Niet beschikbaar
- NSCLIENT heeft geen schrijfrechten. Verkeerd API geheim?
- Ok
- Basaal
- Loop gedeactiveerd door doelen tab
- Superbolus (%d m)
- Loop pauzeren
- Pauzeer (%d m)
- Batterij bijna leeg
- Manueel
- MDI
- Afbreken
- OK
- Maaltijd bolus
- mg/dl
- Te weinig
- mmol/l
- Over
- Exit
- Exporteer instellingen
- Importeer instellingen
- Voorkeuren
- Haal wijzigingen op van NS
- Reset databanken
- Toon logboek
- %s benodigd batterij omptimalistaie vrijwaring voor performate werking
- Alarm opties
- Geen upload naar NS
- Enkel NS upload (sync. gedeactiveerd)
- Hoog
- Laag
- Zeer hoog
- Zeer laag
- NSClient
- Autoscroll
- Geen NS API geheim op (min 12 kar.)
- Max toegestane bolus [E]
- E
- Correctie
- COB
- Koolhydraten
- Bolus IOB
- 15min trend
- BG
- Basaal IOB
- BEHAND
- Insuline hoeveelheid
- Koolhydraten hoeveelheid
- Totale IOB:
- Totale IOB activiteit:
- IOB:
- Foutief SMS telefoon nummer
- Loop was uitgeschakeld
- Loop was ingeschakeld
- Loop is uitgeschakeld
- Loop is ingeschakeld
- Insuline:
- Koolhydraten:
- Actief:
- Behandeling
- Bolus toedien storing
- Basaal onder minimum. Profiel niet ingesteld!
- % (100% = actueel)
- Bolus
- Voorstel
- Open loop
- Nieuw voorstel beschikbaar
- Andere
- Overzicht
- Bolus
- Toegediend
- Er worden %.2fE toegediend
- Stop
- Gestopt
- STOP INGEDRUKT
- Kalibratie
- Oude gegevens druk \"VERNIEUW\" a.u.b.
- %d min geleden
- Berekening
- Dosis
- Periode
- Script debug
- Maaltijd gegevens
- Eénheid
- Doelen
- Controleren van beschikbaarheid BG en insuline pomp data op Nightscout
- Opzetten van visualisatie en monitoring eveneens analyze van basaal en ratio\'s
- In Open Loop modus werken voor enkele dagen, manueel tijdelijke basaal instellen. Set up and use temporary and default temporary targets (e.g. for activity or hypo treatment carbs)
- Starten met de Open Loop modus
- Gebaseerd op deze ervaringen beslissen wat het maximale basaal mag zijn en dit in de pomp instellen
- De Open Loop begrijpen, inclusief de voorgestelde tijdelijke basalen
- In closed Loop werken met een max. IOB = 0 gedurende enkele dagen met een beperkt aantal lage BG
- Starten met closed Loop met bescherming tegen lage BG
- Verhoog max. IOB en test enkele dagen alsook minstens 1 nacht zonder een laag BG alarm voordat je jouw BG doel laat dalen
- BG beschikbaar op NS
- Pas het basaal en de ratios aan indien nodig, activeer hierna de auto-sens optie
- Bereken nu
- Standaardwaarde: waar Dit wordt gebruikt om autosens de bevoegdheid te geven BG doelen aan te passen alsook ISF en basalen
- Interval voor autosens [u]
- Aantal uren in het verleden voor gevoeligheids detectie (koolhy. absorbtie tijd niet meegerekend)
- Activeer AMA autosens
- OpenAPS MA
- Autosens gegevens
- Plugin is gedeactiveerd
- Geen BG gegevens beschikbaar
- Maximaal basaal IOB OpenAPS kan toedienen [E]
- Profiel
- Waarde %s is buiten de toegestane limieten
- Basis basale dosis
- Laatse berekening
- Laatste uitvoering
- Glucose gegevens
- Actueel
- Berekende gegevens
- IOB gegevens
- DIt is de maximale waarde waarop het basaal door OpenAPS ingesteld kan worden
- NS Profiel
- NSPROFIEL
- Pomp
- Tijdelijk basaal
- Tijdelijk basaal
- Tijdelijk streefdoel
- Start
- Controleer
- Wachtend:
- Gepauzeerd
- Leeftijd Patient
- Voeg toe
- Profiel
- Percent
- Kies leeftijd van de patient voor veiligheids limieten
- Streefdoel:
- Vertraagde bolus
- Annuleer vertraagde bolus
- Basale waarde [E/u]
- KH tijdsduur
- Haal wijzigingen op van NS
- Herlaad profiel
- Sluiten van applicatie om instellingen bij te werken
- Bolus via sms niet toegestaan
- Geen SMS bevoegdheid
- Sta SMS bevelen toe
- SMS
- Onderbreek loop voor 10u
- Onderbreek loop voor 1u
- Onderbreek loop voor 2u
- Onderbreek loop voor 3u
- svenska
- Tiener
- Tijdelijk basaal toedien storing
- Totale IOB:
- русский
- Gebruik altijd kleine gemiddelde verschillen ipv gewone verschillen
- Tabel met %d elementen. Actuele waarde:
- Verwijder
- Wijzig
- Home
- Beschikbaarheid:
- Koolhydraten:
- Naam:
- Bolus wizard
- E bolus
- DS bolus
- DE bolus
- Basale uren
- Basale waarde [%]
- Basaal type
- Basaal stap
- Bolus limiet ingesteld
- KH limiet ingesteld
- S Bolus
- DanaR Statistiek
- Cumulative TDD
- Exponentieel verhoogt TDD
- Ratio
- TBB * 2
- TDD
- Mogelijks inacuraat bij gebruik van bolussen om infusieset te vullen
- Verschil
- DIA:
- Uitgevoerd
- Groot gemiddeld verschil
- LAAG grens
- GEEN APS GESLECTEERD OF TOEGEKENT RESULTAAT
- Activeer delen met andere apps (zoals xDrip).
- Activeer locaal delen
- Log app start naar NS
- AAPS is verbonden met NS maar er worden geen wijzigingen uitgevoerd op NS
- Gebruik altijd absolute basale waarden
- NSClient niet geïnstalleerd. Gegevens verloren!
- Basaal
- DIA
- KH ratio
- Oude gegevens
- Oude gegevens sinds [min]
- Alarm oude gegevens sinds [min]
- Dringend oude gegevens vernieuwen
- OAPS
- Activeren van extra functies tijdens de dag zoals AMA
- Manuele correcties
- Pomp status beschikbaar op NS
- DOEL
- Afsluiting
- Lopende berichten
- Open instellingen op Wear
- Maximale E/u dat OpenAPS kan toedienen
- Bereik voor visualisatie
- Ontlucht/vul
- Instelln van basaal profiel mislukt
- Basaal profiel in pomp bijgewerkt
- IOB:
- Ins:
- Ratio:
- Tijdsduur:
- Behandeling veiligheden
- Pomp storing
- Inregelen van de closed loop, verhoog de max IOB boven 0 en laat gelijdelijk het BG doel dalen
- PBAGE
- Standaard waarde: 1.2 Dit betekent dat de verhoging voor autosense ratio (en autotune ratio) is ingesteld op max 20%. Maw. een limiet in hoever je basaal kan verhooght worden en hoeveel je ISF en BG doel verlaagd kan worden.
- Enkel NS upload. Heeft geen effect op de SGV tot als een lokale bron zoals xDipp geselecteerd is. Heeft geen effect op de profielen wanneer het ns profiel is gekozen.
- Pomp niet geïnitialiseerd
- Pomp niet geïnitialiseerd, profiel niet gekozen!
- Pomp is in gebruik
- Pomp uitschakelen
- Pomp onderbreken
- Vaste maaltijd
- Vaste maaltijd instellingen
- Verwijder gegeven:
- Update Wear gegevens
- Wil je echt de databank wissen?
- SENS
- Klein gemiddeld verschil
- Kleine tab tittels
- Verschil:
- %dmin geleden
- Loop hervat
- Loop onderbroken
- Basale instellingen op afstand zijn niet toegestaan
- Kalibratie op afstand is niet toegestaan
- Bevelen op astand zijn niet toegestaan
- Tijdelijk basaal afgebroken
- Afbreken van tijdelijk basaal mislukt
- Start tijdelijk basaal mislukt
- Deze waarde wordt de MAx IOB in OpenAPS context genoemt. Dit is standaard 0. Na enkele dagen of weken naargelang uw vertrouwen kan je dit getal wijzigen.
- Hoge en lage grens voor grafieken op het overzicht en op Wear
- Onbekend bevel of verkeerd antwoord
- Verkeerde tijdsduur
- Status:
- Stoppen van vertraagde bolus
- Stoppen van tijdelijk basaal
- Succes
- Superbolus
- Opgelet! Onderstaande waardes moeten normaal gezien niet worden aangepast. KLIK HIER en LEES de tekst zodat je alles volledig BEGRIJPT voordat je een waarde wijzigt.
- Standaard waarde: 0.7 Dit is de andere kan van de autosens veiligheid limiet. Dit zet een limiet op hoe laag het basaal kan aangepast worden, en hoe hoog het ISF en het BG doel
- Standaard waarde: 2 Bolus snooze is actief nadat je een maaltijd bolus toegediend hebt, zodat de loop geen tegenvoorstel met een verlaagd tijdelijk basaal doet nadat je gegeten hebt. Het voorbeeld hier van van standaard 2; dus een 3 u DIA betekent dat de bolus snooze gemiddeld 1.5u actief is (3DIA/2).
- Standaard waarde: 4 Dit is een combinatie van enerzijds het OpenAPS veiligheid limieten en anderzijds van “3 x max dagelijks basaal ; 4x actueel”. Dit betekent dat het basaal niet hoger kan ingesteld worden dan het ingestelde nummer keer het actueel basaal waarbij de limiet in de pomp geen invloed heeft.Dit is een veiligheidsmaatregel om te vermijden dat patiënten in gevaarlijke laag bereik komen zonder te snappen hoe het algoritme werkt. Nogmaals de standaard waarde is 4x; de meeste zullen deze waarde nooit moeten aanpassen maar zullen eerder andere waardes moeten aanpassen als ze tegen een limiet aanstoten.
- Gedurende 1 week succesvol closed loop met KH ingave
- ACTIVITIJD & FEEDBACK
- Model: %1$02X Protokoll: %2$02X Code: %3$02X
- Verbonden gedurende %d s
- Totaal %d gegevens geupload
- %1$.2f gelimitteerd tot %2$.2f
- Om de loop te onderbreken voor %1$d minuten antwoord met de code %2$s
- Tijdelijk basaal %1$.2fE/u voor %2$d minuten succesvol gestart
- Gemiddelde gevoeligheid
- Dit mag niet gebruikt worden om medische besluiten te trekken. Er is geen garantie voor dit programma voor de werking en het gebruik van dit programma. Tenzij anders beschreven in het copy right. Gebruikers en andere partijen leven dit programma zoals het momenteel is, dit zonder enige garantie.
- Standaard waarde: 3.0 Dit is een belangrijke veiligheid parameter van OpenAPS. Dit limiteert je basaal met een max va 3 maal je hoogste basale dosis. Normaal hoef je deze niet te veranderen. Het is echter belangrijk dat je de ingebouwde limieten kent
- "Standaard waarde: 3.0 Dit is de instelling voor standaard KH absorbeer impact per 5 minuten. Deze standaard waarde slaat op 3mg/dl/5min. Dit heeft effect op hoe snel COB uitgewerkt zijn en hoeveel KH absorptie zal worden gebruikt in het berekenen van de volgende BG en dit wanneer de BG sneller daalt of stijgt dan verwacht. "
- Activeer profiel
- Datum
- Free-Peak Oref
- DIA van %1$f te kort - %2$f wordt inplaats gebruikt!\"
- IOB curve piek tijd
- Piek tijd [min]
- Ongeldig
- Snel-werkende Oref
- Fiasp
- Ultra-Rapid Oref
- Periode van inspanning
- Activiteits doel
- Bloed glucose meetpunt alarm
- Bolus snelheid
- Percentage
- Tijd verschuiving
- Connectie verlopen
- Vullen
- Zet de basale stap op 0,01 E/u
- Geen toestel gevonden
- DanaRS
- Dana
- Standaart tijdelijk basaal
- Eet binnenkort periode
- Eet binnenkort doel
- Bolus status ophalen
- Vertraagde bolus status ophalen
- Pomp instellingen ophalen
- Pomp tijd ophalen
- Ophalen van tijdelijke basaal status
- Koppelen
- Koppeling geslaagd
- Koppeling verlopen
- Koppel nieuwe pomp
- Resterende insuline hoeveelheid
- Herbruik
- Geselecteerde pomp
- Serie nummer
- Stel tijdelijke doelen en bolussen in vanop je horloge.
- Bedieningen via horloge
- Ampull leeg
- Wachten op koppelen van de pomp
- Wijzigingen van profiel
- Bluetooth
- Voeding
- Waarschuwing bij niet bereikbare pomp
- Een bolus met dezelfde hoeveelheid was gevraagd binnen de minuut. Om accidentiële of door bugs veroorzaakte dubbele bolussen te vermijden is deze bolus geannuleerd
- Vet
- Toon gedetaillieerde delta
- Niet ondersteune pomp firmware
- DexcomG5 App (aangepast)
- g
- kJ
- En
- Prot
- INFO
- BT Watchdog
- Desactiveert de bluetooth functie van de telefoon gedurende een ogenblik. Dit kan op sommige gsm\'s een vastgelopen bluetooth service verhelpen.
- Geen BG metingen
- Uitvoeren van gebeurtenis
- Pomp niet beschikbaar
- Pomp niet beschikbaar sinds [min]
- Pomp service gecorrigeerd
- Lokaal gegenereerde waarschuwingen
- Bolus toediening gestart
- Toon delta met eenextra decimaal punt
- Wacht op complete bolus toediening Resterend %d sec.
- Dringend alarm
- TT
- Gebruik systeem notficaties voor waarchuwingen en notificaties
- Opdracht is nu uitgevoerd
- Alarm als er geen BG gegevens ontvangen zijn
- Upload BG gegevens naar NS
- G5 Upload instellingen
- Loop Actief
- Ja
- Nee
- In xDrip+ kies 640g/Eversense data bron
- NSClient BG
- Basaal IOB meerekenen
- APS geslecteerd
- Stuur BG data naar xDrip+
- Basale waarde vervangen door minimaal ondersteunde waarde
- Tijdelijk doel berekenen
- Superbolus berekening
- NSClient heeft schrijf rechten
- Activeren van extra functies tijdes de dag zoals SMB
- BG meerekenen
- Bolus IOB meerekenen
- Closed modus actief
- COB berekening
- ]]>
- ]]>
- BG beschikbaar op gekozen bron
- Enkel positief
- Enkel negatief
- Maximum IOB juist ingesteld
- Trend berekening
- "Bolus in pomp programmeren "
- Vernieuw
- Status
- Geen verbinding gedurende %d minuten
- %1$d%% (%2$d min resterend)
- Waarschuwing
- Pomp klok moet bijgesteld worden
- Leeg
- Bijna leeg
- Normaal
- Vernieuwen
- Batterij pomp is bijna leeg
- Gevraagde is niet momeglijk met de pomp
- Zojuist
- TB GEANNULEERD Waarschuwing is bevestigd
- Annuleren van TB
- Gestopt door een storing
- Gestopt door de gebruiker
- Actief
- Insuline ampul is bijna leeg
- Pomp is in storing, controleer op de pomp: E%1$d %2$s
- Bolus (%.1f E)
- Instellen van basaal profiel
- Lezen van pomp historiek
- Maar %1$.2f E van de gevraagde %2$.2f E zijn toegediend door een storing. Gelieve op de pomp te controleren en het gepaste gevolg uit te voeren.
- Bolus toedienen mislukt. Waarschijnlijk is er geen bolus toegediend. Gelieve de pomp te controleren om een dubbele bolus te vermijden. Als bescherming tegen programmeerfouten worden bolussen niet automatisch opnieuw uitgevoerd.
- Actie
- Instellen TBR (%1$d%% / %2$d min)
- Onvoorzichtig gebruik: Vertraagde of multi wave bolussen zijn toegediend in de afgelopen 6 uur op het geselecteerde basaal patroon is niet 1. Loop is onderbroken tot de 6 uur nadat deze bolussen of andere basale patronen zijn gedetecteerd. Alleen normale bolussen en basaal patroon 1 zijn mogelijk binnen basaal patroon 1
- Opgelet: verlengde en multi wafe bolussen zijn actief. Loop is naar onderdruk lage waardes enkel overgeschakeld gedurende 6 uur. Alleen gewone bolussen worden onderdsteund in loop modus.
- Niet genoeg insuline aanwezig in reservoir voor de bolus
- Combinatie-Bolus
- %.2f E/u
- %.1fu geleden
- Bolus gestopt
- Stoppen van bolus
- Basaal profiel wordt gelezen
- Basale patroon niet geschikt op complete uren: %s
- Ongeldig profiel: %s
- Er kon geen verbinding met de pomp gemaakt worden. De Bolus is niet toegediend.
- Vertraagde bolus toedien storing
- De pomp historiek is gewijzigd nadat de bolus berend was. De bolus is NIET toegediend. Programmeer een nieuwe bolus indien nodig.
- Bolus succesvol toegediend, maar toevoegend van de behandeling is gefaald. Dit kan voorvallen wanneer twee kleine bolussen van dezelfde grote gekozen waren gedurende de laatste 2 minuten. Controleer aub de pomphistoriek en de behandelingen, voeg de ontbrekende toe via het careportal. Let op dat je geen 2 dezelfde hoeveelheden hebt op hetzelfde ogenblik.
- Tijdelijk basaal geweigerd doordat de berekeningen geen rekening hielden met de recente wijzigingen in de pomp historiek
- Vernieuwen van pomp status
- Het basaal patroon is op de pomp gewijzigd en zal binnenkort geupdate worden.
- Basaal patroon op de pomp is gewijzigd, maar konnen niet worden uitgelezen
- Controle van historiek op wijzigingen
- "Verschillend bolussen met dezelfde hoeveelheid op hetzelfde tijdstip zijn geïmporteerd. Er is er maar 1 toegevoegd aan de behandelingen lijst. Controleer op de pomp en voeg eventueel toe via het Careportal menu. Er mogen geen 2 bolussen op hetzelfde tijdstip aanwezig zijn! "
- Geluid dempen
- De laatste bolus is ouder dan 24 uren of bevind zich in de toekomst. Controleer de datum en tijd in de pomp aub.
- Creëer een melding bij storingen
- Creëer een Nightscout melding voor storingen en lokale waarschuwingen (ook zichtbaar inder het Careportal en behandelingen)
- Datum/tijd van de geleverde bolus op de pomp is niet correct, IOB is waarschijnlijk foutief. Controleer aub de datum/tijd op de pomp.
- Profiel wissel ontbreekt. Doe aub een profiel wissel of duw op Activeer Profiel in het Lokale profiel.
- tijdelijk basaal gezet door pomp
- insuline resistente volwassene
- SMB
- Activeer UAM
- Activeer SMB
- Verwisseld
- Pomp Gestopt
- Status vernieuwd
- status
- Insight pomp
- Français
- Hypo
- OpenAPS SMB
- SMB in plaats van tijdelijke basalen voor snellere reactie
- Detectie van niet aangekondigde maaltijden
- m
- u
- Insight
- Hypo tijdsduur
- Initialiseren
- Logboek
- Storing E13: Taal storing
- Storing E10: Terugdraai storing
- Storing E7: Elektronische storing
- Storing E6: Mechanische storing
- Blijf altijd verbonden
- Syncroniseren
- Rust
- Bezig
- Gesyncroniseerd
- Niet geautoriseerd
- incompatibel
- seconde
- minuut
- uur
- dag
- week
- s
- Statistieken
- Automatische verbinden wanneer AndroidAPS scherm geopend wordt, voordat er een pomp commande wordt uitgevoerd om zo de verbindingsvertraging te omzeilen
- Code geweigerd
- Niet aangewezen door hoog batterij verbuik
- Activeer SMB altijd
- SMB altijd onafhangkelijk van bolussen. Enkel mogelijk met een BG bron met goed gefilterde data zoals de G5
- Activeer SMB na koolhydraten
- SMB actief gedurende 6u, zelfs met 0 COB. Enkel mogelijk met een BG bron met goed gefilterde data zoals de G5
- Insuline
- Koolhydraten
- Knoppen
- Stuurt een kalibratie naar xDrip+ of opent het G5 calibratie venster
- Opent xDrip+, terug knop voor terug naar AAPS te gaan
- Aantal koolhydraten toevoegen wanneer de knop wordt ingeduwd
- Hoeveelheid insuline dat wordt toegevoegd wanneer er op de knop geduwt word
- Kon de CGM applicatie niet starten. Zorg dat deze geïnstalleerd is.
- CGM
- Historiek venster
- Waarschuw bij SMB
- Laat tijdelijk basaal lopen
- Voorspellingen
- Fabric Upload
- Categorie
- subcategorie
- Bolus zal enkel opgeslaan worden
- SMB op de pomp ingesteld
- Gevoeligheid
- Afwijkingen
- Basalen
- n/a
- Wizard instellingen
- Berekeningen inclusief in het resultaat van de wizard
- Scherm instellingen
- Algemene instellingen
- Waarschuwing W31: Patroon bijna leeg
- Waarschuwing W32: Batterij niveau laag
- Waarschuwing W33: Datum/tijd onjuist
- Waarschuwing W34: Einde van garantie periode
- Onderhoudsmelding M20: Insuline patroon niet geplaatst
- Onderhoudsmelding M21: Insuline patroon leeg
- Onderhoudsmelding M22: Batterij leeg
- Onderhoudsmelding M23: Automatische uit
- Onderhoudsmelding M24: Verstopping
- Onderhoudsmelding m25: Huur periode voorbij - einde van werking
- Onderhoudsmelding M26: Insuline patroon wissl niet compleet
- Onderhoudsmelding M27: Gegevens download mislukt
- Onderhoudsmelding M26: Gepauzeerde modus verlopen
- Onderhoudsmelding M29: Batterij type niet ingesteld
- Onderhoudsmelding M30: Insuline patroon type niet ingesteld
- Waarschuwing W39: Huurperiode waarschuwing
- WiFi SSID
- Gebuik enkel de WiFi verbinding
- Toegelaten SSIDs (gescheiden door puntkomma)
- Pomp gestopt
- Pomp gestart
- Pomp gepauzeerd
- Maximum maaltijd absorbtie tijd (h)
- Tijd
- Toon het notities veld in het behandelings dialoog
- CGM
- Voeding
- Reset
- Wachttijd voor syncronisatie (%d sec)
- Voorbij
- met
- Actieve TBR
- resterende minuten
- Opstarten
- benodigd
- min
- Laatst afgewerkte actie
- totaal
- Activeer SMB met Koolhydraten
- SMB actief tijdens actieve koolhydraten
- Gebruik SMB met tijdelijke doelen
- Gebruik SMB bij een actief tijdelijk basaal (binnenkort eten, inspanningen)
- Gebruik SMB met een hoog tijdelijk doel
- Gebruik SMB tijdens een verhoogd tijdelijk doel (Inspanningen)
- Start inspanning TT
- Start binnenkort eten TT
- TT
- Aantal bolussen
- Aantal TBR
- Doel %d niet gestart
- Toon SMB op horloge zoals gewone bolussen.
- Toon de voorspellingen op het horloge
- Data Keuzes
- Sta automatische crashrapporten en verder gebruik van data toe zodat deze naar de ontwikelaars via fabric.io kan verzonden worden.
- Automatische BG aanvullen
- Actuele veiliheids verhoger van basaal
- Maximale dagelijkse veiligheids vermeningvuldigings factor
- Bolus snooze dia deler
- Min autosens factor
- Max autosens factor
- Sta verbinding tijdens roaming toe
- Verbindings instellingen
- Enkel tijdens opladen
- Gevraagd: %1$.2fU Afgegeven: %2$.2fU Storings code: %3$d
- Românesc
- Chinese
- Autosens regelt de BG streefwaarde bij
- Hypo streefwaarde
- Maximum aantal minuten basaal om de SMB te limiteren tot
- Verbind preëntief
- Opgenomen Koolhydraten
- Opgenomen Insuline
- Geen actie geselecteerd, er zal niets uitgevoerd worden
- Keep-alive status
- Update dexcom G5 app naar de ondersteunde versie
- automatische ontbenkende BGs aanvullen van NS
- Start Hypo TT
- Engineering modus is geactiveerd
- Engineering modus is niet geactiveerd en dit is niet de relaese branche
- Doel %d niet afgewerkt
- Pomp kan geen tijdelijk basaal aanvaarden
- Geen plausibel basale snelheid van pomp kunnen lezen
- Autosens gedeactiveerd in de voorkeuren
- Closed Loop modus gedeactiveerd in de voorkeuren
- SMB gedeactiveerd in de voorkeuren
- Ongekend
- Beperken van basaal tot max %1$.2f E/U wegens de %2$s
- Pomp limiet
- dit moet een positieve waarde zijn
- Basaal correct ingesteld
- Begrezen van max procentuele wijzigen tot %1$d%% want de %2$s
- SMB altijd gedeactiveerd doordat de gekozen BG bron geen optimale filtering toepast
- SMB niet toegestaan in Open Loop modus
- Niet verbonden (%d m)
- max limiet (SC)
- Onveilig gebruik
- Dev cersie actief. Closed loop gedeactiveerd
- Wacht op confirmatie van code
- Incompatiebele hulp app, we hebben deze versie nodig
- app koppeling
- Niet verbonden met de hulpapp!
- Hulp app lijkt niet geïnstalleerd
- Markeer een infuuwissel in NS
- Leezen van status mislukt
- Markeer een insuline ampull wissel in NS
- Automatische Careportal gebeurtenissen
- resterende van
- op voorhand met
- %1$ds verloopt %2$s
- " http://www.androidaps.org facebook: http://facebook.androidaps.org"
- "Eerste insuline increment"
- Tweede insuline increment
- Derde insuline increment
- Eerste koolhydraten increment
- Tweede koolhydraten increment
- Derde koolhydraten increment
- Bolus beperkt tot %1$.1f E doordat %2$s
- Er is een bolus toegediend gedurende de afgelopen 3 minuten, SMB wordt overgeslagen
- Max IOB wordt beperkt tot %1$1.f E doordat %2$s
- Koolhydraten worden beperkt tot %1$d gr doordat %2$s
- Maximum waarde in voorkeuren
- IOB gelimmiteerd tot %1$.1f E doordat %2$s
- Automatische Insuline, infusieset wissels, batterij wissels en pomp alarmen naar NS uploaden
- Tijdspanne waarbinnen elke maaltijd vollezig is opgenomen. Resterende KH worden niet mee gerekend.
- Max totaal IOB dat OpenAPS niet kan overschrijden (E)
- Max basaal vermenigvuldiger
- Max dagelijks basaal vermenigvuldiger
- MAX IOB in OpenAPS context, OpenAPS zal geen extra insuline toedenen als de actuele IOB onderstaande waarde overschreden heeft
- "Geen bolus toedienen enkel in behandeleingen zetten"
+ Behandelingen veiligheid
+ Max toegestane bolus [E]
+ Max toegestane koolhydraten [g]
+ Instellingen
+ Haal behandelingen op van NS
+ Reset database
+ Wil je echt de database wissen?
+ Afsluiten
+ Gebruik vertraagde bolussen voor >200%
+ DanaR Bluetooth apparaat
+ Gebruik altijd absolute basale waarden
+ Herstart je telefoon of herstart AndroidAPS vanuit de systeem instellingen a. u. b. \nanders zal AndroidAPS geen logboek hebben (Belangrijk om te controleren of de algoritmes correct werken)!
+ Een aantal knoppen voor snelle toegang tot algemene functies
+ Voer geavanceerde logboekitems in.
+ Gebruikt om actieve plugins te configureren
+ Leerprogramma
+ Toon de instellingen voor Voeding in Nightscout
+ Insuline instelling voor Humalog en NovoRapid / NovoLog
+ Insuline instelling voor Fiasp
+ Hiermee kan je de piek van de insulineactiviteit definiëren en deze mag alleen worden gebruikt door gevorderde gebruikers
+ Activeer of deactiveer de implementatie die de Loop triggert.
+ Synchroniseert je data met Nightscout
+ Het algoritme uit 2016
+ Het algoritme uit 2017
+ Meest recente algoritme voor gevorderde gebruikers
+ Toont de huidige Loop-status en knoppen voor meest gebruikte acties
+ Toont een permanente melding met een beknopt overzicht van hetgeen de Loop momenteel doet
+ Definieer een profiel dat offline beschikbaar is.
+ Geeft het profiel dat je hebt gedefinieerd in Nightscout
+ Definieer een profiel met slechts één tijdsblok.
+ Pomp integratie voor Accu-Chek Combo pompen, vereist dat ruffy geïnstalleerd is
+ Pomp integratie voor DANA Diabecare R pompen
+ Pomp integratie voor inheemse DANA Diabecare R pompen
+ Pomp integratie voor DANA Diabecare R pompen met geupgrade firmware
+ Pomp integratie voor DANA Diabecare RS pompen
+ Pomp integratie voor Accu-Chek Insight pompen, vereist dat SightRemote geïnstalleerd is
+ Pomp integratie voor mensen met pen-therapie (meerdere dagelijkse injecties)
+ Pomp integratie voor pompen, waar nog geen driver voor is (Open Loop)
+ Gevoeligheid wordt berekend op dezelfde manier als Oref0, maar u kunt een tijdframe naar het verleden specificeren. Minimale koolhydraat absorptie is berekend op basis van max koolhydraat absorptie tijd van de voorkeursinstellingen.
+ Gevoeligheid is berekend op basis van 24h gegevens uit het verleden en koolhydraten (indien niet geabsorbeerd) worden hiervan afgehaald, na de duur die is opgegeven in de voorkeursinstellingen.
+ Gevoeligheid is berekend op basis van 8h gegevens uit het verleden en koolhydraten (indien niet geabsorbeerd) worden hiervan afgehaald, na de duur die is opgegeven in de voorkeursinstellingen. De plugin berekent ook UAM.
+ Gevoeligheid wordt berekend als een gewogen gemiddelde van afwijkingen. Nieuwere afwijkingen wegen hierbij zwaarder. Minimale koolhydraat absorptie is berekend op basis van de max koolhydraat absorptie tijd uit de voorkeursinstellingen. Dit algoritme is de snelste in het volgen van wijzigingen van de gevoeligheid.
+ Ontvang BG waardes van de patched Dexcom G5 app.
+ Ontvang BG waardes van Glimp.
+ Ontvang BG waardes van 600SeriesAndroidUploader.
+ Download BG waardes van Nightscout
+ Ontvang BG waardes van xDrip.
+ Sla alle behandelingen op
+ AndroidAPS controleren en bedienen met behulp van uw WearOS-horloge.
+ Toon informatie over de Loop op jouw xDrip+ wijzerplaat.
+ Bedien AndroidAPS op afstand met SMS commando\'s.
+ Start
+ Controleer
+ Eénheden
+ DIA
+ KH ratio
+ ISF
+ Basaal
+ Streefdoel
+ Geen profiel ingesteld
+ Insuline:
+ Koolhydraten:
+ IOB:
+ IOB:
+ Activiteit:
+ Totale IOB:
+ Totale IOB activiteit:
+ Tijdsduur:
+ Ratio:
+ Ins:
+ IOB:
+ Totale IOB:
+ Insuline hoeveelheid
+ Koolhydraten hoeveelheid
+ BG
+ TT
+ Koolhydraten
+ Correctie
+ E
+ Bolus IOB
+ Nu uitvoeren
+ VIRTUELE POMP
+ Basis basale dosis
+ Tijdelijk basaal
+ Vertraagde bolus
+ Batterij
+ Reservoir
+ OK
+ Laatste berekening
+ Invoerparameters
+ Glucose status
+ Actueel
+ IOB gegevens
+ Profiel
+ Maaltijd gegevens
+ Resultaat
+ Geen BG gegevens beschikbaar
+ Geen aanpassing noodzakelijk
+ Voorstel
+ Dosis
+ Periode
+ Reden
+ Glucose
+ Verschil
+ Verschil:
+ Configurator
+ Doelen
+ OpenAPS MA
+ Overzicht
+ NS Profiel
+ Eenvoudig profiel
+ Tijdelijk basaal
+ Behandelingen
+ Virtuele Pomp
+ Careportal
+ Pomp
+ Welke pomp wil je gaan gebruiken met AndroidAPS?
+ Behandelingen
+ Welke plugin moet worden gebruikt voor de Behandelingen?
+ Profiel
+ Welk profiel moet AndroidAPS gebruiken?
+ APS
+ Welke APS algoritme moet therapie aanpassingen maken?
+ Algemeen
+ Dit zijn enkele algemene plugins die handig kunnen zijn.
+ Welke beperkingen worden toegepast?
+ dagen
+ Beperkingen
+ Loop
+ Loop
+ Gebruik dit om AndroidAPS loop integratie te activeren.
+ APS
+ Berekening met toepassing van limieten
+ Tijdelijk basaal gezet door pomp
+ Laatste uitvoering
+ OK
+ Annuleer
+ GEEN APS GESELECTEERD OF TOEGEKEND RESULTAAT
+ Veiligheid
+ Plugin is gedeactiveerd
+ In strijd met beperkingen
+ Bolus toedien storing
+ Tijdelijk basaal toedien storing
+ Basale waarde [%]
+ % (100% = actueel)
+ Accepteer nieuw tijdelijk basaal:
+ Bolus
+ Bolus wizard
+ Beperking toegepast!
+ Bevestiging
+ Nieuwe behandeling ingeven:
+ Bolus
+ Bolus:
+ Basaal
+ Basaal:
+ Koolhydraten
+ Wijzig het ingegevene!
+ Stel nieuwe vertraagde bolus in:
+ BG bron
+ Waar moet de AndroidAPS zijn gegevens vandaan halen?
+ xDrip
+ APS Mode
+ Closed loop
+ Open loop
+ Loop gedeactiveerd
+ Loop deactiveren
+ Activeer Loop
+ Nieuw voorstel beschikbaar
+ Niet ondersteunde versie van NSClient
+ Niet ondersteunde versie van Nightscout
+ NSClient niet geïnstalleerd. Gegevens verloren!
+ BG beschikbaar op NS
+ Pomp status beschikbaar op NS
+ Manuele correcties
+ Loop gedeactiveerd door doelen tab
+ Basaal IOB
+ Bolus limiet ingesteld
+ KH limiet ingesteld
+ BG Controle
+ Mededeling
+ Notitie
+ Vraag
+ Sport
+ Infuus wissel
+ CGM Sens. ingebracht
+ CGM Sens. Start
+ Insuline ampul wissel
+ Profiel wissel
+ Snack bolus
+ Maaltijd bolus
+ Correctie bolus
+ Combinatie-Bolus
+ Start tijd. basaal
+ Einde tijd. basaal
+ Koolhydraten correctie
+ OpenAPS Offline
+ Gebeurtenis type
+ Andere
+ Meter
+ Sensor
+ Koolhydraten
+ Insuline
+ KH tijdsduur
+ Splitsen
+ Tijdsduur
+ Procent
+ Absoluut
+ Notities
+ Gebeurtenis tijdstip
+ Profiel
+ Ingegeven door
+ Glucose type
+ Nog geen profiel geladen van NS
+ Tijdelijk basaal
+ Vertraagde bolus
+ Nightscout versie:
+ Te weinig
+ Voorkeuren geëxporteerd
+ Exporteer instellingen naar
+ Importeer instellingen van
+ Instellingen geïmporteerd
+ Bestand niet gevonden
+ Exporteer instellingen
+ Importeer instellingen
+ Maximale E/uur dat OpenAPS kan toedienen
+ Dit is de maximale waarde waarop het basaal door OpenAPS ingesteld kan worden
+ Maximale basaal IOB, dat OpenAPS kan toedienen [E]
+ Deze waarde wordt de Max IOB genoemd in OpenAPS context\nDit is de maximale insuline hoeveelheid in [E] dat APS in één keer kan toedienen.
+ NEGEER
+ DanaR
+ Verbinden
+ Verbonden
+ Niet verbonden
+ DanaR pomp instellingen
+ Eind gebruiker overeenkomst
+ MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+ Begrepen en goedgekeurd
+ Opslaan
+ Geen bluetooth adapter gevonden
+ Geselecteerd toestel niet gevonden
+ Pomp verbindingsstoring
+ Pomp IOB
+ Dag totaal
+ Laatste bolus
+ %.1fu geleden
+ Verkeerde ingave
+ Waarde niet correct ingesteld
+ Herlaad profiel
+ Profiel bekijken
+ Uitgevoerd
+ Commentaar
+ Succes
+ Procent
+ Absoluut
+ Annuleer tijdelijk basaal
+ SMS Communicator
+ Wacht op het resultaat
+ Geautoriseerde telefoon nummers
+ +XXXXXXXXXX;+YYYYYYYYYY
+ Om de bolus %1$.2fU toe te dienen antwoord met de code %2$s
+ Om calibratie %1$.2f te verzenden antwoord met de code %2$s
+ Bolus mislukt
+ Bolus %.2fU succesvol toegediend
+ Klaar om %.2fE toe te dienen
+ Bolus %.2fU succesvol toegediend
+ Toedienen %.2fU
+ Sta SMS bevelen toe
+ Bolus via sms niet toegestaan
+ Vingerprik
+ Sensor
+ Manueel
+ Tijd. streefdoel
+ Tijdelijk streefdoel annuleren
+ DanaR profiel instellingen
+ DIA [uur]
+ Duur van insuline activiteit
+ Update basaal profiel mislukt
+ Vernieuw
+ Uploaden
+ E bolus
+ DS bolus
+ DE bolus
+ storing
+ hervullen
+ basaal uur
+ glucose
+ koolhydraten
+ alarm
+ Totaal %1$d gegevens geupload
+ S Bolus
+ Alarm
+ Basale uren
+ Bulossen
+ Koolhydraten
+ Dagtotaal insuline
+ Storing
+ Glucose
+ Hervullen
+ Onderbreken
+ Verbonden gedurende %1$d s
+ Pomp wachtwoord
+ Verkeerd pomp wachtwoord!
+ Pomp is in gebruik
+ Toegediend
+ Gestopt
+ Bolus gestopt
+ Stoppen van bolus
+ Afsluiting
+ Stop
+ STOP INGEDRUKT
+ Wacht op pomp
+ Er worden %.2fE toegediend
+ Opzetten van visualisatie en monitoring en analyzeren van basaal en ratio\'s
+ Controleren van beschikbaarheid BG en insuline pomp data op Nightscout
+ Starten met de Open Loop modus
+ In Open Loop modus werken voor enkele dagen en handmatig meermaals tijdelijke basaal instellen.
+Stel in en gebruik tijdelijk en standaard tijdelijke streefdoelen (bv. bij sporten of koolhydraten inname bij hypo)
+ De Open Loop begrijpen, inclusief de voorgestelde tijdelijke basaalstanden
+ Gebaseerd op deze ervaringen beslissen wat het maximale basaal mag zijn en dit in de pomp instellen
+ Starten met closed Loop met bescherming tegen lage BG
+ In closed Loop werken met een max. IOB = 0 gedurende enkele dagen met een beperkt aantal lage BG
+ Inregelen van de closed loop, verhoog de max IOB boven 0 en laat gelijdelijk het streef BG dalen
+ Verhoog max. IOB en test enkele dagen als ook minstens 1 nacht zonder een laag BG alarm voordat je jouw streef BG verlaagt
+ Pas het basaal en de ratios aan indien nodig, activeer hierna de auto-sens optie
+ Gedurende 1 week succesvol closed loop met invoer van koolhydraten
+ Activeren van extra functies overdag zoals AMA
+ Activeren van extra functies overdag zoals SMB
+ Lees de wiki en verhoog maxIOB om SMB goed werkend te krijgen. Een goed begin is maxIOB=gemiddelde maaltijdbolus + 3 x max dagelijkse basaal
+ Limiet bereikt
+ Geen profiel geselecteerd
+ Loop was uitgeschakeld
+ Loop was ingeschakeld
+ Loop is uitgeschakeld
+ Loop is ingeschakeld
+ %1$.2f gelimiteerd tot %2$.2f
+ Waarde %s is buiten de toegestane limieten
+ Basale instellingen op afstand zijn niet toegestaan
+ Commando\'s op afstand zijn niet toegestaan
+ Om het basaal %1$.2fE/uur te starten antwoord met de code %2$s
+ Om de loop te onderbreken voor %1$d minuten antwoord met de code %2$s
+ Tijdelijk basaal %1$.2fE/u voor %2$d minuten succesvol gestart
+ Start tijdelijk basaal mislukt
+ Om het tijdelijke basaal te stoppen antwoord met de code %s
+ Tijdelijk basaal afgebroken
+ Afbreken van tijdelijk basaal mislukt
+ Onbekend commando of verkeerd antwoord
+ Vaste maaltijd
+ Vaste maaltijd instellingen
+ Naam:
+ Koolhydraten:
+ Beschikbaarheid:
+ Voeg toe
+ Wijzig
+ Verwijder
+ Maaltijd bolus
+ Correctie
+ Acties
+ AndroidAPS gestart
+ Alleen NS upload (sync. gedeactiveerd)
+ Alleen NS upload. Heeft geen effect op de SGV behalve als een lokale bron zoals xDipp geselecteerd is. Heeft geen effect op de profielen wanneer het NS profiel is gekozen.
+ Pomp niet geïnitialiseerd!
+ Pomp niet geïnitialiseerd, profiel niet gekozen!
+ Ontlucht/vul
+ Verzeker u dat de vulhoeveelheid overeenkomt met de infusieset!
+ Andere
+ Vull standaard hoeveelheid.
+ Knop 1
+ Knop 2
+ Knop 3
+ Eenheden:
+ mg/dl
+ mmol/l
+ DIA:
+ Streefdoel:
+ Bereik voor visualisatie
+ Hoge en lage grens voor grafieken op het Overzicht en op Wear
+ LAAG grens
+ HOOG grens
+ Wear
+ Update Wear gegevens
+ Open instellingen op Wear
+ Pomp storing
+ Batterij bijna leeg
+ Pomp uitschakelen
+ Pomp Batterij Leeg
+ DanaR Koreaans
+ Basaal:
+ Instellie van basaal profiel mislukt
+ Basaal profiel in pomp bijgewerkt
+ EasyUI modus in pomp deactiveren
+ Activeer vertraagde bolussen op de pomp
+ Wijzig de modus E/dag naar E/uur op de pomp
+ Basaalwaarde onder minimum. Profiel niet ingesteld!
+ BG:
+ Laatste BG:
+ MDI
+ MM640g
+ Permanent bericht
+ Oude gegevens
+ %1$d min geleden
+ %1$dmin geleden
+ Lokaal profiel
+ OpenAPS AMA
+ Klein gemiddeld verschil
+ Groot gemiddeld verschil
+ Array van %1$d elementen. \nActuele waarde:
+ Autosens gegevens
+ Script debug
+ Activeer AMA autosens
+ Haal wijzigingen op van NS
+ Verwijder behandelingen in de toekomst
+ Eet binnenkort
+ Hypo
+ Activiteit
+ Verwijder record:
+ DanaR Statistiek
+ Cumulatieve TDD
+ Exponentieel verhoogd TDD
+ Basaal
+ Bolus
+ TDD
+ Datum
+ Ratio
+ # Dagen
+ Gewicht
+ Mogelijks inaccuraat bij gebruik van bolussen om infusieset te vullen!
+ Oude gegevens druk \"VERNIEUW\" a.u.b.
+ Totaal basaal
+ TBB * 2
+ Initialiseren...
+ ACT
+ CONF
+ LOOP
+ EP
+ OAPS
+ LP
+ DANA
+ HOME
+ VPUMP
+ NSPROFIEL
+ BEHAND
+ CP
+ DOEL
+ WEAR
+ SMS
+ Afgekorte tab titels
+ Gebruik altijd kleine gemiddelde verschillen ipv gewone verschillen
+ Nuttig wanneer gegevens van niet gedempte bronnen zoals Xdrip noisy zijn.
+ Geavanceerde instellingen
+ Model: %1$02X Protokoll: %2$02X Code: %3$02X
+ Profiel
+ Standaard waarde: 3.0 Dit is een belangrijke veiligheid parameter van OpenAPS. Dit limiteert je basaal met een max van 3 maal je hoogste basale dosis. Normaal hoef je deze niet te veranderen. Het is echter belangrijk dat je de ingebouwde limieten kent.
+ Standaard waarde: 4 Dit is een combinatie van enerzijds het OpenAPS veiligheid limieten en anderzijds van “3 x max dagelijks basaal; 4x actueel”. Dit betekent dat het basaal niet hoger kan ingesteld worden dan het ingestelde nummer keer het actueel basaal waarbij de limiet in de pomp geen invloed heeft. Dit is een veiligheidsmaatregel om te voorkomen dat patiënten in gevaarlijke laag bereik komen zonder te snappen hoe het algoritme werkt. Nogmaals de standaard waarde is 4x; de meeste zullen deze waarde nooit moeten aanpassen maar zullen eerder andere waardes moeten aanpassen als ze tegen een limiet aanstoten.
+ Standaard waarde: 1.2\nDit betekent dat de verhoging voor autosense ratio (en autotune ratio) is ingesteld op max 20%. Maw. een limiet in hoeverre je basaal kan worden verhoogd en hoeveel je ISF en BG doel verlaagd kan worden.
+ Standaard waarde: 0.7\nDit is de andere kan van de autosens veiligheid limiet. Dit zet een limiet op hoe laag het basaal kan aangepast worden, en hoe hoog het ISF en het streef BG.
+ Autosens past de streefwaardes ook aan
+ Standaardwaarde: waar Dit wordt gebruikt om autosens de bevoegdheid te geven BG doelen aan te passen alsook ISF en basalen
+ Standaard waarde: 2\nBolus snooze is actief nadat je een maaltijd bolus toegediend hebt, zodat de loop geen tegenvoorstel met een verlaagd tijdelijk basaal doet nadat je gegeten hebt. Het voorbeeld hier van van standaard 2; dus een 3 u DIA betekent dat de bolus snooze gemiddeld 1.5u actief is (3DIA/2).
+ Opgelet!\n Onderstaande waardes moeten normaal gezien niet worden aangepast. KLIK HIER en LEES de tekst zodat je alles volledig BEGRIJPT voordat je een waarde wijzigt.
+ Alleen numerieke waarden toegelaten.
+ Alleen numerieke waarden binnen het bereik %1$s - %2$s toegelaten.
+ Veld mag niet leeg zijn
+ Telefoon nummer niet conform
+ Foutief SMS telefoon nummer
+ Kalibratie
+ Verzend calibratie %.1f naar xDrip?
+ xDrip+ niet geïnstalleerd
+ Kalibratie naar xDrip verzonden
+ Kalibratie op afstand is niet toegestaan
+ Kalibratie verzonden. Het ontvangen van kalibraties moet actief zijn in xDrip.
+ XDrip ontvangt geen kalibraties
+ Pomp onderbreken
+ Opvragen pomp status
+ Instellingen tijdelijk basaal
+ Stoppen van tijdelijk basaal
+ Instellingen vertraagde bolus
+ Stoppen van vertraagde bolus
+ Bijwerken basaal patroon
+ Verbreken
+ Uitvoeren
+ Virtuele pomp instellingen
+ Upload status naar NS
+ Verkeerd wachtwoord
+ Wachtwoord voor instelligen
+ Instellingen ontgrendelen
+ Insuline daglimiet bereikt
+ NSClient
+ NSCI
+ URL:
+ Autoscroll
+ Herstart
+ NSClient
+ Nightscout URL
+ Nightscout URL ingeven
+ NS API secret
+ NS API secret
+ Geen NS API secret op (min 12 kar.)
+ Toedienen
+ Ledig wachtrij
+ Toon wachtrij
+ Wachtend:
+ Status:
+ Gepauzeerd
+ Logboek wissen
+ NSCLIENT heeft geen schrijfrechten. Verkeerde API secret?
+ Wear instellingen
+ Toon gedetailleerde IOB
+ Splits IOB in bolus en basaal op de watchface
+ Niet geslaagd - controleer de telefoon
+ Niet beschikbaar
+ Leeftijd Patient
+ Kind
+ Tiener
+ Volwassene
+ insuline resistente volwassene
+ Kies leeftijd van de patient voor veiligheids limieten
+ Glimp
+ %s benodigd batterij optimalistaie vrijwaring voor goede werking
+ Loop pauzeren
+ Gepauzeerd (%1$d m)
+ Superbolus (%1$d m)
+ Onderbreek loop voor 1u
+ Onderbreek loop voor 2u
+ Onderbreek loop voor 3u
+ Onderbreek loop voor 10u
+ Verbreek verbinding 15min met pomp
+ Verbreek verbinding 30min met pomp
+ Verbreek verbinding 1u met pomp
+ Verbreek verbinding 2u met pomp
+ Verbreek verbinding 3u met pomp
+ Hervatten
+ Verkeerde tijdsduur
+ Loop onderbroken
+ Loop hervat
+ 15min trend
+ COB
+ Superbolus
+ Log app start naar NS
+ Sluiten van applicatie om instellingen bij te werken.
+ DanaRv2
+ Insuline curve
+ Welk soort insuline gebruik je?
+ Snel werkende insuline
+ Novorapid, Novolog, Humalog
+ Fiasp
+ INS
+ Activeer superbolus in de wizard
+ Activeer de superbolus functie in de wizard. Activeer deze niet tot je begrijpt wat dit doet. OVERDOSIS IS MOGELIJK BIJ BLINDELINGS GEBRUIK!
+ IOB
+ COB
+ Firmware
+ Laatste verbinding
+ Bluetooh status
+ Over
+ Geen SMS bevoegdheid
+ xDrip Status (Horloge)
+ xDrip Statuslijn (Horloge)
+ xds
+ Toon BGI
+ Voeg BGI toe aan status lijn
+ Geen upload naar NS
+ AAPS is verbonden met NS maar er worden geen wijzigingen uitgevoerd op NS
+ Basaal stap
+ Bolus Stap
+ Vertraagde bolus
+ Tijdelijk streefdoel
+ Annuleer vertraagde bolus
+ Ouderdom sensor
+ Ouderdom infusie set
+ Ouderdom insuline
+ uren
+ Basaal type
+ Ongeldig profiel !!!
+ Wisselen van profiel
+ Ouderdom batterij
+ Pomp bat. wissel
+ Alarm opties
+ Zeer hoog
+ Hoog
+ Laag
+ Zeer laag
+ Oude gegevens
+ Dringend oude gegevens vernieuwen
+ Oude gegevens sinds [min]
+ Alarm oude gegevens sinds [min]
+ Interval voor autosens [uur]
+ Aantal uren in het verleden voor gevoeligheids detectie (koolhy. absorbtie tijd niet meegerekend)
+ Pomp
+ OpenAPS
+ Uploader
+ Gevoeligheid detectie
+ Welke gevoeligheid algoritme moet worden gebruikt?
+ SENS
+ Gevoeligheid Oref0
+ Gevoeligheid Oref1
+ Gevoeligheid AAPS
+ Opname instellingen
+ Max absorptietijd maaltijd [uur]
+ Verwachte tijd in uren totdat alle koolhydraten opgenomen zijn
+ Toon vertraagde bolussen in % aan
+ SAGE
+ IAGE
+ CAGE
+ PBAGE
+ OAPS
+ UPLD
+ BAS
+ EXT
+ Laat scherm aan
+ Voorkomen dat Android het scherm uitschakelt. Dit kost veel accuvoeding als je de telefoon niet aan de oplader hebt.
+ Bij het gebruik van Autosense, vergeet niet alle opgenomen koolhydraten in te geven. Anders zullen BG wijzigingen door maaltijden foutief geïnterpreteerd worden !!
+ Gemiddelde gevoeligheid
+ OK
+ Afbreken
+ Niet alle profielen zijn geladen!
+ Waarden niet opgeslagen!
+ Activeer delen met andere apps (zoals xDrip).
+ Activeer locaal delen.
+ ACTIVITEIT & FEEDBACK
+ KOOLHYDRATEN & BOLUS
+ CGM & OPENAPS
+ POMO
+ Basale waarde [E/uur]
+ Tijdsduur [min]
+ OpenAPS SMB
+ SMB
+ Activeer UAM
+ Activeer SMB
+ SMB in plaats van tijdelijke basalen voor snellere reactie
+ Detectie van niet aangekondigde (UnAnnounced) Maaltijden
+ IOB curve piek tijd
+ Piek tijd [min]
+ Free-Peak Oref
+ Snel-werkende Oref
+ Ultra-Rapid Oref
+ DIA van %1$f te kort - %2$f wordt inplaats gebruikt!
+ Activeer profiel
+ Datum
+ Ongeldig
+ Wachten op koppelen van de pomp
+ Koppeling geslaagd
+ Koppeling verlopen
+ Koppelen
+ Geen toestel gevonden
+ Ampul leeg
+ Bloed glucose meetpunt alarm
+ Resterende insuline hoeveelheid
+ DanaRS
+ Dana
+ Geselecteerde pomp
+ Koppel nieuwe pomp
+ Bolus snelheid
+ Zet de basale stap op 0,01 E/uur
+ Serie nummer
+ Percentage
+ Tijd verschuiving
+ Standaard tijdelijk basaal
+ Eet binnenkort periode
+ Eet binnenkort doel
+ Periode van inspanning
+ Activiteits doel
+ Hypo tijdsduur
+ Hypo streefwaarde
+ Vullen
+ Vertraagde bolus status ophalen
+ Bolus status ophalen
+ Ophalen van tijdelijke basaal status
+ Pomp instellingen ophalen
+ Pomp tijd ophalen
+ Herbruik
+ Bedieningen via horloge
+ Stel tijdelijke doelen en bolussen in vanop je horloge.
+ Connectie verlopen
+ Voeding
+ g
+ m
+ u
+ ]]>
+ kJ
+ En
+ Prot
+ Vet
+ ]]>
+ Wachten op complete bolus toediening. Resterend %1$d sec.
+ Uitvoeren van gebeurtenis
+ Bolus toediening gestart
+ Opdracht is nu uitgevoerd
+ Pomp service gecorrigeerd
+ Pomp niet beschikbaar
+ Geen BG metingen
+ Gebruik systeem notificaties voor waarschuwingen en notificaties
+ Lokaal gegenereerde waarschuwingen
+ Alarm als er geen BG gegevens ontvangen zijn
+ Waarschuwing bij niet bereikbare pomp
+ Pomp niet beschikbaar sinds [min]
+ Dringend alarm
+ INFO
+ Bluetooth
+ BT Watchdog
+ Deactiveert de bluetooth functie van de telefoon gedurende een ogenblik. Dit kan op sommige gsm\'s een vastgelopen bluetooth service verhelpen.
+ DexcomG5 App (aangepast)
+ Upload BG gegevens naar NS
+ G5 Upload instellingen
+ Poctech upload instellingen
+ Toon gedetailleerde delta
+ Toon delta met een extra decimaal punt
+ Maximum aantal minuten basaal om de SMB te limiteren tot
+ Niet ondersteunde pomp firmware
+ Stuur BG data naar xDrip+
+ In xDrip+ kies 640g/Eversense data bron
+ NSClient BG
+ Basale waarde vervangen door minimaal ondersteunde waarde; %s
+ Basale waarde vervangen door maximale ondersteunde waarde: %s
+ BG berekening
+ Bolus IOB berekening
+ Basaal IOB berekening
+ Trend berekening
+ Superbolus berekening
+ Ja
+ Nee
+ Enkel positief
+ Enkel negatief
+ COB berekening
+ Tijdelijk doel berekenen
+ Loop Actief
+ APS geslecteerd
+ NSClient heeft schrijf rechten
+ Closed modus actief
+ Maximum IOB juist ingesteld
+ BG beschikbaar op gekozen bron
+ Basale patroon niet geschikt op complete uren: %s
+ Ongeldig profiel: %s
+ Bolus in pomp programmeren
+ Vernieuw
+ Status
+ Activiteit
+ Geen verbinding gedurende %1$d min
+ %1$d%% (%2$d min resterend)
+ Initialiseren
+ Gestopt door een storing
+ Gestopt door de gebruiker
+ Actief
+ Annuleren van TB
+ Instellen TBR (%1$d%% / %2$d min)
+ Bolus (%.1f E)
+ Vernieuwen
+ Gevraagde is niet mogelijk met de pomp
+ Opgelet: verlengde en multi wave bolussen zijn actief. Loop is overgeschakeld naar low-suspend modus gedurende 6 uur. Alleen gewone bolussen worden ondersteund in loop modus
+ Onveilig gebruik: de pomp gebruikt een andere basaal stand dan de eerste. Loop is uitgeschakeld. Selecteer het eerste profiel en ververs.
+ Een bolus met dezelfde hoeveelheid was gevraagd binnen de afgelopen twee minuten. Om incidentele of door bugs veroorzaakte dubbele bolussen te voorkomen is deze bolus geannuleerd.
+ Zojuist
+ Lezen van pomp historiek
+ Historiek
+ Instellen van basaal profiel
+ Insuline ampul is bijna leeg
+ Batterij pomp is bijna leeg
+ Pomp is in storing, controleer op de pomp: E%1$d %2$s
+ Bijna leeg
+ Leeg
+ Normaal
+ Pomp klok moet bijgesteld worden
+ Waarschuwing
+ TBR GEANNULEERD waarschuwing is bevestigd
+ Er kon geen verbinding met de pomp gemaakt worden. De Bolus is niet toegediend.
+ Bolus toedienen mislukt. Waarschijnlijk is er geen bolus toegediend. Gelieve de pomp te controleren om een dubbele bolus te voorkomen. Indien nodig geef je een nieuwe bolus. Als bescherming tegen programmeerfouten worden bolussen niet automatisch opnieuw uitgevoerd.
+ Maar %1$.2f E van de gevraagde %2$.2f E zijn toegediend door een storing. Gelieve op de pomp te controleren en het gepaste gevolg uit te voeren.
+ Het toedienen van de bolus en het controleren van de geschiedenis van de pomp is mislukt, controleer de pomp. Als een bolus is toegediend, wordt deze toegevoegd aan Behandelingen tijdens de volgende verbinding met de pomp.
+ Niet genoeg insuline aanwezig in reservoir voor de bolus
+ Vertraagde bolus toedieningsfout
+ Insight
+ Insight pomp
+ Status
+ Verwisseld
+ Pomp Gestopt
+ Status vernieuwd
+ voorbij
+ met
+ Actieve TBR
+ resterende minuten
+ Logboek
+ Laatst afgewerkte actie
+ min
+ resterende van
+ totaal
+ op voorhand met
+ Blijf altijd verbonden
+ Rust
+ Synchroniseren
+ Bezig
+ Gesynchroniseerd
+ Opstarten
+ benodigd
+ Niet verbonden met de Companion app!
+ Companion app lijkt niet geïnstalleerd!
+ Incompatiebele Companion app, we hebben deze versie nodig
+ Onbekend
+ Wacht op confirmatie van code
+ Code geweigerd
+ app koppeling
+ Niet geautoriseerd
+ incompatibel
+ seconde
+ minuut
+ uur
+ dag
+ week
+ s
+ %1$ds verloopt %2$s
+ Keep-alive status
+ Statistieken
+ Verbind preventief
+ Automatische verbinden wanneer AndroidAPS scherm geopend wordt, voordat er een pomp commando wordt uitgevoerd om zo de verbindingsvertraging te verkleinen
+ Niet aanbevolen door hoog batterij verbruik
+ Activeer SMB altijd
+ SMB altijd onafhankelijk van bolussen. Enkel mogelijk met een BG bron met goed gefilterde data zoals de G5
+ Activeer SMB na koolhydraten
+ SMB actief gedurende 6u, zelfs met 0 COB. Enkel mogelijk met een BG bron met goed gefilterde data zoals de G5
+ Activeer SMB met Koolhydraten
+ SMB actief tijdens actieve koolhydraten
+ Gebruik SMB met tijdelijke doelen
+ Gebruik SMB bij een actief tijdelijk basaal (binnenkort eten, inspanningen)
+ Gebruik SMB met een hoog tijdelijk doel
+ Gebruik SMB tijdens een verhoogd tijdelijk doel (Inspanningen)
+ Laat tijdelijk basaal lopen
+ Geluid dempen
+ Insuline
+ Koolhydraten
+ Knoppen
+ Stuurt een kalibratie naar xDrip+ of opent het G5 calibratie venster
+ Opent xDrip+, terug knop voor terug naar AAPS te gaan
+ Aantal koolhydraten toevoegen wanneer de knop wordt ingedrukt
+ Hoeveelheid insuline dat wordt toegevoegd wanneer er op de knop gedrukt wordt
+ Kon de CGM applicatie niet starten. Zorg dat deze geïnstalleerd is.
+ CGM
+ Historiek venster
+ Waarschuw bij SMB
+ Toon SMB op horloge zoals gewone bolussen.
+ Creëer een melding bij storingen
+ Creëer een Nightscout melding voor storingen en lokale waarschuwingen (ook zichtbaar in het Careportal en Behandelingen)
+ Toon de voorspellingen op het horloge.
+ Voorspellingen
+ Data Keuzes
+ Fabric Upload
+ Sta automatische crashrapporten en verder gebruik van data toe zodat deze naar de ontwikkelaars via fabric.io kan verzonden worden.
+ Update dexcom G5 app naar de ondersteunde versie
+ Start inspanning TT
+ Start binnenkort eten TT
+ TT
+ Geen bolus toedienen enkel in behandelingen zetten
+ Categorie
+ Subcategorie
+ Bolus zal enkel opgeslagen worden
+ Automatische onbekende BGs aanvullen van NS
+ SMB op de pomp ingesteld
+ Gevoeligheid
+ Afwijkingen
+ Opgenomen Koolhydraten
+ Opgenomen Insuline
+ Basalen
+ Geen actie geselecteerd, er zal niets uitgevoerd worden
+ Start Hypo TT
+ Dev versie actief. Closed loop gedeactiveerd
+ Engineering modus is geactiveerd
+ Engineering modus is niet geactiveerd en dit is niet de release branche
+ %.2f E/uur
+ Basaal profiel wordt gelezen
+ De pomp historiek is gewijzigd nadat de bolus berekend was. De bolus is Niet toegediend. Programmeer een nieuwe bolus indien nodig.
+ Bolus succesvol toegediend, maar toevoegen van de behandeling is gefaald. Dit kan voorvallen wanneer twee kleine bolussen van dezelfde grote gekozen waren gedurende de laatste 2 minuten. Controleer aub de pomphistoriek en de behandelingen, voeg de ontbrekende toe via het Careportal. Let op dat je geen 2 dezelfde hoeveelheden hebt op hetzelfde ogenblik.
+ Tijdelijk basaal geweigerd doordat de berekeningen geen rekening hielden met de recente wijzigingen in de pomp historiek
+ Vernieuwen van pomp status
+ Het basaal patroon is op de pomp gewijzigd en zal binnenkort geupdate worden.
+ Basaal patroon op de pomp is gewijzigd, maar kunnen niet worden uitgelezen
+ Controle van historiek op wijzigingen
+ Verschillende bolussen met dezelfde hoeveelheid op hetzelfde tijdstip zijn geïmporteerd. Er is er maar 1 toegevoegd aan de behandelingen lijst. Controleer op de pomp en voeg eventueel toe via het Careportal menu. Er mogen geen 2 bolussen op hetzelfde tijdstip aanwezig zijn.
+ \n\nhttp://www.androidaps.org \n\nfacebook:\nhttp://facebook.androidaps.org
+ De laatste bolus is ouder dan 24 uren of bevind zich in de toekomst. Controleer de datum en tijd in de pomp aub.
+ Datum/tijd van de geleverde bolus op de pomp is niet correct, IOB is waarschijnlijk foutief. Controleer aub de datum/tijd op de pomp.
+ Profiel wissel ontbreekt. Doe aub een profiel wissel of duw op Activeer Profiel in het Lokale profiel.
+ Aantal bolussen
+ Aantal TBR
+ Doel %1$d niet gestart
+ Doel %1$d niet gereed
+ Pomp kan geen tijdelijk basaal aanvaarden
+ Geen correcte basale snelheid van pomp kunnen lezen
+ Closed Loop modus gedeactiveerd in de voorkeuren
+ Autosens gedeactiveerd in de voorkeuren
+ SMB gedeactiveerd in de voorkeuren
+ Beperken van basaal tot max %1$.2f E/uur wegens de %2$s
+ Pomp limiet
+ dit moet een positieve waarde zijn
+ Max basaal vermenigvuldiger
+ Max dagelijks basaal vermenigvuldiger
+ Er is een bolus toegediend gedurende de afgelopen 3 minuten, SMB wordt overgeslagen
+ Basaal correct ingesteld
+ Begrezen van max procentuele wijzigen tot %1$d%% want de %2$s
+ Bolus beperkt tot %1$.1f E doordat %2$s
+ Max IOB wordt beperkt tot %1$.1f E doordat %2$s
+ Koolhydraten worden beperkt tot %1$d gr doordat %2$s
+ IOB gelimiteerd tot %1$.1f E doordat %2$s
+ Maximum waarde in voorkeuren
+ max limiet (SC)
+ Onveilig gebruik
+ Lezen van status mislukt
+ Markeer een infuuswissel in NS
+ Markeer een insuline ampul wissel in NS
+ SMB altijd gedeactiveerd doordat de gekozen BG bron geen optimale filtering toepast
+ SMB niet toegestaan in Open Loop modus
+ Voeding
+ Reset
+ Wachten voor tijdsynchronisatie (%1$d sec)
+ Verbinding verbroken (%1$d m)
+ Automatische Careportal gebeurtenissen
+ Automatische Insuline, infusieset wissels, batterij wissels en pomp alarmen naar NS uploaden
+ Max totaal IOB dat OpenAPS niet kan overschrijden [E]
+ Deze waarde heet MAX IOB in OpenAPS context\nOpenAPS zal geen extra insuline toedienen als de actuele IOB onderstaande waarde overschreden heeft
+ Pomp gestopt
+ Pomp gestart
+ Pomp gepauzeerd
+ Maximum maaltijd absorptie tijd [uur]
+ Tijdspanne waarbinnen elke maaltijd volledig is opgenomen. Resterende KH worden niet mee gerekend.
+ Tijd
+ Toon het notities veld in het behandeling dialoog
+ Volgende
+ Vorige
+ Setup Wizard
+ FINISH
+ Selecteer uw taal
+ Eerste insuline increment
+ Tweede insuline increment
+ Derde insuline increment
+ Eerste koolhydraten increment
+ Tweede koolhydraten increment
+ Derde koolhydraten increment
+ CGM
+ Gebuik enkel de WiFi verbinding
+ WiFi SSID
+ Enkel tijdens opladen
+ Verbindings instellingen
+ Toegelaten SSIDs (gescheiden door puntkomma)
+ Sta verbinding tijdens roaming toe
+ Max autosens factor
+ Min autosens factor
+ Bolus snooze dia deler
+ Maximale dagelijkse veiligheids vermeningvuldigings factor
+ Actuele veiliheids verhoger van basaal
+ n/a
+ 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
+ Scherm instellingen
+ Algemene instellingen
+ NSClient inschakelen
+ Welkom bij de wizard setup. Het zal je begeleiden door het setup-process\n
+ Pomp setup
+ Lees status
+ Wijzigingen moeten worden gedaan in Nightscout
+ De installatiewizard overslaan
+ Druk op de knop hieronder om AndroidAPS basaalwijzigingen te laten voorstellen/uitvoeren
+ Druk op de knop hieronder voor het activeren van Doelen. Kijk in het tabblad Doelen nadat u klaar bent met deze wizard, om AndroidAPS volledig functioneel te krijgen. \n
+ Inschakelen van Doelen
+ APS plugin configureren
+ Gevoeligheid plugin configureren
+ Gevoeligheid plugin wordt gebruikt voor de detectie van de gevoeligheid en COB berekening. Voor meer info bezoek:
+ https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COB
+ NSClient zorgt voor verbinding met Nightscout. Je kunt dit deel nu overslaan, maar pas het Doel afronden als je het ingesteld hebt.
+ Onthoud: nieuwe insuline profielen vereisen een minimale DIA van 5 uur. DIA 5 – 6h op nieuw profiel is gelijk aan DIA 3h op oude insuline profielen.
+ BG bron configureren
+ Kies een bron van het profiel. Als de patiënt een kind is, moet u het NS-profiel gebruiken. Als er niemand is die je volgt op Nightscout, zul je waarschijnlijk een lokaal profiel prefereren. Onthoud dat u alleen de profielbron selecteert. Om het te gebruiken, moet u het activeren door \"Profiel wisselen\" uit te voeren
+ Selecteer een van beschikbare algoritmen. Ze zijn gesorteerd van oudste naar nieuwste. Nieuwer algoritme is meestal krachtiger en agressiever. Dus als je een nieuwe looper bent, kun je waarschijnlijk beginnen met AMA en niet met de nieuwste. Vergeet niet de OpenAPS-documentatie te lezen en deze vóór gebruik te configureren.
+ Start je eerste Doel
+ Toestemming
+ Vragen om toestemming
+ Toepassing heeft toestemming nodig voor bepalen van Locatie (voor BT scan)
+ Applicatie heeft toestemming nodig om log bestanden op te kunnen slaan
+ Verzoek
+ Gevoeligheid plugin configureren
+ Afsluiten
+ Gebruikersopties
+ Tijdnotatie
+ Scroll-knop
+ Geef een \'piep\' als op een knop gedrukt wordt
+ Alarm
+ Geluid
+ Trillen
+ Beide
+ LCD on time [s]
+ Backlight on time [s]
+ Glucose units
+ Shutdown(hours)
+ Laag reservoir (eenheden)
+ Opslaan van de opties om de pomp
+ Aan
+ Uit
+ Open navigatie
+ Sluit navigatie
+ Plugin voorkeuren
+ Voltooid, goed gedaan!
+ Nog niet voltooid
+ Verstreken tijd
+ %1$d. Doel
+ Poctech
+ Ontvang BG waardes van Poctech app
+ Hoge temptarget verhoogt de gevoeligheid
+ = 100]]>
+ Lage temptarget verlaagt de gevoeligheid
+
+ Ongeldige pompinstellingen, controleer de documenten en controleer of het Quick Info-menu QUICK INFO wordt genoemd met behulp van de 360-configuratiesoftware.
+ Aangepast
+ Groot tijdsverschil
+ Groot tijdsverschil: \nDe tijd in de pomp wijkt meer dan 1,5 uur af. \nStel de tijd handmatig in op de pomp en zorg ervoor dat het uitlezen van de geschiedenis van de pomp geen onverwacht gedrag veroorzaakt. \nIndien mogelijk verwijder de geschiedenis uit de pomp pomp voor het wijzigen van de tijd of schakel de Closed Loop uit voor één DIA na de laatste verkeerde invoer van de geschiedenis, maar vanaf nu minstens één DIA.
+ Verwijder AndroidAPS start-meldingen
+ Opgeslagen instellingen gevonden
+ Let op: als u activeert en verbinding maakt met een hardwarepomp, kopieert AndroidAPS de basale instellingen van het profiel naar de pomp en overschrijft de bestaande basaal snelheid die op de pomp is opgeslagen. Zorg ervoor dat u de juiste basaal instelling hebt in AndroidAPS. Als u niet zeker weet of niet wilt dat de basaal instellingen op uw pomp worden overschreven, drukt u op Annuleren en herhaalt u het overschakelen naar de pomp op een later tijdstip.
+ Behandelingen data incompleet
+ Onderhoudsinstellingen
+ E-mail
+ Ongeldige e-mail
+ Aantal Logs om te verzenden
+ Onderhoud
+ ONDH
+ Biedt verschillende functies voor onderhoud (bv. log verzenden, verwijderen melden).
+ Verstuur Logs per e-mail
+ Verwijder Logs
+ Een Behandeling (insuline: %1$.2f, koolhydraten: %2$d, in: %3$s) niet konden worden toegevoegd aan Behandelingen. Gelieve te controleren en handmatig een record toe te voegen indien nodig.
+ eCarbs: %1$d g (%2$d h), vertraging: %3$d m
+ Geen autosens-gegevens beschikbaar
+ Log instellingen
+ Terug naar standaardinstellingen
+ NSClient werkt niet goed. Overweg een herstart van NS en NSClient.
+ AS
+ Versie %1$s is beschikbaar
+ Tijdverschuiving
+ Voorkeur APS-modus
+ Totaal
+ Calc
+ Handshaking
+ Logboekbestanden van vandaag verzenden aan ontwikkelaars samen met de onverwachte situatie.
+
+ %1$d dag
+ %1$d dag
+
+
+ %1$d uur
+ %1$d uur
+
+
+ %1$d minuut
+ %1$d minuut
+
-
diff --git a/app/src/main/res/values-pl/insight_alerts.xml b/app/src/main/res/values-pl/insight_alerts.xml
new file mode 100644
index 0000000000..70489fbc5e
--- /dev/null
+++ b/app/src/main/res/values-pl/insight_alerts.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index e8ff881837..70489fbc5e 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -1,920 +1,3 @@
-
- Bezpieczeństwo leczenia
- Maks. dopuszczalny bolus [U]
- Maks. dopuszczalne węglowodany [g]
-
- Ustawienia
- Odśwież/pobierz działania z NS
- Zresetuj bazy danych
- Na pewno chcesz zresetować bazy danych?
- Wyjście
- Używaj przedłużonych bolusów >200%
- Urządzenie Bluetooth DanaR
- Zawsze używaj wartości bezwzględnych bazy
- Proszę uruchomić ponownie telefon lub zrestartować AndroidAPS w ustawieniach systemu telefonu \inaczej AndroidAPS nie będzie otrzymywał logowań (ważne ze względu na śledzenie i sprawdzanie poprawności działania algorytmów)!
-
- Start
- Sprawdź
- Jednostki
- DIA
- IC
- ISF
- Baza
- Cel
- NIE USTAWIONO PROFILU
- Insulina:
- Węglowod.:
- IOB:
- IOB:
- Aktywność:
- Całkowita IOB:
- Aktywność całkowitej IOB:
- Czas:
- Iloczyn:
- Ins:
- IOB:
- Całkowita IOB:
- Insulina
- Węglow.
- BG
- TT
- Węglow
- Korekta
- U
- Bolus IOB
- Uruchom teraz
- POMPA WIRTUALNA
- Podstawowa dawka bazowa
- Baza tymczasowa
- Bolus przedłużony
- Bateria
- Zbiornik
- OK
- Ostatnie działanie
- Parametry wejściowe
- Stan glukozy
- Obecna tymczasowa
- IOB data
- Profil
- Dane posiłku
- Rezultat
- Brak danych o glukozie
- Zmiana nie wymagana
- Żądanie
- Wartość
- Czas trwania
- Powód
- Glukoza
- Delta
- Delta:
-
- Konfiguracja
- Zadania
- OpenAPS MA
- Przegląd
- NS Profil
- Prosty profil
- TymczasowaBaza
- Leczenie
- Pompa wirtualna
- PortalOpieki
- Pompa
- Leczenie
- Profil
- APS
- Ogólne
- dni
- Ograniczenia
- Pętla
- Pętla
- APS
- Po ograniczeniach
- Baza tymczasowa ustawiona przez pompę
- Ostatnie działanie
- OK
- Anuluj
- NIE WYBRANO APS LUB NIE UZYSKANO WYNIKU
- Zabezpieczenia
- Plugin jest wyłączony
- Naruszenie ograniczeń
- Błąd podania bolusa
- Błąd podania bazy tymczasowej
- Wartość bazy [%]
- % (100% = current)
- Akceptuj nową bazę tymczasową:
- Leczenie
- Kalkulator
- Ograniczenie nałożone!
- Potwierdzenie
- Wprowadź nowe leczenie:
- Bolus
- Bolus:
- Baza
- Baza:
- Węglow.
- Zmień wprowadzone dane!
- Ustaw nowy bolus przedłużony:
- Źródło BG
- xDrip
- APS Mode
-
- Zamknięta pętla
- Otwarta pętla
- Pętla wyłączona
- Wyłącz pętle
- Włącz pętle
-
- Dostępna nowa sugestia
- Niewspierana wersja NSClient
- Niewspierana wersja Nightscout
- NSClient nie zainstalowany. Zapis stracony!
- BG dostępne w NS
- Status pompy dostępny w NS
- Zmiany wykonane
- PĘTLA WYLĄCZONA Z UWAGI NA OGRANICZENIA
- Czech
- English
- Bazowa IOB
- Ograniczenia bolusa wprowadzone
- Ograniczenia węglow. wprowadzone
- Sprawdź BG
- Powiadomienie
- Notatka
- Pytanie
- Ćwiczenia
- Zmiana wkłucia
- Założenie sensora CGM
- Uruchomienie sensora CGM
- Zmiana zasobnika insuliny
- Zmiana profilu
- Bolus na przekąskę
- Bolus na posiłek
- Bolus korekcyjny
- Bolus złożony
- Dawka Tymczasowa Start
- Dawka Tymczasowa Koniec
- Węglow. korekcyjne
- OpenAPS Rozłączony (Offline)
-
- Typ zdarzenia
- Inne
- Miernik
- Sensor
- Węglow.
- Insulina
- Czas węglow.
- Podział
- Czas trwania
- Procent
- Całkowity
- Notatki
- Czas zdarzenia
- Profil
- Wprowadzone przez
- Typ glukozy
- Nie załadowano profilu z NS
- BazaTymczasowa
- Bolus Przedłużony
- Wersja Nightscout:
- Brakujące
- Właściwości wyeksportowane
- Eksportuj ustawienia do
- Importuj ustawienia z
- Ustawienia zaimportowane
- Nie znaleziono pliku
- Eksportuj ustawienia
- Importuj ustawienia
- Dutch
- German
- Spanish
- Greek
- Italian
- Romanian
- Russian
- Swedish
- French
- Chinese
- Polski
- Max U/h Tymczasowa Dawka Bazowa może być ustawiona
- Wartość nazywana Maksymalną Bazą w OpenAPS
- Maksymalna bazowa IOB, którą OpenAPS może dostarczyć [U]
- Ta wartość jest nazywana Max IOB w OpenAPS\nTo jest maksymalna wartość insuliny w [U], którą APS może dostarczyć w danej chwili.
- Bulgarian
- ODRZUĆ
- Język
-
- DanaR
- Łączę
- Połączono
- Rozłączono
- Ustawienia pompy DanaR
- Umowa licencyjna użytkownika końcowego
- NIE MOŻE BY WYKORZYSTYWANY DO PODEJMOWANIA DECYZJI MEDYCZNYCH. NIE MA ŻADNEJ GWARANCJI NA PROGRAM, W ZAKRESIE DOZWOLONYM PRZEZ OBOWIĄZUJĄCE PRAWO. Z WYJĄTKIEM PRZYPADKÓW, GDY W INNY SPOSÓB PISMO OŚWIADCZENIA PRAW AUTORSKICH I / LUB INNYCH STRON, PRZEDSTAWIAĆ PROGRAM "W STANIE TAKIM, W JAKIM SIĘ ZNAJDUJE" BEZ JAKIEJKOLWIEK GWARANCJI, WYRAŹNEJ LUB DOMNIEMANEJ, W TYM MIĘDZY INNYMI DOMNIEMANYCH GWARANCJI PRZYDATNOŚCI HANDLOWEJ I PRZYDATNOŚCI DO OKREŚLONEGO CELU. CAŁKOWITE RYZYKO ZWIĄZANE Z JAKOŚCIĄ I WYNIKIEM PROGRAMU JEST PO PAŃSTWA STRONIE. W PRZYPADKU USZKODZENIA PROGRAMU UŻYTKOWNIK PONOSI KOSZT CAŁEGO NIEZBĘDNEGO SERWISU, NAPRAWY LUB POPRAWEK. W PRZYPADKU NIEPOROZUMIEŃ ZASTOSOWANIE PRAWNE MA UMOWA W ANGIELSKIEJ WERSJI JĘZYKOWEJ!!!
- ROZUMIEM I WYRAŻAM ZGODĘ
- ZACHOWAJ
- Nie odnaleziono urządzenia bluetooth
- Nie odnaleziono wybranego urządzenia
- Błąd połączenia z pompą
- IOB w pompie
- Jednostki dzienne
- Ostatni bolus
- %.1fh temu
- Błędne dane wejściowe
- Wartość ustawiona nieprawidłowo
- Załaduj profil ponownie
- Zobacz profil
- Wykonane
- Komentarz
- Sukces
- Procent
- Całkowity
- Wyłącz bazę tymczasową
- Komunikator SMS
- Oczekiwanie na wynik
- Dozwolone numery telefonów
- +XXXXXXXXXX;+YYYYYYYYYY
- Aby dostarczyć bolus %1$.2fU wprowadź kod %2$s
- Aby wysłać kalibrację %1$.2f wprowadź kod %2$s
- Bolus nieudany
- Bolus %.2fU dostarczony
- Zamierzam dostarczyć %.2fU
- Bolus %.2fU dostarczony
- Dostarczam %.2fU
- Zezwalaj na komendy zdalne via SMS
- Bolus zdalny nie dozwolony
- Palec
- Sensor
- Ręczne
- Cel tymczasowy (TT)
- Odrzuć Cel tymczasowy
- Ustawienia profilu DanaR
- DIA [h]
- Czas aktywności insuliny
- Nieudane uaktualnienie profilu bazy
- Załaduj ponownie
- Wgrywanie
- E bolus
- DS bolus
- DE bolus
- błąd
- napełnij
- godzina bazy
- glukoza
- węglowodany
- alarm
- Wszystkie %d rekordy załadowane
- S bolus
- Alarmy
- Godziny Bazy
- Bolusy
- Węglowodany
- Insulina dzienna
- Błędy
- Glukoza
- Napełnij
- Wstrzymaj
- Łączę przez %d s
- Hasło pompy
- Błędne hasło pompy!
- Pompa jest zajęta
- Dostarczone
- Zatrzymane
- Bolus zatrzymany
- Zatrzymuję bolus
- Zatkanie
- Stop
- NACIŚNIĘTY STOP
- Czekam na pompę
- Zamierzam podać %.2fU
- Konfigurowanie wizualizacji i monitorowania, analizowanie dawek bazowych i wartości
- Sprawdź czy BG (pomiary cukru) są dostępne w Nightscout, i dane pompy insulinowej są ładowane
- Uruchamiam otwartą pętle (OpenLoop)
- Używaj Otwartą pętle (OpenLoop) przez kilka dni, i ręcznie wykonaj wiele dawek bazowych tymczasowych. Set up and use temporary and default temporary targets (e.g. for activity or hypo treatment carbs)
- Zrozumienie działania otwartej pętli, wraz z jej rekomendacjami dawek tymczasowych
- Na podstawie tych doświadczeń zdecyduj jaka maksymalna baza powinna być ustawiona, i wprowadź ją w pompie i w ustawieniach AAPS
- Rozpoczęcie zamknięcia pętli z zawieszeniem podawania bazy przy niskim poziomie cukru
- Używaj zamkniętej pętli (Closed Loop) z max IOB (maksymalną dawką aktywnej insuliny) = 0 bez zbyt wielu incydentów niskiego poziomu cukru
- Dostrajanie zamkniętej pętli, podniesienie wartości max IOB powyżej 0 i stopniowe obniżanie docelowego poziomu cukru (BG target)
- Używaj pętli przez kilka dni i przynajmniej jedną noc bez żadnego alarmu niskiego poziomu, przed obniżeniem docelowego poziomu cukru (BG target)
- Dostosuj bazę i wartości parametrów, i wtedy uruchom funkcję autosens
- 1 tydzień sukcesu w działaniu pętli w ciągu dnia z regularnym wprowadzaniem spożywanych węglowodanów (węglow.)
- Uruchomienie do użytku dziennego dodatkowych funkcji, jak AMA (zaawansowany asystent posiłku)
- Uruchomienie do użytku dziennego dodatkowych funkcji, jak SMB (Super Mikro Bolusy)
- Osiągnąłeś dozwolony limit
- Nie wybrano profilu
- Pętla (Loop) została wyłączona
- Pętla (Loop) została włączona
- Pętla (Loop) jest wyłączona
- Pętla (Loop) jest włączona
- %1$.2f ograniczone do %2$.2f
- Wartość %s jest poza dopuszczalną granicą
- Ustawienie zdalnej bazy nie jest dozwolone
- Zdalne komendy nie są dozwolone
- Aby rozpocząć bazę %1$.2fU/h odpowiedz kodem %2$s
- Aby wstrzymać pętle na %1$d minut odpowiedz kodem %2$s
- Tymczasowa baza %1$.2fU/h przez %2$d min rozpoczęta
- Rozpoczęcie tymczasowej bazy nie powiodło się
- Aby zatrzymać bazę tymczasową odpowiedz kodem %s
- Baza tymczasowa anulowana
- Anulowanie tymczasowej bazy nie powiodło się
- Nieznane polecenie lub błędna odpowiedź
- SzybkiKreator
- Ustawienia SzybkiegoKreatora
- Tekst przycisku:
- Węglow.:
- Ważny:
- Dodaj
- Edytuj
- Usuń
- Posiłek
- Korekta
- Korean
- Akcje
- AndroidAPS uruchomiony
- NS tylko przesył. (wyłączona synch.)
- NS tylko przesył. Nie skuteczne na SGV o ile ni jest wykorzystywane lokalne źródło danych jak xDrip. Nie skuteczne na Profilach gdy profil z NS jest wykorzystywany.
- Pompa nie zainicjowana!
- Pompa nie zainicjowana, profil nie ustawiony!
- Rozpocznij/Wypełnij
- Proszę upewnij się, że ilość wypełnienia odpowiada ilości właściwej dla twojego wkłucia!
- Inne
- Rozpocznij/Wypełnij standardowe ilości insuliny.
- Przycisk 1
- Przycisk 2
- Przycisk 3
- Jednostki:
- mg/dl
- mmol/l
- DIA:
- Zakres docelowy:
- Zakres do wizualizacji (na wykresie)
- Oznaczenia wysokiego i niskiego cukru na wykresie w oknie przegląd i na smartwatch\'u
- Znacznik NISKI
- Znacznik WYSOKI
- Oprogramowanie Wear (Smartwatch)
- Prześlij ponownie wszystkie dane
- Otwórz ustawienia dla Wear
- Błąd pompy
- Niski stan baterii
- Wyłączenie pompy
- Bateria pompy rozładowana
- DanaR Korean
- Dawka bazowa:
- Ustawienie profilu bazy nie powiodło się
- Profil bazowy w pompie uaktualniony
- Wyłącz tryb EasyUI w pompie
- Uaktywnij bolusy przedłużone w pompie
- Zmień tryb z U/d na U/h w pompie
- Wartość bazy poniżej minimum. Nie ustawiono profilu!
- BG:
- Ostatnia BG:
- MDI
- MM640g
- Nadchodzące powiadomienia
- NIEAKTUALNE DANE
- %d min temu
- %dmin temu
- Lokalny Profil
- OpenAPS AMA
- Krótka średnia delta
- Długa średnia delta
- Lista %d elementów.\nBieżąca wartość:
- Dane Autosens
- Debugowanie skryptów
- Używaj funkcji AMA autosens
- Odśwież zdarzenia z NS
- Wkrótce posiłek
- Hipo
- Ćwiczenia
- Usuń rekord:
- DanaR Statystyki
- Kumulatywna TDD (dawka dzienna)
- Ważona wykładniczo TDD
- Baza
- Bolus
- TDD
- Data
- Stosunek
- # Dni
- Waga
- Możliwa niedokładność jeśli używasz bolusów do wypełnień!
- Stare dane, naciśnij "RELOAD"
- Suma dzienna bazy (TBB)
- TBB * 2
- Inicjuje ...
- ACT
- CONF
- LOOP
- SP
- OAPS
- LP
- DANA
- HOME
- VPUMP
- NSPROFIL
- TREAT
- CP
- OBJ
- WEAR
- SMS
- Skrócone tytuły kart
- Zawsze używaj krótkiej średniej delty zamiast prostej delta
- Użyteczne, jeżeli dane z niefiltrowanego źródła jak xDrip mają rozrzut.
- Ustawienia zaawansowane
- Model: %1$02X Protocol: %2$02X Code: %3$02X
- Profil
- Wartość domyślna: 3 To jest kluczowy współczynnik bezpieczeństwa OpenAPS. Ogranicza dawki bazowe do 3x twojej największej dawki bazowej. Prawdopodobnie nie będziesz musiał tego zmieniać, ale powinieneś być świadomy tego, co się rozumie przez “3x max daily; 4x current” dla współczynników bezpieczeństwa.
- Wartość domyślna: 4 To jest drugi kluczowy współczynnik bezpieczeństwa OpenAPS, i druga wartość z “3x max daily; 4x current”. To oznacza, że Twoja dawka bazowa niezależnie od maksymalnej bazy ustawionej na pompie nie może być większ niż ta ustawiona ilość razy twoja aktuialna dawka bazowa. To ma na celu porzestrzec ludzi przed ustawieniem zbyt wysokiej dawki maksymalnej przed zrozumieniem jak działa algorytm. Ponownie, wartość domyślna to 4x; większość ludzi nie będzie potrzebowała tego zmienić i raczej będą potrzebować dostosować inne ustawienia, jeśli czują, że "wpadają" w ten współczynnik bezpieczeństwa.
- Default value: 1.2\nTo jest mnożnik dla autosens (i wkrótce autotune), ustawia 20% maks. limit dla najwyższej wartości jaką autosens może przyjąć, co z kolei określa jak wysoko autosens może ustawić bazę, jak nisko może ustawić ISF, i jak nisko może ustawić docelową wartość glikemii.
- Wartość domyślna: 0.7\nDruga strona limitu bezpieczeństwa dla autosens, ustawia mnożnik minimalny dla wartości, do jakiej autosens może obniżyć bazę, i jak wysoko może ustawić ISF i wartość docelową BG.
- Autosens dostosowuje rwnież wartości docelowe
- Default value: true\nTa wartość pozwala autosens na dostosowanie wartości docelowych BG, dodatkowo do wartości bazy i ISF.
- Wartość domyślna: 2\nBolus snooze jest uruchamiany po wykonaniu bolusa posiłkowego, tak by pętla nie przeciwdziałała niskim wartościom tymczasowym zaraz po posiłku. Jako przykład i wartość domyślna ustawione jest 2; więc 3 godzinne DIA oznacza, że bolus snooze będzie stopniowo wycofany po 1.5 godziny (3DIA/2).
- Wartość domyślna: 3.0 To jest ustawienie domyślnego wpływu wchłaniania węglowodanów w czasie 5 min. Wartością domyślną jest spodziewane 3mg/dl/5min. Ma to wpływ na szybkość zaniku COB, oraz jak duże wchłanianie węglowodanów będzie przyjęte do obliczeń przyszłych przewidywanych wartości BG, jeżeli BG obniża się bardziej niż w założeniach, lub nie wzrasta tak szybko jak w założeniach.
- UWAGA!\nZwykle nie trzeba zmieniać tych wartości. Proszę NACIŚNIJ TUTAJ i PRZECZYTAJ tekst i upewnij się, że ROZUMIESZ go przed zmianą którejś z tych wartości.
- Dozwolone są tylko cyfry.
- Dozwolone są tylko cyfry w zakresie %1$s - %2$s.
- Pole nie może być puste
- Nieprawidłowy numer telefonu
- Nieprawidłowy numer telefonu SMS
- Skopiuj do schowka
- Skopiowane do schowka
- Pokaż log
- Kalibracja
- Wysłać kalibrację %.1f do xDrip?
- xDrip+ nie zainstalowany
- Kalibracja przesłana do xDrip
- Zdalna kalibracja nie dozwolona
- Kalibracja wysłana. Odbiór musi być dozwolony w xDrip.
- xDrip nie odbiera kalibracji
- Pompa wstrzymana
- Uzyskiwanie statusu pompy
- Ustawianie bazy tymczasowej
- Zatrzymywanie bazy tymczasowej
- Ustawianie bolusa przedłużonego
- Zatrzymywanie bolusa przedłużonego
- Uaktualnianie dawek bazowych
- Rozłączanie
- Wykonywanie
- Ustawienia pompy wirtualnej
- Załaduj status do NS
- Złe hasło
- Hasło do ustawień
- Odblokuj ustawienia
- Zbliżam się do dziennego limitu insuliny
- NSClient
- NSCI
- URL:
- Autoscroll
- Restart
- NSClient
- Nightscout URL
- Wprowadź URL Nightscout
- NS API secret
- NS API secret
- Wprowadź NS API secret (min 12 chars)
- Dostarcz teraz
- Wyczyść kolejkę
- Pokaż kolejkę
- Kolejka:
- Status:
- Wstrzymano
- Wyczyść log
- NSCLIENT nie ma prawa do zapisu. Błędny API secret?
- Ustawienia Wear
- Pokaż szczegóły IOB
- Rozbij IOB na bolus i IOB bazy na zegarku
- nie udało się - proszę sprawdzić telefon
- Niedostępne
- Wiek pacjenta
- Dziecko
- Nastolatek
- Osoba dorosła
- Osoba dorosła insulino odporna
- Proszę wybierz wiek pacjenta w celu ustawienia wartości bezpieczeństwa
- Glimp
- %s Potrzebuję wpisu na białąlistę optymalizacji baterii w celu zapewnienia poprawnego działania
- Pętla wstrzymana
- Wstrzymana (%d m)
- Superbolus (%d m)
- Wstrzymaj pętlę na 1h
- Wstrzymaj pętlę na 2h
- Wstrzymaj pętlę na 3h
- Wstrzymaj pętlę na 10 h
- Wyłącz pompę na 15 min
- Wyłącz pompę na 30 min
- Wyłącz pompę na 1 h
- Wyłącz pompę na 2 h
- Wyłącz pompę na 3 h
- Wznów
- Zły czas trwania
- Pętla wstrzymana
- Pętla wznowiona
- 15min trend
- COB
- Superbolus
- Wyślij start app do NS
- Zamykanie aplikacji w celu wprowadzenia ustawień.
- DanaRv2
- Insulina
- Szybko działająca Insulin
- Novorapid, Novolog, Humalog
- Fiasp
- INS
- Zezwalaj na superbolus w kreatorze
- Zezwalaj na funkcjonalność Superbolus w kreatorze. Nie zezwalaj dopuki nie nauczysz się co ta funkcjonalność wprowadza. MOŻE SPOWODOWAĆ PRZEDAWKOWANIE INSULINY JEŻELI UŻYTE BEZ WIEDZY!
- IOB
- COB
- Firmware
- Ostatnie połączenie
- Status Bluetooth
- O programie
- Utracone pozwolenie SMS
- xDrip Status (watch)
- LiniaStatusu xDrip (watch)
- xds
- Pokaż BGI
- Dodaj BGI do LiniiStatusu
- Brak przesyłania do NS
- Wszystkie dane wysyłane do NS są odrzucane. AAPS jest podłączony do NS, ale nie wykonuje się żadnych zmian w NS
- Krok bazy
- Krok bolusa
- BolusPrzedłużony
- TempTarget
- Anuluj bolus przedłużony
- Czas sensora
- Czas wkłucia
- Czas insuliny
- godzin
- Typ bazy
- Nieważny profil !!!
- ZmieńProfil
- Czas baterii pompy
- Zmiana baterii pompy
- Opcje alarmu
- Uwaga wysoki
- Wysoki
- Niski
- Uwaga niski
- Nieaktualne dane
- Uwaga, nieaktualne dane
- Próg nieaktualne dane [min]
- Próg uwaga nieaktualne dane [min]
- Czasookres dla autosens [h]
- Ilość minionych godzin do określenia wrażliwości (sensitivity)(czas wchłaniania węglowodanów jest wykluczony)
- Pompa
- OpenAPS
- Uploader
- Detekcja wrażliwości (sensitivity)
- SENS
- Wrażliwość Oref0
- Wrażliwość AAPS
- Ustawienia wchłaniania
-
- Maks. czas wchłaniania posiłku [h]
- Oczekiwany czas w godzinach, w którym wszystkie węglowodany zostają wchłonięte
- Pokazuj bolus przedłużony w %
- SAGE
- IAGE
- CAGE
- PBAGE
- OAPS
- UPLD
- BAS
- EXT
- Przy włączonej funkcji Autosens pamiętaj, żeby wprowadzać wszystkie węglowodany. W innym wypadku odchylenia węglowodanów będą błędnie identyfikowane jako zmiany wrażliwości !!
- Wrażliwość ŚredniaWażona
- OK
- Anuluj
- Nie wszystkie profile zostały załadowane!
- Wartości nie są przechowywane!
- Włącz transmisje do innych aplikacji (jak xDrip).
- Włącz transmisję lokalnie.
- AKTYWNOŚĆ & REAKCJA
- WĘGLOW. & BOLUS
- CGM & OPENAPS
- POMPA
- Wartość bazy [U/h]
- Czas trwania [min]
- OpenAPS SMB
- SMB
- Włącz UAM
- Włącz SMB
- Używaj SMB (Super Mikro Bolusów) zamiast bazy tymczasowej dla szybszego działania
- Detekcja niezapowiedzianych posiłków (UAM)
- IOB Czas piku krzywej działania insuliny
- Czas piku [min]
- Swobodny-Pik Oref
- Szybko-Działający Oref
- Ultra-Szybki Oref
- DIA %1$f zbyt krótki - przyjmuję %2$f w zamian!
- Aktywuj profil
- Data
- NIEPRAWIDŁOWY
- Oczekiwanie na pompe na sparowanie
- Sparowanie OK
- Przekroczono limit czasu parowania
- PAROWANIE
- Urządzenie nie zostało znalezione do tej pory
- Pusty zasobnik
- Alarm pomiaru poziomu cukru
- Pozostała ilość insuliny
- DanaRS
- Dana
- Wybrana pompa
- Sparuj nową pompę
- Szybkość podawania bolusa
- Ustaw krok bazy na 0.01 U/h
- Numer seryjny
- Procent
- Zmiana czasu
- Domyślne tymczasowe wartości docelowe
- WkrótcePosiłek czas trwania
- WkrótcePosiłek cel
- Ćwiczenia czas trwania
- Ćwiczenia cel
- Hipo czas trwania
- Hipo cel
- Wypełnianie
- Status otrzymywania bolusa przedłużonego
- Status otrzymywania bolusa
- Status otrzymywania tymczasowej bazy
- Otrzymywanie ustawień pompy
- Otrzymywanie czasu pompy
- użyj ponownie
- Sterowanie z zegarka
- Ustawiaj wartości docelowe i wprowadzaj leczenie z zegarka.
- Przekroczono limit czasu połączenia
- Pożywienie
- g
- m
- h
- ]]>
- kJ
- En
- Bi
- Tł
- ]]>
- Oczekuję na zakończenie bolusa. Pozostało %d sec.
- Przetwarzanie zdarzenia
- Rozpoczynam podawanie bolusa
- Polecenie jest teraz wykonywane
- Poprawiono sterownik pompy
- Pompa nieosiągalna
- Pominięte odczyty BG
- Użyj powiadomień systemowych dla alertów i powiadomień
- Alarmy lokalne
- Alarm, jeśli nie są odbierane odczyty BG
- Alarm, gdy pompa jest nieosiągalna
- Pompa nieosiągalna próg [min]
- Pilny alarm
- INFO
- Bluetooth
- BT Watchdog
- Wyłącza bluetooth telefonu na jedną sekundę, jeśli nie jest możliwe połączenie z pompą. Może to pomóc w niektórych telefonach, w których blokuje się bluetooth.
- DexcomG5 App (patched)
- Przekaż dane BG do NS
- G5 prześlij ustawienia
- Pokaż szczegółowe delta
- Pokaż deltę z jednym więcej miejscem dziesiętnym
- Maks. ilość minut dawki bazowej do ograniczenia SMB
- Nieobsługiwane oprogramowanie pompy
- Prześlij dane BG do xDrip+
- W xDrip+ wybierz źródło danych 640g/Eversense
- NSClient BG
- Wartość bazoy zastąpiona minimalną obsługiwaną wartością
- Obliczenia BG
- Obliczenia Bolus IOB
- Obliczenia IOB
- Obliczenia trendu
- Obliczenia Superbolusa
- Tak
- Nie
- Tylko pozytywne
- Tylko negatywne
- Obliczenia COB
- Temporary target calculation
- Pętla włączona
- Wybrano APS
- NSClient ma prawo do zapisu
- Tryb zamknięty włączony
- Maks. IOB ustawione poprawnie
- BG dostępne z wybranego źródła
- Wartości bazy nie są ustawione w pełnych godzinach: %s
- Nieprawidłowy profil: %s
- Programowanie pompy do podawania bolusa
- Odśwież
- Stan
- Aktywność
- Brak połączenia przez %d min
- %1$d%% (%2$d min pozostało)
- Rozpoczynanie
- Wstrzymane z powodu błędu
- Wstrzymane przez użytkownika
- W działaniu
- Anulowanie TBR
- Ustawianie TBR (%1$d%% / %2$d min)
- Podawanie bolusa (%.1f U)
- Odświeżanie
- Żądana operacja nie jest obsługiwana przez pompę
- Niebezpieczne użycie: aktywne są bolusy przedłużone lub wielofalowe. Tryb pętli został ustawiony tylko na 6 godzinne zawieszenie z uwagi na niski poziom (BG). W trybie pętli obsługiwane są tylko normalne bolusy
- Niebezpieczne użytkowanie: pompa używa innego profilu dawki bazowej niż pierwszy. Pętla została wyłączona. Wybierz pierwszy profil na pompie i odśwież.
- W ciągu ostatnich dwóch minut zażądano bolusa o tej samej wielkości. Z uwagi na zapobieganie przypadkowym podwójnym bolusom i ochronę przed błędami jest to zabronione.
- Teraz
- Sczytuję historię pompy
- historia pompy
- Ustawianie profilu bazowego
- Poziom zasobnika pompy jest niski
- Poziom baterii pompy jest niski
- Pompa wskazuje błąd E%1$d: %2$s
- Niski
- Pusty
- Właściwy
- Potrzebna aktualizacja zegara pompy
- Ostrzeżenie
- TBR ANULOWANY ostrzeżenie zostało potwierdzone
- Pompa nie została odnaleziona. Nie podano bolusa
- Podanie bolusa nie powiodło się. Wygląda na to, że bolus nie został dostarczony. Aby upewnić się, sprawdź pompę, aby uniknąć podwójnego bolusa, a następnie ponownie podaj bolus. Aby uniknąć błędów, bolusy nie są automatycznie ponawiane.
- Only %1$.2f U z zamierzonego bolusa %2$.2f U zostało dostarczone z powodu błędu. Sprawdź pompę, aby sięupewnić i podejmij odpowiednie działania.
- Za mało insuliny na bolus pozostało w zbiorniku
- Błąd dostarczania bolusa przedłużonego
- Wgląd
- Wgląd w pompę
- Status
- Zmieniono
- POMPA ZATRZYMANA
- Status uaktualniony
- temu
- z
- Aktywny TBR
- min pozostało
- Dziennik logów
- Last Completed Action
- min
- remaining over
- total with
- upfront with
- Stay always connected
- BEZCZYNNY
- SYNCHRONIZUJE
- ZAJĘTY
- ZSYNCHRONIZOWANY
- URUCHOMIENIE
- wymagania
- Brak połączenia z aplikacją towarzyszącą!
- Aplikacja towarzysząca prawdopodobnie nie jest zainstalowana!
- Niezgodna aplikacja towarzysząca, potrzebujemy wersji
- Nieznany
- Oczekuję na potwierdzenie kodu
- Kod odrzucony
- Wiązanie aplikacji
- Nieautoryzowany
- Niekompatybilny
- sekunda
- minuta
- godzina
- dzień
- tydzień
- s
- %1$ds wygasa %2$s
- Status czuwania
- Statystyki
- Połącz z wyprzedzeniem
- Automatycznie łącz się, gdy okna AndroidAPS są otwarte, zanim zostanie wydane polecenie do pompy, aby zmniejszyć opóźnienie w połączeniu
- Niezalecane ze względu na szybkie rozładowywanie baterii
- Włącz SMB (Super Mikro Bolusy) zawsze
- Włącz SMB (Super Mikro Bolusy) zawsze, niezależnie od bolusów. Możliwe jedynie ze źródłem BG (poziomu cukru) z dobrym filtrowaniem, jak aplikacja G5
- Włącz SMB po węglowodanach
- Włącz SMB na 6 godzin po węglow., nawet z 0 COB. Możliwe jedynie ze źródłem BG (poziomu cukru) z dobrym filtrowaniem, jak aplikacja G5
- Włącz SMB z COB
- Włącz SMB gdy COB są aktywne.
- Włącz SMB z tymczasowym poziomem docelowym (TT)
- Włącz SMB gdy tymczasowy poziom docelowy (TT) jest aktywny (TT WkrótcePosiłek, TT ćwiczenia)
- Włącz SMB z wysokim tymczasowym poziomem docelowym
- Włącz SMB gdy wysoki tymczasowy poziom docelowy jest aktywny (TT ćwiczenia)
- Pozwól na działanie bazy tymczasowej
- Wycisz
- Insulina
- Węglowod.
- Przyciski
- Wysyła kalibrację do xDrip+ lub otwartego okna kalibracji G5
- Otwiera xDrip+, przycisk "cofnij" przywraca do AAPS
- Liczba węglowodanów do dodania po wciśnięciu przycisku
- Ilość insuliny do dodania po wciśnięciu przycisku
- Nie można uruchomić aplikacji CGM. Upewnij się, że została zainstalowana.
- CGM
- Przegląd historii
- Powiadom na SMB
- Pokaż SMB na zegarku jak bolus standardowy.
- Twórz powiadomienia o błędach
- Twórz powiadomienia Nightscout o błędach i lokalnych alarmach (również widoczne w PortaluOpieki w ramach Leczenia)(
- Pokaż prognozę poziomu na zegarku.
- Prognozy
- Wybór Danych
- Przesyłanie danych fabric
- Zezwalaj na automatyczne zgłaszanie awarii i danych o użytkowaniu aplikacji do deweloperów za pośrednictwem usługi fabric.io.
- Proszę uaktualnić aplikację G5 do wspieranej wersji
- Rozpocznij TT Ćwiczenia
- Rozpocznij TT WkrótcePosiłek
- TT
- Nie podawaj bolusa, tylko zapisz rekord
- Kategoria
- Podkategoria
- Bolus zostanie tylko zapisany w rekordach
- Automatycznie wypełnij brakujące BG z NS
- SMB ustawiony przez pompę
- Wrażliwość
- Odchylenia
- COB (Aktywne Węglow.)
- IOB (Aktywna Insulina)
- Dawki Bazowe
- Nie wybrano żadnej akcji, zdarzenie nie będzie wprowadzone
- Rozpocznij TT Hipo
- Uruchamiona jest wersja dev. Zamknięta pętla jest wyłączona.
- Tryb Inżynierski włączony
- Tryb inżynierski nie włączony i nie pracuje wersja "kandydat do wydania" (RC)
- %.2f U/h
- Wczytuje profil bazowy
- Historia pompy zmieniła się po wykonaniu obliczenia bolusa. Bolus nie został dostarczony. Proszę, przelicz ponownie, jeśli wciąż potrzebujesz bolusa.
- Bolus został pomyślnie dostarczony, ale dodanie wpisu leczenia nie powiodło się. Może się to zdarzyć, jeśli w ciągu ostatnich dwóch minut podano dwa małe bolusy o tej samej wielkości. Sprawdź historię pompy i leczenie i użyj PortaluOpieki, aby dodać brakujące wpisy. Make sure not to add any entries for the exact same minute and same amount.
- Odrzucenie wysokiej dawki tymczasowej ponieważ w obliczeniach nie uwzględniono ostatnio zmienionej historii pompy
- Odświeżanie stanu pompy
- Dawka podstawowa na pompie uległa zmianie i wkrótce zostanie zaktualizowana
- Dawka podstawowa zmieniła się na pompie, ale jej odczyt nie powiódł się
- Sprawdzanie zmian w historii
- Wielokrotne bolusy o tej samej wielkości w tej samej minucie zostały właśnie zaimportowane. Do leczenia można dodać tylko jeden taki rekord. Sprawdź pompę i ręcznie dodaj zapis bolusa za pomocą zakładki PortalOpieki. Upewnij się, że tworzysz bolus z czasem, którego nie używa żaden inny bolus.
- \n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de)
- Ostatni bolus jest starszy niż 24 godziny lub jest w przyszłości. Sprawdź, czy data na pompie jest ustawiona prawidłowo.
- Czas/data dostarczonego bolusa na pompie wydaje się błędna, IOB jest prawdopodobnie niepoprawny. Sprawdź czas/datę pompy.
- Brakuje ZmianyProfilu. Proszę wykonać ZmianęProfilu lub nacisnąć "Aktywuj Profil" w ProfiluLokalnym
- Obliczenia Bolusa
- Obliczenia TBR
- Zadanie %d nie uruchomione
- Zadanie %d nie zakończone
- Pompa nie jest zdolna do wykonywania dawek bazowych tymczasowych
- Brak prawidłowej dawki bazowej odczytanej z pompy
- Tryb zamkniętej pętli wyłączony w ustawieniach
- Autosens wyłączony w ustawieniach
- SMB wyłączone w ustawieniach
- Ograniczam maks. dawkę bazową do %1$.2f U/h z uwagi na %2$s
- ograniczenie pompy
- wartość musi być dodatnia
- mnożnik maksymalnej dawki bazowej
- mnożnik maksymalnej dziennej dawki bazowej
- Bolus został podany w ciągu ostatnich 3 minut, opuszczam SMB
- Baza ustawiona prawidłowo
- Ograniczam maksymalną wartość w procentach do %1$d%% z uwagi na %2$s
- Ograniczam bolus do %1$.1f U z uwagi na %2$s
- Ograniczam max IOB do %1$.1f U z uwagi na %2$s
- Ograniczam węglow. do %1$d g z uwagi na %2$s
- Ograniczam IOB do %1$.1f U z uwagi na %2$s
- maks. wartość w ustawieniach
- twarde ograniczenie
- niebezpieczne użycie
- Odczyt statusu nie powiódł się
- Zapisz zmianę wkłucia
- Zapisz zmianę zasobnika insuliny
- SMB zawsze i po węglow. wyłączone z uwagi na brak źródła BG z zaawansowanym filtrowaniem
- SMB nie dozwolone w trybie otwartej pętli
- Posiłek
- ponowne uruchomienie
- Oczekiwanie na synchronizację czasu (%d sec)
- Rozłączono (%d m)
- Automatyczne działania PortaluOpieki
- Automatycznie przesyłaj zmianę zasobnika, wkłucia i baterii oraz alarmy pompy do Nightscout
- Maksymalna, całkowita IOB, której OpenAPS nie może przekroczyć [U]
- Ta wartość jest nazywana Max IOB w OpenAPS\nOpenAPS nie poda więcej insuliny jeżeli obecna IOB jest większa niż ta wartość
- Pompa zatrzymana
- Pompa uruchomiona
- Pompa wstrzymana
- Maksymalny czas wchłaniania posiłku [h]
- Czas, w którym każdy posiłek jest uznany za wchłonięty. Pozostałe węglowodany zostaną odcięte.
- Czas
- Pokaż pole uwag w oknie leczenia
- Zadano: %1$.2fU Dostarczono: %2$.2fU Kod błędu: %3$d
- Pierwszy stopień przyrostu insuliny
- Drugi stopień przyrostu insuliny
- Trzeci stopień przyrostu insuliny
- Pierwszy stopień przyrostu węglow.
- Drugi stopień przyrostu węglow.
- Trzeci stopień przyrostu węglow.
- CGM
- Używaj tylko połączenia WiFi
- WiFi SSID
- Tylko gdy się ładuje
- Ustawienia połączenia
- Dozwolone SSID (rozdzielone średnikiem)
- Zezwalaj na połączenia w roamingu
- Maks. mnożnik autosens
- Min. mnożnik autosens
- Bolus snooze dia divisor (Dzielnik uśpienia bolusa)
- Max daily safety multiplier (Mnożnik bezpieczeństwa maksymalnej dziennej dawki bazowej [U/godzinę])
- Current basal safety multiplier (Mnożnik bezpieczeństwa aktualnej dziennej dawki bazowej [U/godzinę])
- n/a
- Automatycznie uzupełnij BG
- Ustawienia kreatora
- Obliczenia uwzględnione w wynikach kreatora:
- Ustawienia wyświetlania
- Ustawienia ogólne
-
+
+
diff --git a/app/src/main/res/values-pt/insight_alerts.xml b/app/src/main/res/values-pt/insight_alerts.xml
new file mode 100644
index 0000000000..70489fbc5e
--- /dev/null
+++ b/app/src/main/res/values-pt/insight_alerts.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
new file mode 100644
index 0000000000..00eb3a98b2
--- /dev/null
+++ b/app/src/main/res/values-pt/strings.xml
@@ -0,0 +1,1065 @@
+
+
+
+ Segurança de tratamentos
+ Max bolus permitido [U]
+ Max hidratos permitidos [g]
+ Preferências
+ Atualizar tratamentos do NS
+ Reinicializar base de dados
+ Quer realmente repor a base de dados?
+ Sair
+ Usar bolus prolongado de >200%
+ Dispositivo Bluetooth DanaR
+ Usar sempre valores absolutos de basal
+ Por favor, reinicie o seu telefone ou reinicie o AndroidAPS a partir das Configurações do Sistema \ncaso contrário, o AndroidAPS não terá registro (importante para controlar e verificar se os algoritmos estão a funcionar corretamente)!
+ Alguns botões para aceder rapidamente a funções comuns
+ Inserir as entradas avançadas do livro de registo.
+ Usado para configurar os plugins ativos
+ Programa de aprendizagem
+ Exibe as predefinições de comida definidas no Nightscout
+ Predefinição de Insulina Humalog e NovoRapid / NovoLog
+ Predefinição de Insulina Fiasp
+ Permite definir o pico de atividade da insulina e deve ser usado somente por usuários avançados
+ Ativar ou desativar a aplicação que desencadeia o loop.
+ Sincroniza os seus dados com o Nightscout
+ Estado do algoritmo em 2016
+ Estado do algoritmo em 2017
+ Algoritmo mais recente para usuários avançados
+ Exibe o estado atual do seu loop e botões para ações mais comuns
+ Mostra uma notificação em curso com um breve resumo do que o seu loop está a fazer
+ Definir um perfil que está disponível offline.
+ Fornece o perfil definido no Nightscout
+ Definir um perfil com apenas um bloco de tempo.
+ Integração para bombas Accu-Chek Combo, requer ter o ruffy instalado
+ Integração para bombas DANA Diabecare R
+ Integração para bombas DANA Diabecare R Coreanas
+ Integração para as bombas DANA Diabecare R com firmware atualizado
+ Integração para bombas DANA Diabecare RS
+ Integração para bombas Accu-Chek Insight, requer ter o SightRemote instalado
+ Integração para as pessoas que fazem múltiplas injeções diárias para a sua terapia de diabetes
+ Integração para as bombas que não têm qualquer driver ainda (Open Loop)
+ A sensibilidade é calculada da mesma forma que Oref0, mas você pode especificar o período de tempo para o passado. A absorção mínima de hidratos de carbono é calculada a partir do tempo máximo de absorção de hidratos de carbono das preferências.
+ A sensibilidade é calculada a partir de dados de 24h no passado e os carboidratos (se não absorvidos) são cortados após o tempo especificado nas preferências.
+ A sensibilidade é calculada a partir de dados de 8h no passado e os hidratos de carbono (se não absorvidos) são cortados após o tempo especificado nas preferências. O plug-in também calcula o UAM.
+ A sensibilidade é calculada como uma média ponderada de desvios. Desvios mais recentes têm maior peso. A absorção mínima de hidratos de carbono é calculada a partir do tempo máximo de absorção de hidratos de carbono das preferências. Este algoritmo é o mais rápido em seguir as mudanças de sensibilidade.
+ Receber valores de Glucose da aplicação Dexcom G5 modificada.
+ Receber valores Glucose do Glimp.
+ Receber valores de Glucose do 600SeriesAndroidUploader.
+ Descarrega dados de Glucose do Nightscout
+ Receber valores de Glucose do xDrip.
+ Guarda todos os tratamentos que foram feitos
+ Monitorizar e controlar o AndroidAPS usando o seu relógio WearOS.
+ Mostrar informações sobre o loop no watchface do xDrip+.
+ Controlar remotamente o AndroidAPS usando comandos SMS.
+ Iniciar
+ Verificar
+ Unidades
+ DIA
+ IC
+ ISF
+ Basal
+ Alvo
+ SEM PERFIL DEFINIDO
+ Insulina:
+ Hidratos de Carbono:
+ IOB:
+ IOB:
+ Actividade:
+ IOB Total:
+ Actividade Total IOB:
+ Dur:
+ Rácio:
+ Ins:
+ IOB:
+ IOB Total:
+ Insulina
+ Hidratos
+ GLIC
+ TT
+ Hidratos
+ Corr
+ U
+ Bólus IOB
+ Executar agora
+ BOMBA VIRTUAL
+ Taxa Basal de base
+ Basal temp
+ Bólus estendido
+ Bateria
+ Reservatório
+ OK
+ Última execução
+ Parâmetros de entrada
+ Status de Glicose
+ Temp actual
+ Dados de IOB
+ Perfil
+ Dados de refeição
+ Resultado
+ Sem dados de glucose disponíveis
+ Nenhuma alteração solicitada
+ Pedido
+ Rácio
+ Duração
+ Motivo
+ Glucose
+ Delta
+ Delta:
+ Configurador
+ Objetivos
+ OpenAPS MA
+ Visão geral
+ Perfil NS
+ Perfil simples
+ Basal Temporária
+ Tratamentos
+ Bomba virtual
+ Careportal
+ Bomba
+ Qual a bomba que gostaria de usar com AndroidAPS?
+ Tratamentos
+ Qual o plugin que deve ser usado para os tratamentos?
+ Perfil
+ Que perfil deverá ser usado pelo AndroidAPS?
+ APS
+ Qual é o algoritmo do APS que deve fazer ajustes na terapia?
+ Geral
+ Estes são alguns plugins gerais que pode achar úteis.
+ Que restrições são aplicadas?
+ dias
+ Restrições
+ Loop
+ Loop
+ Utilize isto para ativar a integração loop do AndroidAPS.
+ APS
+ Depois das restrições processadas
+ Basal temporária definida pela bomba
+ Ultima execução
+ OK
+ Cancelar
+ NÃO EXISTE NENHUM APS SELECIONADO OU RESULTADO FORNECIDO
+ Segurança
+ Plugin está desativado
+ Violação das restrições
+ Erro na entrega do bolus
+ Erro na entrega da basal temporária
+ Valor da Basal [%]
+ % (100% = atual)
+ Aceitar nova basal temporária:
+ Tratamento
+ Calculadora
+ Restrição aplicada!
+ Confirmação
+ Introduzir novo tratamento:
+ Bolus
+ Bolus:
+ Basal
+ Basal:
+ Hidratos de Carbono
+ Altere o seu input!
+ Configure um novo bolus prolongado:
+ Origem dos valores de Glucose
+ De onde deve o AndroidAPS obter os dados?
+ xDrip
+ Modo APS
+ Closed Loop
+ Open Loop
+ Loop Desactivado
+ Desactivar Loop
+ Activar Loop
+ Disponível nova sugestão
+ Versão não suportada do NSCliente
+ Versão sem suporte do Nightscout
+ NSCliente em falta. Perdido registo!
+ Glic disponível no NS
+ Status da Bomba está disponível no NS
+ Execução manual
+ LOOP DESATIVADO POR RESTRIÇÕES
+ Basal IOB
+ Restrição de bólus aplicada
+ Restrição de hidratos de carbono aplicada
+ Verificar Glic
+ Anúncio
+ Nota
+ Pergunta
+ Exercício
+ Alteração do local do cateter
+ Colocação do Sensor CGM
+ Início do Sensor CGM
+ Mudança de Cartucho de Insulina
+ Troca de Perfil
+ Bólus Lanche
+ Bólus Refeição
+ Bólus Correcção
+ Bólus Combo
+ Início Temp Basal
+ Fim Temp Basal
+ Correcção Hidratos
+ OpenAPS Offline
+ Tipo de evento
+ Outro
+ Medidor
+ Sensor
+ Hidratos de Carbono
+ Insulina
+ Tempo Hidratos
+ Dividir
+ Duração
+ Percentagem
+ Absoluto
+ Notas
+ Tempo do evento
+ Perfil
+ Introduzido por
+ Tipo de glicose
+ Sem perfil carregado do NS
+ BasalTemp
+ Bólus estendido
+ Versão Nightscout:
+ Em falta
+ Preferências exportadas
+ Exportar configurações para
+ Importar configurações de
+ Configurações importadas
+ Ficheiro não encontrado
+ Exportar configurações
+ Importar configurações
+ Max U/hr em que uma Temp Basal pode ser definida
+ Este valor é chamado max basal no contexto do OpenAPS
+ Basal Máxima IOB que OpenAPS pode dar [U]
+ Este valor é denominado Max IOB em contexto OpenAPS \nEste é o valor máximo de insulina em [U] que APS pode dar de uma vez.
+ Dispensar
+ DanaR
+ A ligar
+ Ligado
+ Desligado
+ Definições bomba DanaR
+ Condições de Utilização
+ NÃO DEVE SER USADO PARA FAZER DECISÕES MÉDICAS. NÃO HÁ NENHUMA GARANTIA PARA O PROGRAMA, NA EXTENSÃO PERMITIDA PELA LEGISLAÇÃO APLICÁVEL. EXCETO QUANDO DE OUTRA FORMA, POR ESCRITO, OS TITULARES DOS DIREITOS DE AUTOR E / OU OUTRAS PARTES FORNECEM O PROGRAMA “TAL COMO ESTÁ”, SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO, ÀS GARANTIAS IMPLÍCITAS DE COMERCIALIZAÇÃO E ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. TODO O RISCO QUANTO À QUALIDADE E DESEMPENHO DO PROGRAMA É COM VOCÊ. CASO O PROGRAMA SEJA DEFEITUOSO, VOCÊ ASSUME O CUSTO DE TODOS OS SERVIÇOS, REPAROS OU CORREÇÕES NECESSÁRIOS.
+ EU ENTENDO E CONCORDO
+ Guardar
+ Nenhum dispositivo bluetooth encontrado
+ Dispositivo seleccionado não foi encontrado
+ Erro de conexão da bomba
+ IOB Bomba
+ Unidades diárias
+ Último bólus
+ %.1fh atrás
+ Entrada Inválida
+ Valor não definido corretamente
+ Recarregar perfil
+ Ver perfil
+ Executado
+ Commentário
+ Sucesso
+ Percentagem
+ Absoluto
+ Cancelar basal temp
+ Comunicador SMS
+ À espera de resultado
+ Número de telefones permitidos
+ +XXXXXXXXXX;+YYYYYYYYYY
+ Para dar bolus %1$.2fU responder com código %2$s
+ Para enviar calibração %1$.2f responder com código %2$s
+ Bólus falhado
+ Bólus %.2fU enviado com êxito
+ Vai ser enviado %.2fU
+ Bólus %.2fU enviado com êxito
+ A enviar %.2fU
+ Permitir comandos remotos via SMS
+ Bólus remoto não permitido
+ Dedo
+ Sensor
+ Manual
+ Alvo temporário
+ Cancelar alvo temporário
+ Definições perfil DanaR
+ DIA [h]
+ Duração da Insulina Activa
+ Falha a actualizar perfil da basal
+ Recarregar
+ A enviar
+ E bólus
+ DS Bólus
+ DE Bólus
+ erro
+ recarregar
+ hora basal
+ glicose
+ hidratos de carbono
+ alarme
+ Total de %1$d registos carregados
+ S bolus
+ Alarmes
+ Horas de Basal
+ Bolus
+ Hidratos de Carbono
+ Insulina diária
+ Erros
+ Glicose
+ Reabastecimento
+ Suspender
+ A ligar durante %1$d s
+ Senha da bomba
+ Senha da bomba incorrecta!
+ A bomba está ocupada
+ Entregue
+ Parado
+ O bolus parou
+ A parar o bolus
+ Oclusão
+ Parar
+ STOP PRESSIONADO
+ À espera da bomba
+ Vai ser enviado %.2fU
+ Configuração da visualização e monitoramento, e análise de rácios e basals
+ Verificar se a BG está disponível no Nightscout, e se os dados de insulina da bomba estão a ser carregados
+ A iniciar um open loop
+ Utilizar em modo de open loop por alguns dias e dar manualmente muitas basais temporárias. Configurar e usar alvos temporários e alvos padrão temporários (por exemplo, para atividade ou tratamentos de hipo com Hcs)
+ Compreender o seu open loop, incluindo as suas recomendações de basais temporárias
+ Com base nessa experiência, decidir qual deve ser a basal máxima e configurá-la na bomba e nas preferências
+ Começaro close loop com Suspensão por Baixa Glicose
+ Utilizar em close loop com IOB máx = 0 por alguns dias sem muitas situações de Suspensão por Baixa Glicose
+ Ajustar o close loop, levantar a IOB máxima acima de 0 e reduzir gradualmente os alvos de valor glicémico
+ Utilizar por alguns dias e pelo menos uma noite sem alarmes de valores glicémicos baixos, antes de baixar os valores
+ Ajustar as basals e os rácios se necessário e em seguida habilitar o auto-sens
+ 1 semana de looping durante o dia com sucesso com entrada de hidratos de carbono regular
+ Ativando recursos adicionais para uso durante o dia, como assistente avançado de refeição
+ Ativando recursos adicionais para uso durante o dia, como SMB
+ Deverá ler a wiki e aumentar a IOB máx para que os SMBs funcionem devidamente! Inicialmente poderá considerar maxIOB= média dos bolus + 3 x a basal máxima
+ Atingiu o limite autorizado
+ Nenhum perfil seleccionado
+ Loop foi desactivado
+ Loop foi activado
+ Loop desactivado
+ Loop activado
+ %1$.2f limitado a %2$.2f
+ O valor %s está fora dos limites permitidos
+ A configuração remota de basal não é permitida
+ O comando remoto não é permitido
+ Para começar basal %1$.2fU/h responda com código %2$s
+ Para suspender o loop por %1$d minutos resposta com código %2$s
+ Basal temporária %1$.2fU/h para %2$d min iniciada com êxito
+ Início basal temp falhou
+ Para parar a basal temporaria responda com o código %s
+ Basal temp cancelada
+ Não foi possivel cancelar a basal temp
+ Comando desconhecido ou resposta errada
+ Assistente Rápido
+ Definições do Assistente Rápido
+ Texto do botão:
+ Hidratos:
+ Válido:
+ Adicionar
+ Editar
+ Remover
+ Refeição
+ Corr
+ Acções
+ AndroidAPS iniciado
+ Envio NS apenas (sincronização desactivada)
+ Apenas upload para NS. Não é eficaz em SGV a menos que uma fonte local como xDrip esteja selecionada. Não é eficaz em perfis enquanto NS-Profiles é usado.
+ Bomba não inicializada!
+ Bomba não inicializada, perfil não definido!
+ Purgar/Preencher
+ Por favor certifique-se que o valor corresponde ao especificado para o seu conjunto de infusão!
+ Outro
+ Purgar/Preencher os valores standard.
+ Botão 1
+ Botão 2
+ Botão 3
+ Unidades:
+ mg/dL
+ mmol/L
+ DIA:
+ Intervalo Alvo:
+ Intervalo para visualização
+ Marca Alto e Baixo para os gráficos em Sumário e Smartwatch
+ Marca Baixo
+ Marca ALTO
+ Wear
+ Reenviar Todos os Dados
+ Abrir Definições em Wear
+ Erro Bomba
+ Bateria fraca
+ Encerrar Bomba
+ Bateria da Bomba Descarregada
+ DanaR Coreana
+ Valor da Basal:
+ Não foi possivel configurar o perfil de basal
+ Perfil Basal actualizado na bomba
+ Desactivar modo EasyUI na bomba
+ Habilitar bolus estendido na bomba
+ Mudar de modo U/d para U/h na bomba
+ Valor da basal abaixo do mínimo. Perfil não definido!
+ GLIC:
+ Ultima Gli:
+ MDI
+ MM640g
+ Notificação em curso
+ DADOS ANTIGOS
+ %1$d min atrás
+ %1$dmin atrás
+ Perfil local
+ OpenAPS AMA
+ Delta médio curto
+ Delta médio longo
+ Array de %1$d elementos.\nValor actual:
+ Dados Autosens
+ Script debug
+ Utilizar função AMA autosens
+ Actualizar tratamentos do NS
+ Apagar tratamentos do futuro
+ Comer brevemente
+ Hipo
+ Actividade
+ Remover registo:
+ Estatísticas DanaR
+ Dose diária acumulativa
+ Dose diária exponencialmente ponderada
+ Basal
+ Bólus
+ TDD
+ Data
+ Rácio
+ # Dias
+ Peso
+ Possivelmente impreciso se foram usados bolus para purgar/preencher!
+ Dados antigos, pressione \"Recarregar\"
+ Basal Diária Total
+ Basal diária * 2
+ A inicializar ...
+ ACÇ
+ CONF
+ LOOP
+ PS
+ OAPS
+ PL
+ DANA
+ Início
+ BOMBAV
+ NSPerfil
+ TRATA
+ CP
+ OBJ
+ WEAR
+ SMS
+ Abreviar títulos dos separadores
+ Usar sempre delta médio curto em vez de delta simples
+ Útil quando há ruído nos dados de fontes sem filtro como o xDrip.
+ Configurações Avançadas
+ Modelo: %1$02X Protocolo: %2$02X Código: %3$02X
+ Perfil
+ Valor padrão: 3 Por segurança é o valor limite estabelecido por OpenAPS. O que faz é limitar a basal a x3 a basal mázima. Se necessário modificar este valor, por favor ter em conta que os dados apontam para que os limites de segurança sejam - 3 x max diario ou 4x valor actual (qual seja menor) como valores máximos.
+ Valor padrão: 4 Esta é a outra parte dos valores limites de segurança - 3 x max diário ou 4x valor actual - do OpenAPS. Isto define que não importa o valor da basal máxima definido na bomba, o valor máximo da basal temporária não pode ser maior que 4 x o valor da basal definida na bomba. O objectivo é evitar que sejam determinadas basais temporárias demasiado elevadas antes que se perceba como o algoritmo funciona. 4x é um valor que a maior parte das pessoas nunca necessitará de alterar pois o mais provável é necessitar de alterar outras definições para não necessitar de \"ultrapassar\" este limite de segurança.
+ Valor predefinido: 1.2\n Este é um multiplicador para autosens (e em breve autotune) que coloca um limite máximo de 20% aos rácios superiores e inferiores de autosens, o que por sua vez calcula o quão alto autosens pode ajustar a basal, quão pode baixar o Factor de Sensibilidade (ISF) e baixar o valor alvo de glucose no sangue (BG).
+ Valor padrão: 0.7\nO outro lado dos limites de segurança do autosens. Coloca um tecto no quão baixo autosens pode ajustar as basais, e quão alto pode ajustar os valores de ISF e valor alvo de glucose no sangue (BG).
+ Autosens também ajusta os alvos
+ Valor padrão: true\nÉ usado para permitir que autosens possa ajustar os valores alvo de glucose no sangue (BG), além de ISF e basais.
+ Valor padrão: 2\nBolus Snooze (pausa após bolus) é executado depois de realizar um bolus por refeição Desta maneira o algoritmo não irá contrariar com temporárias baixas logo depois da refeição. O valor padrão é 2; Então uma duração de acção da insulina (DIA) de 5h significa que o Bolus Snooze irá ser gradualmente reduzido ao longo de 2,5 horas = 5/2 = DIA/Valor padrão.
+ Valor padrão: 3.0 para detecção avançada de refeições (AMA) ou 8.0 para super micro bolus (SMB). Esta é a configuração padrão para o calculo de quanto varia a cada 5 min a glucose no sangue (BG) devido à absorção de hidratos de carbono. O padrão é 3mg/ dl / 5min. Isso afeta a rapidez com que decaem as calorias no corpo (COB), e quantos hidratos de carbono terão de ser considerados no cálculo da previsão de BG, quando é que a BG está baixando mais do que espectável ou não subindo como espectável.
+ Atenção!\n Normalmente não é necessário modificar os valores abaixo. Por favor PRESSIONE AQUI e LEIA o texto para garantir que ENTENDE as consequenciais antes de alterar algum destes valores.
+ Apenas dígitos numéricos são permitidos.
+ Apenas são permitidos valores entre %1$s e %2$s.
+ Este campo não deve estar vazio
+ Número de telefone não é válido
+ SMS número de telefone inválido
+ Calibração
+ Enviar calibração %.1f para o xDrip?
+ xDrip+ não está instalado
+ Calibração enviada para o xDrip
+ Calibração remota não permitida
+ Calibração enviada. Recepção têm de estar activada no xDrip.
+ O xDrip não esta a receber as calibrações
+ Bomba suspensa
+ A obter estado bomba
+ Definindo basal temp
+ A parar basal temp
+ Configurando bolus prolongado
+ Parando bolus prolongado
+ Atualizar valores das basais
+ A desligar
+ A Executar
+ Definições da bomba virtual
+ Enviar estado para NS
+ Senha incorrecta
+ Senha para definições
+ Desbloquear configurações
+ Aproximação do limite diario de insulina
+ NSCliente
+ NSCI
+ URL:
+ Rolar automático
+ Reiniciar
+ NSCliente
+ Nightscout URL
+ Introduza o Nightscout URL
+ NS API secret
+ NS API secret
+ Insira NS API secret (min 12 caract.)
+ Entregar agora
+ Limpar fila de espera
+ Mostrar file de espera
+ Fila de espera:
+ Estado:
+ Em pausa
+ Limpar Registo
+ Cliente NS sem permissões para alterar dados. Tem a senha API correta?
+ Definições Wear
+ Mostrar IOB detalhada
+ Dividir IOB entre IOB de bolus e de basal na face do relógio
+ sem efeito - por favor verifique no telemóvel
+ Indisponível
+ Idade do Paciente
+ Criança
+ Adolescente
+ Adulto
+ Adulto resistente insulina
+ Por favor seleccione a idade do diabético para definir os limites de segurança
+ Glimp
+ %s necessita de autorizar a não optimização da bateria para assegurar a performance necessária
+ Loop suspenso
+ Suspendido (%1$d m)
+ Superbólus (%1$d m)
+ Suspender loop por 1h
+ Suspender loop por 2h
+ Suspender loop por 3h
+ Suspender loop por 10h
+ Desligar bomba por 15 min
+ Desligar bomba por 30 min
+ Desligar bomba por 1 h
+ Desligar bomba por 2 h
+ Desligar bomba por 3 h
+ Retomar
+ Duração errada
+ Loop suspenso
+ Loop retomado
+ Tendência 15 min
+ COB
+ Superbólus
+ Registar inicio da app no NS
+ A sair da aplicação para aplicar as configurações.
+ DanaRv2
+ Insulina
+ Qual o tipo de insulina que está a utilizar?
+ Insulina de ação rapida
+ Novorapid, Novolog, Humalog
+ Fiasp
+ INS
+ Activar superbólus no assistente
+ Habilite a funcionalidade de superbolus no assistente. Não habilite até que aprenda o funcionamento. PODE CAUSAR OVERDOSE DE INSULINA SE USAR INDISCRIMINADAMENTE!
+ IOB
+ COB
+ Firmware
+ Última ligação
+ Estado Bluetooth
+ Acerca
+ Falta de permissão SMS
+ Estado xDrip (relógio)
+ Linha estado xDrip (relógio)
+ xds
+ Mostrar BGI
+ Adicionar BGI à linha de status
+ Sem envio para NS
+ Todos os dados enviados para NS são descartados. AAPS está conectado ao NS, mas não é feita nenhuma alteração no NS
+ Valor da Basal
+ Incremento de bolus
+ BólusEstendido
+ AlvoTemp
+ Cancelar Bólus Estendido
+ Idade Sensor
+ Idade Canula
+ Idade Insulina
+ horas
+ Tipo de Basal
+ Perfil inválido !!!
+ TrocaPerfil
+ Idade bateria bomba
+ Troca bateria bomba
+ Opções Alarme
+ Urgência hiperglicemia
+ Alto
+ Baixo
+ Urgência hipoglicemia
+ Dados Obsoletos
+ Dados obsoletos urgentes
+ Tempo limite para dados obsoletos [min]
+ Tempo limite para Urgência por dados obsoletos [min]
+ Intervalo para autosens [h]
+ Quantidade de horas observadas para a deteção de sensibilidade (o tempo de absorção dos hidratos de carbono é excluído)
+ Bomba
+ OpenAPS
+ Uploader
+ Detecção sensibilidade
+ Que algoritmo de sensibilidade deve ser usado?
+ SENS
+ Sensibilidade Oref0
+ Sensibilidade Oref1
+ Sensibilidade AAPS
+ Configurações de absorção
+ Tempo máx. absorção refeição [h]
+ Tempo em horas, espectável para que todos os hidratos de carbono da refeição sejam absorvidos
+ Visualizar bólus estendido com %
+ SAGE
+ IAGE
+ CAGE
+ PBAGE
+ OAPS
+ UPLD
+ BAS
+ EST
+ Manter ecrã ligado
+ Impedir Android de desligar o ecrã. Isto irá consumir muita bateria quando não ligado ao carregador.
+ Ao activar a função Autosense lembre-se de introduzir todos os hidratos de carbono (carbs) que comeu. Caso contra contrário os desvios de carbs serão erroneamente identificados como uma variação da sensibilidade!!
+ Média ponderada da Sensibilidade
+ OK
+ Cancelar
+ Nem todos perfis foram carregados!
+ Valores não guardados!
+ Activar partilha para outras aplicações (como xDrip).
+ Activar partilha local.
+ ACTIVIDADE & FEEDBACK
+ HIDRATOS & BÓLUS
+ CGM & OPENAPS
+ BOMBA
+ Valor da Basal [U/h]
+ Duração [min]
+ OpenAPS SMB
+ SMB
+ Activar UAM
+ Activar SMB
+ Use Super Micro Boluses em vez de basal temp para uma acção mais rápida
+ Detecção de refeições não Introduzidas
+ Tempo Pico da curva de IOB
+ Tempo Pico [min]
+ Oref Pico-Livre
+ Oref Acção Rápida
+ Ultra-Rapid Oref
+ Duração de Acção da Insulina (DIA) de %1$f demasiado curto - corrigido para %2$f!
+ Activar perfil
+ Data
+ INVÁLIDO
+ Aguardando emparelhamento na bomba
+ Emparelhamento OK
+ Tempo limite emparelhamento
+ A EMPARELHAR
+ Nenhum dispositivo encontrado até agora
+ Reservatório vazio
+ Alerta medição da glicemia
+ Nível de insulina restante
+ DanaRS
+ Dana
+ Bomba seleccionada
+ Emparelhar nova bomba
+ Velocidade Bólus
+ Coloque o incremento da basal em 0.01 U/h
+ Número de série
+ Percentagem
+ Alteração Turno
+ Alvo-Temp padrão
+ duração comerbreve
+ alvo comerbreve
+ duração actividade
+ alvo actividade
+ duração hipo
+ alvo hipo
+ Purge/Encha
+ Procurando o status do bolus estendido
+ A obter estado bólus
+ A obter o status da basal temporária
+ A obter as definições da bomba
+ A obter hora bomba
+ reutilizar
+ Controles do Relógio
+ Definir Alvo-Temp and inserir Tratamentos do relógio.
+ Ligação expirou
+ Alimentos
+ g
+ m
+ h
+ ]]>
+ kJ
+ En
+ Pr
+ Gor
+ ]]>
+ A aguardar o final do bolus. Restam %1$d sec.
+ A processar acção
+ A iniciar administração de bolus
+ Comando será executado agora
+ Controlador bomba corrigido
+ Bomba inacessível
+ Leituras Glic. perdidas
+ Usar as notificações do sistema para alertas e notificações
+ Alertas local
+ Alerta caso nenhuma glicemia seja recebida
+ Alerta caso não seja possivel alcançar a bomba
+ Limite para bomba inacessível [min]
+ Alarme Urgente
+ INFO
+ Bluetooth
+ Watchdog BT
+ Desliga o bluetooth do telefone durante um segundo se nenhuma conexão com bomba for possível. Este parâmetro pode ser util em alguns telefones, onde a pilha bluetooth congela.
+ Aplicação DexcomG5 (com patch)
+ Enviar dados Glic. para NS
+ Definições envio G5
+ Definições de upload para Poctech
+ Mostrar Delta detalho
+ Mostrar delta com mais um ponto decimal
+ Limite de minutos de basal para SMB
+ Firmware bomba não suportado
+ Enviar dados Glic. para xDrip+
+ Seleccionar 640g/Eversense como fonte no xDrip+
+ Glic NSCliente
+ Valor da basal alterado para o valor mínimo suportado: %s
+ Valor da basal alterado para o valor máximo suportado: %s
+ Cálculos Glic
+ Cálculo de Bólus IOB
+ Cálculo de Basal IOB
+ Cálculo tendência
+ Cálculo de superbolus
+ Sim
+ Não
+ Positivo apenas
+ Negativo apenas
+ Cálculo COB
+ Cálculo alvo temporário
+ Loop activado
+ APS seleccionado
+ NSCLiente tem permissão de escrita
+ Modo fechado ativado
+ IOB máxima definida correctamente
+ Glicemia disponivel desde a fonte selecionada
+ Valores das basais não definidos por horas: %s
+ Perfil inválido: %s
+ A programar a bomba para injectar o bolus
+ Actualizar
+ Estado
+ Actividade
+ Sem conexão há %1$d min
+ %1$d%% (%2$d min restantes)
+ A iniciar
+ Suspenso devido ao erro
+ Suspenso pelo utilizador
+ A correr
+ Cancelar TBR
+ A definir TBR (%1$d%% / %2$d min)
+ Injectando (%.1f U)
+ A actualizar
+ Operação solicitada não suportada pela bomba
+ Ultilização nao segura: bolus estendudos ou multionda estão activos. Modo do loop foi alterado para apenas suspender em limite inferior por 6h. Apenas são suportados bolus normais em modo loop
+ Utilização insegura: A bomba utiliza uma perfil de basal diferente do primeiro. O loop foi desactivado. Seleccionar o primeiro perfil da bomba e reinicie.
+ Um bolus com o mesmo valor foi introduzido nos 2 últimos minutos. Para evitar introduções acidentais e segurança contra bugs existentes o bolus foi cancelado.
+ Agora
+ A ler histórico bomba
+ histórico bomba
+ A definir perfil basal
+ Nível cartucho da bomba está baixo
+ Bateria da bomba está fraca
+ A bomba está a dar o erro E%1$d: %2$s
+ Baixo
+ Vazio
+ Normal
+ Necesário actualizar relógio da bomba
+ Aviso
+ Basal Temporária CANCELADA. O aviso foi confirmado
+ Não foi possivel establecer comunicação com a bomba. Nenhum bolus foi administrado.
+ Administração de bolus falhou. Nenhum bolus parece ter sido administrado. Para confirmar, por favor verifique a bomba de forma a evitar uma dupla administração de bolus e programe novamente o bolus. De forma a evitar qualquer problema, os bolus não são reprogramados de forma automatica.
+ Apenas %1$.2f U do bolus de %2$.2f U foi injectado de devido a um erro. Por favor verifique a bomba e tome as medidas necessárias.
+ A injeção do bolus e a verificação do histórico da bomba falharam, por favor verifique a bomba. Se o bolus foi injetado será adicionado ao histórico de tratamentos durante a próxima conexão com a bomba.
+ Não há insulina suficiente no reservatório para bolus
+ Erro na entrega Bólus Estendido
+ Insight
+ Bomba Insight
+ Estado
+ Alterado
+ BOMBA PARADA
+ Estado Actualizado
+ atrás
+ com
+ TBR activa
+ min restante
+ Diário
+ Última Acção Terminada
+ min
+ a restar mais de
+ total com
+ atenção com
+ Ficar sempre ligada
+ PARADO
+ A SINCRONIZAR
+ OCUPADO
+ SINCRONIZADO
+ INICIANDO
+ necessita
+ Nãp conectado com a aplicação acompanhante!
+ Aplicação acompanhante aparentemente não instalada!
+ Aplicação acompanhante incompatível. Versão necessitada
+ Desconhecido
+ A aguardar por código de confirmação
+ Codigo rejeitado
+ Associação de aplicação
+ Não autorizado
+ Incompativel
+ segundo
+ minuto
+ hora
+ dia
+ semana
+ s
+ %1$ds expira %2$s
+ Estado manter ligado
+ Estatísticas
+ Ligar preventivamente
+ Conectar automaticamente quando se inicia o AndroidAPS, antes que seja efectuado qualquer comando, de maneira a reduzir o atraso na conexão
+ Não é recomendado devido ao gasto de bateria
+ SMB sempre activado
+ SMB sempre activo independentemente dos bolus. Possível apenas quando o medidor tive um bom filtro de dados como o G5
+ Activar SMB após hidratos
+ SMB activo por 6h após carbs, mesmo com 0 COB. Possível apenas quando o medidor tive um bom filtro de dados como o G5
+ Activar SMB com COB
+ Activar SMB quando tem COB activo.
+ SMB activo com valores alvo temporários
+ SMB activo quando há valor alvo temporário activo (exercício, etc)
+ SMB activo com alvos temporários elevados
+ SMB activo com alvos temporários elevados em curso (exercicio)
+ Permitir basal temp correr
+ Silêncio
+ Insulina
+ Hidratos
+ Botões
+ Enviar calibrações para o xDrip+ ou abrir sistema de calibração do G5
+ Abre xDrip+, botão retorcer volta ao AAPS
+ Número de carboidratos a adicionar quando o botão é premido
+ Unidades de insulina a adicionar quando o botão é premido
+ Não foi possível lançar aplicação de monitorização contínua. Por favor verifique que está instalada.
+ CGM
+ Navegador do histórico
+ Notificar no SMB
+ Mostrar SMB no relogio como bolus normal.
+ Criar anúncios dos erros
+ Criar um anúncio no Nightscout para caixas de diálogo de erro e alertas locais (também podem ser visualizados em Careportal sob tratamentos)
+ Mostrar a predições na face do relogio.
+ Previsão
+ Escolha de Dados
+ Envio Fabric
+ Permitir que seja enviado automaticamente à equipa de desenvolvimento o report de crashes e das funções utilizadas, utilizando o serviço fabric.io.
+ Por favor actualize a sua versão da app G5 para a versão suportada
+ Iniciar atividade TT
+ Iniciar Comer em breve TT
+ TT
+ Sem bólus, registar apenas
+ Categoria
+ Subcategoria
+ O bolus apenas será gravado
+ Preencher glicemias em falta com NS
+ SMB definido pela bomba
+ Sensibilidade
+ Desvios
+ Carboidratos a bordo
+ Insulina a bordo
+ Basais
+ Nenhuma acção seleccionada, nada irá acontecer
+ Começar TT Hipo
+ A correr a versão dev. O Loop fechado está desabilitado.
+ Modo engenheiro activado
+ Modo de engenharia não habilitado e não no na versão mestra
+ %.2f U/h
+ A ler perfil basal
+ O histórico da bomba foi alterado após o cálculo do bolo ter sido realizado. O bolus não foi injectado. Por favor, verifique se bolus ainda é necessário.
+ O bolus foi injectado, mas não foi possível adicionar ao histórico. Isto é possível se dois bolus do mesmo valor baixo foram administrados nos últimos dois minutos. Por favor verifique o histórico da bomba e use o Careportal para adicionar os dados em falta caso necessário. Cuidado para não adicionar dados com o mesmo valor no mesmo minuto.
+ A rejeitar a temporal alta uma vez que o cálculo não considerou as mudanças do histórico da bomba
+ A actualizar estado bomba
+ O rácio da basal foi alterado na bomba e vai ser actualizado em breve
+ Rácio da basal foi alterado na bomba, mas a leitura falhou
+ A verificar se há alterações de histórico
+ Bólus múltiplos, com a mesma quantidade e no mesmo minuto acabaram de ser importados. Apenas um registo pôde ser adicionado aos tratamentos. Por favor confirma na bomba e adicione o registo de bólus manualmente, utilizando o separador do Careportal. Tenha em atenção que deve criar um bólus com um tempo em que nã oexistem outros registos de bólus.
+ \n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de)
+ O último bólus tem mais de 24 horas ou está no futuro. Por favor verifique se a data está definida correctamente na bomba.
+ Hora/data da entrega do bólus na bomba parece errado, IOB aparentemente está incorrecto. Verifique hora/data na bomba.
+ TrocaPerfil em falta. Por favor faça uma troca de perfil ou pressione \"Activar Perfil\" em PerfilLocal.
+ Contagem Bólus
+ Contagem TBR
+ Objetivo %1$d não iniciado
+ Objetivo %1$d não concluido
+ A bomba não é capaz de basais temporárias
+ Nenhum valor de basal temporaria valido foi lido da bomba
+ Loop fecchado disabilitado nas preferências
+ Autosens desabilitado nas preferências
+ SMB desactivado nas configurações
+ A basal max está limitada a %1$.2f U/h por %2$s
+ limite bomba
+ deve ser valor positivo
+ multiplicador de basal máx
+ multiplicador de basal máx diária
+ Um bolus foi injectado nos últimos 3 minutos, saltando SMB
+ Basal correctamente definida
+ A limitar rácio percentagem máx para %1$d%% porque %2$s
+ A limitar bólus para %1$.1f U porque %2$s
+ A limitar bólus estendido para %1$.1f U porque %2$s
+ A limitar IOB máx. para %1$.1f U porque %2$s
+ A limitar hidratos para %1$d g porque %2$s
+ A limitar IOB para %1$.1f U porque %2$s
+ valor máx nas preferências
+ limite rígido
+ uso não seguro
+ Erro na leitura de estado
+ Registar mudança de sítio
+ Registar mudança cartucho
+ SMB sempre e depois dos hidratos desactivado por fonte da Glicemia activa não suportar filtro avançado
+ SMB não permitido no modo open loop
+ Alimentos
+ repor
+ À espera da sincronização da hora (%1$d sec)
+ Desligado (%1$d m)
+ Eventos careportal automáticos
+ Automaticamente envia mudança de insulina, canula, pilha e alarmes da bomba para o NightScout
+ Máximo total IOS OpenAPS não pode superar [U]
+ Este valor é chamado de Max IOB em contexto de OpenAPS\nOpenAPS não adicionará mais insulina se o IOB atual for maior que este valor
+ Bomba parada
+ Bomba iniciada
+ Bomba suspensa
+ Tempo máx. absorção refeição [h]
+ Hora em que qualquer refeição é considerada absorvida. Restantes hidratos de carbono serão cortados.
+ Hora
+ Mostrar campo de notas na janela de tratamentos
+ Seguinte
+ Anterior
+ Assistente de Configuração
+ TERMINAR
+ Selecione o seu Idioma
+ Pedido: %1$.2fU Entregue: %2$.2fU Código Erro: %3$s
+ Primeiro incremento insulina
+ Segundo incremento insulina
+ Terceiro incremento insulina
+ Primeiro incremento hidratos
+ Segundo incremento hidratos
+ Terceiro incremento hidratos
+ CGM
+ Utilize apenas uma conexão WiFi
+ WiFi SSID
+ Apenas quando estiver a carregar
+ Definições de ligação
+ SSIDs permitidos (separada por ponto e vírgula)
+ Permitir ligação em roaming
+ Rácio máx. autosens
+ Rácio min. autosens
+ Pausa bólus divisor DIA
+ Multiplicador máx. diário de segurança
+ Multiplicador actual de segurança basal
+ n/a
+ Tipo da Bomba Virtual
+ Definição da Bomba
+ 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:
+ Mostrar Configurações
+ Configurações gerais
+ Activar NSCliente
+ Bem-vindo ao assistente de configuração. Vai guiá-lo(a) através do processo de instalação\n
+ Configurações da bomba
+ Ler estado
+ Alterações devem ser feitas no NS
+ Saltar assistente de configuração
+ Pressione o botão abaixo para activar o AndroidAPS para sugerir/fazer alterações basais
+ Pressione o botão abaixo para activar os Objectivos. Veja o separador Objetivos, depois de concluir este assistente, para tornar o AndroidAPS completamente funcional.\n
+ Activar Objectivos
+ Configurar plugin APS
+ Configurar plugin Sensibilidade
+ Plugin de Sensibilidade é usado para detecção de sensibilidade e cálculos COB. Para mais info visite:
+ https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COB
+ NSCliente gere a ligação ao Nightscout. Pode saltar esta parte mas não será possível passar os objectivos até que o configure.
+ Lembre-se: novos perfis de insulina requerem diâmetro de pelo menos 5h. DIA 5–6h no novo perfil é igual ao diâmetro 3h nos antigos perfis de insulina.
+ Configure a fonte das glicemias
+ Por favor seleccione a fonte do perfil. Se o paciente é uma criança deverá utilizar perfil NS. Se ninguém o está a seguir no Nightscout provavelmente preferirá um perfil Local. Lembre-se que apenas está a escolher a fonte de perfil. Para o utilizar terá que o activar executando \"Troca Perfil\"
+ Seleccione um dos algoritmos disponíveis. Eles são classificados do mais antigo para o mais recente. Algoritmo mais recente é geralmente mais forte e mais agressivo. Assim, se você é novo looper, poderá provavelmente começar com AMA e não com a versão mais recente. Não se esqueça de ler a documentação de OpenAPS e configurá-lo antes de usar.
+ Iniciar primeiro objectivo
+ Permissão
+ Pedir permissão
+ Aplicação requer permissão de localização para pesquisa BT
+ Aplicação necessita da permissão de armazenamento para ser capaz de armazenar ficheiros de registo
+ Pedido
+ Configurar plugin Insulina
+ Sair
+ Opções do utilizador
+ Formato hora
+ Botão rolamento
+ Sinal ao pressionar botão
+ Alarme
+ Som
+ Vibrar
+ Ambos
+ Desligar LCD [s]
+ Desligar luz de fundo [s]
+ Unidades de Glucose
+ Desligar(horas)
+ Reservatório baixo (Unidades)
+ Gravar opções para a bomba
+ Ligado
+ Desligado
+ Abrir a navegação
+ Fechar a navegação
+ Preferências plugin
+ Terminado, parabéns!
+ Incompleto
+ Tempo decorrido
+ %1$d. Objectivo
+ Poctech
+ Receber valores Glucose da app Poctech
+ Alto alvotempo aumenta sensibilidade
+ = 100]]>
+ Baixo alvotemp baixa sensibilidade
+
+ Configuração da bomba inválida, verifique a documentação e se o menu de informações rápidas está nomeado de QUICK INFO utilizando o programa de configuração 360.
+ Personalizado
+ Grande diferença Horária
+ Grande diferença horária:\n A diferença de hora para a bomba é superior a 1.5h.\nPor favor ajuste manualmente a hora na bomba e certifique-se que a leitura do histórico da bomba não provoca problemas.\nSe possível apague o histórico da bomba antes de modificar a hora ou desabilite o loop durante toda a duração de acção da insulina (DIA) depois da ultima entrada no histórico da bomba ou mais um DIA desde o momento da correcção, qual delas seja a que mantenha o loop aberto durante mais tempo.
+ Limpar AndroidAPS iniciado
+ Configurações encontradas
+ Atenção: Se conectar à sua bomba física e activar o perfil, o AndroidAPS irá copiar as definições desse perfil para as definições da bomba, apagando o memorizado na bomba. Por favor verifique que o que preencheu no perfil da app tem os mesmos valores que estão na bomba. Em caso contrario pressione imediatamente cancelar e corrija antes de voltar a ligar à bomba.
+ Dados tratamento incompletos
+ Configurações de manutenção
+ Email
+ E-mail Inválido
+ Nr. de registos a enviar
+ Manutenção
+ MANU
+ Fornece várias funções para manutenção (ex. envio de relatórios, eliminação de relatórios).
+ Enviar Logs por e-mail
+ Eliminar registos
+ Um tratamento (insulina: %1$.2f, hidratos: %2$d, às: %3$s) não ficou gravado. Por favor verifique se foi realmente efectuado e se sim adicione manualmente aos tratamentos.
+ eCarbs: %1$d g (%2$d h), atraso: %3$d m
+ Sem dados Autosens disponíveis
+ Definições de registo
+ Repor definições por defeito
+ Erro de funcionamento do NSCliente. Pondere reiniciar o NS e NSCliente.
+ AS
+ Disponível %1$s disponível
+ Fuso horário
+ Modo APS preferido
+ Total
+ Calc
+ Cumprimento
+ Enviar os ficheiros de registo do dia de hoje para os programadores. Situação inesperada.
+ Transgressão Bólus máx
+ Erro no comando
+ Erro velocidade
+ Transgressão limite insulina
+ Pedido de mudança mínima [%]
+ A app mostrará um pedido de alteração apenas se a mudança for superior a este valor. O valor padrão é 20%
+
+ %1$d dia
+ %1$d dias
+
+
+ %1$d hora
+ %1$d hora
+
+
+ %1$d minuto
+ %1$d minutos
+
+
diff --git a/app/src/main/res/values-ro/insight_alerts.xml b/app/src/main/res/values-ro/insight_alerts.xml
new file mode 100644
index 0000000000..70489fbc5e
--- /dev/null
+++ b/app/src/main/res/values-ro/insight_alerts.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index 554dabc628..77179f8c6f 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -1,960 +1,1059 @@
+
- Setări siguranță tratament
- Bolus maxim admis [U]
- Carbohidrați admiși maxim [g]
-
- Preferințe
- Încarcă tratamentele din NS
- Resetează bazele de date
- Sigur resetați bazele de date?
- Ieșire
- Folosiți bolusuri extinse pentru >200%
- Dispozitive bluetooth DanaR
- Folosesțe întotdeauna valori absolute ale bazalei
- Restartați telefonul sau reporniți aplicația AndroidAPS din System Settings \naltfel AndroidAPS nu va putea face loguri (importante pentru verificarea corectitudinii funcționării algoritmului)!
-
- Start
- Verifică
- Unități
- DIA
- IC
- ISF
- Bazală
- Țintă
- NICIUN PROFIL SETAT
- Insulină:
- Carbohidrați:
- IOB:
- IOB:
- Activitate:
- Total IOB:
- Total IOB activitate:
- Durată:
- Rpt:
- Ins:
- IOB:
- IOB totală:
- Cantitatea de insulină
- Cantitatea de carbohidrați
- BG
- Carbo
- Corecție
- U
- Bolus IOB
- Execută
- POMPĂ VIRTUALĂ
- Bolus extins
- OK
- Ultima acțiune
- Parametri de intrare
- Stare glicemie
- Temp curentă
- Date IOB
- Profil
- Date despre masă
- Nu există date despre glicemie
- Nu este solicitată nicio schimbare
- Solicită
- Rată
- Durată
- Motiv
- Glicemie
- Diferență
- Diferență:
-
- Constructor de configurație
- Obiective
- OpenAPS MA
- Privire ansamblu
- Profil NS
- Profil simplu
- Tratamente
- Pompă virtuală
- Careportal
- Pompă
- Tratamente
- Profil
- APS
- General
- zile
- Constrângeri
- Loop
- Loop
- APS
- Constrângeri după procesare
- Buclă inactivă
- Dezactivează bucla
- Activează bucla
-
- O nouă sugestie este disponibilă
- Versiune incorectă de NSClient
- NSClient nu este instalat. Înregistrare pierdută!
- Glicemie disponibilă în NS
- Starea pompei disponibilă în NS
- Acțiuni manuale
- BUCLĂ DEZACTIVATĂ DE CONSTRÂNGERI
- Czech
- English
- IOB bazală
- Constrângere de bolus aplicată
- Constrângere de carbohidrați aplicată
- Verificare glicemie
- Anunț
- Notă
- Întrebare
- Exercițiu
- Schimbare loc pompă
- Inserare senzor
- Start senzor
- Schimbare cartuș insulină
- Schimbare profil
- Gustare
- Masă
- Corecție
- Bolus combo
- Start bazală temporară
- Sfârșit bazală temporară
- Corecție carbohidrați
- OpenAPS Offline
-
- Tip eveniment
- Altul
- Glucometru
- Senzor
- Carbohidrați
- Insulină
- Ora carbohidrați
- Împarte
- Durată
- Procent
- Absolut
- Note
- Ora evenimentului
- Profil
- Înregistrat de
- Tip glicemie
- Nu am încărcat încă un profil din NS
- Bazală temporară
- Bolus extins
- Versiune Nightscout:
- Lipsă
- Am exportat preferințele
- Exportă setările către
- Import setările din
- Setări importate
- Nu am găsit fișierul
- Exportă setările
- Importă setările
- German
- Spanish
- Greek
- Italian
- Russian
- Maximul de unițăți de insulină pe oră (U/h) poate fi setat la
- Această valoare este denumită bazală maximă în contextul OpenAPS
- Maximul de bazală IOB pe care o poate da OpenAPS[U]
- Această valoare este denumită Max IOB în contextul OpenAPS\nAceastă valoare este implicit nulă (0). După câteva zile sau săptămâni, în funcție de opțiunea dumneavoastră, puteți ajusta acest număr.
- Bulgarian
- RENUNȚĂ
- Limba
-
- DanaR
- Se conectează
- Conectat
- Deconectat
- Setări pompă DanaR
- Licență utilizator final
- NU TREBUIE SĂ FOLOSIȚI PENTRU LUAREA DE DECIZII MEDICALE. NU EXISTĂ RĂSPUNDERE LEGALĂ SAU GARANȚIE PENTRU ACEST PROGRAM, ÎN LIMITA APLICABILĂ A LEGII. CU EXCEPTIA CAZURILOR SPECIAL MENȚIONATE, AUTORUL ȘI/SAU ALTE PERSOANE IMPLICATE PUN LA DISPOZIȚIE ACEST PROGRAM FĂRĂ NICIO GARANȚIE, IMPLICITĂ SAU EXPLICITĂ, INCLUZÂND, DAR FĂRĂ A SE LIMITA LA, GARANȚIILE LEGATE DE VĂNZAREA SAU POTRIVIREA PENTRU UN ANUME SCOP. ÎNTREGUL RISC LEGAT DE CALITATEA ȘI PERFORMANȚA ACESTUI PROGRAM CAD ÎN RESPONSABILITATEA DUMNEAVOASTRĂ. DACĂ PROGRAMUL SE DOVEDEȘTE A FI DEFECT, DUMNEAVOASTRĂ VĂ ASUMAȚI ÎNTREAGA RĂSPUNDERE, PRECUM ȘI TOATE COSTURILE LEGATE DE SERVICE, REPARAȚII SAU CORECȚII.
- ÎNȚELEG ȘI SUNT DE ACORD
- Salvează
- Nu s-a găsit niciun adaptor bluetooth
- Dispozitivul selectat nu a fost găsit
- Eroare de corecție a pompei
- IOB din pompă
- Unități zilnice
- ore
- Date de intrare incorecte
- Valoare setată incorect
- Reîncarcă profilul
- Afișează profilul
- Făcut
- Comentariu
- Succes
- Procent
- Absolut
- Renunță la bazala temporară
- SMS Communicator
- Se așteaptă rezultatul
- Numere de telefon permise
- +XXXXXXXXXX;+YYYYYYYYYY
- Pentru a livra un bolus de %1$.2fU răspundeți cu codul %2$s
- Pentru a trimite calibrarea cu %1$.2f răspundeți cu codul %2$s
- Bolus eșuat
- Bolusul de %.2fU livrat cu succes
- Se va livra un bolus de %.2fU
- Bolusul de %.2fU a fost livrat cu succes
- Se livrează %.2fU
- Permite comenzi distante prin SMS
- Bolusare prin comenzi de la distanță interzise
- Deget
- Senzor
- Manual
- Țintă temporară
- Renunțare la ținta temporară
- Setări de profil DanaR
- DIA [h]
- Durata de Acțiune a Insulinei (DIA)
- Setarea profilului bazalei eșuată
- Istoric
- Reîncărcare
- Se trimite
- E bolus
- DS bolus
- DE bolus
- eroare
- reumplere
- bazală pe oră
- glicemie
- carbohidrați
- alarmă
- S-au transmis %d înregistrări
- S bolus
- Alarme
- Ore bazale
- Bolusuri
- Carbohidrați
- Insulină zilnică
- Erori
- Glicemie
- Reumplere
- Suspendare
- Conectare de %d s
- Parola pompei
- Parola pompei greșită!
- Pompa face altă acțiune
- Livrat
- Oprit
- Ocluzie
- Stop
- STOP APĂSAT
- Se așteaptă pompa
- Se vor livra %.2fU
- Se stabilesc vizualizările și monitorizarea și se analizează bazalele și valorile ratelor
- Verificați că vedeți glicemia în Nightscout și că datele despre insulină date de pompă sunt înregistrate în site
- Pornire cu buclă deschisă
- Rulați modul buclă deschisă pentru câteva zile și faceți manual bazalele temporare sugerate. Set up and use temporary and default temporary targets (e.g. for activity or hypo treatment carbs)
- Trebuie să se înțeleagă modalitatea de funcționare a buclei deschise, incluzând recomandările de bazală temporară
- Pe baza acestei experiențe, decideți care va fi bazala maximă și setați această valoare în pompă și în preferințe
- Se începe etapa de buclă închisă cu Suspendarea Insulinei la Valori Glicemie Mici (Low Glucose Suspend = LGS)
- Folosiți sistemul în buclă închisă cu IOB maxim = 0 pentru câteva zile fără prea multe evenimente LGS
- Acordați fin performanța buclei închise, prin mărirea valorii max IOB peste 0 și micșorarea graduală a țintelor glicemice
- Folosiți pentru câteva zile și cel puțin o noapte fără a avea alarme de hipoglicemie înainte de scăderea glicemiei
- Ajustați bazalele și ratele dacă este cazul și apoi activați auto-sens
- O săptămână de folosire cu succes a sistemului cu buclă închisă cu introducerea normală de carbohidrați
- Folosirea instrumentelor adiționale pentru timpul zilei, cum ar fi asistența avansată pentru mese
- Ați atins limita permisă
- Niciun profil selectat
- Bucla a fost dezactivată
- Bucla a fost activată
- Bucla este dezactivată
- Bucla este activată
- Setarea de la distanță a bazalei nu este permisă
- Comanda de la distanță nu este permisă
- Pentru pornirea bazalei de %1$.2fU/h trimiteți codul %2$s
- Pentru suspendarea buclei pentru %1$d minute trimiteți codul %2$s
- Bazala temporară %1$.2fU/h pentru %2$d minute a fost trimisă cu succes
- Trimiterea bazalei temporare a eșuat
- Pentru oprirea bazalei temporare trimiteți codul %s
- Bazala temporară a fost anulată
- Renunțarea la bazala temporară a eșuat
- Comandă necunoscută sau răspuns greșit
-
- AsistentRapid
- Setări AsistentRapid
- Text buton:
- Carbohidrați:
- Valid:
- Adaugă
- Editează
- Șterge
- Masă
- Corecție
- Korean
- Acțiuni
- AndroidAPS a pornit
- Doar încărcare în NS (sincronizare dezactivată)
- Doar încărcare în NS. Nu are efect asupra SGV decât în cazul selectării unei surse locale, precum xDrip. Nu acționează asupra Profilelor cât timp se folosesc profilele din Nightscout.
- Pompa nu este inițializată!
- Pompa nu este inițializată, profilul nu este setat!
- Pregătire/umplere
- Asigurați-vă că aveți cantitatea specificată de instrucțiunile setului de infuzie!
- Alte
- Button 1
- Pregătire/umplere cu cantitățile standard de insulină.
- Buton 2
- Buton 3
- Unități:
- mg/dl
- mmol/l
- DIA:
- Intervalul țintă:
- Intervalul pentru vizualizare
- Valoarea maximă și minimă pentru graficele din vizualizare și pentru smartwatch
- Pragul HIPO
- Pragul HIPER
- Wear
- Retrimite toate datele
- Deschide setările pe Wear
- Eroare de pompă
- Baterie aproape descărcată
- Pompa se oprește
- Bateria pompei este descărcată
- DanaR Korean
- Rată bazală:
- Setarea profilului bazalei a eșuat
- Profilul bazalei a fost modificat în pompă
- Dezactivează modul EasyUI în pompă
- Activează bolusuri extinse în pompă
- Schimbă din modul U/d în U/h în pompă
- Valoarea bazalei este sub minim. Profilul nu este setat!
- Glicemie:
- Ultima glicemie:
- MDI
- MM640g
- Notificare activă
- DATE VECHI
- acum %dmin
- acum %dmin
- Profil local
- OpenAPS AMA
- Media scurtă a deviației
- Media lungă a deviației
- Matrice cu %d elemente.\nValorea efectivă:
- Date Autosens
- Script debug
- Folosește opțiunea autosens AMA
- Masă în curând
- Activitate
- Șterge înregistrarea:
- Statistici DanaR
- TDD cumulat
- TDD cântărit exponențial
- Bazală
- Bolus
- TDD
- Data
- Rata
- # Zile
- Greutate
- Posibil fără acuratețe bună în cazul folosirii de bolusuri pentru pornire/umplere!
- Date vechi, apăsați "RELOAD"
- Total bazală normală
- TBB * 2
- Inițializare...
- ACT
- CONF
- BUCL
- SP
- OAPS
- LP
- DANA
- ACASĂ
- POMPĂV
- PROFILNS
- TRAT
- CP
- OBI
- WEAR
- SMS
- Scurtează titlurile taburilor
- Folosește întotdeauna media scurtă a diferenței în locul diferenței simple
- Folositor când datele vin de la surse nefiltrate, ca atunci când xDrip are măsurători zgomotoase.
- Setări avansate
- Model: %1$02X Protocol: %2$02X Cod: %3$02X
- Profil
- Valoare implicită: 3\nAceasta este o setare de critică de securitate a OpenAPS. Asta înseamnă că se limitează bazala lade 3x valoarea maximă a bazalelor tale.Cel mai probabil nu veți schimba această valoare, dar trebuie să țineți cont de ce se discută despre “3x max zilnic; 4x curent” ca valori de siguranță.
- Valoare implicită: 4\nAceasta este cealaltă jumătate a cheii de siguranță a OpenAPS și cealaltă jumătate a "3x max zilnic; 4x curent" al setărilor de siguranță.Aceasta înseamnă că bazala dumneavoastră, indiferent de bazala maximă configurată în pompă, nu poate fi mai mare de acest număr înmulțit cu nivelul curent al bazalei active. Această limitare este impusă pentru a evita posibilitatea de a intra pe un teritoriu periculos prin setarea unei bazale maxime excesiv de mari înainte de a înțelege funcționarea algoritmului. Din nou, valoarea implictă este 4x; majoritatea oamenilor nu vor trebui să ajusteze această valoare și vor modifica, mai degrabă, alte valori dacă vor simți că această valoare le stă în cale.
- Valoare implicită: 1.2\nAceasta este valoarea limită de multiplicare pentru autosens (și pentru autotune, în curând) pentru a seta o limită maximă de 20% din cât de mare poate fi raportul autosens, care, la rândul ei, determină cât de mult poate autosens să modifice bazalele, cât de jos poate modifica ISF și cât de jos poate pune ținta glicemiei.
- Valoare implicită: 0.7\nCealaltă parte a limitelor autosens, care limitează cât de jos poate ajusta bazalele și cât de mult poate mări ISF și țintele de glicemie.
- Valoare implicită: adevărat\nAceasta se folosește pentru a permite autosens să ajusteze țintele de glicemie, pe lângă modificările asupra ISF și bazalelor.
- Valoare implicită: 2\nAmânarea bolusului este aplicată după ce ați făcut un bolus de masă, astfel încât bucla să nu reacționeze cu ținte bazale temporare scăzute atunci când tocmai ați mâncat. Exemplul de față și valoarea implicită sunt 2; astfel o durată de acțiune a insulinei (DIA) de 3 ore duce la o eliminare treptată a întârzierii setării bazalelor temporare după 1.5 ore (3DIA/2).
- Valoare implicită: 3.0\nAceasta este o setare ce privește impactul carbohidraților pe o durată de 5 minute. Valoarea implicită este de așteptat a fi 3mg/dl/5min. Aceasta afectează cât de mult se scade valoarea COB și cât de mare este presupusă a fi absorbția de carbohidrați în calcularea valorii prezise a glicemiei, atunci când glicemia scade cu mai mult decât s-a estimat sau când nu crește așa cum s-a așteptat.
- Atenție!\nÎn mod normal nu este nevoie să modificați valorile de mai jos. Vă rog să APĂSAȚI AICI și să CITIȚI textul și să vă asigurați că l-ați ÎNȚELES înainte de a schimba valorile.
- Se acceptă numai valori numerice.
- Se acceptă numai valori numerice între %1$1s - %2$2s.
- Acest câmp nu trebuie lăsat necompletat
- Numărul de telefon este invalid
- Număr de telefon SMS invalid
- Copiază în clipboard
- Copiat în clipboard
- Afișează istoricul
- Calibrare
- Trimite calibrarea %.1f către xDrip?
- xDrip+ nu este instalat.
- Calibrare trimisă către xDrip
- Calibrarea la distanță nu este permisă
- Calibrare trimisă. Recepționarea trebuie să fie activată și în xDrip.
- xDrip nu recepționează calibrări
- Livrare de insulină suspendată
- Se primește starea pompei
- Se setează bazala temporară
- Se oprește bazala temporară
- Se pornește bolusul extins
- Se oprește bolusul extins
- Se restabilesc ratele bazale
- Se deconectează
- Se execută
- Setări pompă virtuală
- Trimitere status către NS
- Parolă greșită
- Parola pentru setări
- Deblochează setările
- Se apropie limita zilnică de insulină
- NSClient
- NSCI
- URL:
- Autoscroll
- Restart
- NSClient
- Adresa Nightscout
- Introduceți adresa Nightscout
- Cheia API NS
- Cheia API NS
- Introduceți cheia API NS (min 12 caractere)
- Livrează acum
- Curăță coada de așteptare
- Arată coada de așteptare
- Coadă:
- Status:
- Suspendat
- Șterge istoricul
- NSCLIENT nu are permisiuni de scriere. Cheia API este corect scrisă?
- Setări Wear
- Arată IOB detaliat
- Separă IOB în bolus și IOB bazal pe ceas
- fără succes - verificați telefonul
- Nu este disponibil
- Vârsta pacientului
- Copil
- Adolescent
- Adult
- Vă rog să selectați vârsta pacientului în vederea stabilirii valorilor maxime admise de siguranță
- Glimp
- %s necesită excluderea din lista de optimizare a bateriei pentru funcționare corespunzătoare
- Buclă suspendată
- Suspendată (%d m)
- Superbolus (%d m)
- Suspendă bucla pentru 1h
- Suspendă bucla pentru 2h
- Suspendă bucla pentru 3h
- Suspendă bucla pentru 10 h
- Deconectează pompa pentru 15 min
- Deconectează pompa pentru 30 min
- Deconectează pompa pentru 1h
- Deconectează pompa pentru 2h
- Deconectează pompa pentru 3h
- Restabilește
- Durată greșită
- Buclă suspendată
- Buclă restabilită
- Tendință 15min
- COB
- Superbolus
- Înregistrează pornirea aplicației în NS
- Se iese din aplicație în vederea aplicării setărilor.
- Insulină
- Insulină rapidă
- Novorapid, Novolog, Humalog
- INS
- Activează superbolus în asistent
- Activează funcționalitatea de superbolus în asistentul de buclă. Nu activați până nu înțelegeți ce face cu adevărat. DACĂ ESTE FOLOSIT ÎN NECUNOȘTINȚĂ DE CAUZĂ POATE DUCE LA SUPRADOZĂ DE INSULINĂ!
- IOB
- COB
- Firmware
- Status bluetooth
- Despre
- Lipsesc permisiunile de SMS
- Status xDrip (ceas)
- Linie de status xDrip (ceas)
- xds
- Arată BGI
- Adaugă BGI în linia de status
- Fără trimitere către NS
- Toate trimiterile de date către NS sunt oprite. AAPS este conectat la NS dar nu se fac schimbări în NS
- Pas bazală
- Pas bolus
- TT
- Rată bazală normală
- Bazală temporală
- Baterie
- Rezervor
- Rezultat
- BazalăTemp
- BazalăTemp setată în pompă
- Ultima comandă
- OK
- Renunță
- NU AȚI SELECTAT APS SAU NU EXISTĂ REZULTAT
- Siguranță
- Modul inactiv
- Încălcare a unei limite
- Eroare la livrarea bolusului
- Eroare la setare bazală temporară
- Valoare bazală [%]
- % (100% = curent)
- Acceptă noua bazală temporară:
- Tratament
- Calculator
- Limitare aplicată!
- Confirmare
- Introduceți tratament nou:
- Bolus
- Bolus:
- Bazală
- Bazală:
- Carbo
- Schimbați valoarea!
- Setați un nou bolus extins:
- Sursă glicemie
- xDrip
- Mod APS
- Buclă închisă
- Buclă deschisă
- Versiune de Nightscout nesuportată
- Română
- Ultimul bolus
- Bolus oprit
- Se oprește bolusul
- Se activează opțiuni pentru uzul în timpul zilei, cum ar fi SMB
- Trebuie sa citiți wiki și măriți maxIOB pentru a obține SMB corect! Un start bun este maxIOB=media bolusurilor + 3x maxima bazalei din zi
- %1$.2f este limitată la %2$.2f
- Valarea %s este mai mare decât limita fizică
- Sincronizează cu NS
- Hipo
- Autosens ajustează țintele la
- Adult rezistent la insulină
- DanaRv2
- Fiasp
- Ultima conexiune
- BolusExtins
- ȚintăTemporară
- Renunță la bolusul extins
- Vechime senzor
- Vechime canulă
- Vechime insulină
- ore
- Tip bazală
- Profil invalid!!!
- SchimbareProfil
- Vechime baterie pompă
- Schimbare baterie pompă
- Opțiuni alarmare
- Hiper urgent
- Hiper
- Hipo
- Hipo urgent
- Date învechite
- Date mult prea vechi
- Prag vechime date [min]
- Prag date mult prea vechi [min]
- Interval pentru autosens [o]
- Numărul de ore din trecut pentru detectarea sensibilității (se exclude timpul de absorbție al carbo)
- Pompă
- OpenAPS
- Uploader
- Detectare sensilitate
- SENS
- Sensibilitate Oref0
- Sensibilitate AAPS
- Setări absorbție
- Timp maxim absorbție masă [o]
- Timp în ore la care se presupune că toți carbo sunt absorbiți
- VS
- VI
- VC
- BAT
- OAPS
- UPLD
- BAZ
- EXT
- Trebuie introduși toți carbo la pornirea Autosens. În caz contrar, acțiunea carbo va fi percepută ca schimbare a sensibilității!
- Mediană sensibilitate
- OK
- Renunță
- Nu s-au încărcat toate profilele!
- Nu s-au salvat valorile!
- Permite anunțarea altor aplicații (ca xDrip).
- Permite anunțuri locale.
- ACTIVITATE ȘÎ VERIFICĂRI
- CARBO ȘÎ BOLUS
- CGM ȘÎ OPENAPS
- POMPĂ
- Valoare bazală [U/o]
- Durată [min]
- OpenAPS SMB
- SMB
- Activează UAM
- Activează SMB
- Folosește SMB în locul bazalei temporare pentru reacție mai rapidă
- S-a detectat masă neanunțată
- Curbă timp vârf IOB
- Timp vârf [min]
- Oref Fără-Vârf
- Oref Insulină-Rapidă
- Oref Insulină-UltraRapidă
- DIA din %1$f prea scurtă - se folosește %2$f în schimb!
- Activează profil
- Data
- INVALID
- Se așteaptă conectarea la pompă
- Conectare OK
- Conectare nereușită
- CONECTARE
- Niciun dispozitiv găsit până acum
- Rezervor gol
- Alertă măsurare glicemie
- Nivel insulină rămas
- DanaRS
- Dana
- Pompa selectată
- Conectare la pompă nouă
- Viteză bolusare
- Setare pas bazală la 0.01 U/o
- Număr serial
- Procentaj
- Decalare
- Ținte-Temporare implicite
- durată semănâncăcurând
- țintă semănâncăcurând
- durată activitate
- țintă activitate
- durată țintă
- țintă hipo
- Amorsare tub
- Se obține starea bolusului extins
- Se obține starea bolusului
- Se obține starea bazalei temporare
- Se obțin setările pompei
- Se obține ora pompei
- refolosire
- Controlare din ceas
- Setare Ținte-Temporare și se introduc Tratamente din ceas.
- Conectare eșuată
- Mâncare
- g
- m
- o
- ]]>
- kJ
- En
- Pr
- Grăsime
- ]]>
- Se așteaptă finalul bolusării. Mai sunt %d sec.
- Se procesează activitatea
- Pornire livrare bolus
- Se execută comanda chiar acum
- S-a corectat driverul pompei
- Pompă indisponibilă
- Lipsesc date glicemie
- Se folosesc notificările sistemului pentru alerte și notificări
- Alerte locale
- Alarmează dacă nu se primesc glicemii
- Se alertează dacă pompa este indisponibilă
- Prag pompă indisponibilă [min]
- Alarmă urgentă
- INFO
- Bluetooth
- BT Watchdog
- Oprește bluetooth-ul telefonului pentru o secundă dacă nu se poate conecta la pompă. Aceasta poate ajuta în cazul telefoanelor cu bluetooth incompatitibil.
- App DexcomG5 (cu patch)
- Încarcă date glicemie în NS
- Setări înregistrare G5
- Arată variație detaliată
- Arată variație cu încă o zecimală
- Max minute de bazală la care să se limiteze SMB
- Soft pompă incompatibil
- Trimite date glicemie la xDrip+
- Selectați 640g/Eversense ca sursă de date în xDrip+
- Glicemie NSClient
- Valoare bazală înlocuită cu valoarea minimă suportată
- Calcul glicemie
- Calcul IOB bolus
- Calcul IOB bazală
- Calcul pantă
- Calcul superbolus
- Da
- Nu
- Doar pozitiv
- Doar negativ
- Calcul COB
- Calcul țintă temporară
- Buclă activată
- APS selectat
- NSClient are drepturi de scriere
- Mod buclă închisă activat
- IOB maxim configurat corect
- Glicemie disponibilă din sursa selectată
- Valori bazale nealiniate la ore: %s
- Profil invalid
- Se programează pompa pentru livrare bolus
- Reîncarcă
- Stare
- Activitate
- Fără conexiune de %d min
- %1$d%% (%2$d min rămase)
- Inițializare
- Suspendat din cauza unei erori
- Suspendat de utilizator
- Funcționează
- Se oprește TBR
- Se setează TBR (%1$d%% / %2$d min)
- Bolusare (%.1f U)
- Reîncărcare
- Operațiunea nu este suportată de pompă
- Folosire nesigură: un bolus extins sau multiwave este activ. Modul buclă este setat să funcționeze în low-suspend pentru 6 ore. Doar bolusurile normale sunt posibile.
- Folosire nesigură: pompa folosește un alt profil decât primul. Bucla a fost dezactivată. Selectați primul profil din pompă șî reîncercați.
- Un bolus de aceeași valoare a fost livrat în ultimile două minute. Pentru a preveni bolusarea accidentală dublă și pentru a evita greșelile , acesta nu se va livra
- Acum
- Se citește istoricul din pompă
- Se setează profilul bazalei
- Nivelul insulinei din pompă este scăzut
- Nivelul bateriei pompei este scăzut
- Pompa are eroarea: E%1$d: %2$s
- Scăzut
- Gol
- Normal
- Ceasul pompei trebuie ajustat
- Atenție
- Alerta RBT ANULATĂ a fost confirmată
- Pompa nu poate fi contactată. Nu s-a livrat niciun bolus
- Livrare eșuată. Se pare că nu a fost livrat bolusul. Pentru siguranță, verificați în pompă pentru a evita bolusarea dublă. Pentru evitarea greșelilor, bolusurile nu sunt retrimise automat.
- Doar %1$.2f U din totalul cerut de %2$.2f U a fost livrat din cauza unei erori. Verificați pompa pentru confirmare și acționați corespunzător.
- Nu este suficientă insulină în rezervor
- Eroare de livrare a bolusului extins
- Insight
- Pompă Insight
- Stare
- Schimbat
- POMPĂ OPRITĂ
- Stare actualizată
- în trecut
- cu
- RBT activ
- min. rămase
- Jurnal
- Ultima acțiune efectuată
- min.
- rămase peste
- total cu
- față de
- Rămâneți conectat permanent
- LIBER
- SINCRONIZARE
- OCUPAT
- SINCRONIZAT
- PORNIRE
- nevoi
- Aplicația nu este conectată!
- Aplicația pare să nu fie instalată!
- Aplicație incompatibila, este necesară versiunea
- Necunoscut
- Se așteaptă confirmarea codului
- Cod respins
- Conectare aplicație
- Neautorizat
- Incompatibil
- secundă
- minut
- oră
- z
- săptămână
- e
- %1$ds expiră %2$s
- Stare de menținere
- Statistici
- Conectare preventivă
- Conectare automată atunci când AndroidAPS este afișat pe ecran, înaintea cererii de efectuare a unei comenzi către pompă, pentru reducerea întârzierilor
- Nerecomandat datorită epuizării bateriei
- Activează SMB întotdeauna
- Activează SMB întotdeauna independent de bolusuri. Este posibil doar în cazul unei surse de glicemii filtrate, cum ar fi G5
- Activează SMB după carbo
- Activează SMB pentru 6 ore după carbo, chiar și cu 0 COB. Este posibil doar cu o sursă de glicemii filtrate, ca datele din G5
- Activează SMB cu COB
- Activează SMB atunci când sunt COB activi.
- Activează SMB cu ținte temporare
- Activează SMB chiar atunci când este o țintă temporară activă (mâncare in curând, exerciții fizice)
- Activează SMB cu ținte temporare mari
- Activează SMB atunci când există o țintă temporară mare activă (exerciții fizice)
- Lasă să funcționeze bazala temporară
- Liniște
- Insulină
- Carbohidrați
- Butoane
- Trimite calibrarea către xDrip+ sau deschide calibrarea pentru G5
- Deschide xDrip+, butonul de înapoi returnează la AAPS
- Cantitate de carbohidrați de adăugat când se apasă butonul
- Cantitatea de insulină de adăugat când se apasă butonul
- Nu s-a putut deschide aplicația CGM. Asigurați-vă că este instalată.
- CGM
- Vizualizare istoric
- Notifică despre SMB
- Arată SMB pe ceas ca și un bolus standard.
- Crează anunțuri pentru erori
- Crează anunțuri în Nightscout pentru dialoguri de erori și alerte locale (vizibile și în Careportal - Tratamente)
- Arată previziunile pe ceas.
- Predicții
- Alegeri date
- Încărcare \"fabric\"
- Permite trimiterea de rapoarte automate de eroare și de date despre folosire către dezvoltatori prin serviciul fabric.io
- Actualizați aplicația G5 la o versiune suportată
- Start TT activitate
- Start TT mănânc în curând
- TT
- Nu bolusa, doar înregistrează
- Categorie
- Subcategorie
- Bolusul se va înregistra doar
- Autocompletează valorile glicemiei lipsă din NS
- SMB setat de pompă
- Sensibilitate
- Deviații
- Carbohidrați activi
- Insulină activă
- Bazale
- Nicio acțiune selectată, nu se va întâmpla nimic
- Start TT hipo
- Se folosește versiunea dev. Bucla închisă este dezactivată.
- Mod inginer activat
- Modul inginer nu este activat și nu este în versiunea lansată
- %.2f U/h
- Se citește profilul bazal
- Istoricul pompei s-a schimbat după calcularea bolusului. Bolusul nu a fost livrat. Recalculați dacă mai este necesar un bolus.
- Bolus livrat, dar nu s-a reușit înregistrarea evenimentului. Aceasta se poate întâmpla când două bolusuri mici de aceeași valoare sunt livrate în mai puțin de două minute. Verificați istoricul pompei și înregistrările tratamentelor și folosiți Careportal pentru adăugarea intrărilor lipsă. Asigurați-vă că nu adăugați intrări duble.
- Se respinge temporara mare deoarece calculul nu a luat în calcul istoricul recent schimbat din pompă
- Actualizare stare pompă
- Rata bazală din pompă s-a schimbat și va fi actualizată în curând
- Rata bazală schimbată în pompă, dar nu s-a putut actualiza
- Se verifică schimbările în istoric
- Mai multe bolusuri de aceeași valoare au fost importate. Doar o singură înregistrare va fi adăugată în tratamente. Verifcați manual în pompă și adăugați înregistrările folosind Careportal. Asigurați-vă că veți crea un bolus care nu se suprapune peste altul în timp.
- Atenționare W31: Rezervor aproape gol
- Atenționare W32: Baterie aproape terminată
- Atenționare W33: Timp/dată invalide
- Atenționare W34: Sfârșitul garanției
- Atenționare W39: Alertă timp închiriere
- Mentenanță M20: Rezervorul nu este inserat
- Mentenanță M21: Rezervol gol
- Mentenanță M22: Baterie goală
- Mentenanță M23: Oprire automată
- Mentenanță M24: Ocluzie
- Mentenanță M25: Închiriere terminată - sfârșitul operațiunilor
- Mentenanță M26: Rezervorul nu a fost schimbat
- Mentenanță M27: Descărcarea datelor eșuată
- Mentenanță M28: Modul pauză expirat
- Mentenanță M29: Tipul bateriei nu este setat
- Mentenanță M30: Tipul rezervorului nu este setat
- Eroare E6: Eroare mecanică
- Eroare E7: Eroare electronică
- Eroare E10: Eroare de revenire tijă piston
- Eroare E13: Eroare de limbaj
- Folosește doar conexiune WiFi
- CGM
- Obiectivul %d nu este pornit
- Obiectivul %d nu este atins
- Pompa nu suportă bazale temporare
- Nu s-a citit o rată bazală validă din pompă
- Modul buclă închisă dezactivat în preferințe
- Autosens dezactivat în preferințe
- SMB dezactivat în preferințe
- Se limitează maximul ratei bazale la %1$.2f U/o datorită %2$s
- limită pompă
- trebuie să fie o valoare pozitivă
- maximul multiplicatorului bazalei
- maximul zilnic al multiplicatorului bazalei
- S-a livrat un bolus în ultimile 3 minute, nu se livrează SMB
- Bazala setată corect
- Se limitează procentul ratei maxime la %1$d%% datorită %2$s
- Se limitează bolusul la %1$.1f U datorită %2$s
- Se limitează max IOB la %1$.1f U datorită %2$s
- Se limitează carbohidrații %1$d g datorită %2$s
- Se limitează IOB la %1$.1f U datorită %2$s
- valoare maximă în preferințe
- folosire nesigură
- Citire eșuată a stării
- Înregistrare schimbare a locului pompei
- Înregistrare schimbare rezervor insulină
- SMB dezactivat întotdeauna și după carbo deoarece sursa glicemiei nu suportă filtrare avansată
- SMB nu este permis în mod buclă deschisă
- Mâncare
- Se așteaptă sincronizarea (%d s)
- Deconectat (%d min)
- Evenimente Careportal automate
- Încărcare automată a schimbărilor de insulină, rezervor, baterie și alarme de pompă în Nightscout
- Maximul total IOB peste care OpenAPS nu poate trece [U]
- Pompă oprită
- Pompă pornită
- Pompă în pauză
- Timpul maxim de absorbție a mesei [o]
- Timpul în care orice mâncare se consideră absorbită. Carbohidrații rămași vor fi ignorați.
- Timp
- reset
- Această valoare este denumită Max IOB în contextul OpenAPS, OpenAPS nu va adăuga mai multă insulină dacă IOB este mai mare ca această valoare
- Solicitat: %1$.2fU Livrat: %2$.2fU Cod eroare: %3$d
- Primul increment de insulină
- Al doilea increment de insulină
- Al treilea increment de insulină
- Primul increment de carbohidrați
- Al doilea increment de carbohidrați
- Al treilea increment de carbohidrați
- SSID WiFi
- SSIDuri permise (separare prin punct și virgulă)
- Ultimul bolus este mai vechi de 24 ore sau este în viitor. Verificați ca data să fie configurată corect în pompă.
- Ora/data bolusului livrat de pompă pare eronat, IOB este probabil incorect. Verificați ora/data pompei.
- Lipsă SchimbareProfil. Efectuați o schimbare de profil sau apăsați \"Activare profil\" în ProfilulLocal.
- Afișati bolusul extins ca %
- Asistent setări
- Autocompletează glicemiile lipsă
- n/a
- Multiplicator sigur pentru bazala curentă
- Multiplicator sigur maxim zilnic
- Rată minimă autosens
- Rată maximă autosens
- Permite conexiuni în roaming
- Setări conexiune
- Doar când se încarcă
- Setări afișare
- Setări generale
- Total bolusuri
- Total RBTuri
- limită fizică
- Afișează câmp pentru note în dialogurile de tratamente
- Amână bolusul prin divizor
- Calcule incluse în rezultatul asistentului:
- Irlandeză
- Activează NSClient
- Ați pornit asistentul pentru setări. Acesta vă va ajuta pentru configurarea setărilor
- Setări pompă
- Citire stare
- Schimbările trebuie făcute în NS
- Ignoră asistentul pentru setări
- Apăsați butonul pentru a permite AndroidAPS să sugereze/facă schimbări ale bazalei
- Apăsați butonul pentru a activa Obiectivele. După terminarea procesului de setare, alegeți fereastra Obiective pentru a face AndroidAPS complet funcțional.
- Activați Obiectivele
- Configurați plugin APS
- Configurați pluginul pentru Sensibilitate
- Pluginul Sensibilitate este folosit pentru estimarea sensibilității și calcularea COB. Pentru mai multe info vizitați:
- NSClient răspunde de conexiunea cu Nightscout. Puteți ignora această secțiune, dar nu veți putea completa obiectivele până nu îl configurați.
- Atenție: noul profil presupune o durată a acțiunii insulinei (DIA) de cel puțin 5 ore. DIA de 5-6 ore este echivalent cu DIA de 3 ore în vechile profiluri.
- Configurați sursa glicemiilor
- Selectați sursa sau profilul. Dacă pacientul este copil, ar fi bine să alegeți un profil NS. Dacă nu aveți profil NS, puteți alege profil local. De aici alegeți doar sursa profilului; pentru a utiliza acest profil, trebuie să îl activați prin executarea unei \"Schimbări de profil\".
- Selectați un algoritm dintre cei disponibili. Aceștia sunt sortați de la cei mai vechi la cei mai noi. Algoritmii mai noi sunt, de obicei, mai puternici și mai agresivi. De aceea, dacă sunteți la început, veți dori să alegeți AMA și nu cu cel mai nou algoritm. NU uitați să citiți documentația OpenAPS și să faceți configurările corecte înainte de folosire!
- Începeți primul obiectiv
- Permisiune
- Solicitați permisiunea
- Aplicația necesită permisiune de localizare pentru scanarea prin BT
- Aplicația necesită permisiune de acces la mediul de stocare pentru a putea înregistra jurnalele.
- Cerință
- Configurați plugin insulină
- Ieșire
+ Setări siguranță tratament
+ Bolus maxim admis [U]
+ Carbohidrați admiși maxim [g]
+ Preferințe
+ Reîncarcă tratamentele din NS
+ Resetează bazele de date
+ Sigur resetați bazele de date?
+ Ieșire
+ Folosiți bolusuri extinse pentru >200%
+ Dispozitive bluetooth DanaR
+ Folosește întotdeauna valori absolute ale bazalei
+ Restartați telefonul sau reporniți aplicația AndroidAPS din System Settings \naltfel AndroidAPS nu va putea face loguri (importante pentru verificarea corectitudinii funcționării algoritmilor)!
+ Butoane pentru accesarea celor mai comune facilităţi
+ Accesaţi secţiunea de loguri avansate.
+ Folosit pentru configurarea facilităţilor active
+ Program de învăţare
+ Afişează mâncărurile predefinite în Nightscout
+ Setări prestabilite pentru insulinele Humalog sau NovoRapid / NovoLog
+ Setări prestabilite pentru Fiasp
+ Vă permite definirea vârfului activităţii insulinei şi ar trebui folosit doar de către utilizatorii avansaţi
+ Activare sau dezactivare a implementării declanşatoare pentru buclă.
+ Sincronizare a datelor cu Nightscout
+ Starea algoritmului în 2016
+ Starea algoritmului în 2017
+ Cel mai recent algoritm destinat utilizatorilor avansaţi
+ Afişează starea curentă a buclei şi butoanele pentru cele mai folosite acţiuni
+ Afişează o notificare activă cu o scurtă descriere referitoare la starea buclei
+ Defineşte un profil care este disponibil offline.
+ Foloseşte profilul predefinit deja în Nightscout
+ Definește un profil cu un singur bloc de timp.
+ Integrare cu pompele Accu-Chek, necesită aplicația Ruffy
+ Integrare cu pompele DANA Diabcare R
+ Integrare cu pompele DANA Diabcare R coreene
+ Integrare cu pompele DANA Diabcare R cu firmware upgradat
+ Integrare cu pompele DANA Diabcare RS
+ Integrare cu pompele Accu-Chek Insight, necesită aplicația SightRemote
+ Integrare cu pompă virtuală, pentru persoanele ce folosesc terapia cu pen
+ Integrare cu pompele ce nu au încă un driver software disponibil (Buclă Deschisă)
+ Sensibilitatea este calculată la fel ca în algoritmul Oref0, dar se poate specifica un interval de timp în trecut. Absorbția minimă de carbohidrați este calculată din parametrul echivalent, stabilit în preferințe.
+ Sensibilitatea este calcuată din datele disponibile în ultimele 24 de ore, iar carbohidrații (când nu sunt absorbiți) sunt ignorați după timpul specificat în preferințe.
+ Sensibilitatea este calculată folosind datele din ultimele 8 ore, iar cabohidrații (când nu sunt absorbiți) sunt ignorați după timpul specificat în preferințe. Se calculează, de asemenea, UAM.
+ Sensibilitatea este calculată ca o medie ponderată a deviațiilor. Deviațiile noi au o importanță mai mare. Absorbția minimă de carbohidrați este calculată în funcție de parametrul absorbție maximă de carbohidrați, stabilit în preferințe. Acest algoritm este cel mai rapid atunci când sensibilitatea la insulină este fluctuantă.
+ Primește valorile glicemiei din aplicația Dexcom G5 modificată.
+ Primește valorile glicemiei din aplicația Glimp.
+ Primește valorile glicemiei din aplicația 600SeriesAndroidUploader (Medtronic).
+ Descarcă datele despre glicemii din Nightscout
+ Primește valorile glicemiei din xDrip.
+ Salvează toate tratamentele făcute
+ Monitorizează și controlează aplicația AndroidAPS folosind smartwatchul WearOS.
+ Afișează informații privind starea buclei pe watchface-ul xDrip+.
+ Controlare de la distanță a AndroidAPS folosind comenzi date prin SMS.
+ Start
+ Verifică
+ Unități
+ DIA
+ IC
+ ISF
+ Bazală
+ Țintă
+ NICIUN PROFIL SETAT
+ Insulină:
+ Carbohidrați:
+ IOB:
+ IOB:
+ Activitate:
+ IOB total:
+ Activitate total IOB:
+ Durată:
+ Raport:
+ Ins:
+ IOB:
+ IOB totală:
+ Cantitatea de insulină
+ Cantitatea de carbohidrați
+ Glicemie
+ TT
+ Carbohidrați
+ Corecție
+ U
+ IOB bolus
+ Execută
+ POMPĂ VIRTUALĂ
+ Rată bazală normală
+ Bazală temporară
+ Bolus extins
+ Baterie
+ Rezervor
+ OK
+ Ultima execuție
+ Parametri de intrare
+ Stare glicemie
+ Temp curentă
+ Date IOB
+ Profil
+ Date despre masă
+ Rezultat
+ Nu există date despre glicemie
+ Nu este solicitată nicio schimbare
+ Solicită
+ Rată
+ Durată
+ Motiv
+ Glicemie
+ Diferență
+ Diferență:
+ Configurator
+ Obiective
+ OpenAPS MA
+ Privire de ansamblu
+ Profil NS
+ Profil simplu
+ BazalăTemp
+ Tratamente
+ Pompă virtuală
+ Careportal
+ Pompă
+ Ce pompă doriți să folosiți cu AndroidAPS?
+ Tratamente
+ Ce plugin doriți să folosiți pentru gestionarea tratamentelor?
+ Profil
+ Ce profil doriți să folosească AndroidAPS?
+ APS
+ Ce algoritm APS doriți să decidă ajustările de insulină?
+ General
+ Există pluginuri generale pe care le-ați putea găsi utile.
+ Ce constrângeri sunt aplicate?
+ zile
+ Constrângeri
+ Buclă
+ Buclă
+ Folosiți aceasta pentru a activa facilitățile de buclă a AndroidAPS.
+ APS
+ Constrângeri după procesare
+ Bazală Temporală programată în pompă
+ Ultima acțiune executată
+ OK
+ Renunță
+ NU AȚI SELECTAT APS SAU NU EXISTĂ REZULTAT GENERAT
+ Siguranță
+ Modul inactiv
+ Încălcare a unei limite
+ Eroare la livrarea bolusului
+ Eroare la setare bazală temporară
+ Valoare bazală [%]
+ % (100% = curent)
+ Acceptă noua bazală temporară:
+ Tratament
+ Calculator
+ Limitare aplicată!
+ Confirmare
+ Introduceți tratament nou:
+ Bolus
+ Bolus:
+ Bazală
+ Bazală:
+ Carbohidrați
+ Schimbați ceea ce ați introdus!
+ Setați un nou bolus extins:
+ Sursă glicemie
+ De unde trebuie să primească AndroidAPS datele?
+ xDrip
+ Mod APS
+ Buclă închisă
+ Buclă deschisă
+ Buclă inactivă
+ Dezactivează bucla
+ Activează bucla
+ O nouă sugestie este disponibilă
+ Versiune incompatibilă de NSClient
+ Versiune incompatibilă de Nightscout
+ NSClient nu este instalat. Înregistrare pierdută!
+ Glicemie disponibilă în NS
+ Starea pompei disponibilă în NS
+ Acțiuni manuale
+ BUCLĂ DEZACTIVATĂ DATORITĂ CONSTRÂNGERILOR
+ IOB bazală
+ Constrângere de bolus aplicată
+ Constrângere de carbohidrați aplicată
+ Verificare glicemie
+ Anunț
+ Notă
+ Întrebare
+ Activitate fizică
+ Schimbare loc pompă
+ Inserare senzor
+ Start senzor
+ Schimbare cartuș insulină
+ Schimbare profil
+ Gustare
+ Masă
+ Bolus de corecție
+ Bolus combo
+ Start bazală temporară
+ Sfârșit bazală temporară
+ Corecție de carbohidrați
+ OpenAPS Offline
+ Tip eveniment
+ Altul
+ Glucometru
+ Senzor
+ Carbohidrați
+ Insulină
+ Ora carbohidrați
+ Împarte
+ Durată
+ Procent
+ Absolut
+ Note
+ Ora evenimentului
+ Profil
+ Introdus de
+ Tip glicemie
+ Nu am încărcat încă un profil din NS
+ Bazală temporară
+ Bolus extins
+ Versiune Nightscout:
+ Lipsă
+ Am exportat preferințele
+ Exportă setările către
+ Importă setările din
+ Setări importate
+ Nu am găsit fișierul
+ Exportă setările
+ Importă setările
+ Maximul de unități de insulină pe oră poate fi setat la
+ Această valoare este denumită bazală maximă în contextul OpenAPS
+ Maximul de bazală IOB pe care o poate livra OpenAPS[U]
+ Această valoare este denumită Max IOB în contextul OpenAPS\nAceastă valoare este implicit nulă (0). După câteva zile sau săptămâni, în funcție de opțiunea dumneavoastră, puteți ajusta acest număr.
+ RENUNȚĂ
+ DanaR
+ Se conectează
+ Conectat
+ Deconectat
+ Setări pompă DanaR
+ Licență utilizator final
+ NU FOLOSIȚI PENTRU LUAREA DE DECIZII MEDICALE. NU EXISTĂ RĂSPUNDERE LEGALĂ SAU GARANȚIE PENTRU ACEST PROGRAM, ÎN LIMITA APLICABILĂ A LEGII. CU EXCEPTIA CAZURILOR SPECIAL MENȚIONATE, AUTORUL ȘI/SAU ALTE PERSOANE IMPLICATE PUN LA DISPOZIȚIE ACEST PROGRAM FĂRĂ NICIO GARANȚIE, IMPLICITĂ SAU EXPLICITĂ, INCLUZÂND, DAR FĂRĂ A SE LIMITA LA, GARANȚIILE LEGATE DE VĂNZAREA SAU POTRIVIREA PENTRU UN ANUME SCOP. ÎNTREGUL RISC LEGAT DE CALITATEA ȘI PERFORMANȚA ACESTUI PROGRAM CAD ÎN RESPONSABILITATEA DUMNEAVOASTRĂ. DACĂ PROGRAMUL SE DOVEDEȘTE A FI DEFECT, DUMNEAVOASTRĂ VĂ ASUMAȚI ÎNTREAGA RĂSPUNDERE, PRECUM ȘI TOATE COSTURILE LEGATE DE SERVICE, REPARAȚII SAU CORECȚII.
+ ÎNȚELEG ȘI SUNT DE ACORD
+ Salvează
+ Nu s-a găsit niciun adaptor bluetooth
+ Dispozitivul selectat nu a fost găsit
+ Eroare de conexiune cu pompa
+ IOB din pompă
+ Unități zilnic
+ Ultimul bolus
+ %.1f o în urmă
+ Date de intrare incorecte
+ Valoare setată incorect
+ Reîncarcă profilul
+ Afișează profilul
+ Executat
+ Comentariu
+ Succes
+ Procent
+ Absolut
+ Renunță la bazala temporară
+ Comunicator SMS
+ Se așteaptă rezultatul
+ Numere de telefon permise
+ + XXXXXXXXXX; + YYYYYYYYYY
+ Pentru a livra un bolus de %1$.2fU răspundeți cu codul %2$s
+ Pentru a trimite calibrarea cu %1$.2f răspundeți cu codul %2$s
+ Bolusare eșuată
+ Bolusul de %.2fU livrat cu succes
+ Se va livra un bolus de %.2fU
+ Bolusul de %.2fU a fost livrat cu succes
+ Se livrează %.2fU
+ Permite comenzi de la distanță, prin SMS
+ Bolusarea prin comenzi de la distanță nu este permisă
+ Deget
+ Senzor
+ Manual
+ Țintă temporară
+ Renunțare la ținta temporară
+ Setări de profil DanaR
+ DIA [o]
+ Durata de Acțiune a Insulinei (DIA)
+ Setarea profilului bazalei eșuată
+ Reîncărcare
+ Se trimite
+ Bolus E
+ Bolus DS
+ Bolus DE
+ eroare
+ reumplere
+ bazală pe oră
+ glicemie
+ carbohidrat
+ alarmă
+ Au fost încărcate %1$d înregistrări
+ Bolus S
+ Alarme
+ Ore bazale
+ Bolusuri
+ Carbohidrați
+ Insulină zilnică
+ Erori
+ Glicemie
+ Reumplere
+ Suspendare
+ Conectat de %1$d s
+ Parola pompei
+ Parola pompei greșită!
+ Pompa face altă acțiune
+ Livrat
+ Oprit
+ Bolus oprit
+ Se oprește bolusul
+ Ocluzie
+ Stop
+ STOP APĂSAT
+ Se așteaptă pompa
+ Se vor livra %.2fU
+ Se stabilesc vizualizările și monitorizarea și se analizează bazalele și valorile ratelor
+ Verificați că vedeți glicemia în Nightscout și că datele despre insulină date de pompă sunt înregistrate în site
+ Pornire în mod buclă deschisă
+ Rulați în modul Buclă Deschisă pentru câteva zile și faceți manual bazalele temporare sugerate. Setează și folosește ținte temporare implicite (ex.: pentru activități sau carbohidrați de tratare a hipo)
+ Trebuie să fie înțeleasă modalitatea de funcționare a buclei deschise, inclusiv recomandările de bazală temporară
+ Pe baza acestei experiențe, decideți care va fi bazala maximă și setați această valoare în pompă și în preferințe
+ Se începe etapa de buclă închisă cu Suspendarea Insulinei la Valori Glicemie Mici (Low Glucose Suspend = LGS)
+ Folosiți sistemul în mod buclă închisă cu IOB maxim = 0 pentru câteva zile fără prea multe evenimente LGS
+ Acordați fin performanța buclei închise, prin mărirea valorii max IOB peste 0 și micșorarea graduală a țintelor glicemice
+ Folosiți pentru câteva zile și cel puțin o noapte fără a avea alarme de hipoglicemie, înainte de scăderea glicemiei
+ Ajustați bazalele și ratele dacă este cazul și apoi activați autosens
+ O săptămână de folosire cu succes a sistemului cu buclă închisă cu introducerea normală de carbohidrați
+ Folosirea instrumentelor adiționale pentru timpul zilei, cum ar fi asistența avansată pentru mese
+ Se activează opțiuni pentru uzul în timpul zilei, cum ar fi SMB
+ Trebuie sa citiți wiki și măriți maxIOB pentru a obține SMB corect! Un start bun este maxIOB=media bolusurilor + 3x maxima bazalei din zi
+ Ați atins limita permisă
+ Niciun profil selectat
+ Bucla a fost dezactivată
+ Bucla a fost activată
+ Bucla este dezactivată
+ Bucla este activată
+ %1$.2f este limitată la %2$.2f
+ Valoarea %s este mai mare decât limita fizică
+ Setarea de la distanță a bazalei nu este permisă
+ Comanda de la distanță nu este permisă
+ Pentru pornirea bazalei de %1$.2fU/h trimiteți codul %2$s
+ Pentru suspendarea buclei pentru %1$d minute trimiteți codul %2$s
+ Bazala temporară %1$.2fU/h pentru %2$d minute a fost trimisă cu succes
+ Trimiterea bazalei temporare a eșuat
+ Pentru oprirea bazalei temporare trimiteți codul %s
+ Bazala temporară a fost anulată
+ Renunțarea la bazala temporară a eșuat
+ Comandă necunoscută sau răspuns greșit
+ AsistentRapid
+ Setări AsistentRapid
+ Text buton:
+ Carbohidrați:
+ Valabil:
+ Adaugă
+ Editează
+ Șterge
+ Masă
+ Corecție
+ Acțiuni
+ AndroidAPS a pornit
+ Doar încărcare în NS (sincronizare dezactivată)
+ Doar încărcare în NS. Nu are efect asupra SGV decât în cazul selectării unei surse locale, precum xDrip. Nu acționează asupra Profilurilor cât timp se folosesc profilurile din Nightscout.
+ Pompa nu este inițializată!
+ Pompa nu este inițializată, profilul nu este setat!
+ Pregătire/umplere
+ Asigurați-vă că aveți cantitatea specificată de instrucțiunile setului de infuzie!
+ Alte
+ Pregătire/umplere cu cantitățile standard de insulină.
+ Buton 1
+ Buton 2
+ Buton 3
+ Unități:
+ mg/dl
+ mmol/l
+ DIA:
+ Intervalul țintă:
+ Intervalul pentru vizualizare
+ Valoarea maximă și minimă pentru graficele din vizualizare și pentru smartwatch
+ Pragul HIPO
+ Pragul HIPER
+ Ceas
+ Retrimite toate datele
+ Deschide setările pe Wear
+ Eroare a pompei
+ Baterie aproape descărcată
+ Pompa oprită
+ Bateria pompei este descărcată
+ DanaR din Coreea
+ Rată bazală:
+ Setarea profilului bazalei a eșuat
+ Profilul bazalei a fost modificat în pompă
+ Dezactivează modul EasyUI în pompă
+ Activează bolusuri extinse în pompă
+ Schimbă din modul U/z în U/o în pompă
+ Valoarea bazalei este sub minimul permis. Profilul nu este setat!
+ Glicemie:
+ Ultima glicemie:
+ MDI
+ MM640g
+ Notificare activă
+ DATE VECHI
+ %1$d min în urmă
+ acum %1$dmin
+ Profil local
+ OpenAPS AMA
+ Media scurtă a deviației
+ Media lungă a deviației
+ Matrice de %1$d elemente.\nValoarea curentă:
+ Date Autosens
+ Depanare script
+ Folosește opțiunea autosens AMA
+ Sincronizează cu NS
+ Ștergerea tratamentelor înregistrate în viitor
+ Masă în curând
+ Hipo
+ Activitate
+ Șterge înregistrarea:
+ Statistici DanaR
+ TDD cumulat
+ TDD estimat exponențial
+ Bazală
+ Bolus
+ TDD
+ Data
+ Rata
+ # Zile
+ Greutate
+ Posibil fără acuratețe bună în cazul folosirii de bolusuri pentru pornire/umplere!
+ Date vechi, apăsați \"REÎNCĂRCARE\"
+ Total bazală normală
+ TBB * 2
+ Inițializare...
+ ACT
+ CONF
+ BUCL
+ SP
+ OAPS
+ LP
+ DANA
+ ACASĂ
+ POMPĂV
+ PROFILNS
+ TRAT
+ CP
+ OBI
+ CEAS
+ SMS
+ Scurtează titlurile secțiunilor
+ Folosește întotdeauna media scurtă a diferenței în locul diferenței simple
+ Folositor când datele vin de la surse nefiltrate, ca atunci când xDrip are măsurători zgomotoase.
+ Setări avansate
+ Model: %1$02X Protocol: %2$02X Cod: %3$02X
+ Profil
+ Valoare implicită: 3\nAceasta este o setare de critică de securitate a OpenAPS. Asta înseamnă că se limitează bazala lade 3x valoarea maximă a bazalelor tale.Cel mai probabil nu veți schimba această valoare, dar trebuie să țineți cont de ce se discută despre “3x max zilnic; 4x curent” ca valori de siguranță.
+ Valoare implicită: 4\nAceasta este cealaltă jumătate a cheii de siguranță a OpenAPS și cealaltă jumătate a \"3x max zilnic; 4x curent\" al setărilor de siguranță.Aceasta înseamnă că bazala dumneavoastră, indiferent de bazala maximă configurată în pompă, nu poate fi mai mare de acest număr înmulțit cu nivelul curent al bazalei active. Această limitare este impusă pentru a evita posibilitatea de a intra pe un teritoriu periculos prin setarea unei bazale maxime excesiv de mari înainte de a înțelege funcționarea algoritmului. Din nou, valoarea implictă este 4x; majoritatea oamenilor nu vor trebui să ajusteze această valoare și vor modifica, mai degrabă, alte valori dacă vor simți că această valoare le stă în cale.
+ Valoare implicită: 1.2\nAceasta este valoarea limită de multiplicare pentru autosens (și pentru autotune, în curând) pentru a seta o limită maximă de 20% din cât de mare poate fi raportul autosens, care, la rândul ei, determină cât de mult poate autosens să modifice bazalele, cât de jos poate modifica ISF și cât de jos poate pune ținta glicemiei.
+ Valoare implicită: 0.7\nCealaltă parte a limitelor autosens, care limitează cât de jos poate ajusta bazalele și cât de mult poate mări ISF și țintele de glicemie.
+ Autosens ajustează țintele la
+ Valoare implicită: adevărat\nAceasta se folosește pentru a permite autosens să ajusteze țintele de glicemie, pe lângă modificările asupra ISF și bazalelor.
+ Valoare implicită: 2\nAmânarea bolusului este aplicată după ce ați făcut un bolus de masă, astfel încât bucla să nu reacționeze cu ținte bazale temporare scăzute atunci când tocmai ați mâncat. Exemplul de față și valoarea implicită sunt 2; astfel o durată de acțiune a insulinei (DIA) de 3 ore duce la o eliminare treptată a întârzierii setării bazalelor temporare după 1.5 ore (3DIA/2).
+ Atenție!\nÎn mod normal nu este nevoie să modificați valorile de mai jos. Vă rog să APĂSAȚI AICI și să CITIȚI textul și să vă asigurați că l-ați ÎNȚELES înainte de a schimba valorile.
+ Se acceptă numai valori numerice.
+ Se acceptă numai valori numerice între %1$s - %2$s.
+ Acest câmp nu trebuie lăsat necompletat
+ Numărul de telefon este invalid
+ Număr de telefon SMS invalid
+ Calibrare
+ Trimite calibrarea %.1f către xDrip?
+ xDrip+ nu este instalat.
+ Calibrare trimisă către xDrip
+ Calibrarea la distanță nu este permisă
+ Calibrare trimisă. Recepționarea trebuie să fie activată și în xDrip.
+ xDrip nu recepționează calibrări
+ Livrare de insulină suspendată
+ Se primește starea pompei
+ Se setează bazala temporară
+ Se oprește bazala temporară
+ Se pornește bolusul extins
+ Se oprește bolusul extins
+ Se restabilesc ratele bazale
+ Se deconectează
+ Se execută
+ Setări pompă virtuală
+ Trimitere status către NS
+ Parolă greșită
+ Parola pentru setări
+ Deblochează setările
+ Se apropie limita zilnică de insulină
+ Client NS
+ NSCI
+ URL:
+ Derulare automată
+ Restartare
+ Client NS
+ Adresa Nightscout
+ Introduceți adresa Nightscout
+ Cheia API NS
+ Cheia API NS
+ Introduceți cheia API NS (min 12 caractere)
+ Livrează acum
+ Curăță coada de așteptare
+ Arată coada de așteptare
+ Coadă:
+ Stare:
+ Suspendat
+ Șterge istoricul
+ NSCLIENT nu are permisiuni de scriere. Cheia API este corect scrisă?
+ Setări Wear
+ Arată IOB detaliat
+ Separă IOB în bolus și IOB bazal pe ceas
+ fără succes - verificați telefonul
+ Nu este disponibil
+ Vârsta pacientului
+ Copil
+ Adolescent
+ Adult
+ Adult rezistent la insulină
+ Vă rog să selectați vârsta pacientului în vederea stabilirii valorilor maxime admise de siguranță
+ Glimp
+ %s necesită excluderea din lista de optimizare a bateriei pentru funcționare corespunzătoare
+ Buclă suspendată
+ Suspendat (%1$d min)
+ Superbolus (%1$d min)
+ Suspendă bucla pentru 1h
+ Suspendă bucla pentru 2h
+ Suspendă bucla pentru 3h
+ Suspendă bucla pentru 10 h
+ Deconectează pompa pentru 15 min
+ Deconectează pompa pentru 30 min
+ Deconectează pompa pentru 1h
+ Deconectează pompa pentru 2h
+ Deconectează pompa pentru 3h
+ Restabilește
+ Durată greșită
+ Buclă suspendată
+ Buclă restabilită
+ Tendință 15min
+ COB
+ Superbolus
+ Înregistrează pornirea aplicației în NS
+ Se iese din aplicație în vederea aplicării setărilor.
+ DanaRv2
+ Insulină
+ Ce tip de insulină folosiți?
+ Insulină rapidă
+ Novorapid, Novolog, Humalog
+ Fiasp
+ INS
+ Activează superbolus în asistent
+ Activează funcționalitatea de superbolus în asistentul de buclă. Nu activați până nu înțelegeți ce face cu adevărat. DACĂ ESTE FOLOSIT ÎN NECUNOȘTINȚĂ DE CAUZĂ POATE DUCE LA SUPRADOZĂ DE INSULINĂ!
+ IOB
+ COB
+ Firmware
+ Ultima conexiune
+ Status bluetooth
+ Despre
+ Lipsesc permisiunile de SMS
+ Status xDrip (ceas)
+ Linie de status xDrip (ceas)
+ xds
+ Arată BGI
+ Adaugă BGI în linia de status
+ Fără trimitere către NS
+ Toate trimiterile de date către NS sunt oprite. AAPS este conectat la NS dar nu se fac schimbări în NS
+ Pas bazală
+ Pas bolus
+ BolusExtins
+ ȚintăTemporară
+ Renunță la bolusul extins
+ Vechime senzor
+ Vechime canulă
+ Vechime insulină
+ ore
+ Tip bazală
+ Profil invalid!!!
+ SchimbareProfil
+ Vechime baterie pompă
+ Schimbare baterie pompă
+ Opțiuni alarmare
+ Hiper urgent
+ Hiper
+ Hipo
+ Hipo urgent
+ Date învechite
+ Date mult prea vechi
+ Prag vechime date [min]
+ Prag date mult prea vechi [min]
+ Interval pentru autosens [o]
+ Numărul de ore din trecut pentru detectarea sensibilității (se exclude timpul de absorbție al carbo)
+ Pompă
+ OpenAPS
+ Uploader
+ Detectare sensibilitate
+ Ce algoritm de detecție a sensibilității doriți să folosiți?
+ SENS
+ Sensibilitate Oref0
+ Sensibilitate Oref1
+ Sensibilitate AAPS
+ Setări absorbție
+ Timp maxim absorbție masă [o]
+ Timp în ore la care se presupune că toți carbohidrații sunt absorbiți
+ Afișati bolusul extins ca %
+ VS
+ VI
+ VC
+ BAT
+ OAPS
+ UPLD
+ BZL
+ EXT
+ Menține ecranul aprins
+ Nu permite telefonului să stingă ecranul. Când este activă, această opțiune consumă foarte multă baterie atunci când telefonul nu este la încărcat.
+ Trebuie introduși toți carbo la pornirea Autosens. În caz contrar, acțiunea carbo va fi percepută ca schimbare a sensibilității!
+ Sensibilitate estimată prin mediere
+ OK
+ Renunță
+ Nu s-au încărcat toate profilurile!
+ Nu s-au salvat valorile!
+ Permite anunțarea altor aplicații (ca xDrip).
+ Permite anunțuri locale.
+ ACTIVITATE ȘI VERIFICĂRI
+ CARBO ȘI BOLUS
+ CGM ȘI OPENAPS
+ POMPĂ
+ Valoare bazală [U/o]
+ Durată [min]
+ OpenAPS SMB
+ SMB
+ Activează UAM
+ Activează SMB
+ Folosește SMB în locul bazalei temporare pentru reacție mai rapidă
+ S-a detectat masă neanunțată
+ Curbă timp vârf IOB
+ Timp vârf [min]
+ Oref Vârf-Liber
+ Oref Insulină-Rapidă
+ Oref Insulină-UltraRapidă
+ DIA din %1$f prea scurtă - se folosește %2$f în schimb!
+ Activează profil
+ Data
+ INVALID
+ Se așteaptă conectarea la pompă
+ Conectare OK
+ Conectare nereușită
+ CONECTARE
+ Niciun dispozitiv găsit până acum
+ Rezervor gol
+ Alertă măsurare glicemie
+ Nivel insulină rămas
+ DanaRS
+ Dana
+ Pompa selectată
+ Conectare la pompă nouă
+ Viteză bolusare
+ Setare pas bazală la 0.01 U/o
+ Număr serial
+ Procentaj
+ Decalare
+ Ținte-Temporare implicite
+ durată se-mănâncă-în-curând
+ țintă se-mănâncă-în-curând
+ durată activitate
+ țintă activitate
+ durată țintă
+ țintă hipo
+ Amorsare
+ Se citește starea bolusului extins
+ Se citește starea bolusului
+ Se citește starea bazalei temporare
+ Se citesc setările pompei
+ Se citește ora pompei
+ refolosire
+ Controlare din ceas
+ Setare Ținte-Temporare și se introduc Tratamente din ceas.
+ Conectare eșuată
+ Mâncare
+ g
+ min
+ o
+ ]]>
+ kJ
+ En
+ Pr
+ Grăsime
+ ]]>
+ Se așteaptă terminarea bolusării. Mai sunt %1$d secunde.
+ Se procesează activitatea
+ Pornire livrare bolus
+ Se execută comanda chiar acum
+ S-a corectat driverul pompei
+ Pompă indisponibilă
+ Lipsesc date glicemie
+ Se folosesc notificările sistemului pentru alerte și notificări
+ Alerte locale
+ Alarmează dacă nu se primesc glicemii
+ Se alertează dacă pompa este indisponibilă
+ Prag pompă indisponibilă [min]
+ Alarmă urgentă
+ INFO
+ Bluetooth
+ BT Watchdog
+ Oprește bluetooth-ul telefonului pentru o secundă dacă nu se poate conecta la pompă. Aceasta poate ajuta în cazul telefoanelor cu bluetooth incompatitibil.
+ App DexcomG5 (cu patch)
+ Încarcă date glicemie în NS
+ Setări înregistrare G5
+ Setări upload Poctech
+ Arată variație detaliată
+ Arată variație cu încă o zecimală
+ Max minute de bazală la care să se limiteze SMB
+ Soft pompă incompatibil
+ Trimite date glicemie la xDrip+
+ Selectați 640g/Eversense ca sursă de date în xDrip+
+ Glicemie NSClient
+ Valoarea bazalei a fost înlocuită cu valoarea minimă posibilă: %s
+ Valoarea bazalei a fost înlocuită cu valoarea maximă posibilă: %s
+ Calcul glicemie
+ Calcul IOB bolus
+ Calcul IOB bazală
+ Calcul pantă
+ Calcul superbolus
+ Da
+ Nu
+ Doar pozitiv
+ Doar negativ
+ Calcul COB
+ Calcul țintă temporară
+ Buclă activată
+ APS selectat
+ NSClient are drepturi de scriere
+ Mod buclă închisă activat
+ IOB maxim configurat corect
+ Glicemie disponibilă din sursa selectată
+ Valori bazale nealiniate la ore: %s
+ Profil invalid: %s
+ Se programează pompa pentru livrare bolus
+ Reîncarcă
+ Stare
+ Activitate
+ Fără conexiune de %1$d min
+ %1$d%% (%2$d min rămase)
+ Inițializare
+ Suspendat din cauza unei erori
+ Suspendat de utilizator
+ Rulează
+ Se oprește TBR
+ Se setează TBR (%1$d%% / %2$d min)
+ Bolusare (%.1f U)
+ Reîncărcare
+ Operațiunea nu este suportată de pompă
+ Folosire nesigură: un bolus extins sau multiwave este activ. Modul buclă este setat să funcționeze în low-suspend pentru 6 ore. Doar bolusurile normale sunt posibile.
+ Folosire nesigură: pompa folosește un alt profil decât primul. Bucla a fost dezactivată. Selectați primul profil din pompă și reîncercați.
+ Un bolus de aceeași valoare a fost livrat în ultimele două minute. Pentru a preveni bolusarea accidentală dublă și pentru a evita greșelile, acesta nu se va livra.
+ Acum
+ Se citește istoricul din pompă
+ istoric pompă
+ Se setează profilul bazalei
+ Nivelul insulinei din pompă este scăzut
+ Nivelul bateriei pompei este scăzut
+ Pompa are eroarea: E%1$d: %2$s
+ Scăzut
+ Gol
+ Normal
+ Ceasul pompei trebuie ajustat
+ Atenție
+ Alerta RBT ANULATĂ a fost confirmată
+ Pompa nu poate fi contactată. Nu s-a livrat niciun bolus
+ Livrare eșuată. Se pare că nu a fost livrat bolusul. Pentru siguranță, verificați în pompă pentru a evita bolusarea dublă. Pentru evitarea greșelilor, bolusurile nu sunt retrimise automat.
+ Doar %1$.2f U din totalul cerut de %2$.2f U a fost livrat din cauza unei erori. Verificați pompa pentru confirmare și acționați corespunzător.
+ Nu s-a reușit livrarea bolusului și citirea istoricului pompei, verificați pompa. Dacă a fost totuși livrat un bolus, acesta va fi adăugat în lista tratamentelor în timpul următoarei conexiuni cu pompa.
+ Nu este suficientă insulină în rezervor
+ Eroare de livrare a bolusului extins
+ Insight
+ Pompă Insight
+ Stare
+ Schimbat
+ POMPĂ OPRITĂ
+ Stare actualizată
+ în trecut
+ cu
+ RBT activ
+ min. rămase
+ Jurnal
+ Ultima acțiune efectuată
+ min
+ rămase peste
+ total cu
+ față de
+ Rămâneți conectat permanent
+ LIBER
+ SINCRONIZARE
+ OCUPAT
+ SINCRONIZAT
+ PORNIRE
+ nevoi
+ Aplicația nu este conectată!
+ Aplicația pare să nu fie instalată!
+ Aplicație incompatibila, este necesară versiunea
+ Necunoscut
+ Se așteaptă confirmarea codului
+ Cod respins
+ Conectare aplicație
+ Neautorizat
+ Incompatibil
+ secundă
+ minut
+ oră
+ zi
+ săptămână
+ s
+ %1$ds expiră %2$s
+ Stare de menținere
+ Statistici
+ Conectare preventivă
+ Conectare automată atunci când AndroidAPS este afișat pe ecran, înaintea cererii de efectuare a unei comenzi către pompă, pentru reducerea întârzierilor
+ Nerecomandat datorită epuizării bateriei
+ Activează SMB întotdeauna
+ Activează SMB întotdeauna independent de bolusuri. Este posibil doar în cazul unei surse de glicemii filtrate, cum ar fi G5
+ Activează SMB după carbohidrați
+ Activează SMB pentru 6 ore după carbohidrați, chiar și cu 0 COB. Este posibil doar cu o sursă de glicemii filtrate, ca datele din G5
+ Activează SMB cu COB
+ Activează SMB atunci când sunt COB activi.
+ Activează SMB cu ținte temporare
+ Activează SMB chiar atunci când este o țintă temporară activă (mâncare in curând, exerciții fizice)
+ Activează SMB cu ținte temporare mari
+ Activează SMB atunci când există o țintă temporară mare activă (exerciții fizice)
+ Lasă să funcționeze bazala temporară
+ Liniște
+ Insulină
+ Carbohidrați
+ Butoane
+ Trimite calibrarea către xDrip+ sau deschide calibrarea pentru G5
+ Deschide xDrip+, butonul de înapoi returnează la AAPS
+ Cantitate de carbohidrați de adăugat când se apasă butonul
+ Cantitatea de insulină de adăugat când se apasă butonul
+ Nu s-a putut deschide aplicația CGM. Asigurați-vă că este instalată.
+ CGM
+ Vizualizare istoric
+ Notifică despre SMB
+ Arată SMB pe ceas ca și un bolus standard.
+ Crează anunțuri pentru erori
+ Crează anunțuri în Nightscout pentru dialoguri de erori și alerte locale (vizibile și în Careportal - Tratamente)
+ Arată previziunile pe ceas.
+ Predicții
+ Alegeri date
+ Încărcare \"fabric\"
+ Permite trimiterea de rapoarte automate de eroare și de date despre folosire către dezvoltatori prin serviciul fabric.io.
+ Actualizați aplicația G5 la o versiune suportată
+ Start TT activitate
+ Start TT mănânc-în-curând
+ TT
+ Nu bolusa, doar înregistrează
+ Categorie
+ Subcategorie
+ Bolusul se va înregistra doar
+ Autocompletează valorile glicemiei lipsă din NS
+ SMB setat de pompă
+ Sensibilitate
+ Deviații
+ Carbohidrați activi
+ Insulină activă
+ Bazale
+ Nicio acțiune selectată, nu se va întâmpla nimic
+ Start TT hipo
+ Se folosește versiunea dev. Bucla închisă este dezactivată.
+ Mod inginer activat
+ Modul inginer nu este activat și nu este în versiunea lansată
+ %.2f U/o
+ Se citește profilul bazal
+ Istoricul pompei s-a schimbat după calcularea bolusului. Bolusul nu a fost livrat. Recalculați dacă mai este necesar un bolus.
+ Bolus livrat, dar nu s-a reușit înregistrarea evenimentului. Aceasta se poate întâmpla când două bolusuri mici de aceeași valoare sunt livrate în mai puțin de două minute. Verificați istoricul pompei și înregistrările tratamentelor și folosiți Careportal pentru adăugarea intrărilor lipsă. Asigurați-vă că nu adăugați intrări duble.
+ Se respinge temporara mare deoarece calculul nu a luat în calcul istoricul recent schimbat din pompă
+ Actualizare stare pompă
+ Rata bazală din pompă s-a schimbat și va fi actualizată în curând
+ Rata bazală schimbată în pompă, dar nu s-a putut actualiza
+ Se verifică schimbările în istoric
+ Mai multe bolusuri de aceeași valoare au fost importate. Doar o singură înregistrare va fi adăugată în tratamente. Verifcați manual în pompă și adăugați înregistrările folosind Careportal. Asigurați-vă că veți crea un bolus care nu se suprapune peste altul în timp.
+ \n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de)
+ Ultimul bolus este mai vechi de 24 ore sau este în viitor. Verificați ca data să fie configurată corect în pompă.
+ Ora/data bolusului livrat de pompă pare eronat, IOB este probabil incorect. Verificați ora/data pompei.
+ Lipsă SchimbareProfil. Efectuați o schimbare de profil sau apăsați \"Activare profil\" în ProfilulLocal.
+ Total bolusuri
+ Total RBTuri
+ Obiectivul %1$d nu a fost asumat
+ Obiectivul %1$d nu a fost atins
+ Pompa nu suportă bazale temporare
+ Nu s-a citit o rată bazală validă din pompă
+ Modul buclă închisă dezactivat în preferințe
+ Autosens dezactivat în preferințe
+ SMB dezactivat în preferințe
+ Se limitează maximul ratei bazale la %1$.2f U/o datorită %2$s
+ limită pompă
+ trebuie să fie o valoare pozitivă
+ maximul multiplicatorului bazalei
+ maximul zilnic al multiplicatorului bazalei
+ S-a livrat un bolus în ultimele 3 minute, nu se livrează SMB
+ Bazala setată corect
+ Se limitează procentul ratei maxime la %1$d%% datorită %2$s
+ Se limitează bolusul la %1$.1f U datorită %2$s
+ Se limitează max IOB la %1$.1f U datorită %2$s
+ Se limitează carbohidrații %1$d g datorită %2$s
+ Se limitează IOB la %1$.1f U datorită %2$s
+ valoare maximă în preferințe
+ limită fizică
+ folosire nesigură
+ Citire eșuată a stării
+ Înregistrare schimbare a locului pompei
+ Înregistrare schimbare rezervor insulină
+ SMB dezactivat întotdeauna și după carbohidrați, deoarece sursa glicemiei nu suportă filtrare avansată
+ SMB nu este permis în mod buclă deschisă
+ Mâncare
+ resetare
+ Se așteaptă o sincronizare a timpului (%1$d s)
+ Deconectat (%1$d min)
+ Evenimente Careportal automate
+ Încărcare automată a schimbărilor de insulină, rezervor, baterie și alarme de pompă în Nightscout
+ Maximul total IOB peste care OpenAPS nu poate trece [U]
+ Această valoare este denumită Max IOB în contextul OpenAPS,\nOpenAPS nu va adăuga mai multă insulină dacă IOB este mai mare ca această valoare
+ Pompă oprită
+ Pompă pornită
+ Pompă în pauză
+ Timpul maxim de absorbție a mesei [o]
+ Timpul în care orice mâncare se consideră absorbită. Carbohidrații rămași vor fi ignorați.
+ Timp
+ Afișează câmp pentru note în dialogurile de tratamente
+ Următor
+ Anterior
+ Asistent de configurare
+ TERMINARE
+ Alegeți limba
+ Primul increment de insulină
+ Al doilea increment de insulină
+ Al treilea increment de insulină
+ Primul increment de carbohidrați
+ Al doilea increment de carbohidrați
+ Al treilea increment de carbohidrați
+ CGM
+ Folosește doar conexiune WiFi
+ SSID WiFi
+ Doar când se încarcă
+ Setări conexiune
+ SSIDuri permise (separare prin punct și virgulă)
+ Permite conexiuni în roaming
+ Rată maximă autosens
+ Rată minimă autosens
+ Amână bolusul prin divizor
+ Multiplicator sigur maxim zilnic
+ Multiplicator sigur pentru bazala curentă
+ indisponibil
+ 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ă.
+ Autocompletează glicemiile lipsă
+ Asistent setări
+ Calcule incluse în rezultatul asistentului:
+ Setări afișare
+ Setări generale
+ Activează NSClient
+ Ați pornit asistentul pentru setări. Acesta vă va ajuta pentru configurarea setărilor\n
+ Setări pompă
+ Citire stare
+ Schimbările trebuie făcute în NS
+ Ignoră asistentul pentru setări
+ Apăsați butonul pentru a permite AndroidAPS să sugereze/facă schimbări ale bazalei
+ Apăsați butonul pentru a activa Obiectivele. După terminarea procesului de setare, alegeți fereastra Obiective pentru a face AndroidAPS complet funcțional.\n
+ Activați Obiectivele
+ Configurați plugin APS
+ Configurați pluginul pentru Sensibilitate
+ Pluginul Sensibilitate este folosit pentru estimarea sensibilității și calcularea COB. Pentru mai multe info vizitați:
+ https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COB
+ NSClient răspunde de conexiunea cu Nightscout. Puteți ignora această secțiune, dar nu veți putea completa obiectivele până nu îl configurați.
+ Reamintire: noile profiluri necesită o durată de acțiune a insulinei (DIA) de cel puțin 5 ore. DIA de 5-6 ore în profilurile noi sunt echivalente cu DIA 3 ore din profilele vechi.
+ Configurați sursa glicemiilor
+ Selectați sursa sau profilul. Dacă pacientul este copil, ar fi bine să alegeți un profil NS. Dacă nu aveți profil NS, puteți alege profil local. De aici alegeți doar sursa profilului; pentru a utiliza acest profil, trebuie să îl activați prin executarea unei \"Schimbări de profil\"
+ Alegeți unul dintre algoritmii disponibili. Algoritmii sunt aranjați de la cel mai vechi spre cel mai nou. Algoritmii mai noi sunt, de obicei, mai puternici și mai agresivi. De aceeea, dacă sunteți la început, ar fi indicat să porniți cu AMA și nu cu cel mai nou. Este important să parcurgeți documentația OpenAPS și să îl configurați corect înainte de a folosi aplicația.
+ Începeți primul obiectiv
+ Permisiune
+ Solicitați permisiunea
+ Aplicația necesită permisiune de localizare pentru scanarea prin BT
+ Aplicația necesită permisiune de acces la mediul de stocare pentru a putea înregistra jurnalele
+ Cerință
+ Configurați plugin insulină
+ Ieșire
+ Opțiunile utilizatorului
+ Afișare a formatului timpului
+ Buton derulare
+ Sunet la apăsarea butonului
+ Alarmă
+ Sunet
+ Vibrație
+ Ambele
+ LCD în timp [s]
+ Timp lumină de fundal [s]
+ Unități glicemie
+ Oprire (ore)
+ Rezervor aproape golit (Unități)
+ Salvați opțiunile în pompă
+ Pornit
+ Oprit
+ Afișare navigație
+ Închidere navigație
+ Preferințe plugin
+ Finalizat cu succes!
+ Încă incomplet
+ Timp scurs
+ Obiectiv %1$d
+ Poctech
+ Citire a valorii glicemiei din aplicația Poctech
+ Ținte temporare mai mari cresc sensibilitatea
+ = 100]]>
+ Țintele temporare joase scad sensibilitatea
+
+ Setare pompă invalidă, verificați documentația și asigurați-vă că meniul Quick Info este denumit QUICK INFO, folosind aplicația 360 Configuration Software.
+ Personalizat
+ Diferență majoră de timp
+ Diferență majoră de timp:\nOra din pompă este diferită cu mai multe de 1.5 ore.\nPotriviți manual ora din pompă și asigurați-vă că sincronizarea cu datele istorice din pompă nu va produce un comportament neașteptat.\nDacă este posibil, ștergeți istoricul pompei înaintea modificării orei și inactivați bucla închisă pentru un interval DIA după ultima intrare istorică cu timp greșit, dar minim o DIA de acum încolo.
+ AndroidAPS pornit curat
+ Au fost găsite setări stocate
+ Atenție: Dacă activați și conectați o pompă fizică, AndroidAPS va copia setările bazalelor din profilurile din aplicație în pompă, suprascriindu-le pe cele existente deja în pompă. Asigurați-vă că aveți setările corecte ale bazalelor în AndroidAPS. Dacă aveți dubii sau nu doriți suprascrierea setărilor bazalelor existente în pompă, apăsați butonul de anulare și repetați acțiunea mai târziu.
+ Date incomplete despre tratament
+ Setări de întreținere
+ Email
+ Email invalid
+ Nr de loguri de trimis
+ Mentenanță
+ MENTN
+ Pune la dispoziție funcții pentru mentenanță (ex: trimitere de loguri, ștergere de loguri).
+ Trimite un email cu loguri
+ Șterge logurile
+ Un tratament (insulină: %1$.2f, carbohidrați: %2$d, la: %3$s) nu a putut fi înregistrat. Reverificați și apoi adăugați manual înregistrarea corectă.
+ eCarbohidrați: %1$d g (%2$d h), întârziere: %3$d m
+ Nu există date disponibile privind autosens
+ Setări loguri
+ Resetare la setările implicite
+ Funcționare incorectă a NSClient. Aveți în vedere un restart al NS și al NSClient.
+ AS
+ Versiunea %1$s este disponibilă
+ Diferență de fus orar
+ Modul APS preferat
+ Total
+ Calc
+ Împerechere
+ Trimite înregistrările zilei de astăzi către dezvoltatori, împreună cu timpul curent. Situație neașteptată.
+
+ %1$d zi
+ %1$d zi
+ %1$d zile
+
+
+ %1$d oră
+ %1$d oră
+ %1$d ore
+
+
+ %1$d minut
+ %1$d minut
+ %1$d minute
+
diff --git a/app/src/main/res/values-ru/insight_alerts.xml b/app/src/main/res/values-ru/insight_alerts.xml
new file mode 100644
index 0000000000..70489fbc5e
--- /dev/null
+++ b/app/src/main/res/values-ru/insight_alerts.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index c1eaf74d33..18b0a72853 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -1,589 +1,1055 @@
+
- Glimp
- MM640g
- абсолют
- действия
- ДЕЙСТВ
- активность
- взрослый
- расширенные настройки
- пожалуйста перезагрузите телефон или перезапустите AndroidAPS из системных настроек иначе AndroidAPS не будет вести лог (что важно для отслеживания и проверки алгоритмов)
- всегда используйте укороченное среднее приращение вместо простого
- AndroidAPS запущен
- полезно когда данные из нефильтруемых источников вроде Xdrip зашумляются
- приближается суточный лимит инсулина
- режим APS
- массив %d элементов. актуальная величина:
- базал
- скорость усвоения базала:
- шаг базала
- значение базала ниже минимума. профиль не создан!
- батарея помпы разряжена
- болгарский
- болюс
- шаг болюса
- применено ограничение болюса
- болюс %.2fU дан успешно
- подается болюс %.2fU
- начинается подача болюса %.2fU
- кнопка 1
- кнопка 2
- кнопка 3
- калибровка передается на xdrip
- отмена
- отмена врем базала
- углеводы
- применено ограничение углеводов
- портал назначений
- оповещение
- проверка СК
- корректировка углеводов
- замена сенсора мониторинга глюкозы
- старт сенсора
- комбинированный болюс
- болюс на коррекцию
- нагрузка
- замена картриджа инсулина
- болюс на еду
- абсолют
- углеводы
- действие углеводов
- Длительность действия
- кем введено
- время события
- тип события
- тип глюкозы
- инсулин
- глюкометр
- заметки
- другое
- процент
- профиль
- сенсор
- разбивка
- заметка
- OpenAPS оффлайн
- смена профиля
- смена места катетера помпы
- вопрос
- ПОРТНаз
- болюс на перекус
- оконч действия врем базала
- начало действия врем базала
- временное целевое значение
- отмена времнной цели
- измените введенные данные
- ребенок
- очистка очереди
- очистка лога
- замкнутый цикл
- акт углев
- комментарий
- конфигуратор
- APS
- источник СК
- ограничения
- общее
- инсулин
- замкнутый цикл
- версия Nightscout:
- профиль
- помпа
- КОНФ
- назначения
- подтверждение
- соединение установлено
- соединение устанавливается
- ошибка соединения
- применено ограничение!
- ограничение нарушено
- скопировано в буфер обмена
- копировать в буфер обмена
- коррекция
- чешский
- внимание!
- почасовой базал
- статус блутус
- устройство блутус danaR
- углеводы
- суточные единицы
- болюс DE
- отключить режим EasyUI в помпе
- болюс DS
- болюс E
- активировать увеличенные болюсы на помпе
- ошибка
- гликемия
- история
- оповещения об опасности
- почасовые базалы
- болюсы
- углеводы
- связь установлена за %d сек.
- суточный инсулин
- ошибки
- гликемия
- дозаправка
- приостановка
- замена
- введенные данные неверны
- активный инсулин на помпе
- предыдущий болюс
- модель: %1$02X протокол: %2$02X код: %3$02X
- пароль помпы
- настройки помпы DanaR
- дозаправка
- болюс S
- статистика DanaR
- количество дней
- базал
- болюс
- накопительные TDD
- дата
- экспоненциально взвешенные TDD
- старые данные. нажмите \"перезагрузка\"
- коэффициент
- общий базал
- общий базал*2
- общая суточная доза
- возможны неточности если болюсы использовались для заполнения
- вес
- замена режима с U/d на U/h на помпе
- всего передано %d записей
- для величин >200% пользуйтесь увеличенным болюсом
- величина не задана должным образом
- просмотр профиля
- DanaR Корея
- настройки профиля DanaR
- время действия инсулина (ч.):
- продолжительность инсулиновой активности
- DanaR
- ДАНА
- дней
- Немецкий
- дать сейчас
- изменение
- выбранное устройство не найдено
- время действия инсулина:
- цикличность неактивирована
- деактивировать циклы
- отсоединено
- разъединение
- отсоединить помпу на 1 час
- отсоединить помпу на 2 часа
- отсоединить помпу на 15 мин
- отсоединить помпу на 30 мин
- отсоединить помпу на 3 часа
- отклонить
- продолжительность
- наступает время еды
- греческий
- English
- активировать цикличность
- активировать суперболюс
- активировать возможность суперболюса в мастере. не активируйте если не знаете что это. МОЖЕТ ВЫЗВАТЬ ПЕРЕДОЗИРОВКУ ИНСУЛИНА ЕСЛИ ИСПОЛЬЗУЕТСЯ ВСЛЕПУЮ
- выполнено
- лицензионное соглашение с пользователем
- я понимаю и принимаю
- "НЕ ДОЛЖНО ИСПОЛЬЗОВАТЬСЯ ДЛЯ ПРИНЯТИЯ МЕДИЦИНСКИХ РЕШЕНИЙ. ПРОГРАММА НЕ ДАЕТ ГАРАНТИЙ В РАМКАХ СУЩЕСТВУЮЩЕГО ЗАКОНОДАТЕЛЬСТВА. ПРЕДОСТАВЛЯЕТСЯ \"КАК ЕСТЬ\" БЕЗ ЯВНЫХ ИЛИ СКРЫТЫХ ГАРАНТИЙ ВКЛЮЧАЯ НО НЕ ОГРАНИЧИВАЯСЬ ВОЗМОЖНОСТЬЮ КОММЕРЧЕСКОГО ИСПОЛЬЗОВАНИ ИЛИ СООТВЕТСТВИЯ КАКИМ-ЛИБО ЦЕЛЯМ. ВСЕ РИСКИ ЛОЖАТСЯ НА ВАС. В СЛУЧАЕ НЕРАБОТОСПОСОБНОСТИ ПРОГРАММЫ ВЫ НЕСЕТЕ ВСЕ РАСХОДЫ СВЯЗАННЫЕ С ОБСЛУЖИВАНИЕМ РЕМОНТОМ ИЛИ КОРРЕКТИРОВКОЙ. "
- введите новое назначение
- поле не может быть пустым
- разрешены только цифровые значения
- разрешены только цифровые значения в диапазоне %1$s - %2$s
- неверный номер телефона
- испанский
- выполнение
- экспортировать настройки в
- настройки экспортированы
- не удалось обновить базальный профиль
- быстродействующий инсулин
- Novorapid, Novolog, Humalog
- файл не найден
- заполнить стандартное количество инсулина
- убедитесь что количество соответствует характеристикам вашей инфузионной системы
- получение статуса помпы
- гликемия
- палец
- сенсор
- ВЕРХНЯЯ отметка
- импортировать настройки из
- инициализация...
- ИНС
- IOB акт инс
- итальянский
- корейский
- язык
- локальный профиль
- ЛП
- долгосрочное усредненное изменение
- замкнутый цикл
- APS
- после наложенных ограничений
- ЗЦ
- ЗЦ ОТМЕНЕН ОГРАНИЧЕНИЯМИ
- суперболюс(%d m)
- ЗЦ остановлен
- остановлен на(%d m)
- отметка НИЗКИЙ
- низкий заряд батареи
- вручную
- MDI
- болюс на еду
- mg/dl
- %d м. назад
- отсутствует
- mmol/l
- о приложении
- выход
- экспорт настроек
- импорт настроек
- опции
- синхронисировать назначения с NS
- обнулить базы
- показать лог
- %s необходимо включить в белый список для корректной работы
- APS не выбрана или не выдала результат
- адаптер блутус не найден
- изменения не запрошены
- профиль еще не загружен из NS
- профиль не выбран
- ПРОФИЛЬ НЕ ЗАДАН
- неудача - проверьте телефон
- недоступно
- NS не имеет разрешения внести изменения. неверный API secret?
- начать работу с NS
- данные не передаются в NS
- данные передаваемые в NS не доходят. AAPS соединяется с NS но изменения туда не вносятся
- только абсолютные величины для базала
- только передача в NS (синхронизация отсутствует)
- только передача в NS. работает в SGV только если выбран местный источник вроде xdrip. не работает в профилях при действующем профиле NS
- клиент NS
- автоскроллинг
- введите API secret для NS (мин 12 знаков)
- API secret для NS
- NS API secret
- клиентNS
- клиент NS
- URL:
- введите URL адрес Nightscout
- Nightscout URL
- отключите \"только передача в NS\" чтобы активировать эту опцию
- базал
- DIA (время действия инсулина)
- IC (инсулин/углеводы):
- ISF (чувствительность к инсулину)
- Целевое значение СК:
- единицы
- OAPS
- Цели
- убедитесь что СК и данные помпы передаются в NS
- настройка визуализации и мониторинга, анализ базала и коэффициентов
- работа в режиме незамкнутого цикла и ручной подстройки величины временного базала. Set up and use temporary and default temporary targets (e.g. for activity or hypo treatment carbs)
- старт незамкнутого цикла
- на основе полученного опыта определите макс величину базала и введите ее в помпу и настройки
- анализ вашего незамкнутого цикла включая рекомендации по врем базалу
- работа в замкнутом цикле с макс IOB = 0 несколько дней избегая событий типа Low Suspend
- закольцовывание цикла с Low Glucose Suspend (приостановка на низких СК)
- работа несколько дней и по кр мере одну ночь без срабатывания оповещений о низком СК
- настройка замкнутого цикла с поднятием макс величины IOB выше 0 и постепенным понижением целевых СК
- 1 неделя успешной дневной работы с регулярным введением углеводов
- при необходимости настройка базала и коэффициентов с последующей активацией auto-sens
- активация таких доп функций для дневного времени как калькулятор advanced meal assist
- гликемия доступна в NS
- старт
- проверка
- ввод вручную
- статус помпы доступен в NS
- ЦЕЛИ
- закупорка
- ок
- старые данные
- текущие уведомления
- открыть настройки для Wear
- OpenAPS AMA
- значение по умолчанию : верно. используется чтобы разрешить юстировку целевых СК, а также ISF и базала
- знач по умолчанию:1,2. Это множитель для autosens (вскоре autotune) с лимитом 20% который определяет насколько высоко autosens может поднять базал, насколько низко опустиь ISF (чувствительность к инс)и целевые СК
- по умолчанию:0.7 Еще один параметр безопасности autosens, определяющий как низко он может опускать базал и как высоко поднимать ISF (чувств к инс) и целевые СК
- значение по умолчанию :2 bolus snoose активируется после введения болюса на еду чтобы цикл не взаимодействовал с временными низкими СК сразу после еды. так, трехчасовой DIA при величине 2 означает постыпенное затихание bolus snooze после 1.5 часов (3DIA/2)
- значение по умолчанию: 4 . Это вторая половина обеспечения безопасности OpenAPS из дуэта \"максимум 3x ежедневное; 4x текущее\" Означает что ваша база независимо от установок помпы не может быть выше чем это число умноженное на текущее значение базала. Ограничение для того, чтобы предотвратить вторжение в опасную зону из-за высокого уровня установленных значений базы без понимания алгоритма работы приложения. Большинству людей никогда не потребуется изменять это значение, скорее всего нужно поменять другие настройки если вы чувствуете, что вам мешает это ограничение.
- Внимание! Обычно нет необходимости изменять приведенные ниже величины. Нажмите ЗДЕСЬ, ПРОЧТИТЕ и убедитесь что вы ПОНИМАЕТЕ изложенное прежде чем менять какую-либо из этих величин
- значение по умолчанию:3 Это ключевой ограничитель безопасности OpenAPS. Он ограничивает величину вашего базала максимум до 3x максимума. Вам вероятно не понадобится менять эту величину но вам следует понимать, что она входит в формулу дуэта \"максимум 3x ежедневное; 4x текущее\"
- значение по умолчанию :3 усвоение углеводов за 5 мин. то есть 3 мг/дл/ 5 мин. Влияет на расчет прогнозируемой гликемии, когда СК падает быстрее или не растет так как ожидается.
- использовать AMA autosens
- OpenAPS MA
- данные autosens
- текущий врем базал
- модуль не активен
- статус гликемии
- параметры ввода
- данные IOB (активн инс)
- последнее заданное
- последнее выполненное
- в контексте OpenAPS называется макс базал
- макс разрешенный врем базал Е/ч
- эта величина называется макс IOB (макс активн инс) в OpenAPS. Значение по умолчанию 0. Через несколько дней или недель пользования величину можно юстировать в зависимости от вашего уровня комфорта.
- макс базал активн инс подаваемый с OpenAPS (ед)
- данные приема пищи
- данные гликемии недоступны
- профиль
- запрос
- результат
- выполнить сейчас
- отладка скрипта
- %1$.2f ограничено до %2$.2f
- величина %s недопустима
- открытый цикл
- есть новое предложение
- другое
- начало
- болюс
- доставлено
- будет доставлено %.2fU е инс
- стоп
- остановлено
- нажат стоп
- калькулятор
- калибровка
- текст на кнопке
- углеводы:
- использовать до:
- добавить
- расширенный болюс
- величина базала (%)
- % (100% = current)
- редактировать
- удалить
- НАЧАЛО
- ВремБазал
- Возраст пациента
- выберите возраст пациента для определения ограничителей безопасности
- на паузе
- процент
- нижняя и верхняя граница диаграммы в отчетах и Smartwatch (mmol/l)
- диапазон для визуализации
- прайм/заполнение
- профиль
- настройка базального профиля не состоялась
- базальный профиль помпы обновлен
- профиль NS
- профильNS
- помпа не инициализирована
- помпа не инициализирована, профиль не установлен
- помпа занята
- ошибка помпы
- помпа выключена
- работа помпы приостановлена
- очередь
- БыстрыйБолюс
- БыстрыйБолюс настройки
- значение
- основание
- обновить профиль
- удалить запись
- повторить отправку всех данных
- вы действительно хотите обнулить базы данных ,
- перезапуск
- выход из приложения для применения настроек
- возобновить
- безопасность
- сохранить
- отправить калибровку %.1f на xdrip?
- принять новый врем базал:
- установить новый расширенн болюс:
- настройки импортированы
- установка расшир болюса
- пароль к настройкам
- установка врем базала
- краткосрочная средняя дельта
- сокращенные имена табул
- показать очередь
- простой профиль
- ПП
- гликемия:
- "базал: "
- болюс:
- дельта:
- IOB:
- прошлый СК:
- %d мин назад
- SMS коммуникатор
- разрешенные телефонные номера
- +XXXXXXXXXX;+YYYYYYYYYY
- чтобы начать базал %1$.2fU/h ответьте кодом %2$s
- чтобы прекратить врем базал ответьте кодом %s
- болюс %.2fU доставлен успешно
- доставка болюса не состоялась
- чтобы доставить болюс %1$.2fU ответьте кодом %2$s
- xdrip не получает калибровок
- чтобы отправить калибровку %1$.2f ответьте кодом %2$s
- калибровка отправлена. в xdrip должен быть активирован прием
- неверный номер телефона для смс
- зцикл был деактивирован
- зцикл был активирован
- зцикл не работает
- зцикл работает
- зцикл возобновлен
- зцикл приостановлен
- отсутствует смс подтверждение
- удаленная настройка базала не разрешена
- удаленный болюс не разрешен
- удаленная калибровка не разрешена
- удаленная команда не разрешена
- разрешить команды через смс
- SMS
- для приостановки цикла на %1$d мин ответьте кодом %2$s
- врем базал отменен
- отмена врем базала не состоялась
- неуспех старта врем базала
- врем базал %1$.2fU/h на %2$d мин начат успешно
- неизвестная команда или неверный ответ
- неверное значение длительности
- состояние:
- остановка расшир болюса
- остановка врем базала
- успех
- суперболюс
- приостановить цикл на 10 часов
- приостановить цикл на 1 час
- приостановить цикл на 2 часа
- приостановить цикл на 3 часа
- целевой диапазон
- подросток
- ошибка доставки врем базала
- IOB:
- общий IOB
- инс:
- соотношение:
- длит:
- ошибка доставки болюса
- назначения
- нагрузка:
- углеводы:
- инсулин:
- IOB: активн инс
- общая активность IOB:
- всего IOB:
- кол-во углеводов
- кол-во инсулина
- НАЗНАЧ
- базал IOB
- гликемия
- 15 мин тренд
- болюс IOB
- углеводы
- активн углеводы
- коррекция
- ед
- макс разрешенный болюс
- макс разрешенные углеводы (г)
- безопасность назначений
- единицы измерения:
- разрешить внести изменения в настройки
- неподдерживаемая версия NSClient
- обновление значений базала
- передача данных
- виртуальная помпа
- базовая величина базала
- батарея
- продленный болюс
- прошивка
- прошлое соединение
- резервуар
- OK
- настройки вирт помпы
- ВиртПомпа
- врем базал
- статус передачи данных в NS
- ВИРТУАЛЬНАЯ ПОМПА
- ожидание помпы
- ожидание результата от помпы
- Wear
- разбивка IOB на болюсный и базальный IOB на циферблате смарт-часов
- показать IOB подробно
- настройки смарт-часов Wear
- WEAR
- добавить BGI в строку состояния
- показать BGI
- неверный пароль
- неверный пароль помпы
- xdrip
- xdrip+ не установлен
- строка состояния xdrip (часы)
- состояние xdrip (часы)
- xds
- разрешенный предел достигнут
- Ожидаемое время усваивания всех углеводов пищи в часах
- Максимальное время усваимости пищи
- Настройки усваиваемости
- АКТИВИРОВАТЬ ПРОФИЛЬ
- БАЗ
- АКТИВНОСТЬ
- канюля проработала
- ВозрКан
- УГЛЕВОДЫ ; БОЛЮС
- МОНИТОРИНГ; OPENAPS
- Инсулин проработал
- ВозрИнс
- Длительность (мин)
- Батарея помпы работает
- ВозрБат
- ПОМПА
- замена батареи помпы
- сенсор пропаботал
- ВОЗРСенс
- определение чувствительности
- не все профили загружены!
- Данные не сохранены!
- Просмотреть расширенный болюс %
- DanaRv2
- дата
- pначение длительности работы инс %1$f слишком мало - применено %2$f
- расширенный болюс
- Акуу-Зуфл Щкуа
- час
- Время пика действующего инс IOB
- время пика (в мин.)
- НЕВЕРНО
- Неверный профиль !!!
- отмена
- OK
- Голландский
- опции оповещения
- Активировать передачу на другие приложения (напр. xDrip)
- Активировать локальную передачу
- Высокий
- Низкий
- Нет данных
- Порог устаревших данных (мин)
- Порог тревоги из-за устаревших данных (мин)
- Тревога выс
- Тревога низкий
- Тревога нет данных
- OpenAPS
- OAPS
- отмена расшир болюса
- значения базала (ед/ч)
- тип базала
- смена профиля
- помпа
- быстро действующий Oref
- обновить данные из NS
- heccrbq
- Xedcnd
- Активируя Autosense не забывайте вводить все съеденные углеводы. Иначе отклонения в углеводах будут неверно определены как изменение чувствительности !!
- Чувствительность AAPS
- Чувствительность Oref0
- средневзвешенная чувствительность
- Шведский
- ВремБазал
- ВремЦель
- Fiasp
- Сверхбыстрый Oref
- Неподдерживаемая версия Nightscout
- uploader
- UPLD
- ПРОДЛ
- интервал для autosens (ч)
- Время в часах в прошлом для определения чувствительности (время усвоения углеводов исключается)
+ Безопасность назначений
+ Макс разрешенный болюс [U] ед.
+ макс разрешенные углеводы (г)
+ опции
+ синхронисировать назначения с NS
+ обнулить базы
+ Вы действительно хотите обнулить базы данных?
+ Выход
+ Для величин >200% пользуйтесь удлиненным болюсом
+ устройство блутус danaR
+ Всегда пользуйтесь абсолютными величинами для базала
+ Пожалуйста перезагрузите телефон или перезапустите AndroidAPS из системных настроек \nиначе AndroidAPS не будет вести лог (важно для отслеживания и проверки алгоритмов)!
+ Кнопки быстрого доступа к распространенным настройкам
+ Введите дополнительные записи логов.
+ Применяется для настройки активных плагинов
+ Обучающая программа
+ Показывает предварительные настройки приема пищи из Nightscout
+ Предустановки для Humalog и Novorapid / Novolog
+ Предустановки для Fiasp
+ Позволяет самостоятельно задавать пик активности инсулина - только для опытных пользователей
+ Активировать или деактивировать запуск цикла.
+ Синхронизирует данные с Nightscout
+ Состояние алгоритма в 2016 году
+ Состояние алгоритма в 2017 году
+ Самый новый алгоритм для опытных пользователей
+ Отображает текущее состояние цикла и часто используемые кнопки
+ Показывает текущие уведомления и краткий обзор событий цикла
+ Определить профиль, доступный автономно.
+ Содержит профиль, заданный в Nightscout
+ Определите профиль только в одном блоке времени.
+ Интеграция с помпой Accu-Chek Combo, требует наличия установленного алгоритма
+ Интеграция с помпой DANA Diabetcare R
+ Интеграция с отечественной помпой DANA Diabetcare R
+ Интеграция с помпой Dana Diabetcare R с обновленной прошивкой
+ Интеграция с помпой DANA Diabetcare RS
+ Интеграция с помпой Accu-Chek Insight, требует наличия установленного SightRemote
+ Интеграция с помпой для тех, кто делает многочисленные подколки для компенсации диабета
+ Интеграция с помпами, еще не имеющими драйвера (незамкнутый цикл)
+ Чувствительность вычисляется аналогично алгоритму oref0, но можно включить период прошлого. Минимальное усвоение углеводов вычисляется на основе макс усвоения из настроек.
+ Чувствительность рассчитывается на основе данных за прошедшие 24 часа и (неусвоенные) углеводы не учитываются после времени указанного в настройках.
+ Чувствительность рассчитывается на основе данных за прошедшие 8 часов и (неусвоенные) углеводы не учитываются после времени указанного в настройках. Плагин также вычисляет UAM.
+ Чувствительность рассчитывается как средневзвешенное от отклонений (deviations). Более поздние отклонения имеют больший вес. Минимальное усвоение углеводов рассчитывается на основе макс времени усвоения углеводов в настройках. Этот алгоритм быстрее всего отслеживает изменения чувствительности.
+ Получать данные гликемии от пропатченного приложения Dexcom G5.
+ Получать данные гликемии от Glimp.
+ Получать данные гликемии от 600SeriesAndroidUploader.
+ Получать данные гликемии с сайта Nightscout
+ Получать данные гликемии от xDrip.
+ Сохраняет все выполненные назначения
+ Мониторить и контролировать AndroidAPS при помощи часов WearOS.
+ Показать информацию о работе алгоритма ИПЖ на экране смарт-часов xDrip+.
+ Дистанционное управление AndroidAPS при помощи команд SMS.
+ старт
+ Верификация
+ единицы
+ DIA (время действия инсулина)
+ IC (инсулин/углеводы):
+ ISF (чувствительность к инсулину)
+ базал
+ Целевое значение СК:
+ ПРОФИЛЬ НЕ ЗАДАН
+ инсулин:
+ углеводы:
+ IOB: активн инс
+ IOB: активный инсулин
+ Нагрузка:
+ Общий IOB:
+ Общая активность IOB:
+ длит:
+ соотношение:
+ инс:
+ IOB: активный инсулин
+ общий IOB
+ кол-во инсулина
+ кол-во углеводов
+ гликемия
+ TT
+ углеводы
+ коррекция
+ ед
+ болюс IOB
+ выполнить сейчас
+ ВИРТУАЛЬНАЯ ПОМПА
+ базовая величина базала
+ врем базал
+ продленный болюс
+ батарея
+ резервуар
+ OK
+ последнее выполненное
+ параметры ввода
+ статус гликемии
+ текущий врем базал
+ данные IOB (активн инс)
+ профиль
+ данные приема пищи
+ результат
+ данные гликемии недоступны
+ изменения не запрошены
+ запрос
+ Базал
+ продолжительность
+ основание
+ гликемия
+ изменение
+ дельта:
+ конфигуратор
+ Цели
+ Помощник болюса OpenAPS MA
+ начало
+ профиль NS
+ простой профиль
+ ВремБазал
+ назначения
+ виртуальная помпа
+ портал назначений
+ помпа
+ Какой помпой вы хотели бы пользоваться с AndroidAPS?
+ назначения
+ Каким плагином пользоваться для выполнения назначений?
+ профиль
+ Какой профиль следует использовать в AndroidAPS?
+ система ИПЖ
+ Какой алгоритм ИПЖ должен выполнять подстройку терапии?
+ Общее
+ Это некоторые общепринятые плагины которые могут пригодиться.
+ Какие ограничения применяются?
+ дней
+ ограничения
+ замкнутый цикл
+ замкнутый цикл
+ Используйте, чтобы активировать интеграцию AndroidAPS в цикл ИПЖ.
+ Система ИПЖ
+ после наложенных ограничений
+ Временный базал определяется помпой
+ Последнее предпринятое
+ OK
+ Отменить
+ APS не выбрана или не выдала результат
+ безопасность
+ модуль не активен
+ ограничение нарушено
+ Ошибка подачи болюса
+ Ошибка подачи врем базала
+ величина базала (%)
+ % (100% = текущий)
+ принять новый врем базал:
+ болюс
+ калькулятор
+ применено ограничение!
+ подтверждение
+ введите новое назначение
+ болюс
+ болюс:
+ базал
+ базал:
+ углеводы
+ измените введенные данные
+ Установить новый удлиненный болюс:
+ источник СК
+ Откуда должен получать данные AndroidAPS?
+ xdrip
+ режим APS
+ замкнутый цикл
+ открытый цикл
+ цикличность неактивирована
+ Деактивировать цикличность
+ Активировать цикличность
+ есть новое предложение
+ неподдерживаемая версия NSClient
+ Неподдерживаемая версия Nightscout
+ отключите \"только передача в NS\" чтобы активировать эту опцию
+ гликемия доступна в NS
+ статус помпы доступен в NS
+ ввод вручную
+ ЗЦ ОТМЕНЕН ОГРАНИЧЕНИЯМИ
+ базал IOB
+ применено ограничение болюса
+ применено ограничение углеводов
+ проверка СК
+ оповещение
+ заметка
+ вопрос
+ нагрузка
+ смена места катетера помпы
+ Установка сенсора мониторинга глюкозы
+ старт сенсора
+ замена картриджа инсулина
+ смена профиля
+ болюс на перекус
+ болюс на еду
+ болюс на коррекцию
+ комбинированный болюс
+ начало действия врем базала
+ оконч действия врем базала
+ корректировка углеводов
+ OpenAPS офлайн
+ тип события
+ другое
+ глюкометр
+ сенсор
+ углеводы
+ инсулин
+ Время действия углеводов
+ разбивка
+ Длительность действия
+ процент
+ абсолют
+ заметки
+ время события
+ профиль
+ кем введено
+ тип глюкозы
+ профиль еще не загружен из NS
+ ВремБазал
+ расширенный болюс
+ версия Nightscout:
+ отсутствует
+ настройки экспортированы
+ экспортировать настройки в
+ импортировать настройки из
+ настройки импортированы
+ файл не найден
+ экспорт настроек
+ импорт настроек
+ макс разрешенный врем базал Е/ч
+ в контексте OpenAPS называется макс базал
+ макс базал активн инс подаваемый с OpenAPS (ед)
+ Эта величина называется Max IOB (макс активн инс) в OpenAPS\n. Это макс кол-во инсулина в ед. [U] которое APS может подать единовременно.
+ отклонить
+ DanaR
+ соединение устанавливается
+ соединение установлено
+ Разъединено
+ настройки помпы DanaR
+ лицензионное соглашение с пользователем
+ НЕ ДОЛЖНО ИСПОЛЬЗОВАТЬСЯ ДЛЯ ПРИНЯТИЯ МЕДИЦИНСКИХ РЕШЕНИЙ. ПРОГРАММА НЕ ДАЕТ ГАРАНТИЙ В РАМКАХ СУЩЕСТВУЮЩЕГО ЗАКОНОДАТЕЛЬСТВА. ПРЕДОСТАВЛЯЕТСЯ \"КАК ЕСТЬ\" БЕЗ ЯВНЫХ ИЛИ СКРЫТЫХ ГАРАНТИЙ ВКЛЮЧАЯ НО НЕ ОГРАНИЧИВАЯСЬ ВОЗМОЖНОСТЬЮ КОММЕРЧЕСКОГО ИСПОЛЬЗОВАНИ ИЛИ СООТВЕТСТВИЯ КАКИМ-ЛИБО ЦЕЛЯМ. ВСЕ РИСКИ ЛОЖАТСЯ НА ВАС. В СЛУЧАЕ НЕРАБОТОСПОСОБНОСТИ ПРОГРАММЫ ВЫ НЕСЕТЕ ВСЕ РАСХОДЫ СВЯЗАННЫЕ С ОБСЛУЖИВАНИЕМ РЕМОНТОМ ИЛИ КОРРЕКТИРОВКОЙ.
+ я понимаю и принимаю
+ сохранить
+ адаптер блутус не найден
+ выбранное устройство не найдено
+ ошибка соединения
+ активный инсулин на помпе
+ суточные единицы
+ предыдущий болюс
+ %.1fч назад
+ введенные данные неверны
+ величина не задана должным образом
+ обновить профиль
+ просмотр профиля
+ выполнено
+ комментарий
+ успех
+ процент
+ абсолют
+ отмена врем базала
+ SMS коммуникатор
+ ожидание результата от помпы
+ разрешенные телефонные номера
+ + XXXXXXXXXX; + YYYYYYYYYY
+ Чтобы подать болюс %1$.2fU ответьте кодом %2$s
+ чтобы отправить калибровку %1$.2f ответьте кодом %2$s
+ Подача болюса не состоялась
+ Болюс %.2fU подан успешно
+ Начинается подача болюса %.2fU
+ Болюс %.2fU дан успешно
+ Подается болюс %.2fU
+ разрешить команды через смс
+ Команда на удаленный болюс не разрешена
+ палец
+ сенсор
+ вручную
+ временное целевое значение
+ отмена времнной цели
+ настройки профиля DanaR
+ время действия инсулина (ч.):
+ Продолжительность активности инсулина
+ не удалось обновить базальный профиль
+ Перезагрузка истории
+ передача данных
+ Болюс E (удлиненный)
+ Болюс DS (комбинированный стандартный)
+ Болюс DE (комбинированный расширенный)
+ ошибка
+ дозаправка
+ почасовой базал
+ гликемия
+ углеводы
+ внимание!
+ Всего передано %1$d записей
+ болюс S
+ оповещения об опасности
+ почасовые базалы
+ болюсы
+ углеводы
+ суточный инсулин
+ ошибки
+ гликемия
+ Перезаправка
+ Останов
+ Связь установлена за %1$d сек
+ пароль помпы
+ неверный пароль помпы
+ помпа занята
+ Болюс подан
+ остановлено
+ Болюс остановлен
+ Остановка болюса
+ закупорка
+ стоп
+ нажат стоп
+ ожидание помпы
+ Будет доставлено %.2fU ед. инс
+ настройка визуализации и мониторинга, анализ базала и коэффициентов
+ убедитесь что СК и данные помпы передаются в NS
+ старт незамкнутого цикла
+ Работа в режиме незамкнутого цикла и ручной подстройки величины временного базала. Установите и применяйте временные цели и временные цели по умолчанию (напр. углеводы при нагрузке или купировании гипо)
+ анализ вашего незамкнутого цикла включая рекомендации по врем базалу
+ на основе полученного опыта определите макс величину базала и введите ее в помпу и настройки
+ закольцовывание цикла с Low Glucose Suspend (приостановка на низких СК)
+ работа в замкнутом цикле с макс IOB = 0 несколько дней избегая событий типа Low Suspend
+ настройка замкнутого цикла с поднятием макс величины IOB выше 0 и постепенным понижением целевых СК
+ работа несколько дней и по кр мере одну ночь без срабатывания оповещений о низком СК
+ при необходимости настройка базала и коэффициентов с последующей активацией auto-sens
+ 1 неделя успешной дневной работы с регулярным введением углеводов
+ активация таких доп функций для дневного времени как калькулятор advanced meal assist
+ Активация таких доп функций для дневного времени как супер микро болюс SMB
+ Прочтите wiki и увеличьте maxIOB чтобы супер микро болюс SMB заработал как надо! Хорошее начало – maxIOB = средний болюс на еду + троекратный максимальный базал суток
+ разрешенный предел достигнут
+ профиль не выбран
+ зцикл был деактивирован
+ зцикл был активирован
+ зцикл не работает
+ зцикл работает
+ %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
+ помпа не инициализирована
+ помпа не инициализирована, профиль не установлен
+ прайм/заполнение
+ убедитесь что количество соответствует характеристикам вашей инфузионной системы
+ другое
+ заполнить стандартное количество инсулина
+ кнопка 1
+ кнопка 2
+ кнопка 3
+ единицы измерения:
+ мг/дл
+ ммоль/л
+ Время действия инсулина DIA:
+ целевой диапазон
+ диапазон для визуализации
+ Нижняя и верхняя граница диаграммы в отчетах и Smartwatch
+ отметка НИЗКИЙ
+ Отметка ВЫСОКИЙ
+ Смарт-часы Wear
+ повторить отправку всех данных
+ открыть настройки для Wear
+ ошибка помпы
+ низкий заряд батареи
+ Выключение помпы
+ батарея помпы разряжена
+ DanaR Корея
+ Шаг базала:
+ настройка базального профиля не состоялась
+ базальный профиль помпы обновлен
+ отключить режим EasyUI в помпе
+ Активировать удлиненные болюсы на помпе
+ замена режима с U/d на U/h на помпе
+ значение базала ниже минимума. профиль не создан!
+ гликемия:
+ прошлый СК:
+ Подача инсулина шприц-ручкой
+ MM640g
+ текущие уведомления
+ старые данные
+ %1$d мин. назад
+ %1$d мин. назад
+ локальный профиль
+ Помощник болюса OpenAPS MA
+ краткосрочная средняя дельта
+ Долгосрочная средняя дельта
+ Массив %1$d элементов. \nActual актуальная величина:
+ данные autosens
+ отладка скрипта
+ использовать AMA autosens
+ обновить данные из NS
+ Удалить назначения из будущего
+ Близкий прием пищи
+ Гипо
+ Нагрузка
+ удалить запись
+ статистика DanaR
+ накопительные TDD
+ экспоненциально взвешенные TDD
+ базал
+ болюс
+ общая суточная доза
+ дата
+ коэффициент
+ количество дней
+ вес
+ возможны неточности если болюсы использовались для заполнения
+ старые данные. нажмите \"перезагрузка\"
+ общий базал
+ общий базал*2
+ инициализация...
+ ДЕЙСТВ
+ КОНФ
+ ЗЦ
+ ПП
+ OAPS
+ ЛП
+ ДАНА
+ НАЧАЛО
+ ВиртПомпа
+ профильNS
+ НАЗНАЧ
+ ПОРТНаз
+ ЦЕЛИ
+ WEAR
+ SMS
+ сокращенные имена табул
+ всегда используйте укороченное среднее приращение вместо простого
+ полезно когда данные из нефильтруемых источников вроде Xdrip зашумляются
+ расширенные настройки
+ модель: %1$02X протокол: %2$02X код: %3$02X
+ профиль
+ значение по умолчанию:3 Это ключевой ограничитель безопасности OpenAPS. Он ограничивает величину вашего базала максимум до 3x максимума. Вам вероятно не понадобится менять эту величину но вам следует понимать, что она входит в формулу дуэта \"максимум 3x ежедневное; 4x текущее\"
+ значение по умолчанию: 4 . Это вторая половина обеспечения безопасности OpenAPS из дуэта \"максимум 3x ежедневное; 4x текущее\" Означает что ваша база независимо от установок помпы не может быть выше чем это число умноженное на текущее значение базала. Ограничение для того, чтобы предотвратить вторжение в опасную зону из-за высокого уровня установленных значений базы без понимания алгоритма работы приложения. Большинству людей никогда не потребуется изменять это значение, скорее всего нужно поменять другие настройки если вы чувствуете, что вам мешает это ограничение.
+ знач по умолчанию:1,2. Это множитель для autosens (вскоре autotune) с лимитом 20% который определяет насколько высоко autosens может поднять базал, насколько низко опустиь ISF (чувствительность к инс)и целевые СК
+ по умолчанию:0.7 Еще один параметр безопасности autosens, определяющий как низко он может опускать базал и как высоко поднимать ISF (чувств к инс) и целевые СК
+ Autosens тоже подстроит цели
+ значение по умолчанию : верно. используется чтобы разрешить юстировку целевых СК, а также ISF и базала
+ значение по умолчанию :2 bolus snoose активируется после введения болюса на еду чтобы цикл не взаимодействовал с временными низкими СК сразу после еды. так, трехчасовой DIA при величине 2 означает постыпенное затихание bolus snooze после 1.5 часов (3DIA/2)
+ Значение по умолчанию: 3.0 (AMA) или 8.0 (SMB). Эта настройка на усвоение углеводов за 5 мин. По умолчанию ожидается 3мг/дл/5мин. Влияет на скорость учета поглощения углеводов COB и усвоения в расчетах прогнозируемой гликемии, когда СК падает быстрее или не растет так как ожидается.
+ Внимание! Обычно нет необходимости изменять приведенные ниже величины. Нажмите ЗДЕСЬ, ПРОЧТИТЕ и убедитесь что вы ПОНИМАЕТЕ изложенное прежде чем менять какую-либо из этих величин
+ разрешены только цифровые значения
+ разрешены только цифровые значения в диапазоне %1$s - %2$s
+ поле не может быть пустым
+ неверный номер телефона
+ неверный номер телефона для смс
+ калибровка
+ отправить калибровку %.1f на xdrip?
+ xdrip+ не установлен
+ калибровка передается на xdrip
+ удаленная калибровка не разрешена
+ калибровка отправлена. в xdrip должен быть активирован прием
+ xdrip не получает калибровок
+ Работа помпы остановлена
+ получение статуса помпы
+ установка врем базала
+ остановка врем базала
+ Настройка удлиненного болюса
+ Остановка удлиненного болюса
+ обновление значений базала
+ разъединение
+ выполнение
+ настройки вирт помпы
+ статус передачи данных в NS
+ неверный пароль
+ пароль к настройкам
+ разрешить внести изменения в настройки
+ приближается суточный лимит инсулина
+ клиент NS
+ КЛNS
+ Адрес URL:
+ автоскроллинг
+ перезапуск
+ клиент NS
+ URL-адрес Nightscout
+ введите URL адрес Nightscout
+ API secret для NS
+ API secret для NS
+ введите API secret для NS (мин 12 знаков)
+ Подать сейчас
+ очистка очереди
+ показать очередь
+ очередь
+ состояние:
+ на паузе
+ очистка лога
+ NS не имеет разрешения внести изменения. неверный API secret?
+ настройки смарт-часов Wear
+ показать IOB подробно
+ разбивка IOB на болюсный и базальный IOB на циферблате смарт-часов
+ неудача - проверьте телефон
+ недоступно
+ Возраст пациента
+ ребенок
+ подросток
+ взрослый
+ Инсулинорезистентный взрослый
+ выберите возраст пациента для определения ограничителей безопасности
+ Glimp
+ %s необходимо включить в белый список для корректной работы
+ ЗЦ остановлен
+ Остановлен на(%1$d m)
+ Суперболюс(%1$d m)
+ приостановить цикл на 1 час
+ приостановить цикл на 2 часа
+ приостановить цикл на 3 часа
+ приостановить цикл на 10 часов
+ отсоединить помпу на 15 мин
+ отсоединить помпу на 30 мин
+ отсоединить помпу на 1 час
+ отсоединить помпу на 2 часа
+ отсоединить помпу на 3 часа
+ возобновить
+ неверное значение длительности
+ ЗЦ остановлен
+ ЗЦикл возобновлен
+ 15 мин тренд
+ активн углеводы
+ суперболюс
+ начать работу с NS
+ выход из приложения для применения настроек
+ DanaRv2
+ инсулин
+ Какой тип инсулина вы используете?
+ быстродействующий инсулин
+ Novorapid, Novolog, Humalog
+ Fiasp
+ ИНС
+ активировать суперболюс
+ активировать возможность суперболюса в мастере. не активируйте если не знаете что это. МОЖЕТ ВЫЗВАТЬ ПЕРЕДОЗИРОВКУ ИНСУЛИНА ЕСЛИ ИСПОЛЬЗУЕТСЯ ВСЛЕПУЮ
+ IOB акт инс
+ акт углев
+ прошивка
+ прошлое соединение
+ статус блутус
+ о приложении
+ отсутствует смс подтверждение
+ состояние xdrip (часы)
+ строка состояния xdrip (часы)
+ Статус xDrip
+ показать BGI
+ добавить BGI в строку состояния
+ данные не передаются в NS
+ данные передаваемые в NS не доходят. AAPS соединяется с NS но изменения туда не вносятся
+ шаг базала
+ шаг болюса
+ Удлиненный болюс
+ ВремЦель
+ Отмена удлиненного болюса
+ сенсор пропаботал
+ Катетер помпы проработал
+ Инсулин проработал
+ час
+ тип базала
+ Неверный профиль !!!
+ смена профиля
+ Батарея помпы работает
+ замена батареи помпы
+ опции оповещения
+ Тревога выс
+ Высокий
+ Низкий
+ Тревога низкий
+ Устаревшие данные
+ Тревога! устаревшие данные
+ Порог оповещения об устаревших данных [min] (мин)
+ Порог тревоги об устаревших данных [min] (мин)
+ Интервал для autosens [h] (ч)
+ Время в часах в прошлом для определения чувствительности (время усвоения углеводов исключается)
+ помпа
+ OpenAPS
+ Загрузчик
+ определение чувствительности
+ Какой алгоритм чувствительности следует использовать?
+ ЧУВСТВ
+ Чувствительность Oref0
+ Чувствительность Oref1
+ Чувствительность AAPS
+ Настройки усваиваемости
+ Максимальное время усваимости пищи [h] (час)
+ Ожидаемое время усваивания всех углеводов пищи в часах
+ Просмотреть расширенный болюс %
+ ВОЗРСенс
+ ВозрИнс
+ ВозрКан
+ ВозрБат
+ OAPS
+ ЗАГРУЗ
+ БАЗ
+ УДЛИНН
+ Не отключать экран
+ Не давать системе Android отключать экран. Это увеличит потребление энергии при отключенной сети питания.
+ Активируя Autosense не забывайте вводить все съеденные углеводы. Иначе отклонения в углеводах будут неверно определены как изменение чувствительности !!
+ средневзвешенная чувствительность
+ OK
+ отмена
+ не все профили загружены!
+ Данные не сохранены!
+ Активировать передачу на другие приложения (напр. xDrip)
+ Активировать локальную передачу
+ АКТИВНОСТЬ
+ УГЛЕВОДЫ ; БОЛЮС
+ МОНИТОРИНГ; OPENAPS
+ ПОМПА
+ значения базала (ед/ч)
+ Длительность (мин)
+ Супер микро болюс OpenAPS
+ Супер микро болюс SMB
+ Включить непредвиденный прием пищи UAM
+ Включить супер микро болюс SMB
+ Для ускорения действия используйте супер микро болюсы SMB вместо временного базала
+ Поиск непредвиденного приема пищи
+ Время пика действующего инс IOB
+ время пика (в мин.)
+ Свободный от пиков Oref
+ быстро действующий Oref
+ Сверхбыстрый Oref
+ Значение длительности работы инс %1$f слишком мало - применено %2$f!
+ АКТИВИРОВАТЬ ПРОФИЛЬ
+ дата
+ НЕВЕРНО
+ Ожидание соединения на помпе
+ Соединение OK
+ Истекло время ожидания соединения
+ Установка соединения
+ Устройства пока не найдены
+ Резервуар пуст
+ Предупреждение при измерении уровня СК
+ Уровень оставшегося инсулина
+ DanaRS
+ Dana
+ Выбранная помпа
+ Соединиться с другой помпой
+ Скорость подачи болюса
+ Установить шаг базала 0.01 ед/ч
+ Серийный номер
+ Процент
+ Сдвиг по времени
+ Временные цели по умолчанию
+ продолжительность ожидания приема пищи eatingsoon
+ целевое значение СК при ожидаемом приеме пищи eatingsoon
+ длительность нагрузки
+ целевое значение СК при физической нагрузке
+ длительность гипо
+ целевое значение СК при гипо
+ Заполнить перед работой
+ Получение статуса удлиненного болюса
+ Получение статуса болюса
+ Получение статуса временного базала
+ Получение настроек помпы
+ Получение времени помпы
+ повторное использование
+ Контроль с часов
+ Поставить временные цели и ввести назначения с часов.
+ Истекло время ожидания соединения
+ Еда
+ грамм
+ минут
+ ч
+ ]]>
+ кДж
+ Энергия
+ Белки
+ Жиры
+ ]]>
+ Ожидание окончания болюса. Оставшиеся %1$d сек.
+ Обработка события
+ Начало подачи болюса
+ Команда сейчас выполняется
+ Драйвер помпы откорректирован
+ Помпа недоступна
+ Пропущенные данные СК
+ Использовать системные уведомления для предупреждений и уведомлений
+ Локальные оповещения
+ Оповещать при отсутствии данных СК
+ Оповещать в случае недоступности помпы
+ Порог недоступности помпы [min]
+ Сигнал тревоги
+ ИНФОРМАЦИЯ
+ Bluetooth
+ Дежурный режим Watchdog
+ Выключает bluetooth телефона на одну секунду, если подключение к помпе невозможно. Это помогает на тех телефонах, где зависает модуль bluetooth.
+ Приложение Dexcom (пропатченное)
+ Загрузить данные СК в Nightscout
+ Настройки загрузки c G5
+ Настройка загрузки с Poctech
+ Показать подробно дельту
+ Показать дельту еще с одним десятичным знаком
+ Верхний лимит минут базала на SMB
+ Неподдерживаемая версия прошивки помпы
+ Отправить данные СК на xDrip+
+ В xDrip + выберите источник данных 640g/Eversense
+ СК с клиента Nightscout
+ Значение базала заменено минимальной поддерживаемой величиной: %s
+ Значение базала заменено максимальной поддерживаемой величиной: %s
+ Вычисление СК
+ Расчет болюсного активного инсулина IOB
+ Расчет базального активного инсулина IOB
+ Расчет тренда
+ Расчет супер болюса
+ Да
+ Нет
+ Только положительные
+ Только отрицательные
+ Вычисление активных углеводов COB
+ Вычисление временного целевого значения
+ Цикл активирован
+ Выбран APS
+ NSClient имеет разрешение на запись
+ Режим замкнутого цикла включен
+ Максимум активного инсулина IOB установлен правильно
+ СК доступны из выбранного источника
+ Базальные значения не выровнены по часам: %s
+ Недопустимый профиль: %s
+ Помпа программируется для болюса
+ Обновить
+ Состояние
+ Нагрузка
+ Нет связи в течение %1$d мин
+ %1$d%% (%2$d мин осталось)
+ Инициализация
+ Остановлено из-за ошибки
+ Остановлено пользователем
+ Выполняется
+ Отмена врем базала TBR
+ Установка врем базала TBR на (%1$d%% / %2$d мин)
+ Введение болюса (%.1f ед)
+ Обновление
+ Запрашиваемая операция не поддерживается помпой
+ Небезопасное использование: Удлиненный или многоволновой болюс активны. Режим цикла Loop установлен на приостановку при низкой гликемии только на 6 часов. В режиме loop поддерживаются только обычные болюсы
+ Небезопасное использование: в помпе установлен другой профиль базала чем первый. Цикл остановлен. Выберите первый профиль на помпе и обновите.
+ Болюс с таким же количеством единиц был запрошен за последние две минуты. Для предотвращения случайных двойных болюсов и сбоев операция отменена.
+ Сейчас
+ Чтение истории помпы
+ история помпы
+ Установка базального профиля
+ Низкий уровень инсулина в картридже помпы
+ Низкий заряд батареи помпы
+ Помпа сообщает об ошибке E%1$d: %2$s
+ Низкий
+ Пусто
+ Нормальный
+ Необходимо обновить часы помпы
+ Внимание
+ Предупреждение об отмене скорости временного базала было подтверждено
+ Не удалось подключиться к помпе. Болюс не подан
+ Подача болюса не состоялась. Чтобы удостовериться, проверьте помпу во избежание двойного болюса и повторите подачу. Для защиты от ложных срабатываний болюсы не повторяются автоматически.
+ Только %1$.2f ед. из запрошенного болюса %2$.2f ед. было подано из-за ошибки. Пожалуйста, проверьте помпу, чтобы удостовериться в этом и принять соответствующие меры.
+ Подача болюса и проверка истории помпы не состоялись, пожалуйста проверьте помпу. Если болюс был подан, он будет добавлен в назначения во время следующего соединения с помпой.
+ В резервуаре недостаточно инсулина для болюса
+ Подача пролонгированного болюса не состоялась
+ Insight
+ Помпа Insight
+ Состояние
+ Изменено
+ ПОМПА ОСТАНОВЛЕНА
+ Статус обновлён
+ тому назад
+ с
+ Активный временный базал TBR
+ остался минимум
+ Лог (журнал событий)
+ Последнее завершенное действие
+ мин
+ остающееся свыше
+ итого с
+ рисковать
+ Никогда не разъединяться
+ БЕЗДЕЙСТВИЕ
+ СИНХРОНИЗАЦИЯ
+ Не доступно
+ СИНХРОНИЗИРОВАН
+ Пуск
+ потребности
+ Нет подключения к сопутствующему приложению!
+ Сопутствующее приложение по-видимому не установлено!
+ Несовместимое сопутствующее приложение, нужна версия
+ Неизвестно
+ Ожидание подтверждения кода
+ Код отклонен
+ Соединение с приложением
+ Не авторизована
+ Несовместима
+ сек.
+ мин.
+ ч.
+ дн.
+ нед.
+ с.
+ %1$ds истекает %2$s
+ Статус активности
+ Статистика
+ Подключить досрочно
+ Автоматически подключаться при открытии экранов AndroidAPS, не дожидаясь запросов команд на помпу, для сокращения задержки связи
+ Не рекомендуется из-за сильного расхода заряда батареи
+ Всегда включать супер микро болюс SMB
+ Всегда включать супер микро болюс SMB независимо от болюсов. Возможно только для источников СК с хорошей фильтрацией данных вроде G5
+ Активировать супер микро болюс SMB после углеводов
+ Включать супер микро болюс SMB на 6 часов после углеводов, даже при 0 активного инсулина COB. Возможно только для источников СК с хорошей фильтрацией данных вроде G5
+ Включить супер микро болюс при активном инсулине COB
+ Включить супер микро болюс SMB, когда активен инсулин COB.
+ Включить супер микро болюс SMB с временными целями
+ Включить супер микро болюс SMB при активной временной цели (близкий прием пищи, нагрузка)
+ Включить супер микро болюс SMB с высокими значениями временных целей
+ Включить супер микро болюс SMB при высоком значении действующей временной цели (нагрузка)
+ Оставить временный базал работающим
+ Отключить звук
+ Инсулин
+ Кол-во углеводов
+ Кнопки
+ Отправить калибровки на xDrip+ или открыть диалоговое окно калибровки G5
+ Открывает xDrip +, кнопка назад возвращает в AAPS
+ Количество вводимых углеводов при нажатии кнопки
+ Количество инсулина, вводимого при нажатии кнопки
+ Не удалось запустить приложения мониторинга СК. Убедитесь, что оно установлено.
+ Мониторинг СК
+ История
+ Сообщить о супер микро болюсе SMB
+ Показывать супер микро болюс SMB на часах как стандартный болюс.
+ Создавать оповещение на основе названия ошибки
+ Создать оповещение NS с диалогом об ошибке и оповещения на месте (также видимые в портале назначений в разделе лечение)
+ Показывать линию тренда на смарт-часах.
+ Прогнозирование
+ Отбор данных
+ Загрузка отчета для разработчиков
+ Разрешить отправлять сообщения о неполадках и данные об использовании опций разработчикам при помощи сервиса fabric.io.
+ Пожалуйста обновите ваше приложение G5 до поддерживаемой версии
+ Включить временную цель TT Нагрузка
+ Включить временную цель TT Скорый прием пищи
+ Временная цель (TT)
+ Не подавать болюс, только внести запись
+ Категория
+ Подкатегория
+ Болюс будет только записан
+ Заполнять пропущенные данные из NS
+ Супер микро болюс SMB задан помпой
+ Чувствительность
+ Отклонение
+ Активные углеводы COB
+ Активный инсулин IOB
+ Базал
+ Действие не выбрано, ничего не произойдет
+ Начать временную цель ТТ Гипо
+ Работает версия разработчика. Замкнутый цикл отключен.
+ Режим отладки включен
+ Режим отладки не задействован и отсутствует на ветке релиза
+ %.2f ед/ч
+ Чтение базального профиля
+ История событий помпы изменилась с момента вычисления болюса. Болюс не подан. Пожалуйста пересчитайте потребность в болюсе.
+ Болюс подан успешно, но запись о назначении не сделана. Это может быть вызвано тем, что за последние две минуты назначено два болюса одного объема. Пожалуйста проверьте историю событий помпы и записи о назначениях и добавьте пропущенные записи из Портала назначений. Не добавляйте записи с одним и тем же временем и одинаковым объемом.
+ Временная верхняя цель отклонена т. к. калькуляция не учитывала недавние изменения в истории событий помпы
+ Обновление статуса помпы
+ Скорость базала на помпе изменилась и вскоре будет обновлена
+ Скорость базала на помпе изменилась, но учесть ее не удалось
+ Проверка изменений в истории событий помпы
+ Только что импортировано несколько болюсов с одинаковым количеством инсулина в течение одной минуты. В лог лечения может быть добавлена только одна запись. Пожалуйста проверьте помпу и вручную введите запись о болюсе через вкладку портала назначений. Убедитесь, что данному времени соответствует только одна запись о болюсе.
+ \n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de) \n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de)
+ Новый болюс старше 24 часов или запись относится к будущему. Пожалуйста убедитесь что дата на помпе установлена правильно.
+ Время/дата поданного болюса неверны. Вероятно, кол-во активного инсулина IOB также неверно. Пожалуйста, проверьте время/дату помпы.
+ Профиль не переключен. Пожалуйста переключите профиль или нажмите \"активировать профиль\" в LocalProfile.
+ Отсчет болюса
+ Отсчет временного базала TBR
+ Цель %1$d не запущена
+ Цель %1$d не завершена
+ Эта помпа не рассчитана на подачу временного базала
+ На помпе не найдены валидные записи о базалах
+ Режим замкнутого цикла отключен в настройках
+ Автоматический подбор чувствительности Autosens отключен в настройках
+ Супер микро болюс SMB отключен в настройках
+ Макс базальный уровень ограничен до %1$.2f ед/ч вследствие %2$s
+ лимит помпы
+ величина должна быть положительной
+ множитель макс базала
+ множитель макс суточного базала
+ Болюс был подан в течение последних трех минут, минуя супер микро болюс SMB
+ Базал задан корректно
+ Макс процент базала ограничен до %1$d%% ед/ч вследствие %2$s
+ Макс уровень болюса ограничен до %1$.1f ед вследствие %2$s
+ Ограничение расширенного болюса до %1$.1f U из-за %2$s
+ Ограничение максимума активного инсулина IOB до %1$.1f U из-за %2$s
+ Ограничение максимума углеводов до %1$d грамм из-за %2$s
+ Ограничение активного инсулина IOB до %1$.1f ед. из-за %2$s
+ максимальное значение в настройках
+ жесткий предел
+ небезопасное использование
+ Статус чтения: неудача
+ Запись о замене места помпы
+ Запись о замене картриджа инсулина
+ Опция супер микро болюс всегда и после углеводов отключена т. к. активный источник данных СК не поддерживает комплексное фильтрование
+ В режиме незамкнутого цикла open loop супер микро болюс SMB не допускается
+ Еда
+ сброс
+ Ожидание синхронизации времени (%1$d сек)
+ Разъединен (%1$d м)
+ Автоматические события портала назначений
+ Автоматически загружать инсулин, изменения катетера, батареи и оповещения помпы в Nightscout
+ Предел суммарного активного инсулина IOB для OpenAPS [U]
+ Эта величина называется Max IOB в OpenAPS context\nOpenAPS не будет добавлять инсулин если текущий активный инсулин ее превысит
+ Помпа остановлена
+ Помпа запущена
+ Помпа приостановлена
+ Максимальное время усваимости пищи [h]
+ Время, за которое любая еда считается усвоившейся. Оставшиеся углеводы не будут учтены.
+ Время
+ Показать поле примечаний в диалогах назначений
+ Далее
+ Назад
+ Мастер настройки
+ ГОТОВО
+ Выберите Ваш язык
+ Запрошено: %1$.2f ед. Подано: %2$.2f ед. Код ошибки: %3$s
+ Первый шаг увеличения инсулина
+ Второй шаг увеличения инсулина
+ Третий шаг увеличения инсулина
+ Первый шаг увеличения углеводов
+ Второй шаг увеличения углеводов
+ Третий шаг увеличения углеводов
+ Мониторинг СК
+ Использовать только WiFi соединение
+ WiFi SSID
+ Только при зарядке
+ Параметры подключения
+ Разрешенные SSID (разделенные точкой с запятой)
+ Разрешить подключение в роуминге
+ Макс коэффициент авто чувствительности autosens
+ Мин. коэффициент авто чувствительности autosens
+ Делитель продолжительности действия инсулина при болюсе OpenAPS AMA
+ Множитель безопасности макс суточного базала
+ Текущий множитель безопасности базала
+ н/д
+ Тип виртуальной помпы
+ Определение помпы
+ Болюс: Шаг =%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:
+ Параметры экрана
+ Общие настройки wear
+ Включить клиент NSClient
+ Добро пожаловать в мастер установки
+ Настройки помпы
+ Статус \'чтение\'
+ Изменения должны быть сделано в Nightscout
+ Пропустить Мастер установки
+ Нажмите на кнопку ниже, чтобы AndroidAPS мог предложить/внести изменения в базал
+ Нажмите на кнопку ниже, чтобы включить Цели. По окончании работы Мастера проверьте вкладку Цели, чтобы сделать AndroidAPS полностью функциональным. \n
+ Включить Цели
+ Настроить плагин APS
+ Настроить плагин чувствительности Sensitivity
+ Плагин чувствительности Sensitivity применяется для определения чувствительности к инсулину и вычисления активных углеводов COB. Дополнительная информация:
+ https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COB
+
+Context | Edit Context
+ NSClient обрабатывает подключения к Nightscout. Вы можете пропустить этот этап сейчас, но вы не преодолеете все Цели пока не настроите его.
+ Напоминание: новые профили инсулина требуют как минимум 5 часов длительности действия DIA. 5-6 часовая DIA эквивалентна трехчасовой на старых профилях.
+ Настройте источник СК
+ Пожалуйста выберите источник профиля. Если пациент ребенок пользуйтесь профилем Nightscout. Если никто не отслеживает ваш СК на NS, вы вероятно предпочтете Локальный профиль. Напоминание - вы всего лишь выбираете профиль. Активируйте его \"Переключателем профиля\"
+ Выберите один из доступных алгоритмов. Они расположены от самых старых к самым новым. Более новый алгоритм обычно мощнее и агрессивнее. Если вы новый пользователь возможно вам лучше начать с помощника болюса AMA а не с новейшего алгоритма. Читайте документацию OpenAPS и определите свою конфигурацию.
+ Начните первую Цель
+ Права доступа
+ Запросить права доступа
+ Приложение нуждается в разрешении на доступ к определению местоположения для сканирования bluetooth
+ Приложение нуждается в разрешении доступа к хранению данных для хранения лог-файлов
+ Запрос
+ Настроить плагин инсулина
+ Выход
+ Параметры пользователя
+ Формат отображения времени
+ Кнопка прокрутки
+ Звуковой сигнал при нажатии кнопки
+ Оповещение об опасности
+ Звуковой сигнал
+ Вибросигнал
+ Оба
+ LCD экран на время [s]
+ Подсветка на время [s]
+ Единиц глюкозы
+ (Часов) до выключения помпы
+ В резервуаре мало инсулина (ед.)
+ Сохранить параметры в помпе
+ Вкл.
+ Выкл.
+ Показать панель навигации
+ Cкрыть панель навигации
+ Настройки расширений
+ Завершено, отлично!
+ Не завершено
+ Прошло времени
+ %1$d. Цель
+ Poctech
+ Получать данные гликемии от приложения Poctech
+ Высокая врем. цель temptarget повышает чувствительность
+ = 100]]>
+ Низкая временная цель temptarget снижает чувствительность
+ = 100]]>
+ Недопустимые установки помпы, проверьте документацию и убедитесь, что меню Quick Info называется QUICK INFO, используя приложение 360 для конфигурации помпы.
+ Пользовательские
+ Большая разница во времени
+ Большая разница во времени: \n Время в помпе расходится более чем 1,5 ч. \n. Пожалуйста установите время на помпе вручную и убедитесь, что чтение истории помпы не вызывает неожиданное поведение.\n если возможно, удалите историю из помпы перед изменением времени или отключите замкнутый цикл на один DIA после последней неверной записи в журнале, как минимум на один DIA с настоящего момента.
+ AndroidAPS перезапущен
+ Найдены сохраненные параметры
+ Внимание: Если вы активируете подключение к невиртуальной помпе, AndroidAPS скопирует настройки базала в профиль помпы, перезаписывая существующие настройки, хранящиеся в ней. Убедитесь, что настройки базала в AndroidAPS корректны. Если вы не уверены или не хотите перезаписать настройки базала на помпу, нажмите отменить и повторите подключение в другое время.
+ Данные назначений неполные
+ Параметры обслуживания
+ Адрес электронной почты
+ Недопустимый e-mail
+ Количество логов для отправки
+ Обслуживание
+ ОБСЛУЖ
+ Предоставляет возможности для обслуживания (например. отправку логов, удаление логов).
+ Отправить журналы (логи) по email
+ Удалить записи журнала
+ Назначение (инсулин: %1$.2f, углеводы: %2$d, в: %3$s) не было добавлено. Пожалуйста, проверьте и при необходимости добавьте запись вручную.
+ eCarbs: %1$d г. (%2$d h), задержка: %3$d m
+ Данные autosens недоступны
+ Настройки журнала
+ Восстановить значения по умолчанию
+ Некорректная работа NSClient. Возможно следует перезапустить NS и NSClient.
+ Авточувств
+ Доступна версия %1$s
+ Смещение по времени
+ Предпочитаемый режим APS
+ Итого
+ Кальк
+ Подтверждение связи
+ Отправьте файлы сегодняшнего лога разработчикам наряду с этим. Непредвиденная ситуация.
+ Макс нарушение болюса
+ Ошибка в команде
+ Ошибка в скорости
+ Нарушение ограничения инсулина
+ Минимальный запрос на изменения [%]
+ Алгоритм Ипж выдаст всплывающее окно с запросом на новые изменения, только если изменение больше, чем это значение. Значение по умолчанию — 20%
diff --git a/app/src/main/res/values-sk/insight_alerts.xml b/app/src/main/res/values-sk/insight_alerts.xml
new file mode 100644
index 0000000000..70489fbc5e
--- /dev/null
+++ b/app/src/main/res/values-sk/insight_alerts.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
new file mode 100644
index 0000000000..4a49dd6683
--- /dev/null
+++ b/app/src/main/res/values-sk/strings.xml
@@ -0,0 +1,1070 @@
+
+
+
+ Bezpečnosť zadania ošetrenia
+ Maximálny povolený bolus [U]
+ Maximálne povolené sacharidy [g]
+ Nastavenia
+ Obnoviť ošetrenia z NS
+ Vymaž databázu
+ Naozaj chcete vymazať databázu?
+ Ukončiť
+ Použiť predĺžené bolusy pre >200%
+ DanaR Bluetooth zariadenie
+ Vždy používaj absolútne hodnoty bazálov
+ Prosím reštartuj svoj telefón, alebo reštartuj AndroidAPS zo systémových nastavení, v opačnom prípade AndroidAPS nebude mocť zapisovať údaje (dôležité kvôli sledovaniu a overovaniu, že algoritmus pracuje správne)!
+ Niektoré tlačidlá na rýchly prístup do spoločných funkcií
+ Zadávanie udalostí pre management diabetu.
+ Používané na konfiguráciu aktívnych pluginov
+ Výukový program
+ Zobrazenie prednastavených jedál, definovaných v Nightscoute
+ Predvoľba pre inzulín Humalog a Novorapid
+ Predvoľba pre inzulín Fiasp
+ Umožňuje definovať vrchol účinnosti inzulínu a malo by byť používané iba pokročilými užívateľmi
+ Aktivuje alebo deaktivuje spustenie uzavretého okruhu.
+ Synchronizuje vaše dáta s NS
+ Stav algoritmu v roku 2016
+ Stav algoritmu v roku 2017
+ Najnovší algoritmus pre pokročilých užívateľov
+ Zobrazenie aktuálneho stavu vašeho uzavretého okruhu a tlačidlá k najpoužívanejším ovládacím prvkom
+ Zobrazuje priebežné oznámenia v Androide s krátkym prehľadom, čo práve uzavretý okruh robí
+ Definuj profil, ktorý je k dispozícii offline, iba v AndroidAPS.
+ Použitie profilu, ktorý je definovaný v Nightscoute
+ Definuj profil s iba jedným časovým pásmom.
+ Ovládač pumpy pre Accu-Check Combo, vyžaduje nainštalovanú aplikáciu Ruffy
+ Ovládač pumpy pre Dana Diabecare R
+ Ovládač pumpy pre kórejskú verziu Dana Diabecare R
+ Ovládač pumpy pre Dana Diabecare R s aktualizovaným firmvérom
+ Ovládač pumpy pre Dana Diabecare RS
+ Ovládač pumpy pre Accu-Check Insight, vyžaduje nainštalovanú aplikáciu SighRemote
+ Ovládač pumpy pre užívateľov používajúcich k liečbe diabetu inzulínové perá
+ Ovládač pumpy pre užívateľov bez podporovanej pumpy (Otvorený okruh)
+ Citlivosť je počítaná tým istým spôsobom ako v Oref0, ale je možné špecifikovať časové okno do minulosti. Minimálne vstrebávanie sacharidov je počítané dynamicky z maximálnej doby vstrebávania, definovanej v nastaveniach.
+ Citlivosť je počítaná za posledných 24h a sacharidy (ak sú ešte nevstrebané), sú orezané po čase definovanom v nastaveniach.
+ Citlivosť je počítaná za posledných 8h a sacharidy (pokiaľ nie sú vstrebané), sú orezané po čase definovanom v nastaveniach. Modul tiež počíta s UAM (neoznámené jedlo).
+ Citlivosť je počítaná ako vážený priemer z odchýlok. Novšie majú vyššiu prioritu. Minimálna vstrebateľnosť sacharidov je počítaná dynamicky z maximálnej doby vstrebateľnosti definovanej v nastaveniach. Tento algoritmus je najrýchlejší v sledovaní zmien citlivosti.
+ Príjmi hodnoty glykémií z upravenej Dexcom G5 aplikácie.
+ Príjmi hodnoty glykémií z aplikácie Glimp.
+ Príjmi hodnoty glykémií z 600SeriesAndroidUploader.
+ Stiahne hodnoty glykémií z Nightscoutu
+ Príjmi hodnoty glykémií z xDripu.
+ Ukladá všetky ošetrenia do databázy
+ Zobrazovanie stavu a riadenie AndroidAPS z hodiniek s WearOS.
+ Zobraz informácie o uzavretom okruhu na xDrip+ watchface.
+ Ovládaj na diaľku AndroidAPS použitím SMS príkazov.
+ Začiatok
+ Overenie
+ Jednotky
+ Doba pôsobenia inzulínu
+ Inzulínovo-sacharidový pomer
+ Citlivosť
+ Bazál
+ Cieľ
+ Nenastavený žiadny profil
+ Inzulín:
+ Sacharidy:
+ IOB:
+ IOB:
+ Aktivita:
+ Celkový IOB:
+ Celková aktivita IOB:
+ Trv:
+ Pomer:
+ Inz:
+ IOB:
+ Celkový IOB:
+ Množstvo inzulínu
+ Množstvo sacharidov
+ Glykémia
+ TT
+ Sacharidy
+ Korekcia
+ U
+ Bolusový IOB
+ Spustiť teraz
+ Virtuálna pumpa
+ Základná hodnota bazálu
+ Dočasný bazál
+ Predĺžený bolus
+ Batéria
+ Zásobník
+ OK
+ Posledné spustenie
+ Vstupné parametre
+ Stav glykémie
+ Aktuálny bazál
+ IOB dáta
+ Profil
+ Dáta o jedle
+ Výsledok
+ Nedostupné dáta o glykémiách
+ Nepožadovaná žiadna zmena
+ Požiadavka
+ Hodnota
+ Trvanie
+ Zdôvodnenie
+ Glykémia
+ Rozdiel
+ Rozdiel:
+ Konfigurácia
+ Ciele
+ OpenAPS MA
+ Prehľad
+ NS Profil
+ Jednoduchý profil
+ DočasnýBazál
+ Ošetrenie
+ Virtuálna pumpa
+ Starostlivosť
+ Pumpa
+ Akú pumpu chcete používať s AndroidAPS?
+ Ošetrenie
+ Aký modul chcete používať pre spracovanie ošetrení?
+ Profil
+ Aký profil má používať AndroidAPS?
+ APS
+ Aký APS algoritmus má byť použitý pre prispôsobenie liečby?
+ Všeobecné
+ Toto sú všeobecné moduly, ktoré môžu byť užitočné.
+ Aké obmedzenia sú použité?
+ dní
+ Obmedzenia
+ Uzavretý okruh
+ Uzavretý okruh
+ Použi toto, pre aktiváciu integrácie AndroidAPS uzavretého okruhu.
+ APS
+ Po spracovaní obmedzení
+ Bazál nastavený pumpou
+ Naposledy dodané
+ OK
+ Zrušiť
+ NEVYBRANÉ ŽIADNE APS, ALEBO NEVRÁTILO VÝSLEDOK
+ Bezpečnosť
+ Modul je deaktivovaný
+ Mimo povolený rozsah
+ Chyba podania bolusu
+ Chyba podávania dočasného bazálu
+ Hodnota bazálu [%]
+ % (100% = aktuálny)
+ Povoliť nový dočasný bazál:
+ Bolus
+ Kalkulačka
+ Aplikované obmedzenie!
+ Potvrdenie
+ Zadaj nové ošetrenie:
+ Bolus
+ Bolus:
+ Bazál
+ Bazál:
+ Sacharidy
+ Zmeňte zadanie!
+ Spustiť nový predĺžený bolus:
+ Zdroj glykémie
+ Odkiaľ má AndroidAPS získavať glykémie?
+ xDrip
+ APS mód
+ Uzavretý okruh
+ Otvorený okruh
+ Uzavretý okruh deaktivovaný
+ Deaktivovať uzavretý okruh
+ Aktivovať uzavretý okruh
+ Dostupné nové doporučenie
+ Nepodporovaná verzia NS klienta
+ Nepodporovaná verzia Nighscoutu
+ NS klient nie je nainštalovaný. Záznam je stratený!
+ Glykémia dostupná v NS
+ Stav pumpy dostupný v NS
+ Spustené manuálne
+ Uzavretý okruh deaktivovaný obmedzením
+ Bazálny IOB
+ Aplikované obmedzenie bolusu
+ Aplikované obmedzenie sacharidov
+ Kontrola glykémie
+ Oznámenie
+ Poznámka
+ Otázka
+ Pohyb
+ Výmena setu
+ Výmena senzora
+ Spustenie senzora
+ Výmena inzulínu
+ Prepnutie profilu
+ Bolus na desiatu/olovrant
+ Bolus na jedlo
+ Korekčný bolus
+ Kombinovaný bolus
+ Začiatok dočasného bazálu
+ Koniec dočasného bazálu
+ Prídavok sacharidov
+ OpenAPS vypnuté
+ Typ udalosti
+ Iné
+ Glukomer
+ Senzor
+ Sacharidy
+ Inzulín
+ Čas jedla
+ Rozdelenie
+ Trvanie
+ Percentá
+ Absolútne
+ Poznámky
+ Čas udalosti
+ Profil
+ Zadal
+ Zadanie glykémie
+ Zatiaľ nebol načítaný žiadny profil z NS
+ Dočasný bazál
+ Predĺžený bolus
+ Verzia Nightscoutu:
+ Chýba
+ Nastavenie exportované
+ Exportovať nastavenia do
+ Importovať nastavenia z
+ Nastavenia importované
+ Súbor nenájdený
+ Exportovať nastavenia
+ Importovať nastavenia
+ Maximálny povolený dočasný bazál [U/h]
+ Táto hodnota je nazývaná v OpenAPS ako \"max basal\"
+ Maximálny bazálny IOB, ktorý OpenAPS môže podať [U]
+ Táto hodnota je nazývaná v kontexte OpenAPS ako max IOB, je to maximálne množstvo inzulínu v [U], ktoré APS môže naraz podať.
+
+ POTVRDIŤ
+ DanaR
+ Pripájanie
+ Pripojené
+ Odpojené
+ DanaR nastavenia pumpy
+ Licenčná zmluva s koncovým používateľom
+ Tento program nemôže byť použitý na medicínske rozhodnutia. Na program neexistuje žiadna záruka, alebo garantovaná podpora v akejkoľvek podobe. Keď už sa rozhodneš pre používanie, tak jeho kvalita a celkové schopnosti tohto projektu závisia len na Tebe samotnom. Ak by sa ukázalo, že je program chybný, preberáš všetky potrebné náklady na liečbu, prípadne náklady na iné servisné služby, opravy, alebo korekcie.
+ ROZUMIEM A POTVRDZUJEM
+ Uložiť
+ Bluetooth adaptér nenájdený
+ Vybrané zariadenie nenájdené
+ Chyba pripájania pumpy
+ IOB z pumpy
+ Jednotiek za deň
+ Posledný bolus
+ pred %.1fh
+ Chybné vstupné dáta
+ Hodnota nenastavená správne
+ Obnoviť profil
+ Zobraziť profil
+ Vykonané
+ Komentár
+ Úspech
+ Percent
+ Absolútna
+ Zrušiť dočasný bazál
+ SMS komunikátor
+ Čakanie na výsledok
+ Povolené telefónne čísla
+ +421XXXXXXXXX;+421YYYYYYYYY
+ Pre podanie bolusu %1$.2fU odpovedz SMS kódom %2$s
+ Pre odoslanie kalibrácie %1$.2f odpovedz SMS kódom %2$s
+ Chyba pri aplikovaní bolusu
+ Bolus %.2fU aplikovaný úspešne
+ Spúšťam podávanie %.2fU
+ Bolus %.2fU podaný úspešne
+ Podané %.2fU
+ Povoliť príkazy na diaľku cez SMS
+ Diaľkovo ovládaný bolus nie je povolený
+ Prst
+ Senzor
+ Iný
+ Dočasný cieľ
+ Zrušiť dočasný cieľ
+ DanaR nastavenie profilu
+ DIA [h]
+ Celková doba pôsobenia inzulínu
+ Chyba pri aktualizovaní bazálneho profilu
+ Načítať
+ Nahrávam
+ E bolus
+ DS bolus
+ DE bolus
+ chyba
+ plnenie
+ hodinový bazál
+ glykémia
+ sacharidy
+ alarm
+ Celkom nahraných %1$d záznamov
+ S bolus
+ Alarmy
+ Hodinové bazály
+ Bolusy
+ Sacharidy
+ Denný inzulín
+ Chyby
+ Glykémia
+ Plnenie
+ Pozastavenia
+ Pripájanie %1$d sek
+ Heslo do pumpy
+ Nesprávne heslo do pumpy!
+ Pumpa je zaneprázdnená
+ Podané
+ Zastavené
+ Bolus zastavený
+ Zastavenie bolusu
+ Oklúzia
+ Stop
+ STLAČENÝ STOP
+ Čakanie na pumpu
+ %.2fU inzulínu bude podaných
+ Nastavenie vizualizácie a monitoringu (Nightscout), analyzovať bazály a prevody
+ Skontrolovať, či sú glykémie a údaje z pumpy viditeľné v Nightscoute
+ Začať s otvoreným okruhom
+ Niekoľko dní prevádzkovať otvorený okruh a ručne potvrdzovať doporučené dočasné bazály. Nastavovať a používať dočasné ciele (napr. pre šport, alebo hypo)
+ Porozumieť otvorenému okruhu a doporučeným dočasným bazálom
+ Na základe predchádzajúcich skúseností rozhodnúť, aký vysoký má byť maximálny bazál a nastaviť ho v pumpe a v aplikácii
+ Začať s uzavretým okruhom iba s vypínaním pri nízkej glykémii
+ Spustiť uzavretý okruh s max IOB = 0 na niekoľko dní s minimom nutných korekcií na nízku glykémiu
+ Ladenie uzavretého okruhu, zvyšovať max IOB nad 0 a postupne znižovať cieľovú glykémiu
+ Používať niekoľko dní s aspoň jednou nocou bez alarmov na nízku glykémiu, predtým ako znížiš cieľovú glykémiu
+ Ak je to potrebné, prispôsob bazály a prevody a potom aktivuj automatickú detekciu citlivosti
+ Jeden týždeň úspešne používaj uzavretý okruh so zadávaním bežného príjmu sacharidov cez deň
+ Aktivuj ďalšie prídavné funkcie pre bežné používanie, ako napr. AMA (pokročilý asistent jedál)
+ Aktivuj ďalšie prídavné funkcie pre bežné používanie, ako napr. SMB (Super Micro Bolusy)
+ Prečítať si dokumentáciu a zvýšiť maximálne IOB, aby mohlo správne fungovať SMB! Pre začiatok sa dá použiť veľkosť bežného bolusu + 3x maximálny denný bazál
+ Dosiahnutý limit
+ Nebol vybraný žiadny profil
+ Uzavretý okruh bol deaktivovaný
+ Uzavretý okruh bol aktivovaný
+ Uzavretý okruh je deaktivovaný
+ Uzavretý okruh je aktivovaný
+ %1$.2f obmedzené na %2$.2f
+ Hodnota %s je mimo prednastavený rozsah
+ Ovládanie bazálu na diaľku nie je povolené
+ Príkazy na diaľku nie sú povolené
+ Pre spustenie bazálu %1$.2fU/h odpovedaj SMS s kódom %2$s
+ Pre pozastavenie uzavretého okruhu na %1$d minút odpovedaj SMS s kódom %2$s
+ Dočasný bazál %1$.2fU/h spustený na %2$d minút
+ Spustenie dočasného bazálu zlyhalo
+ Pre ukončenie dočasného bazálu odpovedaj SMS s kódom %s
+ Dočasný bazál zrušený
+ Zrušenie dočasného bazálu zlyhalo
+ Neznámý príkaz alebo chybná odpoveď
+ Rýchly bolus
+ Nastavenie rýchleho bolusu
+ Text na tlačidle:
+ Sacharidy:
+ Platnosť:
+ Pridať
+ Upraviť
+ Vymazať
+ Bolus
+ Korekcia
+ Akcie
+ AndroidAPS reštartovaný
+ Iba nahrávanie do NS (synchronizácia deaktivovaná)
+ Iba nahrávanie dát do NS. Neúčinné pri hodnotách glykémie, pokiaľ nieje vybraný lokálny zdroj dát ako xDrip. Neúčinné pri profiloch, pokiaľ sa používajú NS profily.
+ Pumpa nie je inicializovaná!
+ Pumpa nie je inicializovaná, profil nenastavený!
+ Plnenie/doplňovanie
+ Prosím uistite sa, že hodnota zodpovedá špecifikácií Vášho setu!
+ Iné
+ Štandardné hodnoty plnenia/doplňovania.
+ Tlačidlo 1
+ Tlačidlo 2
+ Tlačidlo 3
+ Jednotky:
+ mg/dL
+ mmol/L
+ DIA:
+ Cieľový rozsah:
+ Rozsah pre zobrazenie
+ Značka vysokej a nízkej hodnoty v prehľade a na hodinkách Wear
+ Dolná značka
+ Horná značka
+ Wear
+ Všetky dáta poslať znova
+ Otvoriť nastavenia na hodinkách
+ Chyba pumpy
+ Nízky stav batérie
+ Vypnutie pumpy
+ Batéria v pumpe vybitá
+ Kórejská DanaR
+ Bazál:
+ Nastavenie bazálneho profilu zlyhalo
+ Bazálny profil v pumpe aktualizovaný
+ Deaktivovať v pumpe režim EasyUI
+ Aktivovať v pumpe predĺžené bolusy
+ Zmeniť v pumpe režim z U/d na U/h
+ Hodnota bazálu pod povoleným minimom. Profil nenastavený!
+ Glykémia:
+ Posledná glykémia:
+ Perá
+ MM640g
+ Priebežné oznámenia
+ ZASTARALÉ DÁTA
+ pred %1$d min
+ pred %1$d min
+ Lokálny profil
+ OpenAPS AMA
+ Krátkodobý priemer
+ Dlhodobý priemer
+ Pole %1$d prvkov.\nAktuálna hodnota:
+ Dáta detekcie citlivosti
+ Ladenie skriptu
+ Použi automatickú detekciu citlivosti AMA
+ Aktualizuj udalosti z NS
+ Zmazať ošetrenia v budúcnosti
+ Pred jedlom
+ Hypoglykémia
+ Aktivita
+ Odstrániť záznam:
+ DanaR štatistiky
+ Kumulatívny TDD
+ Exponenciálne vážený TDD
+ Bazál
+ Bolus
+ TDD
+ Dátum
+ Pomer
+ Dní
+ Váha
+ Pravdepodobne nepresné, ak bol použitý bolus na plnenie!
+ Zastaralé dáta. Prosím načítajte ich znovu
+ Celk. denný bazál
+ TBB * 2
+ Inicializácia ...
+ AKCIA
+ KONF
+ OKRUH
+ JPRO
+ OAPS
+ LPRF
+ DANA
+ PREH
+ VPUM
+ PROF
+ OŠET
+ STAR
+ CIEĽ
+ WEAR
+ SMS
+ Krátke názvy modulov
+ Vždy používať krátkodobý priemerný rozdiel glykémií, namiesto rozdielu posledných dvoch hodnôt
+ Zmysluplné, pokiaľ dáta z xDripu obsahujú veľký šum.
+ Rozšírené nastavenia
+ Model: %1$02X Protokol: %2$02X Kód: %3$02X
+ Profil
+ Štandardná hodnota: 3 Toto je kľúčová hodnota zabezpečenia. Hovorí, že maximálny nastaviteľný bazál je trojnásobkom maximálneho denného bazálu. Spravidla to zrejme nebudete musieť meniť, prípadne si prečítate o téme \"3x max denný; 4x aktuálny\".
+ Štandardná hodnota: 4 Toto je druhá kľúčová hodnota. Hovorí, že maximálna hodnota dočasného bazálu nikdy nebude väčšia, ako štvornásobok aktuálneho bazálu. Je to preto, aby se ľudia nedostali do nebezpečných hodnôt skôr, ako pochopia ako OpenAPS pracuje. Znovu, štandardná hodnota je 4 a väčšina ľudí ju nikdy nebude musieť meniť. Pokiaľ nestačí, obvykle je problém niekde inde.
+ Štandardná hodnota: 1.2\nToto je bezpečnostné nastavenie pre automatickú detekciu citlivosti. Hovorí, že automatická detekcia citlivosti (a onedlho Autotune) môže zvýšiť bazály, znížiť ISF a znížiť cieľovú hodnotu glykémie o 20%.
+ Štandardná hodnota: 0.7\nToto je bezpečnostné nastavenie pre automatickú detekciu citlivosti. Hovorí, že automatická detekcia citlivosti môže znížiť bazály, zvýšiť ISF a zvýšiť cieľovú hodnotu glykémie na 70%.
+ Úprava cieľovej glykémie pomocou automatickej detekcie citlivosti
+ Štandardná hodnota: zapnuté\nToto nastavenie hovorí, že automatická detekcia citlivosti môže meniť tiež cieľové hodnoty glykémií.
+ Štandardná hodnota: 2\nToto nastavenie hovorí, po akú časť z hodnoty DIA uzavretý okruh po boluse čaká a nereaguje na zmeny glykémií (tu 3DIA/2 = 1,5h).
+ Štandardná hodnota: 3.0 (AMA), alebo 8.0 (SMB) mg/dl/5min. Táto hodnota definuje minimálnu časť vstrebaných sacharidov za každých 5min. Táto hodnota ovplyvňuje výpočet COB.
+ Pozor!\nZa normálnych okolností tieto hodnoty nemusíte meniť. Kliknete TU, PREČÍTAJTE si informácie a UISTITE sa, že im rozumiete skôr, ako ich začnete meniť.
+ Povolené iba číslice.
+ Povolené iba čísla v rozsahu %1$s - %2$s.
+ Toto pole nesmie byť prázdne
+ Neplatné telefónne čislo
+ Chybné telefónne číslo
+ Kalibrácia
+ Poslať kalibráciu %.1f do xDripu?
+ xDrip+ nie je nainštalovaný
+ Kalibrácia odoslaná do xDripu
+ Kalibrácia na diaľku nie je povolená
+ Kalibrácia odoslaná. Príjem kalibrácií musí byť v xDripe povolený.
+ xDrip neprijíma kalibrácie
+ Pumpa pozastavená
+ Získavam stav pumpy
+ Nastavujem dočasný bazál
+ Zastavujem dočasný bazál
+ Nastavujem predĺžený bolus
+ Zastavujem predĺžený bolus
+ Aktualizujem bazály
+ Spojenie bude prerušené
+ Vykonávam
+ Nastavenie virtuálnej pumpy
+ Nahrať stav do NS
+ Nesprávne heslo
+ Heslo do nastavení
+ Odomknúť nastavenia
+ Blíži sa denný limit inzulínu
+ NSClient
+ NSCl
+ Adresa URL:
+ Automatický posuv
+ Reštart
+ Interný NSClient
+ Adresa Nightscoutu
+ Zadajte adresu Nightscoutu
+ NS heslo (API secret)
+ NS heslo
+ Zadajte API secret (min 12. znakov)
+ Podať teraz
+ Vymazať frontu
+ Zobraziť frontu
+ Fronta:
+ Stav:
+ Pozastavené
+ Vymazať log
+ NSClient nemá právo na zápis. Nesprávne API secret?
+ Nastavenie hodiniek
+ Zobraziť detailný IOB
+ Rozpísať IOB na hodinkách do bolusového a bazálneho
+ Neúspešné - skontrolujte telefón
+ Nedostupný
+ Vek pacienta
+ Dieťa
+ Dospievajúci
+ Dospelý
+ Dospelý z nízkou citlivosťou
+ Vyberte vek pacienta pre nastavenie bezpečnostných limitov
+ Glimp
+ %s potrebuje vypnúť optimalizáciu baterie pre optimálny výkon
+ Uzavretý okruh pozastavený
+ Pozastavený (%1$d min)
+ Superbolus (%1$d m)
+ Pozastaviť uzavretý okruh na 1 h
+ Pozastaviť uzavretý okruh na 2 h
+ Pozastaviť uzavretý okruh na 3 h
+ Pozastaviť uzavretý okruh na 10 h
+ Odpojiť pumpu na 15 min
+ Odpojiť pumpu na 30 min
+ Odpojiť pumpu na 1 h
+ Odpojiť pumpu na 2 h
+ Odpojiť pumpu na 3 h
+ Pokračovať
+ Nesprávna doba trvania
+ Uzavretý okruh pozastavený
+ Uzavretý okruh obnovený
+ 15min trend
+ COB
+ Superbolus
+ Zaznamenávať spustenie aplikácie do NS
+ Zatváram aplikáciu, aby sa aplikovali nové nastavenia.
+ DanaRv2
+ Inzulín
+ Aký druh inzulínu používate?
+ Rýchlo pôsobiaci inzulín
+ Novorapid, Humalog
+ Fiasp
+ INZ
+ Povoliť superbolus
+ Povolenie superbolusu v kalkulátore. Nepovoľujte, pokiaľ se nenaučíte, čo to v skutočnosti robí. MÔŽE SPÔSOBIŤ PREDÁVKOVANIE INZULÍNOM PRI NESPRÁVNOM POUŽITÍ!
+ IOB
+ COB
+ Firmware
+ Posledné spojenie
+ Stav Bluetooth
+ O aplikácii
+ Chýbajúce povolenie SMS príkazov
+ Stav z xDripu (hodinky)
+ Stavový riadok xDripu (hodinky)
+ XDS
+ Zobrazovať BGI
+ Pridať BGI do stavového riadku
+ Zakázať nahrávanie do NS
+ Všetky dáta odoslané do NS, budú zahodené. AAPS je pripojený k NS, ale nerobí v ňom žiadne zmeny
+ Krok bazálu
+ Krok bolusu
+ PredĺženýBolus
+ DočasnýCieľ
+ Zrušiť predĺžený bolus
+ Vek senzora
+ Vek kanyly
+ Vek inzulínu
+ hodín
+ Typ bazálu
+ Chybný profil !!!
+ Prepnutie profilu
+ Vek batérie v pumpe
+ Výmena batérie v pumpe
+ Nastavenie alarmov
+ Veľmi vysoká
+ Vysoká
+ Nízka
+ Veľmi nízka
+ Zastaralé dáta
+ Veľmi zastaralé dáta
+ Hraničná hodnota pre zastaralé dáta [min]
+ Vysoká hraničná hodnota pre zastaralé dáta [min]
+ Interval pre automatickú detekciu citlivosti [h]
+ Počet uplynutých hodín použitých na automatickú detekciu citlivosti (čas vstrebávania sacharidov sa nezohľadňuje)
+ Pumpa
+ OpenAPS
+ Uploader
+ Detekcia citlivosti
+ Aký druh algoritmu pre detekciu citlivosti má byť použitý?
+ SENZ
+ Senzitivita Oref0
+ Senzitivita Oref1
+ Senzitivita AAPS
+ Nastavenie vstrebávania sacharidov
+ Max. doba vstrebávania sacharidov [h]
+ Čas v hodinách, počas ktorého predpokladáme, že všetky sacharidy budú vstrebané
+ Zobrazovať predĺžený bolus v %
+ SENZ
+ INZ
+ KAN
+ BAT
+ OAPS
+ UPLD
+ BAZ
+ EXT
+ Nechať obrazovku zapnutú
+ Zabrániť Androidu, aby zhasínal obrazovku. Bez pripojenia nabíjačky vybije veľmi rýchlo batériu!
+ Pri zapnutej automatickej detekcii citlivosti, nezabudnite vkladať všetky prijaté sacharidy. V opačnom prípade, budú odchýlky mylne vyhodnocované, ako zmena citlivosti !!
+ Citlivosť vážený priemer
+ OK
+ Zrušiť
+ Nenačítané všetky profily!
+ Hodnoty nie sú uložené!
+ Povoliť odosielanie do ostatných aplikácií (napr. xDrip).
+ Povoliť lokálne vysielanie.
+ AKTIVITA & SPÄTNÁ VÄZBA
+ SACHARIDY & BOLUSY
+ CGM & OPENAPS
+ PUMPA
+ Hodnota bazálu [U/h]
+ Trvanie [min]
+ OpenAPS SMB
+ SMB
+ Povoliť UAM
+ Povoliť SMB
+ Použiť Super Mikro Bolusy namiesto dočasných bazálov, pre zrýchleniu účinku
+ Detekcia neoznámených jedál
+ Čas vrcholu IOB krivky
+ Vrchol krivky [min]
+ Voliteľný vrchol - Oref
+ Rýchlo pôsobiaci - Oref
+ Ultra rýchly - Oref
+ DIA %1$f je príliš krátke - AAPS namiesto toho použilo %2$f !
+ Aktivovať profil
+ Dátum
+ NEPLATNÝ
+ Čakanie na párovanie na pumpe
+ Spárované
+ Vypršal časový limit pre párovanie
+ PÁROVANIE
+ Zatiaľ nenájdené žiadne zariadenie
+ Prázdny zásobník
+ Výstraha merania glykémie
+ Zostávajúci inzulín
+ DanaRS
+ Dana
+ Vybraná pumpa
+ Párovanie novej pumpy
+ Rýchlosť bolusu
+ Nastavte bazálny krok 0.01U/h
+ Sériové číslo
+ % zmena
+ Posun času
+ Predvolené nastavenie dočasných cieľov
+ Trvanie \"blížiaceho sa jedla\"
+ Cieľ pre \"blížiace se jedlo\"
+ Trvanie aktivity
+ Cieľ pri aktivite
+ Trvanie dočasného cieľa pri hypoglykémii
+ Cieľová hodnota pri hypoglykémii
+ Plnenie
+ Získavam stav predĺžených bolusov
+ Získavam stav bolusov
+ Získavam stav dočasných bazálov
+ Získavam nastavenia pumpy
+ Získavam čas z pumpy
+ Znovu použiť
+ Ovládanie z hodiniek
+ Nastavovanie dočasných cieľov a vkladanie ošetrení hodinkami.
+ Vypršal čas na pripojenie
+ Jedlo
+ g
+ m
+ h
+ ]]>
+ kJ
+ En
+ Pr
+ Tuk
+ ]]>
+ Čakanie na koniec bolusu. Zostáva %1$d sek.
+ Spracúvam udalosť
+ Spúšťam podávanie bolusu
+ Príkaz sa práve vykonáva
+ Ovládač pumpy opravený
+ Pumpa nedostupná
+ Chýbajúce hodnoty glykémie
+ Používať systémové notifikácie pre výstrahy a oznámenia
+ Lokálne výstrahy
+ Výstraha pri nedostupných hodnotách glykémie
+ Výstraha pri nedostupnej pumpe
+ Limit pre nedostupnosť pumpy [min]
+ Urgentný alarm
+ INFO
+ Bluetooth
+ Strážny pes BT
+ Vypne na 1 sekundu Bluetooth v telefóne, pokiaľ se nedarí pripojiť k pumpe. Môže to pomôcť pri telefónoch, ktoré majú problémy s BT.
+ DexcomG5 aplikácia (upravená)
+ Nahrávať glykémie do NS
+ Nastavenie nahrávania z G5
+ Nastavenie nahrávania z Poctech
+ Zobrazovať detailné zmeny
+ Zobrazovať rozdiel s jedným desatinným miestom naviac
+ Maximálny počet minút bazálu, ku ktorým se limituje SMB
+ Nepodporovaný firmware v pumpe
+ Odosielať glykémie do xDrip+
+ V xDrip+ vyberte zdroj dát 640g/Eversense
+ Glykémie z NS
+ Hodnota bazálu nahradená minimálnou možnou
+ Hodnota bazálu nahradená maximálnou možnou: %s
+ Výpočet glykémie
+ Výpočet bolusového IOB
+ Výpočet bazálneho IOB
+ Výpočet trendu
+ Výpočet superbolusu
+ Áno
+ Nie
+ Iba kladné
+ Iba záporné
+ Výpočet COB
+ Výpočet dočasného cieľa
+ Uzavretý okruh povolený
+ APS vybrané
+ NSClient má povolenie k zápisu
+ Uzavretý okruh povolený
+ Maximálne IOB nastavené správne
+ Glykémie dostupné z vybraného zdroja
+ Bazálne hodnoty nie sú zarovnané na celé hodiny: %s
+ Chybný profil: %s
+ Programovanie pumpy pre bolus
+ Obnoviť
+ Stav
+ Aktivita
+ Žiadne spojenie už %1$d min
+ %1$d%% (%2$d min zostáva)
+ Inicializácia
+ Pozastavené z dôvodu chyby
+ Pozastavené užívateľom
+ V prevádzke
+ Rušenie dočasného bazálu
+ Nastavovanie doč. bazálu (%1$d%% / %2$d min)
+ Podávanie bolusu (%.1f U)
+ Aktualizuje sa stav
+ Požadovaná operácia nie je pumpou podporovaná
+ Nebezpečné použitie: predĺžený alebo multiwave bolus je aktívny. Pumpa bola vypnutá len na 6 hodín. Povolené sú iba normálne bolusy.
+ Nebezpečné použitie: pumpa má nastavený iný bazálny profil ako prvý. Uzavretý okruh bol zakázaný. Nastavte prvý bazálny profil a znovu načítajte.
+ Rovnako veľký bolus už bol v priebehu poslednej minúty požadovaný. Ako preventívna ochrana pred zdvojeným bolusom a ako ochrana pred chybami bola operácia zakázaná.
+ Teraz
+ Načítavam históriu z pumpy
+ Pamäť pumpy
+ Nastavenie bazálneho profilu
+ Zásobník inzulínu v pumpe je takmer prázdny
+ Batéria v pumpe je takmer vybitá
+ Pumpa hlási chybu E%1$d: %2$s
+ Nízky
+ Prázdny
+ Normálny
+ Je vyžadovaná aktualizácia času v pumpe
+ Upozornenie
+ Upozornenie o ukončenom dočasnom bazále bolo potvrdené.
+ Pumpa nedostupná. Bolus nebol podaný
+ Podávanie inzulínu zlyhalo. Zdá sa, že nebol podaný žiadny bolus. Aby ste si boli istí, skontrolujte pumpu a prípadne pošlite bolus znovu. Aby sa zabránilo nechcenému dvojitému bolusu, podanie bolusu nie je automaticky opakované.
+ Iba %1$.2f U z bolusu %2$.2f bolo podaného z dôvodu chyby. Skontrolujte podaný bolus na pumpe a urobte potrebné opatrenia.
+ Podanie bolusu a kontrola histórie pumpy zlyhala. Skontrolujte pumpu. Pokiaľ bolus prebehol, načíta se pri najbližšom pripojení automaticky.
+ Nedostatok inzulínu v zásobníku pre takýto bolus
+ Chyba pri podávaní predĺženého bolusu
+ Insight
+ Pumpa Insight
+ Stav
+ Zmenené
+ PUMPA ZASTAVENÁ
+ Stav aktualizovaný
+ pred
+ s
+ Aktívny dočasný bazál
+ min zostáva
+ História
+ Posledný vykonaný príkaz
+ min
+ zostáva nad
+ celkom s
+ vopred s
+ Zostať stále pripojený
+ NEČINNÝ
+ SYNCHRONIZÁCIA
+ ZANEPRÁZDNENÝ
+ SYNCHRONIZOVANÉ
+ SPÚŠŤANIE
+ potrebuje
+ Nepripojený k sprievodnej aplikácii!
+ Sprievodná aplikácia pravdepodobne nie je nainštalovaná!
+ Nekompatibilná sprievodná aplikácia, je požadovaná verzia
+ Neznámy
+ Čakám na potvrdenie kódu
+ Kód odmietnutý
+ Pripájanie aplikácie
+ Neautorizovaný
+ Nekompatibilný
+ sekunda
+ minút
+ hodín
+ dní
+ týždňov
+ sekúnd
+ %1$d vyprší %2$s
+ Stav Keep-Alive
+ Štatistiky
+ Preventívne pripájanie
+ Automaticky pripojiť pri otvorení obrazovky AndroidAPS skôr, ako dôjde k poslaniu príkazu na pumpu, aby sa eliminovalo oneskorenie pripojenia
+ Nedoporučené kvôli vybíjaniu batérie
+ Vždy povoliť SMB
+ Povoliť SMB nezávisle na bolusoch. Možno iba zo zdrojom glykémií s dobrým filtrovaním dát, ako napr. G5
+ Povoliť SMB po jedle
+ Povoliť SMB 6 hodín po boluse aj pri nulovom COB. Možno iba zo zdrojom glykémií s dobrým filtrovaním dát, ako napr. G5
+ Povoliť SMB zo sacharidmi
+ Povoliť SMB, pokiaľ zostávajú aktívne sacharidy.
+ Povoliť SMB s dočasnými cieľmi
+ Povoliť SMB, pokiaľ je aktívny dočasný cieľ (aktivita, blížiace sa jedlo)
+ Povoliť SMB s vysokými dočasnými cieľmi
+ Povoliť SMB, pokiaľ je aktívny vysoký dočasný cieľ (aktivita)
+ Nechať bežať aktuálny dočasný bazál
+ Stíšiť
+ Inzulín
+ Sacharidy
+ Tlačidlá
+ Odošle kalibráciu do xDripu+, alebo otvorenie kalibračného dialógu na G5
+ Otvorí xDrip+, tlačidlom späť sa vrátiš do AndroidAPS
+ Množstvo sacharidov, ktoré má byť pridané po stlačení tlačidla
+ Množstvo inzulínu, ktoré má byť pridané po stlačení tlačidla
+ Nie je možné spustiť aplikáciu CGM. Uistite sa, že je nainštalovaná.
+ CGM
+ Prehliadač histórie
+ Oznámenie pri SMB
+ Ukazovať SMB na hodinkách ako normálny bolus.
+ Vytvárať z chýb oznámenia
+ Vytvárať oznámenia pre chyby a lokálne výstrahy v NS (zobraziteľné v starostlivosti pod ošetrením)
+ Zobrazovať predikcie na hodinkách.
+ Predikcia
+ Možnosti dát
+ Odosielanie do Fabric
+ Automatické odosielanie chýb aplikácie a štatistiky používania vývojárom pomocou služby fabric.io.
+ Prosím aktualizujte G5 aplikáciu na podporovanú verziu
+ Spustiť Dočasný cieľ Aktivita
+ Spustiť Dočasný cieľ Blížiace sa jedlo
+ DC
+ Nepodať bolus, iba zaznamenať
+ Kategória
+ Podkategória
+ Bolus bude iba zaznamenaný
+ Automaticky doplňovať chýbajúcu glykémiu z NS
+ SMB podané pumpou
+ Citlivosť
+ Odchýlky
+ Aktívne sacharidy
+ Aktívny inzulín
+ Bazály
+ Žiadna akcia nevybraná, nič sa neudeje
+ Spustiť doč. cieľ Hypo
+ Bežiaca vývojárska verzia. Uzavretý okruh je zakázaný.
+ Vývojársky mód povolený
+ Vývojársky mód nie je povolený a nebeží vydaná verzia
+ %.2f U/h
+ Načítavam bazálny profil
+ História v pumpe sa zmenila po spočítaní bolusu. Bolus nebol podaný. Prosím spočítajte ho znovu, pokiaľ je stále potrebný.
+ Bolus úspešne podaný, ale zápis se nepodaril. To sa môže stať, pokiaľ sú podané bolusy rovnakej veľkosti v priebehu 2 minút. Skontrolujte históriu pumpy a zadajte chýbajúce položky do ošetrení. Uistite sa, že nezadávate rovnakú veľkosť v rámci 1 minúty.
+ Odmietnutý vysoký dočasný bazál, pretože výpočet neuvažoval s najnovšími zmenami v histórii pumpy
+ Obnovujem stav pumpy
+ Bazál na pumpe bol zmenený a bude čoskoro aktualizovaný
+ Bazál na pumpe bol zmenený, ale jeho načítanie zlyhalo
+ Kontrolujem zmeny v histórii
+ Boli načítané bolusy rovnakej veľkosti v priebehu jednej minúty. Do ošetrení je možné pridať iba jeden. Skontrolujte pumpu a pridajte bolus do ošetrení ručne tak, aby čas nekolidoval.
+ \nhttp://www.androidaps.org\n\nfacebook: \nhttp://facebook.androidaps.org
+ Posledný bolus je starší ako 24h, alebo je v budúcnosti. Skontrolujte čas v pumpe.
+ Dátum/čas podaného bolusu se zdá byť nesprávny. IOB bude pravdepodobne chybné. Skontrolujte čas v pumpe.
+ Prepnutie profilu chýba. Vykonajte prepnutie profilu, alebo ho aktivujte na záložke lokálneho profilu.
+ Počet bolusov
+ Počet dočasných bazálov
+ Výukový cieľ %1$d nespustený
+ Výukový cieľ %1$d nedokončený
+ Pumpa nepodporuje dočasné bazály
+ Nenačítaný žiadny platný bazál z pumpy
+ Uzavretý okruh zakázaný v nastaveniach
+ Automatická detekcia citlivosti zakázaná v nastaveniach
+ SMB zakázané v nastaveniach
+ Max bazál obmedzený na %1$.2f U/h: %2$s
+ limit pumpy
+ požadovaná kladná hodnota
+ maximálny násobok bazálu
+ maximálny násobok najvyššieho bazálu
+ Podaný bolus v priebehu posledných 3 minút, SMB preskočené
+ Bazál nastavený správne
+ Bazál obmedzený na %1$d%%: %2$s
+ Bolus obmedzený na %1$.1f U: %2$s
+ Predĺžený bolus obmedzený na %1$.1f U: %2$s
+ Max IOB obmedzený na %1$.1f U: %2$s
+ Sacharidy obmedzené na %1$d g: %2$s
+ IOB obmedzený na %1$.1f U: %2$s
+ maximálna hodnota v nastaveniach
+ pevný limit
+ nebezpečné použitie
+ Načítanie stavu zlyhalo
+ Zaznamenať výmenu setu
+ Zaznamenať výmenu inzulínu
+ \"SMB vždy\" a \"po jedle\" zakázané pretože zdroj glykémie nepodporuje rozšírené filtrovánie
+ SBM nie sú povolené pri otvorenom okruhu
+ Jedlo
+ Resetovať
+ Čakanie na synchronizáciu času (%1$d s)
+ Odpojené (%1$d m)
+ Automatické udalosti v starostlivosti
+ Automaticky vloží výmenu inzulínu, setu, batérie a alarmov pumpy do NS
+ Maximálne celkové IOB, ktoré OpenAPS nemôže prekročiť [U]
+ Táto hodnota je v kontexte OpenAPS nazývaná Max IOB.\nOpenAPS nikdy nepridá inzulín, pokiaľ je súčasné IOB väčšie, ako táto hodnota
+ Pumpa zastavená
+ Pumpa spustená
+ Pumpa pozastavená
+ Maximálna doba vstrebávania sacharidov [h]
+ Doba, po ktorej sú všetky sacharidy považované za vstrebané. Zvyšné budú orezané.
+ Čas
+ Zobrazovať kolónku poznámky v dialógoch ošetrení
+ Ďalšia
+ Späť
+ Sprievodca nastavením
+ Dokončiť
+ Vyberte jazyk
+ Požadované: %1$.2fU Podané: %2$.2fU Chyba: %3$s
+ Prvý prídavok inzulínu
+ Druhý prídavok inzulínu
+ Tretí prídavok inzulínu
+ Prvý prídavok sacharidov
+ Druhý prídavok sacharidov
+ Tretí prídavok sacharidov
+ CGM
+ Používať iba WiFi
+ WiFi SSID
+ Len pri nabíjaní
+ Nastavenie pripojenia
+ Povolené SSID (oddelené bodkočiarkou)
+ Povoliť pripojenie pri roamingu
+ Max hodnota detekcie citlivosti
+ Min hodnota detekcie citlivosti
+ Deliteľ \"bolus snooze\"
+ Max násobiteľ denného najvyššieho bazálu
+ Max násobiteľ súčasného bazálu
+ ---
+ Typ virtuálnej pumpy
+ Definícia pumpy
+ Bolus: Krok =%1$s\nPredl. bolus: [Krok=%2$s, Dĺžka=%3$smin-%4$sh]\nBazál: Krok=%5$s\nDoč. bazál: %6$s (%7$s), Dĺžka=%8$smin-%9$sh\n%10$s
+ * Rozdielne hodnoty podľa rozsahu nie sú podporované.
+ Automatické doplňovanie glykémií z NS
+ Nastavenie wizardu
+ Kalkulácia použitá vo výsledku wizardu:
+ Nastavenie zobrazenia
+ Všeobecné nastavenia
+ Povoliť NSClient
+ Vitajte v sprievodcovi nastavení. Prevedie Vás procesom nastavenia programu\n
+ Nastavenie pumpy
+ Načítať stav
+ Zmeny musia byť urobené v NS
+ Preskočiť sprievodcu
+ Stlačte tlačidlo nižšie, pre povolenie, aby mohlo AndroidAPS navrhovať, alebo robiť zmeny bazálu
+ Stlačte tlačidlo nižšie pre povolenie Cieľov. Po ukončení sprievodcu prejdite na záložku Cieľov, aby ste získali všetky funkcie AndroidAPS.\n
+ Povoliť Ciele
+ Nastavenie APS
+ Nastavenie citlivosti
+ Modul citlivosť slúži k detekcii zmien v citlivosti a k počítaniu COB. Viac informácií tu:
+ https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COB
+ NSClient slúži na spojenie s Nightscoutem. Nastavenia môžete teraz preskočiť, ale nebudete schopný dokončiť ciele, pokiaľ neurobíte nastavenia.
+ Prosím, zapamätajte si: Nové inzulínové profily vyžadujú DIA minimálne 5h. DIA 5-6 hodín zodpovedá zhruba nastaveniam 3h na starších typoch profilu.
+ Konfigurácia zdroja glykémií
+ Vyberte zdroj profilov. Pokiaľ ide o dieťa, využijete pravdepodobne NS profil. Pokiaľ Vás nikto cez NS nesleduje, budete pravdepodobne preferovať lokálny profil. Uvedomte si, že nastavujete iba zdroj profilov. Na to aby se naozaj profil začal používať, je potrebné vykonať aktiváciu profilu použitím funkcie \"Prepnutie profilu\"
+ Vyberte jeden z algoritmov. Sú zoradené od najstaršieho po najnovší. Novší je obvykle lepší a agresívnejší, ale vyžaduje presnejšie nastavenie. Preto pokiaľ s uzavretým okruhom začínate, mali by ste najskôr vybrať jen AMA a nie ten posledný. Nezabudnite si prečítať dokumentáciu k OpenAPS a prejsť nastavenia, kým ho začnete používať.
+ Spusťte prvý cieľ
+ Povolenie
+ Vyžiadať si povolenie
+ Aplikácia vyžaduje povolenie \"polohy\", aby mohla vyhľadávať BT zariadenia
+ Aplikácia vyžaduje prístup k úložisku, aby mohla ukladať logy
+ Požiadavka
+ Nastavenie inzulínového modulu
+ Koniec
+ Užívateľské nastavenia
+ Formát času
+ Posun pri stlačení tlačidla
+ Zvuk pri stlačení tlačidla
+ Alarm
+ Zvuk
+ Vibrácie
+ Oboje
+ Čas pred vypnutím displeja [s]
+ Podsvietenie [s]
+ Jednotky
+ Vypnutie [h]
+ Nízky stav zásobníka [U]
+ Uložiť do pumpy
+ ZAP
+ VYP
+ Otvoriť Menu
+ Zavrieť Menu
+ Nastavenie modulov
+ Hotovo, gratulujeme!
+ Nedokončené
+ Uplynutý čas
+ %1$d. Cieľ
+ Poctech
+ Získavať glykémie z aplikácie Poctech
+ Vysoký dočasný cieľ zvýši citlivosť
+ = 5.5]]>
+ Nízky dočasný cieľ zníži citlivosť
+
+ Chybné nastavenie pumpy. Prejdite si dokumentáciu a presvedčte sa, že menu Quick Info se nazýva QUICK INFO, s použitím 360° Configuration Software.
+ Voliteľný
+ Veľký rozdiel v čase
+ Veľký rozdiel v čase:\nČas v pumpe sa líši minimálne o 1,5 h.\nProsím upravte čas v pumpe manuálne a vymažte históriu pumpy.\nPokiaľ je to potrebné, prípadne pozastavte uzavretý okruh aspoň na \"DIA\" hodín.
+ Vymazať udalosti \"AndroidAPS reštartovaný\"
+ Nájdené uložené nastavenia
+ POZOR: Pokiaľ aktivujete a pripojíte skutočnú pumpu, AndroidAPS nakopíruje (a bude udržiavať) nastavenie bazálu z aktívneho profilu do pumpy. Nastavenie bazálu v pumpe bude prepísané. Pokiaľ si nieste istí, alebo nechcete prepísať bazály v pumpe, stlačte Zrušiť a opakujte prepnutie na inú pumpu neskôr.
+ Dáta ošetrení neúplné
+ Nastavenie údržby
+ E-Mail
+ Neplatný E-mail
+ Počet protokolov na odoslanie
+ Údržba
+ Údržba
+ Poskytuje viaceré funkcie pre údržbu (ako napr. zasielanie logov, vymazanie logov).
+ Zasielať logy E-mailom
+ Vymazať logy
+ Ošetrenie (inzulín: %1$.2f, sacharidy: %2$d, čas: %3$s) nie je možné pridať. Skontrolujte a podľa potreby manuálne pridajte záznam.
+ eCarbs: %1$d g (%2$d h), Oneskorenie: %3$d m
+ Nedostupné dáta o glykémiách
+ Nastavenie logovania
+ Obnoviť predvolené
+ Chyba NSClienta. Zvážte reštart NS a NSClienta.
+ AS
+ Verzia %1$s je k dispozícii
+ Časový posun
+ Preferovaný režim APS
+ Spolu
+ Kalk
+ Overovanie
+ Odošlite dnešné súbory protokolov vývojárom spolu s týmto časom. Neočakávaná situácia.
+ Prekročený maximálny bolus
+ Chyba príkazu
+ Chyba rýchlosti
+ Prekročený limit inzulínu
+
+ %1$d deň
+ %1$d dní
+ %1$d dní
+ %1$d dní
+
+
+ %1$d hodina
+ %1$d hodín
+ %1$d hodín
+ %1$d hodín
+
+
+ %1$d minúta
+ %1$d minút
+ %1$d minút
+ %1$d minút
+
+
diff --git a/app/src/main/res/values-sv/insight_alerts.xml b/app/src/main/res/values-sv/insight_alerts.xml
new file mode 100644
index 0000000000..70489fbc5e
--- /dev/null
+++ b/app/src/main/res/values-sv/insight_alerts.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index b97e007b3d..322d206e13 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -1,853 +1,1065 @@
+
- Avbryt
- Glimp
- Minimed 640g
- Absolut
- Åtgärder
- Act
- Träning
- Vuxen
- Avancerade inställningar
- Starta om telefonen eller AndroidAPS från systeminställningar, annars kommer Android APS inte kunna logga fel (viktigt att kunna spåra och verifiera att algoritmerna fungerar korrekt)!
- Använd alltid kort medeldelta istället för enkel delta
- Användbart när ofiltrerade källor som xDrip ger brusvärden
- AndroidAPS startar
- Maximal daglig dos snart nådd
- APS-läge
- Basal
- Basal:
- Basalsteg
- Basal understiger miniminivå. Profilen sattes inte.
- Pumpbatteri urladdat
- Bolus
- Bolussteg
- Bolusspärr aktiverad
- Bolus %.2f enheter korrekt tillförd
- Ger %.2f enheter
- Kommer att tillföra %.2f enheter
- Knapp 1
- Knapp 2
- Knapp 3
- Kalibrering skickad till xDrip
- Avbryt temp basal
- Kolhydrater
- Kolhydratsspärr aktiverad
- Careportal
- Meddelande
- BG-kontroll
- Kanylålder
- Byte CGM-sensor
- Start CGM-sensor
- Kombinationsbolus
- Korrektionsbolus
- Träning
- Insulinålder
- Byte insulinreservoar
- Måltidsbolus
- Absolut
- KH
- KH-tid
- Duration
- Loggat av
- Tid
- Händelsetyp
- Insulin
- Mätare
- Anteckning
- Annat
- Procent
- Profil
- Sensor
- Delad
- Anteckning
- OpenAPS Offline
- Pumpbatteri ålder
- Byt profil
- Byte pumpkanyl
- Fråga
- CP
- Mellanmålsbolus
- Temp basal slut
- Temp basal start
- Temp mål
- Temp mål avbrutet
- Ändra inmatning
- Barn
- Töm kö
- Töm logg
- Closed Loop
- COB
- Kommentar
- Konfigurationsverktyg
- APS
- BG-källa
- Generella inställningar
- Insulin
- Loop
- Nightscoutversion:
- Profil
- Pump
- Konf
- Behandlingar
- Bekräfta
- Ansluten
- Ansluter
- Anslutningsfel
- Begränsning nådd
- Begränsning nådd
- Kopierat till Urklipp
- Kopiera till Urklipp
- Korr
- larm
- basal tim
- Bluetoothstatus
- DanaR Bluetooth Pump
- kolhydrat
- Enheter per dag
- Avaktivera EasyUI mode in pumpen
- Aktivera förlängd bolus i pumpen
- fel
- glukos
- Historik
- Larm
- Basaltimmar
- Bolusar
- Kolhydrater
- Ansluter (%d s)
- Daglig insulinmängd
- Fel
- Glukos
- Påfyllning
- Stoppa
- Hämta
- Fel på inmatning
- Pumpens IOB
- Senaste bolus
- Lösenord pump
- DanaR pumpinställningar
- påfyllning
- Kumulativ TDD
- Datum
- Exponentiellt viktad TDD
- Gammal data. Tryck på Hämta.
- Kvot
- Använd förlängd bolus för att ange >200%
- Misslyckades med inställning
- Visa profil
- Visa förlängd bolus som %
- DanaR Korea
- DanaR profilinställningar
- DIA [tim]
- Insulinets verkningstid (DIA)
- DanaR
- Dana
- dagar
- Synkronisera nu
- Delta
- Vald enhet kan inte nås
- DIA:
- Loop frånkopplad
- Koppla loss pump i 1 h
- Stäng av loop
- Frånkopplad
- Kopplar från
- Koppla loss pump i 2 h
- Koppla loss pump i 30 min
- Koppla loss pump i 3 h
- TA BORT
- Duration
- Äta snart
- Starta loop
- Aktivera superbolus i kalkylatorn
- Aktiverar superbolusfunktionen i kalkylatorn. Aktivera inte innan du förstått hur den fungerar. DEN KAN ORSAKA ÖVERDOSERING AV INSULIN OM INSIKT SAKNAS OM FUNKTIONEN!
- Aktiverad
- Licensavtal för slutanvändare
- JAG FÖRSTÅR OCH GODKÄNNER
- Ange ny behandling:
- Denna kolumn får ej vara tom
- Endast siffror tillåtna.
- Endast siffror mellan %1$s - %2$s är tillåtna.
- Ogiltigt telefonnummer
- Utför
- Exportera inställningar till
- Inställningar exporterade
- Förlängd bolus
- Lyckades inte uppdatera basalprofilen
- Snabbverkande Insulin
- Novorapid, Novolog, Humalog, Apidra
- Hittade inte filen
- Standardvärden för prime/fyll.
- Försäkra dig om att mängden motsvarar det som är specificerat för just ditt infusionsset.
- Hämtar pumpstatus
- Glukos
- Finger
- Sensor
- HÖG-markering
- timmar
- %.1f tim sedan
- Importera inställningar från
- Startar...
- Ogiltig profil!
- IOB
- Språk
- Lokal profil
- LP
- Loop
- APS
- Efter begränsningar
- Loop
- LOOP STOPPAD PGA BEGRÄNSNINGAR
- Superbolus (%d min)
- Loop pausad
- LÅG-markering
- Svagt batteri
- Manuell
- Avbryt
- Måltid
- Saknas:
- Om
- Avsluta
- Exportera inställningar
- Importera inställningar
- Inställningar
- Uppdatera från Nightscout
- Återställ databaserna
- Visa logg
- INGEN APS VALD
- Ingen Bluetooth-adapter funnen
- Ingen ändring behövs
- Ingen profil laddad från Nightscout ännu
- Ingen profil vald
- INGEN PROFIL VALD
- misslyckat - kontrollera telefonen
- Ej tillgängligt
- NS Client har inga skrivrättigheter. Fel API secret?
- Larminställningar
- Slå på sändning av data till alla appar i telefonen (ex xDrip).
- Aktivera lokala broadcasts
- Markera appstart till Nightscout
- Ingen uppladdning till Nightscout
- Ingen data sänds till Nightscout. AAPS ansluter till Nightscout men inga ändringar görs i Nightscout.
- Använd alltid absoluta värden i basal
- Endast uppladdning till Nightscout
- Endast uppladdning till Nightscout. Kommer inte få BG-data om inte lokal källa som xDrip används. Kommer heller inte att kunna hämta basalprofiler från Nightscout.
- Hög
- Låg
- BG-data saknas
- Ange Nightscout API secret (min 12 tecken)
- Nightscout API secret
- NSClient är inte installerad. Data förlorad!
- Nightscout URL
- Ange Nightscout URL
- URL:
- NSClient
- NSCI
- Nightscout API secret
- Basal
- DIA
- IC
- ISF
- Målvärde
- Enheter
- OAPS
- Mål
- Kontrollera att BG syns i Nightscout och att insulindata från pumpen laddas upp
- Ställer in utseende och övervakning för att sedan kunna analysera basaler och kvoter
- Du har nått din tillåtna gräns
- xds
- xDrip Status (klocka)
- xDrip Statuslinje (klocka)
- xDrip+ inte installerat
- xDrip
- Fel lösenord för pump
- Fel lösenord
- Visa BGI
- Visa BGI i statusfält
- Wear
- Inställningar för klocka (Wear)
- Visa detaljerad IOB
- Visa IOB med bolus och basal på klocka
- Klocka (Wear)
- Väntar på resultat
- Väntar på pump
- Virtuell pump
- Ladda upp status till Nightscout
- Temp basal
- vPump
- Inställningar för Virtuell pump
- OK
- Reservoar
- Senast ansluten
- Firmwareversion
- Förlängd bolus
- Batteri
- Profilens basalhastighet
- Virtuell pump
- Laddar upp
- Uppdaterar basalhastigheter
- Osupportad version av Nightscout
- Osupportad version av NSClient
- Lås upp inställningar
- Enheter:
- Säkerhetsbegränsingar
- Max tillåtna KH [g]
- Max tillåten bolus [E]
- Korr
- COB
- KH
- Bolus IOB
- 15 min trend
- BG
- Basal IOB
- Beh
- Insulin
- KH
- Total IOB (bolus):
- Total aktivitet (5m):
- IOB:
- Insulin:
- KH:
- 5m:
- Behandlingar
- Fel vid bolusleverans
- Temp mål
- Dur:
- Tot:
- Ins:
- Total IOB (basal):
- IOB:
- Fel vid justering av tempbasal
- Temp basal
- Tonåring
- Målområde:
- Pausa loop i 3 h
- Pausa loop i 2 h
- Pausa loop i 1 h
- Pausa loop i 10 h
- Superbolus
- Lyckad
- Avbryter temp basal
- Avbryter förlängd bolus
- Status:
- Fel duration:
- Okänt kommando eller fel svar
- Tempbasal %1$.2f enheter/tim i %2$d min startad
- Fel vid start av temp basal
- Misslyckades med att avbryta temp basal
- Temp basal avbruten
- För att pausa loop i %1$d minuter, svara med kod %2$s
- SMS
- Tillåt fjärrstyrning via SMS
- Kalibrering från andra källor inte tillåtna
- Fjärrbolus är inte tillåtet
- Fjärrkommandon för att ändra basaler tillåts ej
- Saknar rättighet att skicka SMS
- Loop pausad
- Loop återupptagen
- Loop är aktiverad
- Loop är avstängd
- Loop är aktiverat
- Loop är avstängd
- Ogiltigt telefonnummer för SMS
- Kalibrering skickad. xDrip måste tillåta att ta emot kalibrering i inställningarna.
- För att skicka kalibrering %1$.2f, svara med kod %2$s
- xDrip tar inte emot kalibreringar
- För att ge bolus %1$.2f enheter, svara med kod %2$s
- Bolus avbruten
- Bolus %.2f enheter tillförd
- För att stoppa temp basal, svara med kod %s
- För att starta basal %1$.2f enheter/tim, svara med kod %2$s
- +XXXXXXXXXX;+YYYYYYYYYY
- Godkända telefonnummer
- SMS-tjänst
- Senaste BG:
- Enkel profil
- Visa kö
- Lösenord för inställningar
- Ställer in förlängd bolus
- Inställningar importerade
- Ställ in ny förlängd bolus:
- Acceptera ny tempbasal:
- Skicka kalibrering %.1f till xDrip?
- Spara
- Säkerhet
- Återuppta
- Resultat
- Avslutar appen för att inställningarna ska läsas in.
- Starta om
- Vill du verkligen återställa databaserna?
- Uppdatera klockans data
- Ta bort sparad data:
- Ladda om profil
- Uppdatera från Nightscout
- Orsak
- Hastighet
- Kalkylatorinställningar
- Kalkylator
- Kö:
- Pump pausad
- Pump avstängd
- Pumpfel
- Pump upptagen
- Pump inte initierad, ingen profil vald.
- Pump inte initierad
- Pump
- NSProfil
- NS-profil
- Profilbyte
- Basalprofilen uppdaterad i pumpen
- Lyckades inte sätta basalprofilen
- Profil
- Prime/Fyll
- Gränsvärden för visualisering
- Högt och lågt värde för grafen i Översikt och i smartwatch
- Procent
- Pausad
- Vg ange personens ålder för inställningar av gränser
- Personens ålder
- Temp basal
- Hem
- Ta bort
- Ändra
- % (100% = profilens värde)
- Stoppa förlängd bolus
- Förlängd bolus
- Lägg till
- Giltig:
- KH:
- Knapptext:
- Kalibrering
- Kalkylator
- Stopp nedtryckt
- Stoppad
- Stopp
- Kommer tillföra %.2f enheter
- Tillförd
- Översikt
- Ny rekommendation tillgänglig
- Open Loop
- Beräkna nu
- Beräknat behov
- Profil
- Ingen glukosdata tillänglig
- Måltidsdata
- Maximal basal IOB som OpenAPS kan ge [E]
- Detta värde kallas Max IOB i OpenAPS. Det är ställt till noll från start. Efter flera dagar till veckor, beroende på hur du känner, kan du välja att justera denna.
- Max enheter per timme som temp basal kan sättas till
- Detta värde kallas max basal inom OpenAPS
- Senaste beräkning
- Senast startad
- IOB-data
- Ange värden
- Glukosstatus
- Plugin är avaktiverad
- Nuvarande temp
- Autosensdata
- OpenAPS MA
- Använd AMA autosens
- Standardvärde: 3.0 mg/dl/5 min Detta är grundinställning för KH-absorption per 5 min. Detta styr hur snabbt COB minskar, dvs hur snabbt programmet kalkylerar att KH tagits upp, och påverkar BG framöver när BG faller mer än väntat, eller inte stiger som väntat.
- Standardvärde: 3 Detta är en grundsten i OpenAPS säkerhet. Detta begränsar dina tempbasaler till maximalt 3x din största basalhastighet. Du behöver oftast inte ändra detta värde. Läs på och förstå skillnaden mellan 3x nuvarande och 3x daglig max som säkerhetsinställningar.
- Viktigt! Normalt behöver du inte ändra dessa värden. Vg KLICKA HÄR och LÄS texten och försäkra dig om att du FÖRSTÅTT innan du ändrar dessa värden.
- Standardvärde: 2 Bolus snooze är aktivt efter att du givit en måltidsbolus, detta för att inte loop ska lågtempa när du just ätit. I detta exempel och grundvärde är 2; innebär att DIA på 3 tim kommer bolus snooze kommer att fasas ut under 1,5 tim (3DIA/2).
- Antal timmar för beräkning av känslighet (Absorptionstid för KH är exkluderad).
- Intervall för autosens [tim]
- Standardvärde: 1.2 Med standarvärdet 1.2 kan autosens justera upp dina basaler, kvoter etc med upp till 20% för att kompensera för t ex tillfällig insulinresistens.
- Standardvärde: sant. Detta för att tillåta autosens justera mål-BG utöver ISF och basaler.
- Autosens justerar även mål-BG
- OpenAPS AMA
- OpenAPS
- Öppna inställningar på klockan
- Konstant avisering i telefonen
- Aktuellt BG saknas!
- OK
- Ocklusion
- Mål
- Pumpstatus tillgängligt i Nightscout
- Manuella justeringar
- Godkänn
- Starta
- BG är tillängligt i Nightscout
- Aktiverar extra funktioner som kan användas dagtid, såsom avancerad måltidsassistans, AMA
- Justerar basaler och kvoter om det behövs. Aktivera sedan autosens.
- 1 veckas lyckad looping dagtid, där alla måltider lagts in.
- Finjustering av closed loop, gradvis ökande IOB och minskande önskat BG målvärde
- Kör några dagar och åtminstone en natt utan larm för lågt BG innan du sänker målvärdet för BG.
- Börja använda closed loop med aktiverad funktion att stänga av vid lågt BG
- Aktivera closed loop med max IOB=0 i några dagar till dess systemet inte stänger av pga lågt BG för många gånger
- Förstå din open loop och hur den föreslår temp basaler
- Utifrån vad du nu lärt dig, besluta vilken max basal du vil ha. Ställ in det både i inställningarna i APS och i din pump.
- Starta med open loop
- Starta med open loop och använd det några dagar. Försök att ge många föreslagna temp basaler. Set up and use temporary and default temporary targets (e.g. for activity or hypo treatment carbs)
- Tid i timmar när alla kolhydradet förväntas vara absorberade
- Max absorptionstid för en måltid [tim]
- Absorptionsinställningar
- PUMP
- Byte pumpbatteri
- Sensorålder
- Kan visa fel om man använder bolus för priming/fyllning!
- MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
- mmol/l
- %d m
- mg/dl
- OK
- MDI
- NSClient
- Autoscroll
- http://openaps.readthedocs.io/en/latest/docs/walkthrough/phase-3/beyond-low-glucose-suspend.html
- Basaltyp
- SENS
- Genom att slå på Autosens funktionen, kom ihåg att skriva in alla KH. Annars kommer programmet göra fel i beräkningar av känslighet (ISF)!!
- AAPS
- Oref0
- WeightedAverage
- Ställer in temp basal
- SP
- BG:
- Basal:
- Bolus:
- Delta:
- IOB:
- %d min
- Första varning efter [min]
- Akut varning efter [min]
- Akut hög
- Akut låg
- BG-data saknas (akut larm)
- AndroidAPS
- TT
- Basal [%]
- BG-källa
- Svenska
- Laddade upp totalt %d värden
- Aktiverar ytterligare funktioner för användning dagtid, t ex SMB.
- Otillåtet fjärrkommando
- Ändra inställningen från E/d till E/tim i pumpen
- Kort medeldelta
- Långt medeldelta
- Antal dagar
- Vikt
- Total grundbasal
- Förkorta namnen på flikarna
- Modell: %1$02X Protokoll: %2$02X Kod: %3$02X
- "Standardvärde: 4 Detta är en grundsten i OpenAPS säkerhet. Detta begränsar dina tempbasaler till maximalt 4x din nuvarande basal, oberoende av din max basalhastighet. Detta för att undvika att man av misstag gör farliga inställningar. Om man når taket i denna inställning så kanske ändringar i andra inställningar behövs. De flesta behöver inte ändra denna inställning. "
- Standardvärde: 0.7 Med standardvärdet 0.7 kan autosens justera ner dina basaler, kvoter etc med upp till 30% för att kompensera för t ex tillfällig hög insulinkänslighet.
- %s behöver kunna kringgå batterisparfunktionerna för att fungera korrekt
- Pausad (%d min)
- Uppladdare
- Känslighetsavkänning
- Basal [E/tim]
- Peaktid för IOB-kurvan
- Peaktid [min]
- Rapid-Acting Oref
- Ultra-Rapid Oref
- %1$s tim DIA är för kort. Använder %2$s istället!
- Aktivera profil
- Datum
- OGILTIG
- Väntar på parkoppling med pump
- Parkopplingen klar
- Parkopplingen tog för lång tid
- PARKOPPLAR
- Ingen enhet funnen ännu
- Tom reservoar
- Varning om blodsockermätning
- "Återstående mängd insulin "
- Vald pump
- Parkoppla ny pump
- Bolushastighet
- Sätt basalsteg till 0.01 enheter per timme
- Serienummer
- Procent
- Tidsförskjutning
- Standardvärde för Temp-mål
- Äta snart [min]
- Mål vid Äta snart
- Träning [min]
- Mål vid träning
- Hämtar status för förlängd bolus
- Hämtar status för bolus
- Hämtar status för tempbasal
- Hämtar pumpinställningar
- Hämtar tid och datum i pumpen
- återanvänd
- Kontroller från klockan
- Sätt tempmål och ange behandlingar från klockan.
- Anslutningen tog för lång tid
- Matdatabas
- kJ
- En
- Pr
- Fett
- Väntar på att bolus ska slutföras (%d sek)
- Behandlar
- Påbörjar bolus
- Kommandot kör just nu
- Pumpdrivrutin justerad
- Pumpen kan inte nås
- BG-värden saknas
- Använd systemnotiser för larm och information
- Lokala larm
- Varna om BG-data saknas
- Varna om pumpen inte går att nå
- Pumpen ses som ej nåbar efter [min]
- Akut larm
- Bluetooth-övervakare
- Startar om bluetooth på telefonen om anslutning till pumpen misslyckas. Detta hjälper på en del telefoner där bluetooth ibland hänger sig.
- Ladda upp BG-data till Nightscout
- Uppladdningsinställningar för G5
- Visa detaljerad delta
- Visa delta med en extra decimal
- Osupportad firmware i pumpen
- Skicka BG-data till xDrip+
- Välj 640g/Eversense data som datakälla i xDrip+
- Basalvärdet ersatt med det lägsta tillåtna
- Använd BG
- Använd bolus-IOB
- Använd basal-IOB
- Använd BG-trend
- Använd superbolus
- Ja
- Nej
- Endast positiva
- Endast negativa
- Använd COB
- Använd temp mål
- Loop aktiverad
- APS vald
- NSClient har skrivrättigheter
- Closed loop aktiverad
- Max IOB är korrekt angivet
- BG tillgängligt från vald källa
- Profilens basaler är inte satta på hel timme: %s
- Ogiltig profil: %s
- Programmerar bolus i pump
- Uppdatera
- Läge
- Aktivitet
- Ingen anslutning på %d min
- %1$d%% (%2$d min återstår)
- Pausad pga fel
- Pausad av användaren
- Körs
- Avbryter tempbasal
- Sätter tempbasal (%1$d%% / %2$d min)
- Ger bolus (%.1f enheter)
- Uppdaterar
- Önskad åtgärd stöds inte av pumpen
- Osäker användning: Förlängd- eller kombibolus är aktiv. Loop mode är satt till att bromsa vid lågt BG i 6 timmar. Endast normala bolusar tillåtna i loopläge.
- Osäker användning: Pumpen använder en annan basalprofil än den första. Loop avstängd. Välj den första profilen på pumpen och uppdatera.
- En bolus med samma mängd efterfrågades inom den senaste minuten. För att förhindra att råka ge dubbla bolusar av misstag och ev programfel är detta inte tillåtet.
- Nu
- Läser historik från pumpen
- Sätter basalprofil
- Låg nivå i insulinreservoaren
- Pumpbatteriet är svagt
- Pumpen visar felet: E%1$d: %2$s
- Låg
- Tom
- Normal
- Pumpens klocka behöver ställas om
- Varning
- Varningen om avbruten tempbasal bekräftad
- Bolus avbruten. Det verkar som om ingen bolus gavs. För att vara säker, vänligen kontrollera pumpen för att undvika dubbel bolus och prova sedan vid behov igen. För att förhindra fel orsakade av mjukvaran, försöker inte mjukvaran igen automatiskt.
- Endast %1$.2f enheter %2$.2f gavs pga ett fel. Vänligen verifiera på pumpen och vidta nödvändiga åtgärder.
- Inte tillräckligt med insulin i reservoaren för att ge bolus
- Förlängd bolus misslyckad
- KH-korrektion
- E
- Begränsningar
- Temp basal satt i pump
- Behandling
- Bolus avbruten
- Avbryter bolus
- %1$.2f begränsat till %2$.2f
- Värdet %s är utanför hård begränsning
- Pumpen kunde inte nås. Bolus ej levererad.
- Ändrad
- PUMP STOPPAD
- Status uppdaterad
- sedan
- med
- Aktiv temp basal
- min kvar
- Loggbok
- Senast utförda åtgärd
- återstår över
- total med
- direkt med
- Håll alltid ansluten
- REDO
- SYNKRONISERAR
- UPPTAGEN
- SYNKRONISERAD
- STARTAR
- behöver
- Inte ansluten till hjälp-app!
- Hjälp-app verkar inte vara installerad!
- Inkompatibel hjälp-app. Vi behöver version
- Okänd
- Inväntar kodverifiering
- Kod ej godkänd
- Ej godkänd
- Inkompatibel
- sek
- min
- tim
- dag
- vecka
- %1$ds går ut %2$s
- Statistik
- Anslut på förhand
- Anslut automatiskt när AAPS är öppet, innan något pumpkommando är skickat, för att snabba upp kommunikationen
- Rekommenderas inte, då det drar mycket batteri
- Använd alltid SMB
- Använd alltid SMB oberoende av bolus. Endast möjligt med en bra filtrerad BG-källa, t ex Dexcom G5.
- Använd SMB efter kolhydrater
- Använd SMB i 6 timmar efter kolhydrater, även med 0 COB. Endast möjligt med en bra filtrerad BG-källa, t ex Dexcom G5.
- Använd SMB med kolhydrater (COB)
- Använd SMB medan du har kolhydrater aktiva (COB)
- Använd SMB när Temp mål är satt
- Använd SMB när temp mål är satt, t ex Äta snart eller Träning
- Använd SMB även när ett högt temp mål är satt
- Använd SMB även när ett högt temp mål är satt (över 5,5 mmol)
- Låt temp basalen gå
- Tysta
- Kolhydrater
- Knappar
- Insulin
- Skicka kalibrering till xDrip+ eller öppna kalibreringsrutan i G5-appen
- Öppnar xDrip+. Tillbaka-knappen återgår till AAPS
- "Mängd kolhydrater att lägga till när man trycker på knappen "
- Mängd insulin att lägga till när man trycker på knappen
- Kunde inte starta CGM-appen. Kontrollera att den är installerad.
- Historikläsare
- Notis vid SMB
- Visa SMB på klockan som en standardbolus.
- Skapa notiser vid fel
- Skapa notiser i Nightscout vid fel eller lokala meddelanden (även synliga i Careportal/Behandlingar)
- Visa BG-prognos på klockan.
- Prognos
- Dataval
- Uppladdning till Fabric
- Tillåt automatisk rapportering av appkrascher och användningsinformation till utvecklarna via fabric.io-tjänsten.
- Vänligen uppdatera din G5-app till en supportad version
- Starta \"Träning\"
- Starta \"Äta snart\"
- Ge ingen bolus, logga bara
- Kategori
- Underkategori
- Bolusen sparas bara i loggboken
- SMB satt i pump
- Känslighet (Sens)
- Avvikelser (Dev)
- Aktiva KH (COB)
- Aktivt insulin (IOB)
- Basaler
- Ingen åtgärd vald. Inget ändras.
- Starta \"Hypo\"
- Du kör nu dev-versionen. Closed Loop inte tillåtet.
- Engineering Mode aktiverat
- Engineering Mode inte aktiverat och appen körs inte som release
- %.2f E/h
- Läser basalprofil
- Pumphistoriken ändrad efter att boluskalkylen gjordes. Bolusen har inte levererats. Vänligen gör en ny kalkyl vid behov.
- Bolusen levererad, men det gick inte att lägga till den i loggen. Detta kan hända om två små bolusar ges inom två minuter. Vänligen kontrollera pumpens historik och Careportal och lägg till om det saknas. Se till att inte lägga till två bolusar med samma mängd och samma tid.
- Avböjer hög tempbasal eftersom kalkylen inte innefattade nyligen ändrad historik
- Uppdaterar pumpsstatus
- Basalen på pumpen är ändrad och kommer att uppdateras inom kort
- Basalen ändrad i pumpen, men det gick inte att läsa till vad
- Letar efter förändringar i historiken
- Flera bolusar med samma mängd insulin importerades just. Endast en kan läggas till i Careportal. Vänligen kontrollera pumpen och gör ändringar i Careportal manuellt vid behov. Observera att man bara kan ha en bolus per klockslag.
- Den senaste bolusen är äldre än 24 timmar eller i framtiden. Vänligen konttrollera tid och datum i pumpen.
- Tid/datum för bolusen verkar fel. IOB är troligen missvisande. Vänligen kontrollera tid och datum i pumpen.
- Profilbyte saknas. Vänligen gör ett profilbyte eller tryck Aktivera profil under Lokal Profil.
- Antal bolus
- Antal temp basaler
- Mål %d inte startat
- Mål %d inte nått
- Pumpen är inte kapabel till temp basal
- Ingen giltig data om temp basaler fanns i pumpen
- Closed Loop inaktiverat i Inställningar
- Autosens inaktiverat i Inställningar
- SMB inaktiverat i Inställningar
- Begränsar max basal till %1$.2f E/h pga %2$s
- pumpbegränsning
- det måste vara ett positivt värde
- multiplikator för max basal
- multiplikator för daglig max basal
- En bolus gavs för mindre än 3 min sedan. Hoppar över SMB
- Basal justerad korrekt
- Begränsar max procent hastighet till %1$d%% pga %2$s
- Begränsar bolus till %1$.1f enheter pga %2$s
- Begränsar max IOB till %1$.1f pga %2$s
- Begränsar kolhydrater till %1$d g pga %2$s
- Begränsar IOB till %1$.1f pga %2$s
- maxvärde i Inställningar
- hård begränsning
- osäker användning
- Statuskontroll misslyckad
- Logga byte av kanyl
- Logga byte av insulinreservoar
- SMB Alltid På och SMB Efter Kolhydrater är inaktiverat pga att den aktiva BG-källan inte stöder avancerad filtrering
- SMB inte tillåtet i Open Loop
- Mat
- Återställ
- Väntar på tidssynkronisering (%d sek)
- Frånkopplad (%d min)
- Automatisk loggning i Careportal
- Ladda upp insulin-, kanyl- och batteribyten samt pumplarm till Nightscout
- Max IOB som OpenAPS inte kan överstiga [E]
- Det här värdet kallas Max IOB av OpenAPS. Om denna mängd insulin on board (IOB) nås, kan inte OpenAPS lägga till mer.
- Pump stoppad
- Pump startad
- Pump pausad
- Max absorptionstid för kolhydrater [tim]
- Efter denna tid anses alla kolhydrater vara absorberade. Om det fortfarande finns COB, kommer dessa att tas bort ur beräkningen.
- Tid
- Visa anteckningar i behandlingsdialogerna
- Angivet: %1$.2f enheter. Levererat: %2$.2f enheter. Felkod: %3$d
- Första snabbknabben för insulin
- Andra snabbknabben för insulin
- Tredje snabbknabben för insulin
- Första snabbknabben för kolhydrater
- Andra snabbknabben för kolhydrater
- Tredje snabbknabben för kolhydrater
- Använd endast WiFi
- Anslutningsinställningar
- Tillåtna SSID (separerade med semikolon)
- Tillåt anslutning vid Roaming
- Multiplikator för max daglig basal (max_daily)
- Multiplikator för nuvarande basal (max_current)
- -
- Free-Peak Oref
- Hypo
- Hypo [min]
- Mål vid Hypo
- Insulinresistent vuxen
- Debug
- Koppla loss pump i 15 min
- All profiler laddades inte!
- Alla värden sparades inte!
- Aktivera UAM
- Aktivera SMB
- Använd Super Micro Bolusar istället för temp basal för snabbare resultat
- Avkänning av oförberedda måltider (UAM)
- Appbindning
- Hämta saknad BG-data från Nightscout
- Endast vid laddning
- Auto Backfill BG
- Kalkylatorinställningar
- Kalkyler inkluderade i resultatet
- Visningsinställningar
- Generella inställningar
- TRÄNING & BG-MÅL
- KOLHYDRATER & BOLUS
- CGM & LOGGNING
- Övrigt
- Initierar
- Max antal minuter som kan bli SMB
- t
- m
- DanaR v2
+ Säkerhetsbegränsningar för behandlingar
+ Max tillåten bolus [E]
+ Max tillåtna KH [g]
+ Inställningar
+ Uppdatera behandlingar från Nightscout
+ Återställ databaserna
+ Vill du verkligen återställa databaserna?
+ Avsluta
+ Använd förlängd bolus för att ange >200% basal
+ Dana R Bluetooth Pump
+ Använd alltid absoluta värden i basal
+ Starta om telefonen eller AndroidAPS från systeminställningar,\nannars kommer AndroidAPS inte kunna logga fel (viktigt att kunna spåra och verifiera att algoritmerna fungerar korrekt)!
+ Knappar för att snabbt komma åt vanliga funktioner
+ Mata in avancerade poster i loggboken.
+ Används för att konfigurera de aktiva insticksprogrammen
+ Inlärningsprogram
+ Visar förutbestämda inställningar för mat i Nightscout
+ Insulininställning för Humalog, Apidra och Novorapid/Novolog
+ Insulininställning för Fiasp
+ Låter dig ställa in tidpunkten för toppen på insulinets aktivitet och ska bara användas av avancerade användare
+ Aktivera eller avaktivera implementationen som kör loopen.
+ Synkroniserar dina data med Nightscout
+ Så som algoritmen var definierad år 2016
+ Så som algoritmen var definierad år 2017
+ Den senaste algoritmen för avancerade användare
+ Visar loopens nuvarande tillstånd och knappar för de vanligaste funktionerna
+ Visar en konstant avisering med en kort sammanfattning av vad din loop gör
+ Definiera en basalprofil som är tillgänglig offline.
+ Använder profiler från Nightscout
+ Definiera en insulinprofil som bara har ett enda tidsblock.
+ Pumpintegration för Accu-Chek Combo. Kräver att Ruffy är installerat
+ Pumpintegration för DANA Diabecare R
+ Pumpintegration för DANA Diabecare R, koreansk version
+ Pumpintegration för DANA Diabecare R med uppgraderad firmware
+ Pumpintegration för DANA Diabecare RS
+ Pumpintegration för Accu-Chek Insight. Kräver att SightRemote är installerat
+ Integration för de som endast använder insulinpennor
+ Integration för pumpar som ännu inte stöds av AndroidAPS (Open loop)
+ Känsligheten beräknas på samma sätt som i Oref0, men du kan specificera hur mycket av historiken som ska tas med i beräkningen. Minimalt upptag av kolhydrater beräknas utifrån maximal upptagstid för kolhydrater som angetts i Inställningar.
+ Känsligheten beräknas från 24 timmars data från historiken och kolhydrater som inte redan tagits upp, ignoreras efter tiden som ställts in i inställningarna.
+ Känsligheten beräknas från 8 timmars data från historiken och kolhydrater som ännu inte tagits upp ignoreras efter tiden som ställts in i inställningarna. Insticksprogrammet beräknar också icke inmatade måltider, UAM.
+ Känsligheten beräknas som ett viktat medelvärde av avvikelserna. Senare avvikelser får en högre vikt. Minimal upptagning av kolhydrater beräknas utifrån maximal upptagstid för kolhydrater som angetts i inställningarna. Den här algoritmen är den snabbaste att justera förändringar i känsligheten.
+ Ta emot BG-data från den modifierade Dexcom G5-appen.
+ Ta emot BG-data från Glimp.
+ Ta emot BG-data från 600SeriesAndroidUploader.
+ Ladda ner BG-data från Nightscout
+ Ta emot BG-data från xDrip.
+ Spara alla behandlingar som gjorts
+ Följ och kontrollera din AndroidAPS med din WearOS-klocka.
+ Visa information om din loop på din urtavla från xDrip.
+ Fjärrstyr AndroidAPS med SMS-kommandon.
+ Starta
+ Godkänn
+ Enheter
+ DIA
+ IC
+ ISF
+ Basal
+ Målvärde
+ INGEN PROFIL VALD
+ Insulin:
+ KH:
+ IOB:
+ IOB:
+ Aktivitet:
+ Total IOB (bolus):
+ Total aktivitet (5m):
+ Dur:
+ Tot:
+ Ins:
+ IOB:
+ Total IOB (basal):
+ Insulin
+ KH
+ BG
+ TT
+ KH
+ Korr
+ E
+ Bolus IOB
+ Beräkna nu
+ Virtuell pump
+ Profilens basaldos
+ Temp basal
+ Förlängd bolus
+ Batterinivå
+ Reservoar
+ OK
+ Senaste beräkning
+ Ange värden
+ Glukosstatus
+ Nuvarande temp
+ IOB-data
+ Profil
+ Måltidsdata
+ Resultat
+ Ingen BG-data tillänglig
+ Ingen ändring behövs
+ Beräknat behov
+ Basaldos
+ Duration
+ Orsak
+ Glukos
+ Delta
+ Delta:
+ Konfigurationsverktyg
+ Mål
+ OpenAPS MA
+ Översikt
+ NS-profil
+ Enkel profil
+ Temp basal
+ Behandlingar
+ Virtuell pump
+ Careportal
+ Pump
+ Vilken pump skulle du vilja använda med AndroidAPS?
+ Behandlingar
+ Vilket insticksprogram ska användas för att hantera behandlingar?
+ Profil
+ Vilken profil ska AndroidAPS använda?
+ APS
+ Vilken algoritm ska användas för behandlingar?
+ Generella inställningar
+ Dessa är några allmänna insticksprogram som kan vara användbara.
+ Vilka begränsningar ska tillämpas?
+ dagar
+ Begränsningar
+ Loop
+ Loop
+ Använd detta för att aktivera AndroidAPS loop-möjligheter.
+ APS
+ Efter begränsningar
+ Temp basal satt i pump
+ Senaste justering
+ OK
+ Avbryt
+ INGEN APS VALD
+ Säkerhet
+ Insticksprogram avaktiverat
+ Begränsning nådd
+ Fel vid bolusleverans
+ Fel vid justering av temp basal
+ Basal [%]
+ % (100% = profilens värde)
+ Acceptera ny temp basal:
+ Behandling
+ Kalkylator
+ Begränsning nådd
+ Bekräfta
+ Ange ny behandling:
+ Bolus
+ Bolus:
+ Basal
+ Basal:
+ Kolhydrater
+ Ändra inmatning
+ Ställ in ny förlängd bolus:
+ BG-källa
+ Var ska AndroidAPS få sitt data ifrån?
+ xDrip
+ APS-läge
+ Closed Loop
+ Open Loop
+ Loop avstängd
+ Inaktivera loop
+ Aktivera loop
+ Ny rekommendation tillgänglig
+ Versionen av NSClient stöds inte
+ Versionen av Nightscout stöds inte
+ NSClient är inte installerad. Data förlorad!
+ BG är tillängligt i Nightscout
+ Pumpstatus tillgängligt i Nightscout
+ Manuella justeringar
+ LOOP STOPPAD PGA BEGRÄNSNINGAR
+ IOB från basal
+ Bolusspärr aktiverad
+ Kolhydratsspärr aktiverad
+ BG-kontroll
+ Meddelande
+ Anteckning
+ Fråga
+ Träning
+ Byte pumpkanyl
+ Byte CGM-sensor
+ Start CGM-sensor
+ Byte insulinreservoar
+ Byt profil
+ Mellanmålsbolus
+ Måltidsbolus
+ Korrektionsbolus
+ Kombinationsbolus
+ Temp basal start
+ Temp basal slut
+ KH-korrektion
+ OpenAPS Offline
+ Händelsetyp
+ Annat
+ Mätare
+ Sensor
+ KH
+ Insulin
+ KH-tid
+ Delad
+ Duration
+ Procent
+ Absolut
+ Anteckning
+ Tid
+ Profil
+ Loggat av
+ Glukostyp
+ Ingen profil laddad från Nightscout ännu
+ Temp basal
+ Förlängd bolus
+ Nightscoutversion:
+ Saknas:
+ Inställningar exporterade
+ Exportera inställningar till
+ Importera inställningar från
+ Inställningar importerade
+ Hittade inte filen
+ Exportera inställningar
+ Importera inställningar
+ Max enheter per timme
+ Detta värde kallas max basal inom OpenAPS
+ Maximal basal IOB som OpenAPS kan ge [E]
+ Detta värde kallas Max IOB i OpenAPS. Det är ställt till noll från start. Efter flera dagar till veckor, beroende på hur du känner, kan du välja att justera denna.
+ TA BORT
+ Dana R
+ Ansluter
+ Ansluten
+ Frånkopplad
+ Dana R pumpinställningar
+ Licensavtal för slutanvändare
+ FÅR INTE ANVÄNDAS FÖR ATT FATTA MEDICINSKA BESLUT. DET FINNS INGEN GARANTI FÖR PROGRAMMET I DEN UTSTRÄCKNING SOM TILLÅTS AV GÄLLANDE LAG. FÖRUTOM NÄR ANNAT ANGES SKRIFTLIGEN LEVERERAS APPLIKATIONEN SOM DEN ÄR HELT UTAN GARANTIER I NÅGON SOM HELST FORM, VARKEN UTTRYCKTA ELLER UNDERFÖRSTÅDDA, INKLUSIVE MEN INTE BEGRÄNSAT TILL SÄLJBARHET OCH LÄMPLIGHET FÖR ETT VISST ÄNDAMÅL. HELA RISKEN VAD GÄLLER KVALITET OCH PRESTANDA AV PROGRAMMET ÅLIGGER ANVÄNDAREN. OM PROGRAMMET VISAR SIG VARA DEFEKT ANTAR ANVÄNDAREN DEN FULLA FÖR KOSTNADEN FÖR ALL NÖDVÄNDIG SERVICE, REPARATION ELLER KORRIGERING.
+ JAG FÖRSTÅR OCH GODKÄNNER
+ Spara
+ Ingen Bluetooth-adapter funnen
+ Vald enhet kan inte nås
+ Anslutningsfel
+ Pumpens IOB
+ Enheter per dag
+ Senaste bolus
+ %.1f tim sedan
+ Fel på inmatning
+ Misslyckades med inställning
+ Ladda om profil
+ Visa profil
+ Utförd
+ Kommentar
+ Lyckad
+ Procent
+ Absolut
+ Avbryt temp basal
+ SMS-tjänst
+ Väntar på resultat
+ Godkända telefonnummer
+ +4670XXXXXXX; +4670YYYYYYY
+ För att ge bolus %1$.2f enheter, svara med kod %2$s
+ För att skicka kalibrering %1$.2f, svara med kod %2$s
+ Bolus misslyckades
+ Bolus %.2f enheter korrekt levererad
+ Kommer att leverera %.2f enheter
+ Bolus %.2f enheter levererad
+ Levererar %.2f enheter
+ Tillåt fjärrstyrning via SMS
+ Fjärrbolus är inte tillåtet
+ Finger
+ Sensor
+ Manuell
+ Temp målvärde
+ Temp målvärde avbrutet
+ Dana R profilinställningar
+ DIA [tim]
+ Insulinets verkningstid
+ Lyckades inte uppdatera basalprofilen
+ Hämta
+ Laddar upp
+ Förlängd bolus
+ Standardbolus
+ Kombibolus
+ fel
+ påfyllning
+ basal tim
+ glukos
+ kolhydrat
+ larm
+ Laddade upp totalt %1$d värden
+ S bolus
+ Larm
+ Basaltimmar
+ Bolusar
+ Kolhydrater
+ Daglig insulinmängd
+ Fel
+ Glukos
+ Påfyllning
+ Stoppa
+ Ansluter (%1$d s)
+ Lösenord pump
+ Fel lösenord för pump
+ Pump upptagen
+ Levererad
+ Stoppad
+ Bolus avbruten
+ Avbryter bolus
+ Ocklusion
+ Stopp
+ Stopp nedtryckt
+ Väntar på pump
+ Kommer att leverera %.2f enheter
+ Ställer in utseende och övervakning för att sedan kunna analysera basaler och kvoter
+ Kontrollera att BG syns i Nightscout och att insulindata från pumpen laddas upp
+ Starta med open loop
+ Starta med open loop och använd det några dagar. Försök att ge många föreslagna temp basaler. Sätt upp och använd standardmålvärden (Träning, Äta snart och Hypo)
+ Förstå din open loop och hur den föreslår temp basaler
+ Utifrån vad du nu lärt dig, besluta vilken max basal du vill ha. Ställ in det både i inställningarna i APS och i din pump
+ Börja använda closed loop med aktiverad funktion att stänga av vid lågt BG
+ Aktivera closed loop med max IOB=0 i några dagar till dess systemet inte stänger av pga lågt BG för många gånger
+ Finjustering av closed loop, gradvis ökande IOB och minskande målvärde för BG
+ Kör några dagar och åtminstone en natt utan larm för lågt BG innan du sänker målvärdet för BG.
+ Justera basaler och kvoter om det behövs. Aktivera sedan autosens
+ 1 veckas lyckad looping dagtid, där alla måltider lagts in
+ Aktiverar extra funktioner som kan användas dagtid, såsom avancerad måltidsassistans, AMA
+ Aktiverar ytterligare funktioner för användning dagtid, t ex SMB
+ Du måste läsa på wikin och öka max IOB för att få SMB att fungera bra. En bra start är att sätta max IOB till din genomsnittliga måltidsbolus plus 3 gånger den högsta basalen du har under ett dygn
+ Du har nått din tillåtna gräns
+ Ingen profil vald
+ Loop stängdes av
+ Loop aktiverades
+ Loop är avstängd
+ Loop är aktiverad
+ %1$.2f begränsat till %2$.2f
+ Värdet %s är utanför hård begränsning
+ Fjärrkommandon för att ändra basaler tillåts ej
+ Otillåtet fjärrkommando
+ För att starta temp basal %1$.2f enheter/tim, svara med kod %2$s
+ För att pausa loop i %1$d minuter, svara med kod %2$s
+ Temp basal %1$.2f enheter/tim i %2$d min startad
+ Fel vid start av temp basal
+ För att stoppa temp basal, svara med kod %s
+ Temp basal avbruten
+ Misslyckades med att avbryta temp basal
+ Okänt kommando eller fel svar
+ Kalkylator
+ Kalkylatorinställningar
+ Knapptext:
+ KH:
+ Giltig:
+ Lägg till
+ Ändra
+ Ta bort
+ Måltid
+ Korrektion
+ Åtgärder
+ AndroidAPS startad
+ Endast uppladdning till Nightscout
+ Endast uppladdning till Nightscout. Kommer inte få BG-data om inte lokal källa som xDrip används. Kommer heller inte att kunna hämta basalprofiler från Nightscout.
+ Pump inte initierad
+ Pump inte initierad, ingen profil vald.
+ Prime/Fyll
+ Försäkra dig om att mängden motsvarar det som är specificerat för just ditt infusionsset.
+ Övrigt
+ Standardvärden för prime/fyll
+ Knapp 1
+ Knapp 2
+ Knapp 3
+ Enheter:
+ mg/dl
+ mmol/l
+ DIA:
+ Målområde:
+ Gränsvärden för visualisering
+ Högt och lågt värde för grafen i Översikt och i klockan
+ LÅG-markering
+ HÖG-markering
+ Klocka (Wear)
+ Uppdatera klockans data
+ Öppna inställningar på klockan
+ Pumpfel
+ Svagt batteri
+ Pump avstängd
+ Pumpbatteri urladdat
+ Dana R Korea
+ Basal:
+ Lyckades inte sätta basalprofilen
+ Basalprofilen uppdaterad i pumpen
+ Avaktivera EasyUI-läget i pumpen
+ Aktivera förlängd bolus i pumpen
+ Ändra inställningen från E/d till E/tim i pumpen
+ Basal understiger miniminivå. Profilen sattes inte.
+ BG:
+ Senaste BG:
+ Dagliga injektioner
+ Minimed 640G
+ Konstant avisering i telefonen
+ Aktuellt BG saknas!
+ %1$d min sedan
+ %1$d min sedan
+ Lokal profil
+ OpenAPS AMA
+ Kort medeldelta
+ Långt medeldelta
+ En serie med %1$d tal.\nVärde:
+ Autosensdata
+ Debug
+ Använd AMA autosens
+ Uppdatera från Nightscout
+ Ta bort behandlingar från framtiden
+ Äta snart
+ Hypo
+ Träning
+ Ta bort sparad data:
+ Dana R statistik
+ Kumulativ TDD
+ Exponentiellt viktad TDD
+ Basal
+ Bolus
+ TDD
+ Datum
+ Kvot
+ Antal dagar
+ Vikt
+ Kan visa fel om man använder bolus för priming/fyllning!
+ Gammal data. Tryck på Hämta.
+ Total grundbasal
+ TBB * 2
+ Startar...
+ Act
+ Konf
+ Loop
+ EP
+ OAPS
+ LP
+ Dana
+ Hem
+ vPump
+ NSProfil
+ Beh
+ CP
+ Mål
+ Wear
+ SMS
+ Förkorta namnen på flikarna
+ Använd alltid kort medeldelta istället för enkel delta
+ Användbart när ofiltrerade källor som xDrip ger brusvärden
+ Avancerade inställningar
+ Modell: %1$02X Protokoll: %2$02X Kod: %3$02X
+ Profil
+ Standardvärde: 3 Detta är en grundsten i OpenAPS säkerhet. Detta begränsar dina temp basaler till maximalt 3x din största basaldos. Du behöver oftast inte ändra detta värde. Läs på och förstå skillnaden mellan 3x nuvarande och 3x daglig max som säkerhetsinställningar.
+ Standardvärde: 4 Detta är en grundsten i OpenAPS säkerhet. Detta begränsar dina tempbasaler till maximalt 4 gånger din nuvarande basaldos, oberoende av din maximala basaldos. Detta för att undvika att man av misstag gör farliga inställningar. Om man når taket i denna inställning så kanske ändringar i andra inställningar behövs. De flesta behöver inte ändra denna inställning.
+ Standardvärde: 1.2\nDetta är en multiplikatorbegränsare för autosens/autotune som gör att automatiken kan justera upp basaler, sänka insulinkänslighet (ISF) och/eller målvärde med upp till 20%.
+ Standardvärde: 0.7\nDetta är en multiplikatorbegränsare för autosens/autotune som gör att automatiken kan justera ner basaler, höja insulinkänslighet (ISF) och/eller målvärde med upp till 30% för att kompensera för t ex tillfällig hög insulinkänslighet.
+ Autosens justerar även mål-BG
+ Standardvärde: sant. Detta för att tillåta autosens justera mål-BG utöver ISF och basaler.
+ Standardvärde: 2 Bolus snooze är aktivt efter att du givit en måltidsbolus, detta för att inte loop ska lågtempa när du just ätit. I detta exempel och grundvärde är 2; innebär att DIA på 3 tim kommer bolus snooze kommer att fasas ut under 1,5 tim (3DIA/2).
+ Standardvärde: 3.0 (AMA) eller 8.0 (SMB). Detta är grundinställning för KH-absorption per 5 min. Detta styr hur snabbt COB minskar, dvs hur snabbt programmet kalkylerar att KH tagits upp, och påverkar BG framöver när BG faller mer än väntat, eller inte stiger som väntat.
+ Viktigt!\nNormalt behöver du inte ändra dessa värden. Vg KLICKA HÄR och LÄS texten och försäkra dig om att du FÖRSTÅTT innan du ändrar dessa värden.
+ Endast siffror tillåtna.
+ Endast siffror mellan %1$s - %2$s är tillåtna.
+ Detta fält får inte vara tomt
+ Ogiltigt telefonnummer
+ Ogiltigt telefonnummer för SMS
+ Kalibrering
+ Skicka kalibrering %.1f till xDrip?
+ xDrip+ inte installerat
+ Kalibrering skickad till xDrip
+ Kalibrering från andra källor inte tillåtna
+ Kalibrering skickad. xDrip måste tillåta att ta emot kalibrering i inställningarna.
+ xDrip tar inte emot kalibreringar
+ Pump pausad
+ Hämtar pumpstatus
+ Ställer in temp basal
+ Avbryter temp basal
+ Ställer in förlängd bolus
+ Avbryter förlängd bolus
+ Uppdaterar basaldoser
+ Kopplar från
+ Utför
+ Inställningar för Virtuell pump
+ Ladda upp status till Nightscout
+ Fel lösenord
+ Lösenord för inställningar
+ Lås upp inställningar
+ Maximal daglig dos snart nådd
+ NS Client
+ NSCl
+ URL:
+ Automatisk rullning
+ Starta om
+ NSClient
+ Nightscout-URL
+ Ange Nightscout-URL
+ Nightscout API secret
+ Nightscout API secret
+ Ange Nightscout API secret (min 12 tecken)
+ Synkronisera nu
+ Töm kö
+ Visa kö
+ Kö:
+ Status:
+ Pausad
+ Töm logg
+ NS Client kan inte uppdatera Nightscout. Fel API secret?
+ Inställningar för klocka (Wear)
+ Visa detaljerad IOB
+ Visa IOB med bolus och basal på klocka
+ misslyckat - kontrollera telefonen
+ Ej tillgängligt
+ Personens ålder
+ Barn
+ Tonåring
+ Vuxen
+ Insulinresistent vuxen
+ Vg ange personens ålder för inställningar av gränser
+ Glimp
+ %s behöver kunna kringgå batterisparfunktionerna för att fungera korrekt
+ Loop pausad
+ Pausad (%1$d min)
+ Superbolus (%1$d min)
+ Pausa loop i 1 timme
+ Pausa loop i 2 timmar
+ Pausa loop i 3 timmar
+ Pausa loop i 10 timmar
+ Koppla loss pump i 15 min
+ Koppla loss pump i 30 min
+ Koppla loss pump i 1 timme
+ Koppla loss pump i 2 timmar
+ Koppla loss pump i 3 timmar
+ Återuppta
+ Fel duration
+ Loop pausad
+ Loop återupptagen
+ 15 min trend
+ COB
+ Superbolus
+ Rapportera appstart till Nightscout
+ Avslutar appen för att inställningarna ska läsas in.
+ Dana R v2
+ Insulin
+ Vilken typ av insulin använder du?
+ Snabbverkande Insulin
+ Novorapid, Novolog, Humalog, Apidra
+ Fiasp
+ INS
+ Aktivera superbolus i kalkylatorn
+ Aktiverar superbolusfunktionen i kalkylatorn. Aktivera inte innan du förstått hur den fungerar. DEN KAN ORSAKA ÖVERDOSERING AV INSULIN OM INSIKT SAKNAS OM FUNKTIONEN!
+ IOB
+ COB
+ Firmwareversion
+ Senast ansluten
+ Bluetoothstatus
+ Om
+ Saknar behörighet att skicka SMS
+ xDrip Status (klocka)
+ xDrip Statusrad (klocka)
+ xds
+ Visa BGI
+ Visa BGI i statusraden
+ Ingen uppladdning till Nightscout
+ Ingen data sänds till Nightscout. AndroidAPS ansluter till Nightscout men inga ändringar görs i Nightscout
+ Basalsteg
+ Bolussteg
+ Förlängd bolus
+ Temp mål
+ Stoppa förlängd bolus
+ Sensorålder
+ Kanylålder
+ Insulinålder
+ timmar
+ Basaltyp
+ Ogiltig profil!
+ Profilbyte
+ Pumpbatteri ålder
+ Byte pumpbatteri
+ Larminställningar
+ Akut hög
+ Hög
+ Låg
+ Akut låg
+ BG-data saknas
+ BG-data saknas (akut larm)
+ Första varning efter [min]
+ Akut varning efter [min]
+ Intervall för autosens [tim]
+ Antal timmar för beräkning av känslighet (absorptionstid för KH är exkluderad)
+ Pump
+ OpenAPS
+ Uppladdare
+ Känslighetsavkänning
+ Vilken algoritm vill du använda för känslighetsavkänning?
+ SENS
+ Oref0
+ Oref1
+ AAPS
+ Absorptionsinställningar
+ Max absorptionstid för en måltid [tim]
+ Tid i timmar när alla kolhydrater förväntas vara absorberade
+ Visa förlängd bolus som %
+ SAGE
+ IAGE
+ CAGE
+ PBAGE
+ OAPS
+ UPLD
+ BAS
+ EXT
+ Håll skärmen igång
+ Förhindrar Android att stänga av skärmen. Det kommer att förbruka mer batteri.
+ Genom att slå på Autosens funktionen, kom ihåg att skriva in alla KH. Annars kommer programmet göra fel i beräkningar av känslighet (ISF)!!
+ WeightedAverage
+ OK
+ Avbryt
+ Alla profiler laddades inte!
+ Alla värden sparades inte!
+ Slå på sändning av data till alla appar i telefonen (ex xDrip).
+ Aktivera lokala broadcasts
+ TRÄNING & BG-MÅL
+ KOLHYDRATER & BOLUS
+ CGM & LOGGNING
+ PUMP
+ Basal [E/tim]
+ Duration [min]
+ OpenAPS SMB
+ SMB
+ Aktivera UAM
+ Aktivera SMB
+ Använd Super Micro Bolusar istället för temp basal för snabbare resultat
+ Avkänning av oförberedda måltider (UAM)
+ Peaktid för IOB-kurvan
+ Peaktid [min]
+ Free-Peak Oref
+ Rapid-Acting Oref
+ Ultra-Rapid Oref
+ %1$s tim DIA är för kort. Använder %2$s istället!
+ Aktivera profil
+ Datum
+ OGILTIG
+ Väntar på parkoppling med pump
+ Parkopplingen klar
+ Parkopplingen tog för lång tid
+ PARKOPPLAR
+ Ingen enhet funnen ännu
+ Tom reservoar
+ Varning om blodsockermätning
+ Återstående mängd insulin
+ Dana RS
+ Dana
+ Vald pump
+ Parkoppla ny pump
+ Bolushastighet
+ Sätt basalsteg till 0.01 enheter per timme
+ Serienummer
+ Procent
+ Tidsförskjutning
+ Standardmålvärden
+ Äta snart [min]
+ Mål vid Äta snart
+ Träning [min]
+ Mål vid träning
+ Hypo [min]
+ Mål vid Hypo
+ Förfyll
+ Hämtar status för förlängd bolus
+ Hämtar status för bolus
+ Hämtar status för temp basal
+ Hämtar pumpinställningar
+ Hämtar tid och datum i pumpen
+ återanvänd
+ Kontrollera från klockan
+ Sätt temp målvärde och ange behandlingar från klockan.
+ Anslutningen tog för lång tid
+ Matdatabas
+ g
+ min
+ h
+ ]]>
+ kJ
+ En
+ Pr
+ Fett
+ ]]>
+ Slutför bolus (%1$d sek)
+ Behandlar
+ Påbörjar bolus
+ Kommando körs just nu
+ Pumpdrivrutin justerad
+ Pumpen kan inte nås
+ BG-värden saknas
+ Systemaviseringar för larm och info
+ Lokala larm
+ Varna om BG-data saknas
+ Varna om pumpen inte går att nå
+ Pumpen ses som ej nåbar efter [min]
+ Akut larm
+ INFO
+ Bluetooth
+ Bluetooth-övervakare
+ Startar om bluetooth på telefonen om anslutning till pumpen misslyckas. Detta hjälper på en del telefoner där bluetooth ibland hänger sig.
+ DexcomG5 App (modifierad)
+ Ladda upp BG-data till Nightscout
+ Uppladdningsinställningar för G5
+ Uppladdningsinställningar för Poctech
+ Visa detaljerad delta
+ Visa delta med en extra decimal
+ Max antal minuter som kan bli SMB
+ Pumpens firmware stöds inte
+ Skicka BG-data till xDrip+
+ Välj \"640G/Eversense\" som datakälla i xDrip+
+ NSClient BG
+ Basalvärdet ersatt med det lägsta tillåtna: %s
+ Basalvärdet ersatt med det maximala tillåtna: %s
+ Använd BG
+ Använd bolus-IOB
+ Använd basal-IOB
+ Använd BG-trend
+ Använd superbolus
+ Ja
+ Nej
+ Endast positiva
+ Endast negativa
+ Använd COB
+ Använd temp målvärde
+ Loop aktiverad
+ APS vald
+ NSClient kan uppdatera Nightscout
+ Closed loop aktiverad
+ Max IOB är korrekt angivet
+ BG tillgängligt från vald källa
+ Profilens basaler är inte satta på hel timme: %s
+ Ogiltig profil: %s
+ Programmerar bolus i pump
+ Uppdatera
+ Läge
+ Aktivitet
+ Ingen anslutning på %1$d min
+ %1$d%% (%2$d min återstår)
+ Initierar
+ Pausad pga fel
+ Pausad av användaren
+ Körs
+ Avbryter temp basal
+ Sätter temp basal (%1$d%% / %2$d min)
+ Levererar bolus (%.1f enheter)
+ Uppdaterar
+ Önskad åtgärd stöds inte av pumpen
+ Osäker användning: Förlängd- eller kombibolus är aktiv. Loop mode är satt till att bromsa vid lågt BG i 6 timmar. Endast normala bolusar tillåtna i loopläge.
+ Osäker användning: Pumpen använder en annan basalprofil än den första. Loop avstängd. Välj den första profilen på pumpen och uppdatera.
+ En bolus med samma mängd efterfrågades inom den senaste minuten. För att förhindra att råka ge dubbla bolusar av misstag och ev programfel är detta inte tillåtet.
+ Nu
+ Läser historik från pumpen
+ Pumphistorik
+ Sätter basalprofil
+ Låg nivå i insulinreservoaren
+ Pumpbatteriet är svagt
+ Pumpen visar felet: E%1$d: %2$s
+ Låg
+ Tom
+ Normal
+ Pumpens klocka behöver ställas om
+ Varning
+ Varningen om avbruten temp basal bekräftad
+ Pumpen kunde inte nås. Bolus ej levererad.
+ Bolus avbruten. Det verkar som om ingen bolus levererades. För att vara säker, vänligen kontrollera pumpen för att undvika dubbel bolus och prova sedan vid behov igen. För att förhindra fel orsakade av mjukvaran, försöker inte mjukvaran igen automatiskt.
+ Endast %1$.2f enheter %2$.2f levererades pga ett fel. Vänligen verifiera på pumpen och vidta nödvändiga åtgärder.
+ Leverans av bolus och kontroll av pumpens historik misslyckades. Vänligen kontrollera pumpen manuellt. Om en bolus levererades, kommer den att läggas till som behandling vid nästa anslutning till pumpen.
+ Inte tillräckligt med insulin i reservoaren för att ge bolus
+ Förlängd bolus misslyckad
+ Insight
+ Insight-pump
+ Status
+ Ändrad
+ PUMP STOPPAD
+ Status uppdaterad
+ sedan
+ med
+ Aktiv temp basal
+ min kvar
+ Loggbok
+ Senast utförda åtgärd
+ min
+ återstår över
+ total med
+ direkt med
+ Håll alltid ansluten
+ REDO
+ SYNKRONISERAR
+ UPPTAGEN
+ SYNKRONISERAD
+ STARTAR
+ behöver
+ Inte ansluten till hjälp-app!
+ Hjälp-app verkar inte vara installerad!
+ Inkompatibel hjälp-app. Vi behöver version
+ Okänd
+ Inväntar kodverifiering
+ Kod ej godkänd
+ Appbindning
+ Ej godkänd
+ Inkompatibel
+ sek
+ min
+ tim
+ dag
+ vecka
+ s
+ %1$ds går ut %2$s
+ Keepalive-status
+ Statistik
+ Anslut på förhand
+ Anslut automatiskt när AndroidAPS är öppet, innan något pumpkommando är skickat, för att snabba upp kommunikationen
+ Rekommenderas inte, då det drar mycket batteri
+ Använd alltid SMB
+ Använd alltid SMB oberoende av bolus. Endast möjligt med en bra filtrerad BG-källa, t ex Dexcom G5.
+ Använd SMB efter kolhydrater
+ Använd SMB i 6 timmar efter kolhydrater, även med 0 COB. Endast möjligt med en bra filtrerad BG-källa, t ex Dexcom G5.
+ Använd SMB med kolhydrater (COB)
+ Använd SMB medan du har kolhydrater aktiva (COB)
+ Använd SMB vid temp målvärde
+ Använd SMB när temp mål är satt, t ex Äta snart eller Träning
+ Använd SMB vid högt målvärde
+ Använd SMB även när ett högt temp målvärde är satt (över 5,5 mmol)
+ Låt temp basalen gå
+ Tysta
+ Insulin
+ Kolhydrater
+ Knappar
+ Skicka kalibrering till xDrip+ eller öppna kalibreringsrutan i G5-appen
+ Öppnar xDrip+. Tillbaka-knappen återgår till AndroidAPS
+ Mängd kolhydrater att lägga till när man trycker på knappen
+ Mängd insulin att lägga till när man trycker på knappen
+ Kunde inte starta CGM-appen. Kontrollera att den är installerad.
+ CGM
+ Historikläsare
+ Skicka notis vid SMB
+ Visa SMB på klockan som en standardbolus.
+ Skapa notiser vid fel
+ Skapa notiser i Nightscout vid fel eller lokala meddelanden (även synliga i Careportal/Behandlingar)
+ Visa BG-prognos på klockan.
+ Prognos
+ Dataval
+ Uppladdning till Fabric
+ Tillåt automatisk rapportering av appkrascher och användningsinformation till utvecklarna via fabric.io-tjänsten.
+ Vänligen uppdatera din G5-app till en supportad version
+ Starta \"Träning\"
+ Starta \"Äta snart\"
+ TT
+ Ge ingen bolus, logga bara
+ Kategori
+ Underkategori
+ Bolusen sparas bara i loggboken
+ Hämta saknad BG-data från Nightscout
+ SMB satt i pump
+ Känslighet (Sens)
+ Avvikelser (Dev)
+ Aktiva KH (COB)
+ Aktivt insulin (IOB)
+ Basaler
+ Ingen åtgärd vald. Inget ändras.
+ Starta \"Hypo\"
+ Du kör nu dev-versionen. Closed Loop inte tillåtet.
+ Engineering Mode aktiverat
+ Engineering Mode inte aktiverat och appen körs inte som release
+ %.2f E/h
+ Läser basalprofil
+ Pumphistoriken ändrad efter att boluskalkylen gjordes. Bolusen har inte levererats. Vänligen gör en ny kalkyl vid behov.
+ Bolusen levererad, men det gick inte att lägga till den i loggen. Detta kan hända om två små bolusar ges inom två minuter. Vänligen kontrollera pumpens historik och Careportal och lägg till om det saknas. Se till att inte lägga till två bolusar med samma mängd och samma tid.
+ Avböjer hög temp basal eftersom kalkylen inte innefattade nyligen ändrad historik
+ Uppdaterar pumpstatus
+ Basalen på pumpen är ändrad och kommer att uppdateras inom kort
+ Basalen ändrad i pumpen, men det gick inte att läsa till vad
+ Letar efter förändringar i historiken
+ Flera bolusar med samma mängd insulin importerades just. Endast en kan läggas till i Careportal. Vänligen kontrollera pumpen och gör ändringar i Careportal manuellt vid behov. Observera att man bara kan ha en bolus per klockslag.
+ \n\nWeb: http://www.androidaps.org\n\nDocs: http://wiki.androidaps.org\n\nFB: http://facebook.androidaps.org
+ Den senaste bolusen är äldre än 24 timmar eller i framtiden. Vänligen kontrollera tid och datum i pumpen.
+ Tid/datum för bolusen verkar fel. IOB är troligen missvisande. Vänligen kontrollera tid och datum i pumpen.
+ Profilbyte saknas. Vänligen gör ett profilbyte eller tryck Aktivera profil under Lokal Profil.
+ Antal bolus
+ Antal temp basaler
+ Mål %1$d inte startat
+ Mål %1$d inte uppnått
+ Pumpen kan inte hantera temp basaler
+ Ingen giltig data om temp basaler fanns i pumpen
+ Closed Loop inaktiverat i Inställningar
+ Autosens inaktiverat i Inställningar
+ SMB inaktiverat i Inställningar
+ Begränsar max basal till %1$.2f E/h pga %2$s
+ pumpbegränsning
+ det måste vara ett positivt värde
+ multiplikator för max basal
+ multiplikator för daglig max basal
+ En bolus gavs för mindre än 3 min sedan. Hoppar över SMB
+ Basal justerad korrekt
+ Begränsar max procent hastighet till %1$d%% pga %2$s
+ Begränsar bolus till %1$.1f enheter pga %2$s
+ Begränsar bolus till %1$.1f enheter pga %2$s
+ Begränsar max IOB till %1$.1f pga %2$s
+ Begränsar kolhydrater till %1$d g pga %2$s
+ Begränsar IOB till %1$.1f pga %2$s
+ maxvärde i Inställningar
+ hård begränsning
+ osäker användning
+ Statuskontroll misslyckad
+ Logga byte av kanyl
+ Logga byte av insulinreservoar
+ SMB Alltid På och SMB Efter Kolhydrater är inaktiverat pga att den aktiva BG-källan inte stöder avancerad filtrering
+ SMB inte tillåtet i Open Loop
+ Mat
+ Återställ
+ Väntar på tidssynkronisering (%1$d sek)
+ Frånkopplad (%1$d min)
+ Automatisk loggning i Careportal
+ Ladda upp insulin-, kanyl- och batteribyten samt pumplarm till Nightscout
+ Max IOB som OpenAPS inte kan överstiga [E]
+ Det här värdet kallas Max IOB av OpenAPS. Om denna mängd insulin on board (IOB) nås, kan inte OpenAPS lägga till mer.
+ Pump stoppad
+ Pump startad
+ Pump pausad
+ Max absorptionstid för kolhydrater [tim]
+ Efter denna tid anses alla kolhydrater vara absorberade. Om det fortfarande finns COB, kommer dessa att tas bort ur beräkningen.
+ Tid
+ Visa anteckningar i behandlingsdialogerna
+ Nästa
+ Föregående
+ Installationsguide
+ Avsluta
+ Välj språk
+ Angivet: %1$.2f enheter. Levererat: %2$.2f enheter. Felkod: %3$s
+ Första snabbknabben för insulin
+ Andra snabbknabben för insulin
+ Tredje snabbknabben för insulin
+ Första snabbknabben för kolhydrater
+ Andra snabbknabben för kolhydrater
+ Tredje snabbknabben för kolhydrater
+ CGM
+ Använd endast WiFi
+ WiFi nätverksnamn
+ Endast vid laddning
+ Anslutningsinställningar
+ Tillåtna nätverksnamn (separerade med semikolon)
+ Tillåt NS-data vid roaming
+ Max autosens ratio
+ Min autosens ratio
+ Bolus snooze DIA divisor
+ Multiplikator för max daglig basal (max_daily)
+ Multiplikator för nuvarande basal (max_current)
+ -
+ Typ av virtuell pump
+ Pumpdefinition
+ Bolus: Steg =%1$s\nFörlängd bolus: [Steg=%2$s, duration =%3$smin -%4$sh] \nBasal: Steg=%5$s\nTempbasal: %6$s (av %7$s), duration =%8$smin -%9$sh\n%10$s
+ * Den virtuella pumpen kräver fasta värden för basal/bolus.
+ Auto Backfill BG
+ Kalkylatorinställningar
+ Kalkyler inkluderade i resultatet
+ Visningsinställningar
+ Generella inställningar
+ Aktivera NSClient
+ Välkommen till installationsguiden! Den kommer att hjälpa dig genom installationsprocessen\n
+ Pumpinställningar
+ Läs status
+ Ändringar måste göras i NS
+ Hoppa över installationsguiden
+ Tryck på knappen nedan för att låta AndroidAPS föreslå/göra basalförändringar
+ Tryck på knappen nedan för att aktivera Mål. Titta på fliken Mål efter att du slutfört den här guiden för att göra AndroidAPS helt funktionell. \n
+ Aktivera mål
+ Konfigurera APS-insticksprogram
+ Konfigurera insticksprogram för känslighet
+ Insticksprogrammet för känslighet används för att detektera insulinkänslighet och för att beräkning av aktiva kolhydrater, COB. För mer information, besök:
+ https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COB
+ NSClient hanterar anslutningen till Nightscout. Du kan hoppa över denna del nu, men du kommer inte att kunna passera vissa mål tills du har satt upp det.
+ Kom ihåg: De nya insulinprofilerna kräver en duration (DIA) på minst 5 timmar. En DIA på 5-6 timmar enligt de nya profilerna är ungefär lika med DIA 3 timmar enligt de gamla insulinprofilerna.
+ Konfigurera BG-källa
+ Vänligen välj källa för profil. Om patienten är ett barn bör du använda NS profil. Om ingen följer dig på Nightscout kommer du förmodligen föredra lokal profil. Kom ihåg att du endast väljer profilkälla här. För att använda den måste du aktivera den genom att köra ”Byt Profil”
+ Välj en av dessa algoritmer. De sorteras från den äldsta till nyaste. Nyare algoritm är oftast mer kraftfull och mer aggressiv. Om du är ny som loopanvändare vill du förmodligen börja med AMA och inte med senaste. Glöm inte att läsa dokumentationen om OpenAPS och konfigurera algoritmen innan användning.
+ Påbörja ditt första mål
+ Behörighet
+ Be om behörighet
+ Appen behöver behörighet att använda Platsinfo för att kunna söka efter Bluetooth-enheter
+ Appen behöver behörighet att använda Lagring för att kunna spara loggfiler
+ Begäran
+ Konfigurera insticksprogram för insulin
+ Avsluta
+ Användaralternativ
+ Format för tidsvisning
+ Scrollfunktion
+ Pip vid knapptryckning
+ Larm
+ Ljud
+ Vibrera
+ Båda
+ LCD på, tid [s]
+ Bakgrundsbelysning på, tid [s]
+ Glukosenheter
+ Stäng av (timmar)
+ Låg nivå reservoar (enheter)
+ Spara till pump
+ På
+ Av
+ Öppna menyn
+ Stäng menyn
+ Inställningar för insticksprogram
+ Klart. Bra jobbat!
+ Inte slutfört ännu
+ Förfluten tid
+ %1$d. Mål
+ Poctech
+ Ta emot BG-data från Poctechappen
+ Högt målvärde höjer känsligheten
+
+ Lågt målvärde sänker känsligheten
+
+ Felaktig pumpinstallation. Kontrollera dokumentationen och verifiera att Snabbmenyn heter QUICK INFO med hjälp av 360-mjukvaran.
+ Anpassad
+ Stor tidsskillnad
+ Stor tidsskillnad:\nTiden i pumpen skiljer mer än 1,5 timme.\nVänligen justera tiden manuellt på pumpen och se till att det går att läsa historiken från pumpen utan oväntat beteende.\nOm möjligt, töm historiken i pumpen innan tidsomställning alternativt stäng av loopen i minst DIA timmar efter den senaste felaktiga historikloggen, men minst DIA timmar från nu.
+ Rensa alla \"AndroidAPS startad\"
+ Tidigare sparade inställningar hittade
+ Varning: Om du aktiverar och ansluter en pump, kommer AndroidAPS skriva över pumpens basalprofil med den aktiva profilen i AndroidAPS. Se till att ha rätt inställningar i appen innan du ansluter. Om du är osäker, tryck på Avbryt och anslut pumpen på nytt vid ett senare tillfälle.
+ Behandlingsdata ofullständigt
+ Underhållsinställningar
+ e-post
+ Ogiltig e-postadress
+ Antal loggar att skicka
+ Underhåll
+ UH
+ Tillhandahåller funktioner för underhåll (t ex skicka eller ta bort loggar).
+ Skicka loggar per e-post
+ Radera loggar
+ En behandling (insulin: %1$.2f, kolhydrater: %2$d, tid: %3$s) kunde inte läggas till listan i Behandlingar. Vänligen kontrollera och lägg till en post manuellt vid behov.
+ eCarbs: %1$d g (%2$d h), fördröjd i %3$d m
+ Ingen data tillgänglig för autosens
+ Loggningsinställningar
+ Återställ standardinställningar
+ Fel på NSClient. Överväg att starta om NSClient och Nightscout-webbplatsen.
+ AS
+ Version %1$s tillgänglig
+ Tidsförskjutning
+ Föredraget APS-läge
+ Total
+ Kalkyl
+ Verifierar anslutningen
+ Skicka dagens loggfiler till utvecklarna tillsammans med denna datumstämpel. Oväntad situation.
+ Max bolus nådd
+ Kommandofel
+ Felaktig hastighet
+ Insulingräns nådd
+ Minsta ändring som ger notifiering [%]
+ Loopen kommer att be om justering endast om ändringen är större än detta värde. Standardvärde är 20%
+
+ %1$d dag
+ %1$d dagar
+
+
+ %1$d timme
+ %1$d timmar
+
+
+ %1$d min
+ %1$d min
+
diff --git a/app/src/main/res/values-zh/insight_alerts.xml b/app/src/main/res/values-zh/insight_alerts.xml
new file mode 100644
index 0000000000..70489fbc5e
--- /dev/null
+++ b/app/src/main/res/values-zh/insight_alerts.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml
new file mode 100644
index 0000000000..93b944c31e
--- /dev/null
+++ b/app/src/main/res/values-zh/strings.xml
@@ -0,0 +1,1053 @@
+
+
+
+ 治疗安全
+ 允许的最大大剂量值[U]
+ 最大允许碳水化合物 [g]
+ 参数选项
+ 从Nightscout刷新治疗数据
+ 重置数据库
+ 你真的想重置数据库吗?
+ 退出
+ 使用>200%的扩展大剂量(extended boluses)
+ DanaR 蓝牙设备
+ 总是使用基础率的绝对值
+ 请重启你的手机或者从系统设置里重启AndroidAPS软件 \n 否则 Android APS将不会记录日志 (这对于跟踪和检查算法是否正确很重要)!
+ 一些快速访问常用功能的按钮
+ 输入高级日志条目
+ 用于配置活动插件
+ 学习计划
+ 显示 Nightscout 中定义的食物预设
+ 胰岛素预设为 Humalog(优泌乐) 和 NovoRapid(门冬)/NovoLog(诺和锐)
+ Fiasp 胰岛素预设
+ 允许您定义胰岛素作用的峰值, 并且只应由高级用户使用
+ 激活或停用这个工具触发闭环。
+ 将数据与 Nightscout 同步
+ 算法的状态在2016年
+ 算法的状态在2017年
+ 最新的适合高级用户的算法
+ 显示闭环的当前状态和大多数常用操作的按钮
+ 显示持续的通知, 其中简要概述了您的闭环正在做什么
+ 定义一个脱机可用的配置文件。
+ 提供您在 Nightscout 中已经定义的配置文件
+ 仅使用一个时间段定义配置文件。
+ 与Accu-Check Combo 胰岛素泵集成,需要安装ruffy软件
+ 与丹纳R泵集成
+ 与韩版丹纳R泵集成
+ 与升级固件后的丹纳R泵集成
+ 与丹纳RS泵集成
+ 与Accu-Check Insight 胰岛素泵集成,需要安装 SightRemote软件
+ 与用于糖尿病治疗的多次每日注射的泵集成
+ 与我们还没有其驱动的泵集成(开环)
+ 灵敏度的计算方式与 Oref0 相同, 但可以指定过去的时间范围。碳水化合物吸收最小值是根据参数选项里的碳水化合物吸收时间最大值计算得来的
+ 灵敏度是根据过去的24小时数据计算出来的, 而碳水化合物 (如果不吸收) 则在参数选项里指定的时间后减掉
+ 灵敏度是根据过去的24小时数据计算出来的, 而碳水化合物 (如果不吸收) 则在参数选项里指定的时间后减掉。插件还计算 UAM。
+ 灵敏度计算根据偏差的加权平均值。新的偏差有更高的权重。碳水化合物吸收最小值是根据参数选项里的碳水化合物吸收时间最大值计算得来的好。此算法在敏感度变化后最快。
+ 从安卓版的 Dexcom G5 app接收血糖值。
+ 从 Glimp 接收血糖值。
+ 从美敦力600Series 的AndroidUploader 接收血糖值。
+ 从 Nightscout 下载 血糖数据
+ 从 xDrip 接收血糖值。
+ 保存所做的所有治疗
+ 使用您的 WearOS 手表监视和控制 AndroidAPS。
+ 在 xDrip + 表盘上显示有关闭环的信息。
+ 远程控制 AndroidAPS 使用 SMS 短信命令。
+ 开始
+ 校验
+ 单位
+ DIA胰岛素作用持续时间
+ IC碳水系数
+ ISF胰岛素敏感系数
+ 基础率
+ 血糖控制目标值
+ 没有设置配置文件
+ 胰岛素:
+ 碳水化合物:
+ IOB活性胰岛素:
+ IOB活性胰岛素:
+ Activity(活动)
+ 总 IOB:
+ 总IOB activity(活动):
+ Dur:
+ 比率:
+ Ins:
+ IOB活性胰岛素:
+ 总 IOB:
+ 胰岛素
+ 碳水化合物
+ 血糖
+ 临时目标
+ 碳水化合物
+ 矫正值
+ U
+ 大剂量活性胰岛素IOB
+ 现在运行
+ 虚拟泵
+ 基础率
+ 临时基础率
+ 扩展大剂量(方波)
+ 电池
+ 储药器
+ 确定
+ 上一次运行
+ 输入参数
+ 血糖状态
+ 当前临时基础率
+ IOB活性胰岛素数据
+ 配置文件
+ 膳食数据
+ 结果
+ 没有可用的血糖数据
+ 不需要改变
+ 请求
+ 比率
+ 持续时间
+ 原因
+ 血糖
+ 增量
+ 增量:
+ 配置生成器
+ 目标
+ OpenAPS MA
+ 首页概览
+ NS 配置文件
+ 简单配置文件
+ 临时基础
+ 治疗
+ 虚拟泵
+ 护理记录
+ 胰岛素泵
+ 你想用 AndroidAPS连接哪个胰岛素泵?
+ 治疗
+ 什么插件应该用于治疗处理?
+ 配置文件
+ AndroidAPS 应该使用哪个配置文件?
+ APS
+ 哪个 APS 算法应该用于治疗调整?
+ 一般
+ 这些是一些一般的插件, 你可能会觉得有用。
+ 应用了哪些约束条件?
+ 天
+ 约束条件
+ 闭环
+ 闭环
+ 使用此激活 AndroidAPS 的闭环集成。
+ APS
+ 通过约束条件之后
+ 通过泵设置临时基础率
+ 上次制定
+ 确定
+ 取消
+ APS没有被选择或者提供结果
+ 安全性
+ 插件已禁用
+ 违反约束条件
+ 大剂量输注错误
+ 临时基础输注错误
+ 基础率数值 [%]
+ % (100% = 当前)
+ 接受新的临时基础率
+ 治疗
+ 计算器
+ 应用约束!
+ 确认
+ 输入新的治疗:
+ 大剂量
+ 大剂量:
+ 基础率
+ 基础率:
+ 碳水化合物
+ 更改您的输入!
+ 设定新的扩展大剂量
+ 血糖来源
+ AndroidAPS 从何处获取数据?
+ xDrip
+ APS模式
+ 闭环
+ 开环
+ 闭环禁用
+ 禁用闭环
+ 启用闭环
+ 新的建议可用
+ 不支持的 NSClient 版本
+ 不支持的 Nightscout 版本
+ 未安装 NSClient。记录丢失!
+ 血糖在NS中可用
+ 泵状态在 NS 中可用
+ 手动制定
+ 按约束条件禁用循环
+ 基础 IOB
+ 大剂量约束条件应用了
+ 碳水化合物约束条件应用了
+ 指血检查
+ 通告
+ 备注
+ 问题
+ 运动
+ 泵更换管路
+ CGM 传感器插入
+ CGM 传感器启动
+ 更换储药器
+ 配置文件切换
+ 零食大剂量
+ 餐时大剂量
+ 矫正大剂量
+ Combo组合大剂量
+ 临时基础率开始
+ 临时基础率结束
+ 碳水化合物校正
+ OpenAPS 离线
+ 事件类型
+ 其他
+ 血糖仪
+ 传感器
+ 碳水化合物
+ 胰岛素
+ 碳水化合物时间
+ 拆分
+ 持续时间
+ 百分比
+ 绝对
+ 备注
+ 事件时间
+ 配置文件
+ 输入者是
+ 血糖类型
+ 尚未从 NS 加载配置文件
+ 临时基础
+ 扩展大剂量
+ Nightscout 版本:
+ 缺少
+ 参数选项导出了
+ 导出配置
+ 导入配置
+ 配置导入了
+ 找不到文件
+ 导出配置
+ 导入配置
+ 临时基础率可以设置的最大值 U/小时
+ 这个值在 OpenAPS被称为最大基础率
+ OpenAPS通过基础率可以输注的IOB活性胰岛素的最大值[U]
+ 这个值在OpenAPS中被成为最大IOB\n这是APS单次可以输注的胰岛素的最大值[U]
+ 忽略
+ DanaR
+ 正在连接
+ 已连接
+ 已断开连接
+ DanaR 泵设置
+ 最终用户许可协议
+ 不得用于制定医疗决定。在适用法律允许的范围内,对该程序不作任何保证。除非另有书面授权的版权所有者和/或其他方均按原样提供程序,不附带明示或暗示的任何形式的担保,包括但不限于对适销性和适用于特定用途的默示担保。对您的程序的质量和性能的完整风险。如果程序存在缺陷,您应承担所有必要维修,修理或更正的代价.
+ 我理解并同意
+ 保存
+ 未找到蓝牙适配器
+ 找不到所选设备
+ 泵连接错误
+ 泵 IOB
+ 每日单位数
+ 上次大剂量
+ %.1fh 前
+ 无效的输入数据
+ 数值设定的不正确
+ 重新加载配置文件
+ 查看配置文件
+ 制定
+ 评论
+ 成功
+ 百分比
+ 绝对值
+ 取消临时基础率
+ SMS短信通讯器
+ 正在等待结果
+ 允许的手机号码
+ +XXXXXXXXXX;+YYYYYYYYYY
+ 要输注大剂量胰岛素%1$.2fU 回复如下代码 %2$s
+ 要发送校准值 %1$.2f 回复如下代码 %2$s
+ 大剂量输注失败
+ 成功输注大剂量%.2fU
+ 将要输注 %.2fU
+ 成功输注大剂量%.2fU
+ 正在输注 %.2fU
+ 通过SMS短信允许远程命令
+ 远程大剂量没有被允许
+ 手指
+ 传感器
+ 手动
+ 临时目标
+ 临时目标取消
+ DanaR 配置文件设置
+ DIA [h]
+ 胰岛素活性持续时间
+ 更新基础率配置文件失败
+ 重新加载
+ 正在上传···
+ 扩展大剂量
+ DS bolus
+ DE bolus
+ 错误
+ 充盈
+ 基础率 小时
+ 血糖
+ 碳水化合物
+ 报警
+ 总计上传了%1$d个记录
+ S bolus
+ 报警
+ 基础率 小时
+ 大剂量
+ 碳水化合物
+ 每日胰岛素用量
+ 错误
+ 血糖
+ 充盈
+ 暂停
+ 正在连接 %1$d s
+ 泵密码
+ 错误的泵密码
+ 胰岛素泵忙碌中
+ 已输注
+ 已停止
+ 大剂量停止了
+ 正在停止大剂量
+ 堵管
+ 停止
+ 停止键按下了
+ 正在等待泵
+ 将要输注 %.2fU
+ 设置可视化和监视, 并分析基础率和比率
+ 验证 Nightscout 中的血糖是否可用, 并且正在上传泵的胰岛素数据
+ 开始开环
+ 在开环模式下运行几天,并在手机上手动制定很多次临时基础率。设置和使用临时目标和默认的临时目标 (例如, 用于活动或处理碳水化合物)
+ 了解你的开环,包括它的临时基础率建议
+ 基于以上的经验,决定适合自己的最大基础率,在泵和本软件的参数选项上设置
+ 开始闭环模式,低血糖自动暂停
+ 在闭环模式下运行,设置最大IOB = 0 运行几天确保没有太多的低血糖事件
+ 优化闭环,逐渐增加最大IOB,并逐渐降低目标血糖值
+ 运行几天,至少一个晚上没有低血糖报警,然后才可以继续调低目标血糖
+ 如果需要的话,调整基础率和比值,然后再启用auto-sense
+ 一个星期成功的白天闭环,常规的碳水化合物摄入
+ 启用额外的功能以供白天使用,例如用餐助手(meal assist)
+ 启用额外的功能以供白天使用, 例如微型大剂量 SMB
+ 为了让微型大剂量工作的更好,你必须读指南,提高最大IOB的值。 建议是最大IOB值=餐时大剂量的平均值+3倍 的每日基础率中的最大值
+ 你达到了允许的极限
+ 没有选定配置文件
+ 闭环已经被禁用
+ 闭环已经被启用
+ 闭环被禁用
+ 闭环被启用
+ %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-配置文件时.
+ 泵未初始化!
+ 泵未初始化, 配置文件未设置!
+ 充盈
+ 请确保数量和输液器里的药量匹配
+ 其他
+ 充盈标准数量的胰岛素
+ 按钮1
+ 按钮2
+ 按钮3
+ 单位:
+ mg/dl
+ mmol/l
+ DIA:
+ 目标范围:
+ 可视化范围
+ 在智能手表上的图表上的高值和低值标记
+ 低值标记
+ 高值标记
+ 手表
+ 重新发送所有数据
+ 在手表上打开设置
+ 泵错误
+ 电池电量低
+ 泵关机
+ 泵电池被拆卸了
+ DanaR 韩版
+ 基础率比值:
+ 设定基础率配置文件失败
+ 泵基础率配置文件更新了
+ 禁用泵中的 EasyUI 模式
+ 在泵上启用扩展大剂量
+ 在泵上更改模式,从U/d 改为 U/h
+ 基础率值低于泵支持的最小值。配置文件没有设定
+ 血糖:
+ 上次血糖:
+ MDI
+ 美敦力640g
+ 持续的的通知
+ 旧数据
+ %1$d 分钟前
+ %1$d分钟前
+ 本地配置文件
+ OpenAPS AMA
+ 短平均增量
+ 长平均增量
+ %1$d 元素的数组. \n 实际值:
+ Autosens 数据
+ 脚本调试
+ 使用 AMA autosens 功能
+ 从 NS 刷新事件
+ 删除未来的治疗项
+ 很快吃饭
+ 低
+ 活动
+ 删除记录
+ DanaR 统计
+ 累积的每日胰岛素输注的总量
+ 日输注总量指数加权
+ 基础率
+ 大剂量
+ 日胰岛素总量
+ 日期
+ 比值
+ # 天
+ 权重
+ 如果使用大剂量来充盈排气的话,活性胰岛素的量显示的可能不准确
+ 旧数据请按 \"重新加载\"
+ 基础率总量
+ TBB * 2
+ 正在初始化
+ 操作
+ 配置
+ 闭环
+ 本地
+ OpenAPS
+ 本地配置文件
+ 丹纳泵
+ 主页
+ 虚拟泵
+ NS配置文件
+ 治疗
+ 记录
+ 目标
+ 手表
+ 手机SMS
+ 标题名称缩写
+ 总是使用短时间的平均增量代替简单增量
+ 当数据来自没有过滤的源头时,例如 xDrip 偶尔出现噪音数据.
+ 高级设置
+ 型号: %1$02X 协议: %2$02X 代码: %3$02X
+ 配置文件
+ 默认值: 3 这是一个关键的 OpenAPS 安全阀值。这是限制你的闭环可以最大扩张3倍的日最大基础率。你可能不需要改变这个值 但你应该这个值的含义。日最大基础率的3倍,当前基础率的4倍,这是建议的安全阀值
+ 默认值: 4 这是另一个的关键 OpenAPS 安全阀值, 日最大基础率的3倍,当前基础率的4倍,这是建议的安全阀值。这意味着你的基础率, 无论你的泵上的最大基础率设置的多少,也 不能超过你的当前基础率的4倍。这是为了防止人们在了解该算法的工作原理之前进入危险的领域 。同样, 默认值为 4倍; 大多数人将永远不需要调整, 而是更有可能需要调整其他设置,
+ 默认值: 1.2 \n 这是 autosens 的安全阀值 对 autosens ( 很快autotune) 比率的高值设置最大增加20% 最大限制, 这反过来决定了 autosens 可以调整的基础率的上限值, 可以调整的胰岛素敏感系数的下限值, 以及它可以设置血糖目标的下限值。
+ 默认值: 0.7 \n 这是autosens 的另一个安全阈值, 。这个值决定了 autosens 可以调整的基础率的下限值, 可以调整的胰岛素敏感系数的上限值, 以及它可以设置血糖目标的上限值。
+ Autosens 也调整目标血糖
+ 缺省值:是\n 这是用来允许 autosens调整血糖目标,还有 ISF胰岛素敏感系数和基础率这些参数。
+ 默认值: 2 \n大剂量snooze是在输注餐时大剂量后开始生效的, 所以在你刚吃完饭的时候, 闭环不会因为你输注了大剂量而减少或停基础。这里的例子和缺省是 2; 因此, 3 小时的DIA(胰岛素持续作用时间) 意味着大剂量snooze将逐步在1. 5小时 (3 DIA/2) 后失效。
+ 注意! \n 正常地您不必在下面更改这些值。请点击这里, 阅读说明, 并确保您了解它之前不要更改任何这些值。
+ 只允许数字。
+ 仅允许在范围 %1$s - %2$s 内的数字。
+ 此字段不能为空
+ 电话号码无效
+ 无效的SMS手机号码
+ 校准
+ 确认将校准值 %.1f 发送到 xDrip 吗?
+ 没有安装xDrip+
+ 校准发送到 xDrip
+ 远程校准没有被允许
+ 校准值发送了,必须在xDrip开启允许通过其他app使用它的校准功能
+ xDrip 没有收到校准
+ 泵暂停了
+ 正在获取泵的状态
+ 正在设定临时基础率
+ 正在停止临时基础率
+ 正在设定扩展大剂量
+ 正在停止扩展大剂量
+ 正在更新基础率
+ 正在断开连接
+ 正在执行
+ 虚拟泵设置
+ 将状态上传到 NS
+ 密码错误
+ 密码设置
+ 解锁设置
+ 接近每日胰岛素的极限值
+ NSClient
+ NSCIient
+ URL网址:
+ 自动滚动
+ 重新启动
+ NSClient
+ Nightscout URL(网址)
+ 输入您的 Nightscout URL(网址)
+ NS API 密钥
+ NS API 密钥
+ 输入 NS API 密钥 (最少12个字符)
+ 立即输注
+ 清除队列
+ 显示队列
+ 队列:
+ 状态:
+ 已暂停
+ 清除日志
+ NSCLIENT 没有写权限。可能是NS的 API 密钥输错了?
+ 手表设置
+ 显示详细 IOB
+ 在手表的表盘上分别显示大剂量IOB和基础IOB
+ 未成功-请检查手机
+ 不可用
+ 病人年龄
+ 儿童
+ 青少年
+ 成人
+ 胰岛素抵抗成人
+ 请选择患者年龄以设置安全限制
+ Glimp
+ %s 需要加入电池优化白名单才能正常运行
+ 闭环暂停了
+ 暂停了 (%1$d m)
+ 超级大剂量 (%1$d m)
+ 暂停闭环一个小时
+ 暂停闭环2个小时
+ 暂停闭环3个小时
+ 暂停闭环10个小时
+ 与泵断开连接15分钟
+ 与泵断开连接30分钟
+ 与泵断开连接1个小时
+ 与泵断开连接2个小时
+ 与泵断开连接3个小时
+ 恢复
+ 错误的持续时间
+ 闭环暂停了
+ 闭环恢复了
+ 15分钟 趋势
+ 碳水
+ 超级大剂量Superbolus
+ 记录app启动事件到NS服务器
+ 正在退出应用程序以应用设置。
+ DanaRv2
+ 胰岛素
+ 你使用哪种类型的胰岛素?
+ 速效胰岛素
+ 诺和锐, 门冬, 优泌乐
+ Fiasp超速效
+ INS
+ 在向导中启用超级大剂量
+ 在向导中启用 superbolus超级大剂量 功能。不要启用, 直到你了解它真正的用法。如果盲目使用, 可能会导致胰岛素过量!
+ IOB活性胰岛素
+ COB活性碳水
+ 固件
+ 上次连接
+ 蓝牙状态
+ 关于
+ 缺少 SMS 短信权限
+ xDrip 状态 (手表)
+ xDrip 状态线 (手表)
+ xdrip
+ 显示血糖线
+ 添加血糖线到状态线
+ 没有上传到NS服务器
+ 所有发送到 NS 的数据都将被丢弃。AAPS 已连接到 NS, 但 NS中没有进行任何更改
+ 基础率步值
+ 大剂量步值
+ 扩展大剂量
+ 临时目标
+ 取消扩展大剂量
+ 传感器使用时间
+ 管路使用时间
+ 胰岛素使用时间
+ 小时
+ 基础率类型
+ 无效的配置文件!!!
+ 配置文件切换
+ 泵电池使用时间
+ 更换泵电池
+ 报警选项
+ 紧急高
+ 高
+ 低
+ 紧急低
+ 陈旧数据
+ 紧急陈旧数据
+ 陈旧数据阈值 [min]
+ 紧急陈旧数据阈值 [min]
+ Autosens间隔的 [h]
+ 灵敏度检测过去的小时数 (排除碳水化合物吸收时间)
+ 胰岛素泵
+ OpenAPS
+ 上传者
+ 灵敏度检测
+ 应使用哪一种灵敏度算法?
+ 灵敏度
+ 灵敏度 Oref0
+ 灵敏度 Oref1
+ 灵敏度 AAPS
+ 食物吸收设置
+ 膳食最大吸收时间 [h]
+ 预计膳食中所有的碳水化合物被吸收的时间,以小时为单位
+ 用百分比的形式显示扩展大剂量
+ 探头AGE
+ 胰岛素AGE
+ 管路AGE
+ PBAGE
+ OpenAPS
+ UPLD
+ 基础率
+ EXT
+ 保持屏幕常亮
+ 阻止 Android 系统关闭手机屏幕。这将非常耗电
+ 如果要打开 Autosense功能, 记住输入所有吃的碳水化合物。否则碳水化合物的偏差将被识别为错误的灵敏度变化!!
+ 灵敏度 WeightedAverage
+ 确定
+ 取消
+ 配置文件加载不完整
+ 值没有被存储
+ 启用广播到其他应用程序(如xDrip).
+ 启用本地广播。
+ 活动 & 反馈
+ 碳水化合物 & 大剂量
+ CGM & OPENAPS
+ 泵
+ 基础率值 [U/小时]
+ 持续时间 [min]
+ OpenAPS SMB
+ SMB
+ 启用 UAM
+ 启用微型大剂量
+ 使用微型大剂量代替使用临时基础率,更快的干预
+ 检测未输入的膳食
+ IOB 曲线峰值时间
+ 峰值时间 [min]
+ Free-Peak Oref
+ 速效 Oref
+ 超速效 Oref
+ DIA of %1$f 太短了,请使用 %2$f 代替
+ 激活配置文件
+ 日期
+ 无效
+ 等待泵配对
+ 配对成功
+ 配对超时
+ 正在配对
+ 迄今未找到任何设备
+ 储药器空了
+ 血糖测量警报
+ 剩余胰岛素数量
+ 丹纳RS
+ 丹纳泵
+ 已选择的泵
+ 配对新的泵
+ 大剂量输注速度
+ 将基础率步值设定为 0.01 U/小时
+ 序列号
+ 百分比
+ 时间偏移
+ 默认的临时目标
+ 很快吃饭 持续时间
+ 很快吃饭 临时血糖目标
+ 活动持续时间
+ 运动临时目标
+ 持续时间短
+ 低目标
+ 充盈
+ 正在获取扩展大剂量状态
+ 正在获取大剂量状态
+ 正在获取临时基础率状态
+ 正在获取泵设置
+ 正在获取泵时间
+ 重复用
+ 从手表上控制
+ 设置临时目标并从手表中进行治疗操作。
+ 连接超时
+ 食物
+ 克
+ 分
+ 小时
+ ]]>
+ kJ
+ En
+ 蛋白质
+ 脂肪
+ ]]>
+ 正在等待大剂量输注结束。剩余时间 %1$d 秒。
+ 正在处理事件
+ 开始大剂量输注
+ 现在命令被执行了
+ 泵驱动程序已更正
+ 泵无法连接
+ 血糖读数丢失
+ 对警报和通知使用系统通知音
+ 本地警报
+ 如果未收到血糖数据, 则发出警报
+ 如果无法连接泵, 则发出警报
+ 泵无法连接的时间阈值[min]
+ 紧急报警
+ 信息
+ 蓝牙
+ 蓝牙看门狗
+ 如果没有连接到泵,关闭手机的蓝牙一秒钟再自动打开。这在一些蓝牙堆栈僵死的手机上是有帮助的,
+ DexcomG5 app (补丁)
+ 将 数据血糖数据上传到 NS服务器
+ G5 上传设置
+ Poctech 上传设置
+ 显示详细的增量
+ 增量再多显示一个小数位
+ 基础率的最大分钟数限制SMB微型大剂量到
+ 不支持的泵固件
+ 将血糖数据发送到 xDrip +
+ 在 xDrip + 选择640g/Eversense 数据源
+ NSClient 血糖
+ 基础率值被泵支持的最小值: %s 替换了
+ 基础率值被泵支持的最大值:%s 替换了
+ 血糖计算
+ 大剂量IOB (活性胰岛素) 计算
+ 基础率IOB (活性胰岛素) 计算
+ 趋势计算
+ 超级大剂量计算
+ 是
+ 否
+ 仅正数
+ 仅负数
+ COB计算
+ 临时目标血糖计算
+ 闭环启用了
+ APS已选择
+ NSClient 具有写入权限
+ 闭环模式启用了
+ 合理地设置最大 IOB
+ 所选的血糖值来源的血糖是可用的
+ 基础率值与小时不一致:%s
+ 无效的配置文件:%s
+ 正在调用泵上的大剂量输注程序
+ 刷新
+ 状态
+ 活动
+ %1$d分钟没有连接
+ %1$d%% (%2$d 分钟剩余)
+ 正在初始化
+ 由于错误而暂停
+ 被使用者暂停了
+ 正在运行
+ 正在取消临时基础率
+ 正在设置临时基础率 (%1$d%% / %2$d 分钟)
+ 正在输注大剂量 (%.1f U)
+ 正在刷新
+ 泵不支持请求的操作
+ 不安全的用法: 扩展大剂量(方波) 或者双波被启用了,闭环只支持常规大剂量, 闭环已经被设置为6个小时的低血糖暂停模式(low-suspend only 6 hours).
+ 不安全的用法:这个泵使用了和第一个不同的基础率配件文件,闭环已经被禁用,在泵上选择第一个配件文件然后刷新.
+ 在最近2分钟内要输注相同数量的大剂量。 为了防止错误地重复打大剂量发生意外,不允许这样操作
+ 现在
+ 读取泵历史记录
+ 泵历史记录
+ 设置基础率配置文件
+ 泵储药器快没胰岛素了
+ 泵电池电量不足
+ 泵显示错误 E%1$d: %2$s
+ 低
+ 空的
+ 正常
+ 泵的时间需要更新
+ 警告
+ 临时基础率取消告警被确认了
+ 找不到泵,大剂量输注失败
+ 大剂量输注失败,看起来好像没有大剂量被输注。安全起见,请检查泵,避免重复输注大剂量。软件考虑安全因素,不会再自动重试大剂量输注.
+ 由于遇到一个错误, %2$.2f U 中只有%1$.2fU 输注成功了. 请在泵上检查并核实,看是否需要采取适当的措施.
+ 正在输注大剂量和核实泵的历史失败了,请检查泵,如果大剂量已经输注成功,下次连接泵的时候会在治疗的标签里自动添加一个大剂量记录.
+ 储药器里没有足够的胰岛素可用于大剂量输注了
+ 扩展大剂量(方波) 输注错误
+ Insight
+ Insight胰岛素泵
+ 状态
+ 已更改
+ 泵停止了
+ 状态已更新
+ 之前
+ with
+ 现在用的临时基础率
+ 剩余分钟数
+ 日志簿
+ 上次完成的操作
+ 分
+ 剩余
+ 合计
+ upfront with
+ 始终保持连接
+ 空闲
+ 正在同步
+ 忙
+ 同步了
+ 启动
+ 需要
+ 没有连接到companion app!
+ 好像没有安装companion app!
+ 和companion app不兼容,我们需要版本
+ 未知的
+ 正在等待代码确认
+ 代码被拒绝
+ App绑定中
+ 未授权
+ 不兼容
+ 秒
+ 分钟
+ 小时
+ 天
+ 周
+ s
+ %1$ds 过期 %2$s
+ 保持活动状态
+ 统计
+ 抢先连接
+ 当 AndroidAPS 屏幕打开时, 在请求任何泵命令之前自动连接, 以减少连接延迟
+ 由于电池耗尽而不推荐
+ 始终启用 SMB
+ 启用SMB微型大剂量,总是独立于常规大剂量。 可能只能使用带有良好的数据过滤功能的血糖值来源。例如G5
+ 在输入碳水化合物后启用SMB
+ 在输入碳水化合物后,启用SMB微型大剂量6个小时,即使活性碳水化合物COB为0。 可能只能使用带有良好的数据过滤功能的血糖值来源。例如G5
+ 启用带活性碳水化合物的SMB
+ 当有活性碳水化合物时启动SMB
+ 启用带有临时目标的SMB
+ 当临时目标处于活动状态时启用 SMB (很快吃饭, 运动)
+ 启用具有高临时目标的 SMB
+ 当临时目标处于活动状态(锻炼)时启用SMB
+ 让临时基础率运行
+ 静音
+ 胰岛素
+ 碳水
+ 按钮
+ 向 xDrip + 发送校准请求或打开 G5 校准对话框
+ 打开 xDrip +, 后退按钮返回到 AAPS
+ 按下按钮时添加的碳水化合物数量
+ 按下按钮时添加的胰岛素量
+ 无法启动 CGM 应用程序。 请确保已安装。
+ CGM
+ 历史浏览
+ 在 SMB 上通知
+ 在手表上像显示常规大剂量一样显示SMB微型大剂量
+ 创建错误公告
+ 为错误对话框和本地警报创建Nightscout公告(在治疗标签下的护理记录里也可查看)
+ 在手表的表盘上显示预测
+ 预测
+ 数据选择
+ 通过Fabric上传
+ 允许通过fabric.io服务将自动崩溃报告和功能使用数据发送给开发人员。
+ 请将您的 G5 app更新为支持的版本
+ 开始运动临时目标
+ 开始很快吃饭TT(临时目标)
+ TT(临时目标)
+ 不打大剂量,只记录
+ 类别
+ 子类别
+ 大剂量将仅被记录
+ Autobackfill 现在无法从NS获取血糖
+ 通过泵设置SMB微型大剂量
+ 灵敏度
+ 偏差
+ 活性碳水化合物
+ 活性胰岛素
+ 基础率
+ 没有选择任何行动,不会做出任何改变
+ 开始低的临时目标
+ 正在运行开发版本,闭环被禁用了
+ 已启用工程模式
+ 工程模式没有启用或者在这个版本上不支持
+ %.2f U/h
+ 正在读取基础率配置文件
+ 在大剂量计算之后,泵的历史记录已经发生变化了。大剂量将不会被输注,如果仍然需要大剂量输注请重新计算
+ 大剂量输注成功,但添加到治疗记录时失败。如果在最近两分钟内使用相同量的两个小大剂量,就会发生这种情况。请检查泵的历史记录和治疗条目,并使用记录标签添加丢失的条目。确保在同一分钟不要添加重复的条目
+ 由于泵的历史事件变化了,拒绝过高的临时基础率
+ 刷新泵状态
+ 更上的基础率已经更改了,很快就会更新
+ 泵上的基础率改变了,但是读取失败
+ 检查历史记录变化
+ 在同一分钟内使用相同数量的多个大剂量记录被导入的。治疗中只能增加一项记录。请手动检查泵并使用记录标签手动添加一个大剂量记录。确保创建一个和其他大剂量记录时间不重复的大剂量记录.
+ \n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de)
+ 最后一次大剂量的输注时间是在24个小时以前或者在未来的时间,请检查泵上的日期设置的的是否正确
+ 输注过的大剂量的时间/日期看着好像错了,活性胰岛素可能不准确。请检查泵的时间/日期
+ 配置文件切换缺失。请做一次配置文件切换或者在本地配置文件里按“激活配置文件”
+ 大剂量 计数
+ 临时基础率 计数
+ 目标 %1$d 未开始
+ 目标 %1$d 未完成
+ 这个泵无法设置临时基础率
+ 从泵中无法读取有效的基础率
+ 在参数选项中禁用了闭环模式
+ Autosens 在参数选项中被禁用了
+ SMB微型大剂量在参数选项里被禁用了
+ 最大基础率被限定为 %1$.2f U/h 由于 %2$s
+ 泵限制
+ 它必须是正数
+ 最大基础率倍数
+ 最大日基础率倍数
+ 在最近3分钟内输注了大剂量,正在忽略SMB微型大剂量
+ 正确地设置基础率
+ 由于 %2$s, 将最大百分比限制为 %1$d%%
+ 由于 %2$s, 将大剂量限制为 %1$.1f U
+ 由于 %2$s, 将最大 IOB(活性胰岛素) 限制为 %1$.1f U
+ 由于 %2$s, 将碳水化合物限制为 %1$d 克
+ 由于 %2$s, 将 IOB(活性胰岛素) 限制为 %1$.1f U
+ 在参数选项里的最大值
+ 硬限制
+ 不安全的用法
+ 读取状态失败了
+ 记录泵管路更换
+ 记录胰岛素储药器变化
+ SMB always and after carbs disabled 因为实时的血糖来源不支持高级筛选
+ 在开环模式下不允许使用SMB-微型大剂量
+ 食物
+ 重置
+ 正在等待时间同步 (%1$d 秒)
+ 已断开连接 (%1$d 分)
+ 自动记录的护理事件
+ 自动上传胰岛素更换,管路更换和电池更换以及泵警报至Nightscout
+ OpenAPS的IOB活性胰岛素总数的最大值不能超过[U]
+ 该值在OpenAPS中称为最大 IOB\n如果当前IOB大于此值,则OpenAPS不会输注更多胰岛素
+ 泵停止了
+ 泵启动了
+ 泵暂停了
+ 膳食最大吸收时间 [h]
+ 任何膳食被认为完全吸收的时间。 剩余的碳水化合物将被忽略
+ 时间
+ 在治疗对话框中显示备注字段
+ 下一个
+ 上一个
+ 设置向导
+ 完成
+ 选择你的语言
+ 第一胰岛素增量
+ 第二胰岛素增量
+ 第三胰岛素增量
+ 第一碳水化合物增量
+ 第二碳水化合物增量
+ 第三碳水化合物增量
+ CGM
+ 仅使用 WiFi 连接
+ WiFi SSID
+ 仅在充电时
+ 连接设置
+ 允许的 SSIDs (分号分隔)
+ 允许在漫游中连接
+ 最大 autosens 比率
+ 最小 autosens 比率
+ 大剂量snooze 胰岛素持续作用时间除数
+ 最大日基础率安全倍数
+ 当前基础率安全倍数
+ 无可用
+ 虚拟泵类型
+ 泵定义
+ 大剂量: 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 血糖
+ 向导设置
+ 包含在向导中的计算结果:
+ 显示设置
+ 常规设置
+ 启用 NSClient
+ 欢迎使用设置向导。它将指导您完成设置过程 \n
+ 泵设置
+ 读取状态
+ 更改必须在 NS 中完成
+ 跳过设置向导
+ 按下下面的按钮, 以使 AndroidAPS 建议或者更改基础率
+ 按下下面的按钮以启用目标。在 \"目标\" 标签中, 完成此向导后, 使 AndroidAPS 完全正常工作。\n
+ 启用目标
+ 配置APS插件
+ 配置灵敏度插件
+ 灵敏度插件用于灵敏度检测和碳水化合物计算。有关详细信息, 请访问:
+ https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COB
+ NSClient 处理与 Nightscout 的连接。您可以跳过这一部分, 但您将无法通过目标, 直到您设置它。
+ 请记住:新的胰岛素分布需要DIA至少5小时。 对于新的配置文件,DIA 5-6小时相当于旧胰岛素配置文件中的DIA 3小时
+ 配置血糖值来源
+ 请选择配置文件的来源。如果病人是孩子, 你应该使用 NS 配置文件。如果没有人通过 Nightscout关注你, 你可能会更喜欢本地配置文件。请记住, 您只选择配置文件源。要使用它, 您必须通过执行 \"配置文件切换\" 来激活它。
+ 从可用算法中选择一个。 他们从最旧到最新排序。 较新的算法通常更强大,更冒险。 因此,如果你是新的闭环使用者,你可能会从AMA算法开始,而不是最新的。 不要忘记在使用之前阅读OpenAPS文档并对其进行配置。
+ 开始你的第一个目标
+ 权限
+ 请求权限
+ 应用程序需要位置权限用于蓝牙扫描
+ 应用程序需要存储权限才能存储日志文件
+ 请求
+ 配置胰岛素插件
+ 退出
+ 用户选项
+ 时间显示的格式
+ 按钮滚动
+ 按下按钮时发出提示音
+ 报警
+ 声音
+ 振动
+ 两者都
+ LCD屏幕亮的时间[s]
+ 背景光开启的时间[s]
+ 血糖单位
+ 关机(小时)
+ 储药器药量低(单位)
+ 保存选项到泵上
+ 开启
+ 关闭
+ 打开导航栏
+ 关闭导航栏
+ 插件选项
+ 完成了,做的好
+ 尚未完成
+ 已用时间
+ %1$d.目标
+ Poctech
+ 从 Poctech app 接收血糖值。
+ 高临时目标增加灵敏度
+ =100 mg/dl (5.5 mmol/l) 时提高灵敏度]]>
+ 低临时目标降低灵敏度
+
+ 泵设置的无效,检查文档并核实这个Quick Info 菜单被命名为 QUICK INFO,使用360 configuration 这个软件
+ 自定义
+ 手机和泵的时间相差很大
+ 手机和泵的时间相差很大\n泵上的时间已经偏离1. 5小时\n请在泵上手动调整时间,并且确定可以顺利读取泵历史,没有出现意外的行为。\n如果可能的话,在更改泵时间之前从泵上删除历史。或者禁用闭环至少一个DIA的时间,也就是胰岛素作用时间。
+ Clean AndroidAPS 启动了
+ 发现曾经保存过的设置
+ 注意:如果你激活并且连接到了一个硬件泵,AndroidAPS将会从配置文件复制基础率到泵上。覆盖泵上已有的基础率。请确定你已经在AndroidAPS上设置了正确的基础率。如果你不确定或者不想覆盖泵上的基础率设置,按取消键,以后再切换激活配置文件。
+ 治疗数据不完整
+ 维护设置
+ 电子邮箱
+ 邮箱地址无效
+ 没有要发送的日志
+ 维护
+ 维护
+ 提供了几个维护功能 (例如日志发送、日志删除)。
+ 用电子邮件发送
+ 删除日志
+ 一个治疗 (胰岛素: %1$.2f, 碳水: %2$d, 在: %3$s)不能被添加到治疗里。请检查并手动记录是合适的。
+ eCarbs: %1$d 克 (%2$d h), 延迟: %3$d 分钟
+ Autosens 数据不可用
+ 日志设置
+ 重置为默认值
+ NSClient故障。 考虑Nightscout和NSClient重启。
+ AS
+ 版本 %1$s 可用
+ 时区偏移
+ 首选的APS模式
+ 总计
+ 计算
+ 握手
+ 发送包括当前时间的今日的日志文件给开发者。描述一下意外情况
+
+ %1$d 天
+
+
+ %1$d 小时
+
+
+ %1$d 分钟
+
+
diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml
index 991bfc5013..a6039d43c7 100644
--- a/app/src/main/res/values/arrays.xml
+++ b/app/src/main/res/values/arrays.xml
@@ -22,8 +22,10 @@
@string/el_lang@string/it_lang@string/ko_lang
+ @string/pt_lang@string/ro_lang@string/ru_lang
+ @string/sk_lang@string/sv_lang@string/pl_lang@string/zh_lang
@@ -40,11 +42,13 @@
elitko
+ ptroru
+ sksvpl
- zh-rCN
+ zh
@@ -112,11 +116,12 @@
Generic AAPS
- CellnovoAccu-Chek SpiritAccu-Chek Combo
+ Accu-Chek InsightAnimas PingAnimas Vibe
+ CellnovoDanaRDanaR KoreanDanaRS
@@ -125,8 +130,7 @@
Medtronic 512/712Medtronic 515/715Medtronic 522/722
- Medtronic 523/723
- Medtronic 553/753 (Revel)
+ Medtronic 523/723 (Revel)Medtronic 554/754 (Veo)Medtronic 640GTandem t:slim
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 8d11d46540..cd7ae725a7 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -27,6 +27,7 @@
#ff1a1a#424242
+ #BBBBBB#77dd77#77dd77
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 37d08f835b..001f41b653 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -183,8 +183,8 @@
Pump status available in NSManual enactsLOOP DISABLED BY CONSTRAINTS
- Czech
- English
+ Czech
+ EnglishBasal IOBBolus constraint appliedCarbs constraint applied
@@ -235,24 +235,26 @@
File not foundExport settingsImport settings
- Dutch
- German
- Spanish
- Greek
- Italian
- Romanian
- Russian
- Swedish
- French
- Chinese
- Polski
+ Dutch
+ German
+ Spanish
+ Greek
+ Italian
+ Romanian
+ Portuguese
+ Russian
+ Slovak
+ Swedish
+ French
+ Chinese
+ PolskiMax U/hr a Temp Basal can be set toThis value is called max basal in OpenAPS contextMaximum basal IOB OpenAPS can deliver [U]This value is called Max IOB in OpenAPS context\nThis is maximal insulin in [U] APS can deliver at once.
- Bulgarian
+ BulgarianDISMISS
- Language
+ LanguageDanaRConnecting
@@ -313,7 +315,7 @@
glucosecarbohydratealarm
- Total %d records uploaded
+ Total %1$d records uploadedS bolusAlarmsBasal Hours
@@ -324,7 +326,7 @@
GlucoseRefillSuspend
- Connecting for %d s
+ Connecting for %1$d sPump passwordWrong pump password!Pump is busy
@@ -381,7 +383,7 @@
RemoveMealCorr
- Korean
+ KoreanActionsAndroidAPS startedNS upload only (disabled sync)
@@ -425,13 +427,13 @@
MM640gOngoing NotificationOLD DATA
- %d min ago
- %dmin ago
+ %1$d min ago
+ %1$dmin agoLocal ProfileOpenAPS AMAShort avg. deltaLong avg. delta
- Array of %d elements.\nActual value:
+ Array of %1$d elements.\nActual value:Autosens dataScript debugUse AMA autosens feature
@@ -489,7 +491,7 @@
bolussnooze_dia_divisorDefault value: 2\nBolus snooze is enacted after you do a meal bolus, so the loop won’t counteract with low temps when you’ve just eaten. The example here and default is 2; so a 3 hour DIA means that bolus snooze will be gradually phased out over 1.5 hours (3DIA/2).min_5m_carbimpact
- Default value: 3.0 This is a setting for default carb absorption impact per 5 minutes. The default is an expected 3mg/dl/5min. This affects how fast COB are decayed, and how much carb absorption is assumed in calculating future predicted BG, when BG is falling more than expected, or not rising as much as expected.
+ Default value: 3.0 (AMA) or 8.0 (SMB). This is a setting for default carb absorption impact per 5 minutes. The default is an expected 3mg/dl/5min. This affects how fast COB are decayed, and how much carb absorption is assumed in calculating future predicted BG, when BG is falling more than expected, or not rising as much as expected.Attention!\nNormally you do not have to change these values below. Please CLICK HERE and READ the text and make sure you UNDERSTAND it before change any of these values.http://openaps.readthedocs.io/en/latest/docs/walkthrough/phase-3/beyond-low-glucose-suspend.htmlOnly numeric digits are allowed.
@@ -497,9 +499,6 @@
The field must not be emptyPhone number not validInvalid SMS phone number
- Copy To Clipboard
- Copied to clipboard
- Show logCalibrationSend calibration %.1f to xDrip?xDrip+ not installed
@@ -572,8 +571,8 @@
Glimp%s needs battery optimalization whitelisting for proper performanceLoop suspended
- Suspended (%d m)
- Superbolus (%d m)
+ Suspended (%1$d m)
+ Superbolus (%1$d m)Suspend loop for 1hSuspend loop for 2hSuspend loop for 3h
@@ -771,7 +770,7 @@
PrFat]]>
- Waiting for bolus end. Remaining %d sec.
+ Waiting for bolus end. Remaining %1$d sec.Processing eventStarting bolus deliveryCommand is executed right now
@@ -809,8 +808,8 @@
dexcomg5_xdripuploadIn xDrip+ select 640g/Eversense data sourceNSClient BG
- Basal value replaced by minimal supported value
- Basal value replaced by maximum supported value
+ Basal value replaced by minimal supported value: %s
+ Basal value replaced by maximum supported value: %sBG calculationBolus IOB calculationBasal IOB calculation
@@ -834,7 +833,7 @@
RefreshStateActivity
- No connection for %d min
+ No connection for %1$d min%1$d%% (%2$d min remaining)%1$.1f %2$s (%3$s)Initializing
@@ -865,7 +864,7 @@
The pump could not be reached. No bolus was givenBolus delivery failed. It appears no bolus was delivered. To be sure, please check the pump to avoid a double bolus and then bolus again. To guard against bugs, boluses are not automatically retried.Only %1$.2f U of the requested bolus of %2$.2f U was delivered due to an error. Please check the pump to verify this and take appropriate actions.
- Delivering the bolus and verifying the pump\'s history failed, please check the pump and manually. If a bolus was delivered, it will be added to treatments during the next connection to the pump.
+ Delivering the bolus and verifying the pump\'s history failed, please check the pump. If a bolus was delivered, it will be added to treatments during the next connection to the pump.Not enough insulin for bolus left in reservoirExtended bolus delivery errorInsight
@@ -1000,8 +999,8 @@
ProfileSwitch missing. Please do a profile switch or press \"Activate Profile\" in the LocalProfile.Bolus countTBR count
- Objective %d not started
- Objective %d not finished
+ Objective %1$d not started
+ Objective %1$d not finishedPump is not temp basal capableNo valid basal rate read from pumpClosed loop mode disabled in preferences
@@ -1021,6 +1020,7 @@
Limiting max percent rate to %1$d%% because of %2$streatmentssafety_maxbolusLimiting bolus to %1$.1f U because of %2$s
+ Limiting extended bolus to %1$.1f U because of %2$sLimiting max IOB to %1$.1f U because of %2$sLimiting carbs to %1$d g because of %2$sLimiting IOB to %1$.1f U because of %2$s
@@ -1037,8 +1037,8 @@
FoodIobCobCalculatorreset
- Waiting for time synchronization (%d sec)
- Disconnected (%d m)
+ Waiting for time synchronization (%1$d sec)
+ Disconnected (%1$d m)Automatic careportal eventsAutomatically upload insulin, cannula and battery changes and pump alarms to Nightscoutopenapsmb_max_iob
@@ -1060,7 +1060,7 @@
Select your languagelanguageopenapsama_min_5m_carbimpact
- Asked: %1$.2fU Delivered: %2$.2fU Error code: %3$d
+ Asked: %1$.2fU Delivered: %2$.2fU Error code: %3$sFirst insulin incrementSecond insulin incrementThird insulin increment
@@ -1085,8 +1085,13 @@
Max daily safety multiplierCurrent basal safety multipliern/a
+ virtualpump_type
+ Virtual Pump Type
+ Pump Definition
+ Bolus: Step=%1$s\nExtended Bolus: [Step=%2$s, Duration=%3$smin-%4$sh]\nBasal: Step=%5$s\nTBR: %6$s (by %7$s), Duration=%8$smin-%9$sh\n%10$s
+ * Ranged basal/bolus values are not supported by Virtual Pump.Autobackfill BG
- Irish
+ IrishWizard Settingswearwizard_bgwearwizard_tt
@@ -1112,10 +1117,10 @@
Sensitivity plugin is used for sensitivity detection and COB calculation. For more info visit:https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COBNSClient handles connection to Nightscout. You can skip this part now but you will not be able to pass objectives until you setup it.
- Please remember: new insulin profiles require DIA at least 5h. DIA 5-6h on new profile is equal to DIA 3h on old insulin profiles.
+ Please remember: new insulin profiles require DIA at least 5h. DIA 5–6h on new profile is equal to DIA 3h on old insulin profiles.Configure BG sourcePlease select source of profile. If patient is a child you should use NS profile. If there is nobody following you on Nightscout you will probably prefer Local profile. Please remember that you are only selecting the profile source. To use it you must activate it by executing \"Profile switch\"
- Select one from availables algorithms. They are sorted from oldest to newest. Newer algorithm is usually more powerful and more aggresive. Thus if you are new looper you may probably start with AMA and not with latest one. Do not forget to read the OpenAPS documentation and configure it before use.
+ Select one from availables algorithms. They are sorted from oldest to newest. Newer algorithm is usually more powerful and more aggressive. Thus if you are new looper you may probably start with AMA and not with latest one. Do not forget to read the OpenAPS documentation and configure it before use.Start your first objectivePermissionAsk for permission
@@ -1133,7 +1138,7 @@
VibrateBothLCD on time [s]
- Backlight on time [h]
+ Backlight on time [s]Glucose unitsShutdown(hours)Low reservoir (Units)
@@ -1164,30 +1169,42 @@
Stored settings foundAttention: If you activate and connect to a hardware pump, AndroidAPS will copy the basal settings from the profile to the pump, overwriting the existing basal rate stored on the pump. Make sure you have the correct basal setting in AndroidAPS. If you are not sure or don\'t want to overwrite the basal settings on your pump, press cancel and repeat switching to the pump at a later time.Treatment data incomplete
-
- A treatment (insulin: %.2f, carbs: %d, at: %s) could not be added to treatments. Please check and manually add a record as appropriate.
- Generated eCarbs with amount: %1$dg, duration: %2$dh, delay: %3$dm
+ Maintenance Settings
+ Email
+ email
+ Invalid Email
+ amount of logs to send
+ No of Logs to send
+ Maintenance
+ MAINT
+ Provides several functions for maintenance (eg. log sending, log deletion).
+ Send Logs by Email
+ Delete Logs
+
+ A treatment (insulin: %1$.2f, carbs: %2$d, at: %3$s) could not be added to treatments. Please check and manually add a record as appropriate.
+ eCarbs: %1$d g (%2$d h), delay: %3$d mkey_plugin_stats_report_timestampNo autosens data available
-
-
- %d day
- %d days
-
-
- %d hour
- %d hours
-
-
- %d minute
- %d minutes
-
-
- Virtual Pump Type
- Pump Definition
- Bolus: Step=%s\nExtended Bolus: [Step=%s, Duration=%smin-%sh]\nBasal: Step=%s\nTBR: %s (by %s), Duration=%smin-%sh\nEXTENDED_NOTE
- * Ranged basal/bolus values are not supported by Virtual Pump.
-
+ Log settings
+ Reset to defaults
+ NSClient malfunction. Consider NS and NSClient restart.
+ AS
+ Version %1$s available
+ Time offset
+ aps_mode
+ Preferred APS mode
+ Total
+ Calc
+ Handshaking
+ Send today\'s log files to developers along with this time. Unexpected situation.
+ Max bolus violation
+ Command error
+ Speed error
+ Insulin limit violation
+ loop_openmode_min_change
+ Minimal request change [%]
+ Loop will popup new change request only if change is bigger than this value. Default value is 20%
+ short_tabtitlesOperation not supported by pump.
@@ -1292,4 +1309,17 @@
Remote cancel of Bolus is not supported. If you wish to cancel bolus, go to pump put it in suspend and then resume. This will cancel the bolus.
+
+
+ %1$d day
+ %1$d days
+
+
+ %1$d hour
+ %1$d hours
+
+
+ %1$d minute
+ %1$d minutes
+
diff --git a/app/src/main/res/xml/filepaths.xml b/app/src/main/res/xml/filepaths.xml
new file mode 100644
index 0000000000..7490f459d4
--- /dev/null
+++ b/app/src/main/res/xml/filepaths.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/pref_closedmode.xml b/app/src/main/res/xml/pref_closedmode.xml
deleted file mode 100644
index d0e3ac25e6..0000000000
--- a/app/src/main/res/xml/pref_closedmode.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/xml/pref_loop.xml b/app/src/main/res/xml/pref_loop.xml
new file mode 100644
index 0000000000..16c5c94375
--- /dev/null
+++ b/app/src/main/res/xml/pref_loop.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/pref_maintenance.xml b/app/src/main/res/xml/pref_maintenance.xml
new file mode 100644
index 0000000000..8ce4572685
--- /dev/null
+++ b/app/src/main/res/xml/pref_maintenance.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/pref_nsclientinternal.xml b/app/src/main/res/xml/pref_nsclientinternal.xml
index c104a6b7c2..4f3a3ca239 100644
--- a/app/src/main/res/xml/pref_nsclientinternal.xml
+++ b/app/src/main/res/xml/pref_nsclientinternal.xml
@@ -127,7 +127,7 @@
android:title="@string/ns_create_announcements_from_errors_title" />
diff --git a/app/src/main/res/xml/pref_openapsama.xml b/app/src/main/res/xml/pref_openapsama.xml
index aac00aee60..1dc22c7348 100644
--- a/app/src/main/res/xml/pref_openapsama.xml
+++ b/app/src/main/res/xml/pref_openapsama.xml
@@ -30,6 +30,19 @@
android:summary="@string/openapsama_autosens_adjusttargets_summary"
android:title="@string/openapsama_autosens_adjusttargets" />
+
+
diff --git a/app/src/main/res/xml/pref_others.xml b/app/src/main/res/xml/pref_others.xml
index 9ecf31aca3..5d3b365cb6 100644
--- a/app/src/main/res/xml/pref_others.xml
+++ b/app/src/main/res/xml/pref_others.xml
@@ -69,7 +69,7 @@
diff --git a/app/src/main/res/xml/pref_virtualpump.xml b/app/src/main/res/xml/pref_virtualpump.xml
index ac65f5e228..367fa59531 100644
--- a/app/src/main/res/xml/pref_virtualpump.xml
+++ b/app/src/main/res/xml/pref_virtualpump.xml
@@ -13,7 +13,7 @@
android:defaultValue="1"
android:entries="@array/virtualPumpTypes"
android:entryValues="@array/virtualPumpTypes"
- android:key="virtualpump_type"
+ android:key="@string/key_virtualpump_type"
android:title="@string/virtualpump_type" />
diff --git a/app/src/test/java/info/AAPSMocker.java b/app/src/test/java/info/AAPSMocker.java
index c02c69cd07..81c8b99597 100644
--- a/app/src/test/java/info/AAPSMocker.java
+++ b/app/src/test/java/info/AAPSMocker.java
@@ -2,6 +2,7 @@ package info;
import android.content.Context;
import android.content.Intent;
+import android.content.res.Resources;
import com.squareup.otto.Bus;
@@ -19,11 +20,18 @@ import info.nightscout.androidaps.data.ConstraintChecker;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.data.ProfileStore;
import info.nightscout.androidaps.db.DatabaseHelper;
+import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.androidaps.plugins.Treatments.TreatmentService;
+import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
+import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin;
+import info.nightscout.androidaps.plugins.PumpDanaRKorean.DanaRKoreanPlugin;
import info.nightscout.androidaps.queue.CommandQueue;
import info.nightscout.utils.SP;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
@@ -90,12 +98,15 @@ public class AAPSMocker {
when(MainApp.gs(R.string.minago)).thenReturn("%d min ago");
when(MainApp.gs(R.string.hoursago)).thenReturn("%.1fh ago");
when(MainApp.gs(R.string.careportal_profileswitch)).thenReturn("Profile Switch");
+ when(MainApp.gs(R.string.configbuilder_insulin)).thenReturn("Insulin");
+ when(MainApp.gs(R.string.bolusdelivering)).thenReturn("Delivering 0.0U");
}
public static MainApp mockMainApp() {
PowerMockito.mockStatic(MainApp.class);
MainApp mainApp = mock(MainApp.class);
when(MainApp.instance()).thenReturn(mainApp);
+
return mainApp;
}
@@ -105,9 +116,10 @@ public class AAPSMocker {
when(MainApp.getConfigBuilder()).thenReturn(configBuilderPlugin);
}
- public static void mockConstraintsChecker() {
+ public static ConstraintChecker mockConstraintsChecker() {
ConstraintChecker constraintChecker = mock(ConstraintChecker.class);
when(MainApp.getConstraintChecker()).thenReturn(constraintChecker);
+ return constraintChecker;
}
public static void mockBus() {
@@ -122,14 +134,26 @@ public class AAPSMocker {
when(SP.getInt(anyInt(), anyInt())).thenReturn(0);
}
- public static void mockApplicationContext() {
- Context context = mock(Context.class);
- when(MainApp.instance().getApplicationContext()).thenReturn(context);
+ public static void mockL() {
+ PowerMockito.mockStatic(L.class);
+ when(L.isEnabled(any())).thenReturn(true);
}
- public static void mockDatabaseHelper() {
+ public static void mockNSUpload(){
+ PowerMockito.mockStatic(NSUpload.class);
+ }
+
+ public static void mockApplicationContext() {
+ Context mockedContext = mock(Context.class);
+ Resources mResources = mock(Resources.class);
+ when(MainApp.instance().getApplicationContext()).thenReturn(mockedContext);
+ when(mockedContext.getResources()).thenReturn(mResources);
+ }
+
+ public static DatabaseHelper mockDatabaseHelper() {
DatabaseHelper databaseHelper = mock(DatabaseHelper.class);
when(MainApp.getDbHelper()).thenReturn(databaseHelper);
+ return databaseHelper;
}
public static void mockCommandQueue() {
@@ -137,11 +161,27 @@ public class AAPSMocker {
when(ConfigBuilderPlugin.getCommandQueue()).thenReturn(queue);
}
+ public static TreatmentsPlugin mockTreatmentPlugin() {
+ PowerMockito.mockStatic(TreatmentsPlugin.class);
+ TreatmentsPlugin treatmentsPlugin = PowerMockito.mock(TreatmentsPlugin.class);
+ when(TreatmentsPlugin.getPlugin()).thenReturn(treatmentsPlugin);
+ return treatmentsPlugin;
+ }
+
public static void mockTreatmentService() throws Exception {
TreatmentService treatmentService = PowerMockito.mock(TreatmentService.class);
PowerMockito.whenNew(TreatmentService.class).withNoArguments().thenReturn(treatmentService);
}
+ public static DanaRPlugin mockDanaRPlugin() {
+ PowerMockito.mockStatic(DanaRPlugin.class);
+ DanaRPlugin danaRPlugin = mock(DanaRPlugin.class);
+ DanaRKoreanPlugin danaRKoreanPlugin = mock(DanaRKoreanPlugin.class);
+ when(MainApp.getSpecificPlugin(DanaRPlugin.class)).thenReturn(danaRPlugin);
+ when(MainApp.getSpecificPlugin(DanaRKoreanPlugin.class)).thenReturn(danaRKoreanPlugin);
+ return danaRPlugin;
+ }
+
public static Profile getValidProfile() {
try {
if (profile == null)
@@ -169,6 +209,14 @@ public class AAPSMocker {
return profileStore;
}
+ public static void mockProfileFunctions() {
+ PowerMockito.mockStatic(ProfileFunctions.class);
+ ProfileFunctions profileFunctions = PowerMockito.mock(ProfileFunctions.class);
+ PowerMockito.when(ProfileFunctions.getInstance()).thenReturn(profileFunctions);
+ profile = getValidProfile();
+ PowerMockito.when(ProfileFunctions.getInstance().getProfile()).thenReturn(profile);
+ }
+
private static MockedBus bus = new MockedBus();
public static void prepareMockedBus() {
diff --git a/app/src/test/java/info/nightscout/MainAppTest.java b/app/src/test/java/info/nightscout/MainAppTest.java
index 7bb58797be..17ca9ef5da 100644
--- a/app/src/test/java/info/nightscout/MainAppTest.java
+++ b/app/src/test/java/info/nightscout/MainAppTest.java
@@ -5,12 +5,12 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
-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.PluginType;
import info.nightscout.androidaps.interfaces.PumpInterface;
+import info.nightscout.androidaps.plugins.Maintenance.LoggerUtils;
import info.nightscout.androidaps.plugins.Overview.OverviewPlugin;
@@ -73,7 +73,7 @@ public class MainAppTest {
public void getSpecificPluginsListTest() {
// currently MDI, VP, R, Rv2, KoreanR, RS
int expected;
- if (Config.NSCLIENT || Config.G5UPLOADER)
+ if (Config.NSCLIENT)
expected = 1; // VirtualPump only
else
expected = 7;
@@ -84,7 +84,7 @@ public class MainAppTest {
public void getSpecificPluginsVisibleInListTest() {
// currently MDI, VP, R, Rv2, KoreanR, RS
int expected;
- if (Config.NSCLIENT || Config.G5UPLOADER)
+ if (Config.NSCLIENT)
expected = 1; // VirtualPump only
else
expected = 7;
@@ -95,7 +95,7 @@ public class MainAppTest {
public void getSpecificPluginsListByInterfaceTest() {
// currently MDI, VP, R, Rv2, KoreanR, RS
int expected;
- if (Config.NSCLIENT || Config.G5UPLOADER)
+ if (Config.NSCLIENT)
expected = 1; // VirtualPump only
else
expected = 7;
@@ -106,7 +106,7 @@ public class MainAppTest {
public void getSpecificPluginsVisibleInListByInterfaceTest() {
// currently MDI, VP, R, Rv2, KoreanR, RS
int expected;
- if (Config.NSCLIENT || Config.G5UPLOADER)
+ if (Config.NSCLIENT)
expected = 1; // VirtualPump only
else
expected = 7;
@@ -121,13 +121,13 @@ public class MainAppTest {
@Test
public void isEngineeringModeOrReleaseTest() {
- Assert.assertEquals(!BuildConfig.APS, mainApp.isEngineeringModeOrRelease());
+ Assert.assertEquals(!Config.APS, mainApp.isEngineeringModeOrRelease());
}
@Test
public void getLogDirectoryTest() {
// logger not initialized in Roboelectric
- Assert.assertNull(mainApp.getLogDirectory());
+ Assert.assertNull(LoggerUtils.getLogDirectory());
}
}
diff --git a/app/src/test/java/info/nightscout/androidaps/data/PumpEnactResultTest.java b/app/src/test/java/info/nightscout/androidaps/data/PumpEnactResultTest.java
index 9889c9185a..7ce14c2281 100644
--- a/app/src/test/java/info/nightscout/androidaps/data/PumpEnactResultTest.java
+++ b/app/src/test/java/info/nightscout/androidaps/data/PumpEnactResultTest.java
@@ -109,7 +109,7 @@ public class PumpEnactResultTest {
Assert.assertEquals("Success: false\n" +
"Enacted: true\n" +
"Comment: AAA\n" +
- "SMB: 10.0 U", per.toString());
+ "Insulin: 10.0 U", per.toString());
per = new PumpEnactResult().enacted(true).isTempCancel(true).comment("AAA");
Assert.assertEquals("Success: false\n" +
diff --git a/app/src/test/java/info/nightscout/androidaps/interfaces/ConstraintTest.java b/app/src/test/java/info/nightscout/androidaps/interfaces/ConstraintTest.java
index 23352a57f9..2a742efc65 100644
--- a/app/src/test/java/info/nightscout/androidaps/interfaces/ConstraintTest.java
+++ b/app/src/test/java/info/nightscout/androidaps/interfaces/ConstraintTest.java
@@ -4,17 +4,27 @@ import junit.framework.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
+import info.AAPSMocker;
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.utils.SP;
+
/**
* Created by mike on 19.03.2018.
*/
@RunWith(PowerMockRunner.class)
+@PrepareForTest({MainApp.class, SP.class})
public class ConstraintTest {
@Test
- public void doTests() throws Exception {
+ public void doTests() {
+ AAPSMocker.mockMainApp();
+ AAPSMocker.mockApplicationContext();
+ AAPSMocker.mockSP();
+
Constraint b = new Constraint<>(true);
Assert.assertEquals(Boolean.TRUE, b.value());
Assert.assertEquals("", b.getReasons());
diff --git a/app/src/test/java/info/nightscout/androidaps/interfaces/ConstraintsCheckerTest.java b/app/src/test/java/info/nightscout/androidaps/interfaces/ConstraintsCheckerTest.java
index 9258f9c308..205ceed465 100644
--- a/app/src/test/java/info/nightscout/androidaps/interfaces/ConstraintsCheckerTest.java
+++ b/app/src/test/java/info/nightscout/androidaps/interfaces/ConstraintsCheckerTest.java
@@ -75,7 +75,7 @@ public class ConstraintsCheckerTest {
@Test
public void isClosedLoopAllowedTest() throws Exception {
- when(SP.getString("aps_mode", "open")).thenReturn("closed");
+ when(SP.getString(R.string.key_aps_mode, "open")).thenReturn("closed");
objectivesPlugin.objectives.get(3).setStartedOn(null);
Constraint c = constraintChecker.isClosedLoopAllowed();
@@ -83,7 +83,7 @@ public class ConstraintsCheckerTest {
Assert.assertEquals(true, c.getMostLimitedReasonList().size() == 2); // Safety & Objectives
Assert.assertEquals(Boolean.FALSE, c.value());
- when(SP.getString("aps_mode", "open")).thenReturn("open");
+ when(SP.getString(R.string.key_aps_mode, "open")).thenReturn("open");
c = constraintChecker.isClosedLoopAllowed();
Assert.assertEquals(true, c.getReasonList().size() == 3); // 2x Safety & Objectives
Assert.assertEquals(true, c.getMostLimitedReasonList().size() == 3); // 2x Safety & Objectives
@@ -156,7 +156,7 @@ public class ConstraintsCheckerTest {
// Apply all limits
Constraint d = constraintChecker.getMaxBasalAllowed(AAPSMocker.getValidProfile());
Assert.assertEquals(0.8d, d.value());
- Assert.assertEquals(true, d.getReasonList().size() == 6);
+ Assert.assertEquals(6, d.getReasonList().size());
Assert.assertEquals("DanaR: Limiting basal rate to 0.80 U/h because of pump limit", d.getMostLimitedReasons());
}
@@ -183,7 +183,7 @@ public class ConstraintsCheckerTest {
// Apply all limits
Constraint i = constraintChecker.getMaxBasalPercentAllowed(AAPSMocker.getValidProfile());
Assert.assertEquals((Integer) 100, i.value());
- Assert.assertEquals(true, i.getReasonList().size() == 9); // 6x Safety & RS & R & Insight
+ Assert.assertEquals(9, i.getReasonList().size()); // 6x Safety & RS & R & Insight
Assert.assertEquals("Safety: Limiting percent rate to 100% because of pump limit", i.getMostLimitedReasons());
}
diff --git a/app/src/test/java/info/nightscout/androidaps/interfaces/PumpDescritpionTest.java b/app/src/test/java/info/nightscout/androidaps/interfaces/PumpDescritpionTest.java
new file mode 100644
index 0000000000..054c44bb49
--- /dev/null
+++ b/app/src/test/java/info/nightscout/androidaps/interfaces/PumpDescritpionTest.java
@@ -0,0 +1,45 @@
+package info.nightscout.androidaps.interfaces;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import info.nightscout.androidaps.interfaces.PumpDescription;
+import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpCapability;
+import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpTempBasalType;
+import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpType;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by andy on 5/13/18.
+ */
+public class PumpDescritpionTest {
+
+ @Test
+ public void setPumpDescription() {
+
+ PumpDescription pumpDescription = new PumpDescription();
+
+ pumpDescription.setPumpDescription(PumpType.AccuChekCombo);
+
+ Assert.assertEquals(pumpDescription.bolusStep, PumpType.AccuChekCombo.getBolusSize(), 0.1d);
+ Assert.assertEquals(pumpDescription.basalMinimumRate, PumpType.AccuChekCombo.getBaseBasalStep(), 0.1d);
+ Assert.assertEquals(pumpDescription.basalStep, PumpType.AccuChekCombo.getBaseBasalStep(), 0.1d);
+ Assert.assertEquals(pumpDescription.extendedBolusDurationStep, PumpType.AccuChekCombo.getExtendedBolusSettings().getDurationStep(), 0.1d);
+ Assert.assertEquals(pumpDescription.extendedBolusMaxDuration, PumpType.AccuChekCombo.getExtendedBolusSettings().getMaxDuration(), 0.1d);
+ Assert.assertEquals(pumpDescription.extendedBolusStep, PumpType.AccuChekCombo.getExtendedBolusSettings().getStep(), 0.1d);
+ Assert.assertEquals(pumpDescription.isExtendedBolusCapable, PumpType.AccuChekCombo.getPumpCapability().hasCapability(PumpCapability.ExtendedBolus));
+ Assert.assertEquals(pumpDescription.isBolusCapable, PumpType.AccuChekCombo.getPumpCapability().hasCapability(PumpCapability.Bolus));
+ Assert.assertEquals(pumpDescription.isRefillingCapable, PumpType.AccuChekCombo.getPumpCapability().hasCapability(PumpCapability.Refill));
+ Assert.assertEquals(pumpDescription.isSetBasalProfileCapable, PumpType.AccuChekCombo.getPumpCapability().hasCapability(PumpCapability.BasalProfileSet));
+ Assert.assertEquals(pumpDescription.isTempBasalCapable, PumpType.AccuChekCombo.getPumpCapability().hasCapability(PumpCapability.TempBasal));
+ Assert.assertEquals(pumpDescription.maxTempPercent, PumpType.AccuChekCombo.getTbrSettings().getMaxDose(), 0.1d);
+ Assert.assertEquals(pumpDescription.tempPercentStep, PumpType.AccuChekCombo.getTbrSettings().getStep(), 0.1d);
+ Assert.assertEquals(pumpDescription.tempBasalStyle, PumpType.AccuChekCombo.getPumpTempBasalType()== PumpTempBasalType.Percent ? PumpDescription.PERCENT : PumpDescription.ABSOLUTE);
+ Assert.assertEquals(pumpDescription.tempDurationStep, PumpType.AccuChekCombo.getTbrSettings().getDurationStep());
+ Assert.assertEquals(pumpDescription.tempDurationStep15mAllowed, PumpType.AccuChekCombo.getSpecialBasalDurations().hasCapability(PumpCapability.BasalRate_Duration15minAllowed));
+ Assert.assertEquals(pumpDescription.tempDurationStep30mAllowed, PumpType.AccuChekCombo.getSpecialBasalDurations().hasCapability(PumpCapability.BasalRate_Duration30minAllowed));
+
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialogTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialogTest.java
index 185f400e4f..23be73838a 100644
--- a/app/src/test/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialogTest.java
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialogTest.java
@@ -18,12 +18,11 @@ import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.db.DatabaseHelper;
import info.nightscout.androidaps.db.ProfileSwitch;
-import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialog;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.ProfileNS.NSProfilePlugin;
import info.nightscout.androidaps.plugins.Treatments.TreatmentService;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
-import info.nightscout.utils.NSUpload;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
import info.nightscout.utils.SP;
import static info.nightscout.androidaps.plugins.Careportal.CareportalFragment.PROFILESWITCH;
@@ -59,14 +58,6 @@ public class NewNSTreatmentDialogTest {
Assert.assertEquals(AAPSMocker.TESTPROFILENAME, profileSwitchUpload.profileName);
}
- @Test
- public void doProfileSwitch() {
- }
-
- @Test
- public void doProfileSwitch1() {
- }
-
@Before
public void prepareMock() throws Exception {
AAPSMocker.mockMainApp();
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPluginTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPluginTest.java
index 59628a8dea..268faa5ab7 100644
--- a/app/src/test/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPluginTest.java
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPluginTest.java
@@ -12,11 +12,12 @@ import org.powermock.modules.junit4.PowerMockRunner;
import info.AAPSMocker;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.interfaces.PluginType;
+import info.nightscout.utils.SP;
import static org.powermock.api.mockito.PowerMockito.mock;
@RunWith(PowerMockRunner.class)
-@PrepareForTest({MainApp.class})
+@PrepareForTest({MainApp.class, SP.class})
public class ConfigBuilderPluginTest {
@Test
@@ -41,9 +42,10 @@ public class ConfigBuilderPluginTest {
}
@Before
- public void prepareMock() throws Exception {
- MainApp mainApp = mock(MainApp.class);
- PowerMockito.mockStatic(MainApp.class);
+ public void prepareMock() {
+ AAPSMocker.mockMainApp();
+ AAPSMocker.mockApplicationContext();
+ AAPSMocker.mockSP();
AAPSMocker.prepareMockedBus();
}
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPluginTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPluginTest.java
index 77a91046ab..ae350c4fe6 100644
--- a/app/src/test/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPluginTest.java
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPluginTest.java
@@ -47,8 +47,8 @@ public class SafetyPluginTest {
}
@Test
- public void disabledEngineeringModeShouldLimitClosedLoop() throws Exception {
- when(SP.getString("aps_mode", "open")).thenReturn("closed");
+ public void disabledEngineeringModeShouldLimitClosedLoop() {
+ when(SP.getString(R.string.key_aps_mode, "open")).thenReturn("closed");
when(MainApp.isEngineeringModeOrRelease()).thenReturn(false);
Constraint c = new Constraint<>(true);
@@ -58,8 +58,8 @@ public class SafetyPluginTest {
}
@Test
- public void setOpenLoopInPreferencesShouldLimitClosedLoop() throws Exception {
- when(SP.getString("aps_mode", "open")).thenReturn("open");
+ public void setOpenLoopInPreferencesShouldLimitClosedLoop() {
+ when(SP.getString(R.string.key_aps_mode, "open")).thenReturn("open");
Constraint c = new Constraint<>(true);
c = safetyPlugin.isClosedLoopAllowed(c);
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/IobCobCalculatorPlugin/IobCobCalculatorPluginTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/IobCobCalculatorPlugin/IobCobCalculatorPluginTest.java
new file mode 100644
index 0000000000..c68e7f3919
--- /dev/null
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/IobCobCalculatorPlugin/IobCobCalculatorPluginTest.java
@@ -0,0 +1,422 @@
+package info.nightscout.androidaps.plugins.IobCobCalculatorPlugin;
+
+import android.content.Context;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import info.AAPSMocker;
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.db.BgReading;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
+import info.nightscout.utils.DateUtil;
+import info.nightscout.utils.SP;
+import info.nightscout.utils.T;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({MainApp.class, ConfigBuilderPlugin.class, SP.class, Context.class, L.class})
+public class IobCobCalculatorPluginTest {
+
+ IobCobCalculatorPlugin iobCobCalculatorPlugin = IobCobCalculatorPlugin.getPlugin();
+
+ @Test
+ public void isAbout5minDataTest() {
+ List bgReadingList = new ArrayList<>();
+
+ // Super data should not be touched
+ bgReadingList.clear();
+ bgReadingList.add(new BgReading().date(T.mins(20).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(15).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(10).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(5).msecs()).value(100));
+
+ iobCobCalculatorPlugin.setBgReadings(bgReadingList);
+
+ Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData());
+
+ // too much shifted data should return false
+ bgReadingList.clear();
+ bgReadingList.add(new BgReading().date(T.mins(20).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(15).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(9).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(5).msecs()).value(100));
+
+ iobCobCalculatorPlugin.setBgReadings(bgReadingList);
+
+ Assert.assertEquals(false, iobCobCalculatorPlugin.isAbout5minData());
+
+ // too much shifted and missing data should return false
+ bgReadingList.clear();
+ bgReadingList.add(new BgReading().date(T.mins(20).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(9).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(5).msecs()).value(100));
+
+ iobCobCalculatorPlugin.setBgReadings(bgReadingList);
+
+ Assert.assertEquals(false, iobCobCalculatorPlugin.isAbout5minData());
+
+ // too much shifted and missing data should return false
+ bgReadingList.clear();
+ bgReadingList.add(new BgReading().date(T.mins(83).plus(T.secs(40)).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(78).plus(T.secs(40)).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(73).plus(T.secs(40)).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(68).plus(T.secs(40)).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(63).plus(T.secs(40)).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(58).plus(T.secs(40)).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(53).plus(T.secs(40)).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(48).plus(T.secs(40)).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(43).plus(T.secs(40)).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(38).plus(T.secs(33)).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(33).plus(T.secs(1)).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(28).plus(T.secs(0)).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(23).plus(T.secs(0)).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(16).plus(T.secs(36)).msecs()).value(100));
+
+ iobCobCalculatorPlugin.setBgReadings(bgReadingList);
+
+ Assert.assertEquals(false, iobCobCalculatorPlugin.isAbout5minData());
+
+ // slighly shifted data should return true
+ bgReadingList.clear();
+ bgReadingList.add(new BgReading().date(T.mins(20).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(15).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(10).msecs() - T.secs(10).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(5).msecs()).value(100));
+
+ iobCobCalculatorPlugin.setBgReadings(bgReadingList);
+
+ Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData());
+
+ // slighly shifted and missing data should return true
+ bgReadingList.clear();
+ bgReadingList.add(new BgReading().date(T.mins(20).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(10).msecs() - T.secs(10).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(5).msecs()).value(100));
+
+ iobCobCalculatorPlugin.setBgReadings(bgReadingList);
+
+ Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData());
+
+ }
+
+ @Test
+ public void createBucketedData5minTest() throws Exception {
+ List bgReadingList = new ArrayList<>();
+
+ // Super data should not be touched
+ bgReadingList.clear();
+ bgReadingList.add(new BgReading().date(T.mins(20).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(15).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(10).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(5).msecs()).value(100));
+
+ iobCobCalculatorPlugin.setBgReadings(bgReadingList);
+ iobCobCalculatorPlugin.createBucketedData();
+
+ Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData());
+ Assert.assertEquals(bgReadingList.get(0).date, iobCobCalculatorPlugin.getBucketedData().get(0).date);
+ Assert.assertEquals(bgReadingList.get(3).date, iobCobCalculatorPlugin.getBucketedData().get(3).date);
+ Assert.assertEquals(bgReadingList.size(), iobCobCalculatorPlugin.getBucketedData().size());
+
+ // Missing value should be replaced
+ bgReadingList.clear();
+ bgReadingList.add(new BgReading().date(T.mins(20).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(10).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(5).msecs()).value(100));
+
+ iobCobCalculatorPlugin.setBgReadings(bgReadingList);
+ iobCobCalculatorPlugin.createBucketedData();
+
+ Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData());
+ Assert.assertEquals(bgReadingList.get(0).date, iobCobCalculatorPlugin.getBucketedData().get(0).date);
+ Assert.assertEquals(bgReadingList.get(2).date, iobCobCalculatorPlugin.getBucketedData().get(3).date);
+ Assert.assertEquals(bgReadingList.size() + 1, iobCobCalculatorPlugin.getBucketedData().size());
+
+ // drift should be cleared
+ bgReadingList.clear();
+ bgReadingList.add(new BgReading().date(T.mins(20).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(15).msecs() + T.secs(10).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(10).msecs() + T.secs(10).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(5).msecs() - T.secs(10).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(0).msecs()).value(100));
+
+ iobCobCalculatorPlugin.setBgReadings(bgReadingList);
+ iobCobCalculatorPlugin.createBucketedData();
+
+ Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData());
+ Assert.assertEquals(T.mins(20).msecs(), iobCobCalculatorPlugin.getBucketedData().get(0).date);
+ Assert.assertEquals(T.mins(15).msecs(), iobCobCalculatorPlugin.getBucketedData().get(1).date);
+ Assert.assertEquals(T.mins(10).msecs(), iobCobCalculatorPlugin.getBucketedData().get(2).date);
+ Assert.assertEquals(T.mins(5).msecs(), iobCobCalculatorPlugin.getBucketedData().get(3).date);
+ Assert.assertEquals(bgReadingList.size(), iobCobCalculatorPlugin.getBucketedData().size());
+
+ // bucketed data should return null if not enough bg data
+ bgReadingList.clear();
+ bgReadingList.add(new BgReading().date(T.mins(30).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(5).msecs()).value(100));
+
+ iobCobCalculatorPlugin.setBgReadings(bgReadingList);
+ iobCobCalculatorPlugin.createBucketedData();
+
+ Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData());
+ Assert.assertEquals(null, iobCobCalculatorPlugin.getBucketedData());
+
+ // data should be reconstructed
+ bgReadingList.clear();
+ bgReadingList.add(new BgReading().date(T.mins(50).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(45).msecs()).value(90));
+ bgReadingList.add(new BgReading().date(T.mins(20).msecs()).value(40));
+
+ iobCobCalculatorPlugin.setBgReadings(bgReadingList);
+ iobCobCalculatorPlugin.createBucketedData();
+
+ Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData());
+ Assert.assertEquals(T.mins(50).msecs(), iobCobCalculatorPlugin.getBucketedData().get(0).date);
+ Assert.assertEquals(T.mins(20).msecs(), iobCobCalculatorPlugin.getBucketedData().get(6).date);
+ Assert.assertEquals(7, iobCobCalculatorPlugin.getBucketedData().size());
+
+ Assert.assertEquals(100, iobCobCalculatorPlugin.getBucketedData().get(0).value, 1);
+ Assert.assertEquals(90, iobCobCalculatorPlugin.getBucketedData().get(1).value, 1);
+ Assert.assertEquals(50, iobCobCalculatorPlugin.getBucketedData().get(5).value, 1);
+ Assert.assertEquals(40, iobCobCalculatorPlugin.getBucketedData().get(6).value, 1);
+
+ // non 5min data should be reconstructed
+ bgReadingList.clear();
+ bgReadingList.add(new BgReading().date(T.mins(50).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(48).msecs()).value(96));
+ bgReadingList.add(new BgReading().date(T.mins(20).msecs()).value(40));
+
+ iobCobCalculatorPlugin.setBgReadings(bgReadingList);
+ iobCobCalculatorPlugin.createBucketedData();
+
+ Assert.assertEquals(false, iobCobCalculatorPlugin.isAbout5minData());
+ Assert.assertEquals(T.mins(50).msecs(), iobCobCalculatorPlugin.getBucketedData().get(0).date);
+ Assert.assertEquals(T.mins(20).msecs(), iobCobCalculatorPlugin.getBucketedData().get(6).date);
+ Assert.assertEquals(7, iobCobCalculatorPlugin.getBucketedData().size());
+
+ Assert.assertEquals(100, iobCobCalculatorPlugin.getBucketedData().get(0).value, 1);
+ Assert.assertEquals(90, iobCobCalculatorPlugin.getBucketedData().get(1).value, 1);
+ Assert.assertEquals(50, iobCobCalculatorPlugin.getBucketedData().get(5).value, 1);
+ Assert.assertEquals(40, iobCobCalculatorPlugin.getBucketedData().get(6).value, 1);
+
+ //bucketed data should be null if no bg data available
+ iobCobCalculatorPlugin.setBgReadings(null);
+ iobCobCalculatorPlugin.createBucketedData();
+ Assert.assertEquals(null, iobCobCalculatorPlugin.getBucketedData());
+
+ // real data gap test
+ bgReadingList.clear();
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T13:34:55Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T13:14:55Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T13:09:55Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T13:04:55Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T12:59:55Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T12:54:55Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T12:49:55Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T12:44:55Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T12:39:55Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T12:34:55Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T12:29:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T12:24:55Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T12:19:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T12:14:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T12:09:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T12:04:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T11:59:55Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T11:54:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T11:49:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T11:44:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T11:39:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T11:34:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T11:29:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T11:24:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T11:19:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T11:14:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T11:09:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T11:04:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T10:59:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T10:54:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T10:49:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T10:44:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T10:39:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T10:34:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T10:29:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T10:24:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T10:19:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T10:14:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T10:09:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T10:04:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T09:59:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T09:54:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T09:49:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T09:44:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T09:39:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T09:35:05Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T09:30:17Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T09:24:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T09:19:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T09:14:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T09:09:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T09:04:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T08:59:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T08:54:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T08:49:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T08:44:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T08:40:02Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T08:34:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T08:29:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T08:24:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T08:19:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T08:14:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T08:09:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T08:04:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T07:59:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T07:54:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T07:49:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T07:44:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T07:39:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T07:34:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T07:30:03Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T07:25:17Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T07:19:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T07:14:58Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T07:09:58Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T07:04:58Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T06:59:58Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T06:54:58Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T06:49:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T06:44:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T06:39:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T06:34:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T06:29:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T06:24:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T06:19:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T06:14:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T06:10:03Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T06:04:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T05:59:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T05:54:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T05:49:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T05:44:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T05:39:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T05:34:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T05:29:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T05:24:57Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T05:19:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T05:14:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T05:09:57Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T05:04:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T04:59:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T04:54:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T04:50:03Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T04:44:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T04:39:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T04:34:57Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T04:29:57Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T04:24:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T04:19:57Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T04:14:57Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T04:10:03Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T04:04:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T03:59:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T03:54:56Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T03:50:03Z")).value(100));
+ bgReadingList.add(new BgReading().date(DateUtil.fromISODateString("2018-09-05T03:44:57Z")).value(100));
+
+ iobCobCalculatorPlugin.setBgReadings(bgReadingList);
+ iobCobCalculatorPlugin.createBucketedData();
+
+ Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData());
+ Assert.assertEquals(DateUtil.fromISODateString("2018-09-05T13:34:57Z").getTime(), iobCobCalculatorPlugin.getBucketedData().get(0).date);
+ Assert.assertEquals(DateUtil.fromISODateString("2018-09-05T03:44:57Z").getTime(), iobCobCalculatorPlugin.getBucketedData().get(iobCobCalculatorPlugin.getBucketedData().size() - 1).date);
+ }
+
+ @Test
+ public void getBgReadingsTest() {
+ List bgReadingList = new ArrayList<>();
+
+ iobCobCalculatorPlugin.setBgReadings(bgReadingList);
+
+ Assert.assertEquals(bgReadingList, iobCobCalculatorPlugin.getBgReadings());
+ }
+
+ @Test
+ public void roundUpTimeTest() {
+ Assert.assertEquals(T.mins(3).msecs(), iobCobCalculatorPlugin.roundUpTime(T.secs(155).msecs()));
+ }
+
+ @Test
+ public void findNewerTest() {
+ List bgReadingList = new ArrayList<>();
+
+ bgReadingList.add(new BgReading().date(T.mins(20).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(15).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(10).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(5).msecs()).value(100));
+
+ iobCobCalculatorPlugin.setBgReadings(bgReadingList);
+
+ Assert.assertEquals(T.mins(10).msecs(), iobCobCalculatorPlugin.findNewer(T.mins(8).msecs()).date);
+ Assert.assertEquals(T.mins(5).msecs(), iobCobCalculatorPlugin.findNewer(T.mins(5).msecs()).date);
+ Assert.assertEquals(T.mins(10).msecs(), iobCobCalculatorPlugin.findNewer(T.mins(10).msecs()).date);
+ Assert.assertEquals(T.mins(20).msecs(), iobCobCalculatorPlugin.findNewer(T.mins(20).msecs()).date);
+ Assert.assertEquals(null, iobCobCalculatorPlugin.findNewer(T.mins(22).msecs()));
+ }
+
+ @Test
+ public void findOlderTest() {
+ List bgReadingList = new ArrayList<>();
+
+ bgReadingList.add(new BgReading().date(T.mins(20).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(15).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(10).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(5).msecs()).value(100));
+
+ iobCobCalculatorPlugin.setBgReadings(bgReadingList);
+
+ Assert.assertEquals(T.mins(5).msecs(), iobCobCalculatorPlugin.findOlder(T.mins(8).msecs()).date);
+ Assert.assertEquals(T.mins(5).msecs(), iobCobCalculatorPlugin.findOlder(T.mins(5).msecs()).date);
+ Assert.assertEquals(T.mins(10).msecs(), iobCobCalculatorPlugin.findOlder(T.mins(10).msecs()).date);
+ Assert.assertEquals(T.mins(20).msecs(), iobCobCalculatorPlugin.findOlder(T.mins(20).msecs()).date);
+ Assert.assertEquals(null, iobCobCalculatorPlugin.findOlder(T.mins(4).msecs()));
+ }
+
+ @Test
+ public void findPreviousTimeFromBucketedDataTest() {
+ List bgReadingList = new ArrayList<>();
+
+ iobCobCalculatorPlugin.setBgReadings(bgReadingList);
+ iobCobCalculatorPlugin.createBucketedData();
+ Assert.assertEquals(null, iobCobCalculatorPlugin.findPreviousTimeFromBucketedData(1000));
+
+ // Super data should not be touched
+ bgReadingList.clear();
+ bgReadingList.add(new BgReading().date(T.mins(20).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(15).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(10).msecs()).value(100));
+ bgReadingList.add(new BgReading().date(T.mins(5).msecs()).value(100));
+
+ iobCobCalculatorPlugin.setBgReadings(bgReadingList);
+ iobCobCalculatorPlugin.createBucketedData();
+
+ Assert.assertEquals(null, iobCobCalculatorPlugin.findPreviousTimeFromBucketedData(T.mins(4).msecs()));
+ Assert.assertEquals((Long) T.mins(5).msecs(), iobCobCalculatorPlugin.findPreviousTimeFromBucketedData(T.mins(6).msecs()));
+ Assert.assertEquals((Long) T.mins(20).msecs(), iobCobCalculatorPlugin.findPreviousTimeFromBucketedData(T.mins(20).msecs()));
+ Assert.assertEquals((Long) T.mins(20).msecs(), iobCobCalculatorPlugin.findPreviousTimeFromBucketedData(T.mins(25).msecs()));
+ }
+
+ @Before
+ public void doMock() {
+ AAPSMocker.mockMainApp();
+ AAPSMocker.mockL();
+ }
+}
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSResultTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSResultTest.java
new file mode 100644
index 0000000000..d5fe95c49d
--- /dev/null
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/Loop/APSResultTest.java
@@ -0,0 +1,197 @@
+package info.nightscout.androidaps.plugins.Loop;
+
+import android.content.Context;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import info.AAPSMocker;
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.data.ConstraintChecker;
+import info.nightscout.androidaps.db.TemporaryBasal;
+import info.nightscout.androidaps.interfaces.Constraint;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions;
+import info.nightscout.androidaps.plugins.PumpCommon.defs.PumpType;
+import info.nightscout.androidaps.plugins.PumpVirtual.VirtualPumpPlugin;
+import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
+import info.nightscout.utils.JsonHelper;
+import info.nightscout.utils.SP;
+
+import static org.mockito.ArgumentMatchers.anyDouble;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.powermock.api.mockito.PowerMockito.when;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({MainApp.class, ConfigBuilderPlugin.class, SP.class, Context.class, ProfileFunctions.class, TreatmentsPlugin.class, L.class})
+public class APSResultTest {
+ VirtualPumpPlugin virtualPumpPlugin;
+ TreatmentsPlugin treatmentsPlugin;
+ Constraint closedLoopEnabled = new Constraint<>(false);
+
+ @Test
+ public void isChangeRequestedTest() {
+ APSResult apsResult = new APSResult();
+
+ // BASAL RATE IN TEST PROFILE IS 1U/h
+
+ // **** PERCENT pump ****
+ virtualPumpPlugin.getPumpDescription().setPumpDescription(PumpType.Cellnovo1); // % based
+ apsResult.usePercent(true);
+
+ // closed loop mode return original request
+ closedLoopEnabled.set(true);
+ when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(null);
+ apsResult.tempBasalRequested(false);
+ Assert.assertEquals(false, apsResult.isChangeRequested());
+ apsResult.tempBasalRequested(true).percent(200).duration(30);
+ Assert.assertEquals(true, apsResult.isChangeRequested());
+
+ // open loop
+ closedLoopEnabled.set(false);
+ // no change requested
+ when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(null);
+ apsResult.tempBasalRequested(false);
+ Assert.assertEquals(false, apsResult.isChangeRequested());
+
+ // request 100% when no temp is running
+ when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(null);
+ apsResult.tempBasalRequested(true).percent(100).duration(30);
+ Assert.assertEquals(false , apsResult.isChangeRequested());
+
+ // request equal temp
+ when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().percent(70).duration(30));
+ apsResult.tempBasalRequested(true).percent(70).duration(30);
+ Assert.assertEquals(false , apsResult.isChangeRequested());
+
+ // request zero temp
+ when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().percent(10).duration(30));
+ apsResult.tempBasalRequested(true).percent(0).duration(30);
+ Assert.assertEquals(true , apsResult.isChangeRequested());
+
+ // request high temp
+ when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().percent(190).duration(30));
+ apsResult.tempBasalRequested(true).percent(200).duration(30);
+ Assert.assertEquals(true , apsResult.isChangeRequested());
+
+ // request slightly different temp
+ when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().percent(70).duration(30));
+ apsResult.tempBasalRequested(true).percent(80).duration(30);
+ Assert.assertEquals(false , apsResult.isChangeRequested());
+
+ // request different temp
+ when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().percent(70).duration(30));
+ apsResult.tempBasalRequested(true).percent(120).duration(30);
+ Assert.assertEquals(true , apsResult.isChangeRequested());
+
+ // it should work with absolute temps too
+ // request different temp
+ when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().absolute(1).duration(30));
+ apsResult.tempBasalRequested(true).percent(100).duration(30);
+ Assert.assertEquals(false , apsResult.isChangeRequested());
+
+ when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().absolute(2).duration(30));
+ apsResult.tempBasalRequested(true).percent(50).duration(30);
+ Assert.assertEquals(true , apsResult.isChangeRequested());
+
+ // **** ABSOLUTE pump ****
+ virtualPumpPlugin.getPumpDescription().setPumpDescription(PumpType.Medtronic_515_715); // U/h based
+ apsResult.usePercent(false);
+
+ // open loop
+ closedLoopEnabled.set(false);
+ // request 100% when no temp is running
+ when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(null);
+ apsResult.tempBasalRequested(true).rate(1).duration(30);
+ Assert.assertEquals(false , apsResult.isChangeRequested());
+
+ // request equal temp
+ when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().absolute(2).duration(30));
+ apsResult.tempBasalRequested(true).rate(2).duration(30);
+ Assert.assertEquals(false , apsResult.isChangeRequested());
+
+ when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().percent(200).duration(30));
+ apsResult.tempBasalRequested(true).rate(2).duration(30);
+ Assert.assertEquals(false , apsResult.isChangeRequested());
+
+ // request zero temp
+ when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().absolute(0.1d).duration(30));
+ apsResult.tempBasalRequested(true).rate(0).duration(30);
+ Assert.assertEquals(true , apsResult.isChangeRequested());
+
+ // request high temp
+ when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().absolute(34.9).duration(30));
+ apsResult.tempBasalRequested(true).rate(35).duration(30);
+ Assert.assertEquals(true , apsResult.isChangeRequested());
+
+ // request slightly different temp
+ when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().absolute(1.1d).duration(30));
+ apsResult.tempBasalRequested(true).rate(1.2d).duration(30);
+ Assert.assertEquals(false , apsResult.isChangeRequested());
+
+ // request different temp
+ when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().absolute(1.1d).duration(30));
+ apsResult.tempBasalRequested(true).rate(1.5d).duration(30);
+ Assert.assertEquals(true , apsResult.isChangeRequested());
+
+ // it should work with percent temps too
+ // request different temp
+ when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().percent(110).duration(30));
+ apsResult.tempBasalRequested(true).rate(1.1d).duration(30);
+ Assert.assertEquals(false , apsResult.isChangeRequested());
+
+ when(treatmentsPlugin.getTempBasalFromHistory(anyLong())).thenReturn(new TemporaryBasal().percent(200).duration(30));
+ apsResult.tempBasalRequested(true).rate(0.5d).duration(30);
+ Assert.assertEquals(true , apsResult.isChangeRequested());
+
+ }
+
+ @Test
+ public void cloneTest() {
+ APSResult apsResult = new APSResult();
+ apsResult.rate(10);
+
+ APSResult apsResult2 = apsResult.clone();
+ Assert.assertEquals(apsResult.rate, apsResult2.rate, 0);
+ }
+
+ @Test
+ public void jsonTest() {
+ closedLoopEnabled.set(true);
+ APSResult apsResult = new APSResult();
+ apsResult.rate(20).tempBasalRequested(true);
+ Assert.assertEquals(20d, JsonHelper.safeGetDouble(apsResult.json(), "rate"), 0d);
+
+ apsResult.rate(20).tempBasalRequested(false);
+ Assert.assertEquals(false, apsResult.json().has("rate"));
+ }
+
+ @Before
+ public void prepareMock() throws Exception {
+ AAPSMocker.mockMainApp();
+ AAPSMocker.mockConfigBuilder();
+ AAPSMocker.mockSP();
+ AAPSMocker.mockStrings();
+ AAPSMocker.mockBus();
+ AAPSMocker.mockProfileFunctions();
+ AAPSMocker.mockTreatmentService();
+ AAPSMocker.mockL();
+ treatmentsPlugin = AAPSMocker.mockTreatmentPlugin();
+ ConstraintChecker constraintChecker = AAPSMocker.mockConstraintsChecker();
+
+ virtualPumpPlugin = VirtualPumpPlugin.getPlugin();
+ when(ConfigBuilderPlugin.getActivePump()).thenReturn(virtualPumpPlugin);
+
+ when(constraintChecker.isClosedLoopAllowed()).thenReturn(closedLoopEnabled);
+
+ Mockito.when(SP.getDouble(anyInt(), anyDouble())).thenReturn(30d);
+
+ }
+}
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/Loop/LoopPluginTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/Loop/LoopPluginTest.java
index 4a457651ce..0a37ba5df5 100644
--- a/app/src/test/java/info/nightscout/androidaps/plugins/Loop/LoopPluginTest.java
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/Loop/LoopPluginTest.java
@@ -41,7 +41,7 @@ public class LoopPluginTest {
Assert.assertEquals("LOOP", loopPlugin.getNameShort());
Assert.assertEquals(true, loopPlugin.hasFragment());
Assert.assertEquals(true, loopPlugin.showInList(PluginType.LOOP));
- Assert.assertEquals(R.xml.pref_closedmode, loopPlugin.getPreferencesId());
+ Assert.assertEquals(R.xml.pref_loop, loopPlugin.getPreferencesId());
// Plugin is disabled by default
Assert.assertEquals(false, loopPlugin.isEnabled(PluginType.LOOP));
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/Maintenance/MaintenancePluginTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/Maintenance/MaintenancePluginTest.java
new file mode 100644
index 0000000000..3eb3d2d661
--- /dev/null
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/Maintenance/MaintenancePluginTest.java
@@ -0,0 +1,43 @@
+package info.nightscout.androidaps.plugins.Maintenance;
+
+import org.junit.Test;
+
+import java.io.File;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class MaintenancePluginTest {
+
+ private MaintenancePlugin sut = new MaintenancePlugin();
+
+ @Test
+ public void getLogfilesTest() {
+ String logDirectory = "src/test/res/logger";
+
+ List logs = sut.getLogfiles(logDirectory, 2);
+ assertEquals(2, logs.size());
+ assertEquals("AndroidAPS.log", logs.get(0).getName());
+ assertEquals("AndroidAPS.2018-01-03_01-01-00.1.zip", logs.get(1).getName());
+
+ logs = sut.getLogfiles(logDirectory, 10);
+ assertEquals(4, logs.size());
+ }
+
+
+ @Test
+ public void zipLogsTest() {
+ String logDirectory = "src/test/res/logger";
+ List logs = sut.getLogfiles(logDirectory, 2);
+
+ String name = "AndroidAPS.log.zip";
+
+ File zipFile = new File("build/" + name);
+ zipFile = sut.zipLogs(zipFile, logs);
+
+ assertTrue(zipFile.exists());
+ assertTrue(zipFile.isFile());
+ }
+
+}
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MessageHashTableTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MessageHashTableTest.java
new file mode 100644
index 0000000000..b345a2b324
--- /dev/null
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MessageHashTableTest.java
@@ -0,0 +1,36 @@
+package info.nightscout.androidaps.plugins.PumpDanaR.comm;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import info.AAPSMocker;
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.Treatments.Treatment;
+import info.nightscout.utils.SP;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by Rumen Georgiev on 8/31/2018.
+ */
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({MainApp.class, SP.class, L.class})
+public class MessageHashTableTest {
+
+ @Test
+ public void runTest() {
+ AAPSMocker.mockMainApp();
+ AAPSMocker.mockSP();
+ AAPSMocker.mockL();
+ MessageHashTable messageHashTable = new MessageHashTable();
+ MessageBase testMessage = messageHashTable.findMessage(0x41f2);
+ assertEquals("CMD_HISTORY_ALL", testMessage.getMessageName());
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MessageOriginalNamesTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MessageOriginalNamesTest.java
new file mode 100644
index 0000000000..e7130e3984
--- /dev/null
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MessageOriginalNamesTest.java
@@ -0,0 +1,32 @@
+package info.nightscout.androidaps.plugins.PumpDanaR.comm;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import info.AAPSMocker;
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.Treatments.Treatment;
+import info.nightscout.utils.SP;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by Rumen Georgiev on 8/28/2018.
+ */
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({MainApp.class, SP.class, L.class})
+public class MessageOriginalNamesTest {
+ @Test
+ public void runTest() {
+ MessageOriginalNames packet = new MessageOriginalNames();
+ String testName = packet.getName(0x41f2);
+ assertEquals("CMD_HISTORY_ALL", testName);
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusProgressTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusProgressTest.java
new file mode 100644
index 0000000000..062c176c9b
--- /dev/null
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusProgressTest.java
@@ -0,0 +1,59 @@
+package info.nightscout.androidaps.plugins.PumpDanaR.comm;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import info.AAPSMocker;
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.PumpDanaRS.comm.DanaRS_Packet_Bolus_Set_Extended_Bolus;
+import info.nightscout.androidaps.plugins.Treatments.Treatment;
+import info.nightscout.utils.SP;
+
+import static org.junit.Assert.*;
+
+/**
+ * Created by Rumen Georgiev on 8/28/2018.
+ */
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({MainApp.class, SP.class, L.class})
+public class MsgBolusProgressTest {
+ @Test
+ public void runTest() {
+ AAPSMocker.mockMainApp();
+ AAPSMocker.mockApplicationContext();
+ AAPSMocker.mockSP();
+ AAPSMocker.mockL();
+ AAPSMocker.mockStrings();
+ AAPSMocker.mockBus();
+ Treatment t = new Treatment();
+ MsgBolusProgress packet = new MsgBolusProgress(3D, t);
+
+ // test message decoding
+ packet.handleMessage(createArray(34, (byte) 1));
+
+ int valueRequested = (((byte) 1 << 8) + ((byte) 1 + 0));
+ assertEquals(valueRequested, packet.progress,0d);
+
+ }
+
+ byte[] createArray(int length, byte fillWith){
+ byte[] ret = new byte[length];
+ for(int i = 0; i messages = new DanaRSMessageHashTable().messages;
+ DanaRS_Packet forTesting = new DanaRS_Packet_APS_Set_Event_History();
+ DanaRS_Packet testPacket = DanaRSMessageHashTable.findMessage(forTesting.getCommand());
+ assertEquals(BleCommandUtil.DANAR_PACKET__OPCODE__APS_SET_EVENT_HISTORY, testPacket.getOpCode());
+ }
+
+}
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_Basal_Set_Temporary_BasalTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_Basal_Set_Temporary_BasalTest.java
index bbacbb485c..61266462cc 100644
--- a/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_Basal_Set_Temporary_BasalTest.java
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_Basal_Set_Temporary_BasalTest.java
@@ -2,6 +2,14 @@ package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import info.AAPSMocker;
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.utils.SP;
import static org.junit.Assert.assertEquals;
@@ -9,62 +17,77 @@ import static org.junit.Assert.assertEquals;
* Created by mike on 20.11.2017.
*/
-public class DanaRS_Packet_APS_Basal_Set_Temporary_BasalTest extends DanaRS_Packet_APS_Basal_Set_Temporary_Basal {
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({MainApp.class, SP.class, L.class})
+public class DanaRS_Packet_APS_Basal_Set_Temporary_BasalTest {
@Test
- public void runTest() throws Exception {
+ public void runTest() {
+ AAPSMocker.mockMainApp();
+ AAPSMocker.mockApplicationContext();
+ AAPSMocker.mockSP();
+ AAPSMocker.mockL();
+
// under 100% should last 30 min
- setParams(0);
- assertEquals(0, temporaryBasalRatio);
- assertEquals(PARAM30MIN, temporaryBasalDuration);
+ DanaRS_Packet_APS_Basal_Set_Temporary_Basal packet = new DanaRS_Packet_APS_Basal_Set_Temporary_Basal();
+ packet.setParams(0);
+ assertEquals(0, packet.temporaryBasalRatio);
+ assertEquals(packet.PARAM30MIN, packet.temporaryBasalDuration);
+ //constructor with param
+ packet = new DanaRS_Packet_APS_Basal_Set_Temporary_Basal(10);
+ assertEquals(10, packet.temporaryBasalRatio);
+ assertEquals(packet.PARAM30MIN, packet.temporaryBasalDuration);
+ packet = new DanaRS_Packet_APS_Basal_Set_Temporary_Basal(20, true, false);
+ assertEquals(20, packet.temporaryBasalRatio);
+ assertEquals(packet.PARAM15MIN, packet.temporaryBasalDuration);
// over 100% should last 15 min
- setParams(150);
- assertEquals(150, temporaryBasalRatio);
- assertEquals(PARAM15MIN, temporaryBasalDuration);
+ packet.setParams(150);
+ assertEquals(150, packet.temporaryBasalRatio);
+ assertEquals(packet.PARAM15MIN, packet.temporaryBasalDuration);
// test low hard limit
- setParams(-1);
- assertEquals(0, temporaryBasalRatio);
- assertEquals(PARAM30MIN, temporaryBasalDuration);
+ packet.setParams(-1);
+ assertEquals(0, packet.temporaryBasalRatio);
+ assertEquals(packet.PARAM30MIN, packet.temporaryBasalDuration);
// test high hard limit
- setParams(550);
- assertEquals(500, temporaryBasalRatio);
- assertEquals(PARAM15MIN, temporaryBasalDuration);
+ packet.setParams(550);
+ assertEquals(500, packet.temporaryBasalRatio);
+ assertEquals(packet.PARAM15MIN, packet.temporaryBasalDuration);
// test setting 15 min
- setParams(50, true, false);
- assertEquals(50, temporaryBasalRatio);
- assertEquals(PARAM15MIN, temporaryBasalDuration);
+ packet.setParams(50, true, false);
+ assertEquals(50, packet.temporaryBasalRatio);
+ assertEquals(packet.PARAM15MIN, packet.temporaryBasalDuration);
// test setting 30 min
- setParams(50, false, true);
- assertEquals(50, temporaryBasalRatio);
- assertEquals(PARAM30MIN, temporaryBasalDuration);
+ packet.setParams(50, false, true);
+ assertEquals(50, packet.temporaryBasalRatio);
+ assertEquals(packet.PARAM30MIN, packet.temporaryBasalDuration);
// over 200% set always 15 min
- setParams(250, false, true);
- assertEquals(250, temporaryBasalRatio);
- assertEquals(PARAM15MIN, temporaryBasalDuration);
+ packet.setParams(250, false, true);
+ assertEquals(250, packet.temporaryBasalRatio);
+ assertEquals(packet.PARAM15MIN, packet.temporaryBasalDuration);
// test low hard limit
- setParams(-1, false, true);
- assertEquals(0, temporaryBasalRatio);
- assertEquals(PARAM30MIN, temporaryBasalDuration);
+ packet.setParams(-1, false, true);
+ assertEquals(0, packet.temporaryBasalRatio);
+ assertEquals(packet.PARAM30MIN, packet.temporaryBasalDuration);
// test high hard limit
- setParams(550, false,true);
- assertEquals(500, temporaryBasalRatio);
- assertEquals(PARAM15MIN, temporaryBasalDuration);
+ packet.setParams(550, false, true);
+ assertEquals(500, packet.temporaryBasalRatio);
+ assertEquals(packet.PARAM15MIN, packet.temporaryBasalDuration);
// test message generation
- setParams(260, true, false);
- byte[] generatedCode = getRequestParams();
- assertEquals(3 , generatedCode.length);
- assertEquals((byte)4 , generatedCode[0]);
- assertEquals((byte)1 , generatedCode[1]);
- assertEquals((byte)PARAM15MIN, generatedCode[2]);
+ packet.setParams(260, true, false);
+ byte[] generatedCode = packet.getRequestParams();
+ assertEquals(3, generatedCode.length);
+ assertEquals((byte) 4, generatedCode[0]);
+ assertEquals((byte) 1, generatedCode[1]);
+ assertEquals((byte) packet.PARAM15MIN, generatedCode[2]);
// test message decoding
- handleMessage(new byte[]{(byte) 0, (byte) 0, (byte) 0});
- assertEquals(false, failed);
- handleMessage(new byte[]{(byte) 0, (byte) 0, (byte) 1});
- assertEquals(true, failed);
+ packet.handleMessage(new byte[]{(byte) 0, (byte) 0, (byte) 0});
+ assertEquals(false, packet.failed);
+ packet.handleMessage(new byte[]{(byte) 0, (byte) 0, (byte) 1});
+ assertEquals(true, packet.failed);
- assertEquals("BASAL__APS_SET_TEMPORARY_BASAL", getFriendlyName());
+ assertEquals("BASAL__APS_SET_TEMPORARY_BASAL", packet.getFriendlyName());
}
}
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_History_EventsTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_History_EventsTest.java
new file mode 100644
index 0000000000..0abf2166a9
--- /dev/null
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_History_EventsTest.java
@@ -0,0 +1,98 @@
+package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+
+
+import android.content.Context;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+
+import info.AAPSMocker;
+import info.SPMocker;
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.db.DatabaseHelper;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload;
+import info.nightscout.androidaps.plugins.Treatments.TreatmentService;
+import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
+import info.nightscout.utils.SP;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Created by Rumen on 31.07.2018.
+ */
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({SP.class, MainApp.class, ConfigBuilderPlugin.class, Context.class, NSUpload.class, TreatmentsPlugin.class, TreatmentService.class, DatabaseHelper.class})
+public class DanaRS_Packet_APS_History_EventsTest extends DanaRS_Packet_APS_History_Events {
+
+ @Test
+ public void runTest() {
+ AAPSMocker.mockMainApp();
+ AAPSMocker.mockApplicationContext();
+ AAPSMocker.mockSP();
+ AAPSMocker.mockBus();
+ SPMocker.prepareMock();
+ SP.putString("profile", AAPSMocker.getValidProfileStore().getData().toString());
+ AAPSMocker.mockConfigBuilder();
+ AAPSMocker.mockStrings();
+ PowerMockito.mockStatic(NSUpload.class);
+ AAPSMocker.mockDatabaseHelper();
+ DanaRS_Packet_APS_History_Events testPacket = new DanaRS_Packet_APS_History_Events(System.currentTimeMillis());
+ // test getRequestedParams
+ byte[] returnedValues = testPacket.getRequestParams();
+ byte[] expectedValues = getCalender(System.currentTimeMillis());
+ //year
+ assertEquals(expectedValues[0], returnedValues[0]);
+ //month
+ assertEquals(expectedValues[1], returnedValues[1]);
+ //day of month
+ assertEquals(expectedValues[2], returnedValues[2]);
+ // hour
+ assertEquals(expectedValues[3], returnedValues[3]);
+ // minute
+ assertEquals(expectedValues[4], returnedValues[4]);
+ // second
+ assertEquals(expectedValues[5], returnedValues[5]);
+
+ // test message decoding
+ testPacket.handleMessage(createArray(50, (byte) 0));
+ assertEquals(false, failed);
+// testPacket.handleMessage(createArray(50, (byte) 1));
+// assertEquals(true, done);
+
+ assertEquals("APS_HISTORY_EVENTS", getFriendlyName());
+ }
+
+ byte[] createArray(int length, byte fillWith){
+ byte[] ret = new byte[length];
+ for(int i = 0; i 1U/hr
+ double basal120 = byteArrayToInt(getBytes(createArray(50, (byte) 120), 2, 2)) / 100d;
+ DanaRS_Packet_Basal_Get_Profile_Basal_Rate testPacket = new DanaRS_Packet_Basal_Get_Profile_Basal_Rate(1);
+ byte[] params = testPacket.getRequestParams();
+ assertEquals((byte) 1, params[0]);
+ testPacket.handleMessage(createArray(50, (byte) 0));
+ assertEquals(0.0d, testPacket.pump.pumpProfiles[1][1],0);
+ testPacket.handleMessage(createArray(50, (byte) 1));
+ assertEquals(basal01, testPacket.pump.pumpProfiles[1][2],0);
+ testPacket.handleMessage(createArray(50, (byte) 5));
+ assertEquals(basal05, testPacket.pump.pumpProfiles[1][1],0);
+ testPacket.handleMessage(createArray(50, (byte) 12));
+ assertEquals(basal12, testPacket.pump.pumpProfiles[1][1],0);
+ testPacket.handleMessage(createArray(50, (byte) 120));
+ assertEquals(basal120, testPacket.pump.pumpProfiles[1][1],0);
+
+ assertEquals("BASAL__GET_PROFILE_BASAL_RATE", getFriendlyName());
+ }
+
+ byte[] createArray(int length, byte fillWith){
+ byte[] ret = new byte[length];
+ for(int i = 0; i 4 should return fail
+
+ assertEquals("BASAL__GET_PROFILE_NUMBER", packet.getFriendlyName());
+ }
+
+}
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Get_Temporary_Basal_StateTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Get_Temporary_Basal_StateTest.java
new file mode 100644
index 0000000000..385aa70e53
--- /dev/null
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Get_Temporary_Basal_StateTest.java
@@ -0,0 +1,49 @@
+package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import info.AAPSMocker;
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.utils.SP;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Created by Rumen on 01.08.2018.
+ */
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({MainApp.class, SP.class, L.class})
+public class DanaRS_Packet_Basal_Get_Temporary_Basal_StateTest {
+
+ @Test
+ public void runTest() {
+ AAPSMocker.mockMainApp();
+ AAPSMocker.mockApplicationContext();
+ AAPSMocker.mockSP();
+ AAPSMocker.mockL();
+
+ DanaRS_Packet_Basal_Get_Temporary_Basal_State packet = new DanaRS_Packet_Basal_Get_Temporary_Basal_State();
+
+ // test message decoding
+ packet.handleMessage(createArray(50,(byte) 0));
+ assertEquals(false, packet.failed);
+ packet.handleMessage(createArray(50,(byte) 1));
+ assertEquals(true, packet.failed);
+
+ assertEquals("BASAL__TEMPORARY_BASAL_STATE", packet.getFriendlyName());
+ }
+
+ byte[] createArray(int length, byte fillWith) {
+ byte[] ret = new byte[length];
+ for (int i = 0; i < length; i++) {
+ ret[i] = fillWith;
+ }
+ return ret;
+ }
+}
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Basal_RateTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Basal_RateTest.java
new file mode 100644
index 0000000000..4ac4e2e76e
--- /dev/null
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Basal_RateTest.java
@@ -0,0 +1,61 @@
+package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import info.AAPSMocker;
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.utils.SP;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Created by Rumen on 01.08.2018
+ */
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({MainApp.class, SP.class, L.class})
+public class DanaRS_Packet_Basal_Set_Basal_RateTest {
+
+ @Test
+ public void runTest() {
+ AAPSMocker.mockMainApp();
+ AAPSMocker.mockApplicationContext();
+ AAPSMocker.mockSP();
+ AAPSMocker.mockL();
+
+ // test message decoding
+ DanaRS_Packet_Basal_Set_Basal_Rate packet = new DanaRS_Packet_Basal_Set_Basal_Rate(createArray(24, 5));
+ byte[] requested = packet.getRequestParams();
+ byte lookingFor = (byte) ((5 * 100) & 0xff);
+ assertEquals(lookingFor, requested[24]);
+ lookingFor = (byte) ((500 >>> 8) & 0xff);
+ assertEquals(lookingFor, requested[25]);
+ packet.handleMessage(createArray(3, (byte) 0));
+ assertEquals(false, packet.failed);
+ packet.handleMessage(createArray(3, (byte) 1));
+ assertEquals(true, packet.failed);
+
+ assertEquals("BASAL__SET_BASAL_RATE", packet.getFriendlyName());
+ }
+
+ double[] createArray(int length, double fillWith) {
+ double[] ret = new double[length];
+ for (int i = 0; i < length; i++) {
+ ret[i] = fillWith;
+ }
+ return ret;
+ }
+
+ byte[] createArray(int length, byte fillWith) {
+ byte[] ret = new byte[length];
+ for (int i = 0; i < length; i++) {
+ ret[i] = fillWith;
+ }
+ return ret;
+ }
+}
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Cancel_Temporary_BasalTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Cancel_Temporary_BasalTest.java
new file mode 100644
index 0000000000..bd6f870ef3
--- /dev/null
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Cancel_Temporary_BasalTest.java
@@ -0,0 +1,49 @@
+package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import info.AAPSMocker;
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.utils.SP;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Created by Rumen on 01.08.2018.
+ */
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({MainApp.class, SP.class, L.class})
+public class DanaRS_Packet_Basal_Set_Cancel_Temporary_BasalTest {
+
+ @Test
+ public void runTest() {
+ AAPSMocker.mockMainApp();
+ AAPSMocker.mockApplicationContext();
+ AAPSMocker.mockSP();
+ AAPSMocker.mockL();
+
+ DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal packet = new DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal();
+
+ // test message decoding
+ packet.handleMessage(createArray(3,(byte) 0));
+ assertEquals(false, packet.failed);
+ packet.handleMessage(createArray(3,(byte) 1));
+ assertEquals(true, packet.failed);
+
+ assertEquals("BASAL__CANCEL_TEMPORARY_BASAL", packet.getFriendlyName());
+ }
+
+ byte[] createArray(int length, byte fillWith) {
+ byte[] ret = new byte[length];
+ for (int i = 0; i < length; i++) {
+ ret[i] = fillWith;
+ }
+ return ret;
+ }
+}
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Profile_Basal_RateTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Profile_Basal_RateTest.java
new file mode 100644
index 0000000000..06024f93b6
--- /dev/null
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Set_Profile_Basal_RateTest.java
@@ -0,0 +1,64 @@
+package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import info.AAPSMocker;
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.logging.L;
+import info.nightscout.utils.SP;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Created by Rumen on 06.08.2018.
+ */
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({MainApp.class, SP.class, L.class})
+public class DanaRS_Packet_Basal_Set_Profile_Basal_RateTest {
+
+ @Test
+ public void runTest() {
+ AAPSMocker.mockMainApp();
+ AAPSMocker.mockApplicationContext();
+ AAPSMocker.mockSP();
+ AAPSMocker.mockL();
+ DanaRS_Packet_Basal_Set_Profile_Basal_Rate packet = new DanaRS_Packet_Basal_Set_Profile_Basal_Rate(1, createArray(24,1));
+
+ // test params
+ byte[] testparams =packet.getRequestParams();
+ // is profile 1
+ assertEquals((byte) 1, testparams[0]);
+ // is value 100
+ assertEquals((byte) 100, testparams[3]);
+
+
+ // test message decoding
+ packet.handleMessage(new byte[]{(byte) 0, (byte) 0, (byte) 0});
+ assertEquals(false, packet.failed);
+ packet.handleMessage(new byte[]{(byte) 0, (byte) 0, (byte) 1});
+ assertEquals(true, packet.failed);
+
+ assertEquals("BASAL__SET_PROFILE_BASAL_RATE", packet.getFriendlyName());
+ }
+
+ byte[] createArray(int length, byte fillWith){
+ byte[] ret = new byte[length];
+ for(int i = 0; i>> 8), testparams[9]);
+
+ // test message decoding
+ packet.handleMessage(createArray(34, (byte) 0));
+ assertEquals(false, packet.failed);
+
+ packet.handleMessage(createArray(34, (byte) 1));
+ assertEquals(true, packet.failed);
+
+ assertEquals("ETC__SET_HISTORY_SAVE", packet.getFriendlyName());
+ }
+
+ byte[] createArray(int length, byte fillWith){
+ byte[] ret = new byte[length];
+ for(int i = 0; i bolusConstraint = new Constraint<>(0d);
when(MainApp.getConstraintChecker().applyBolusConstraints(any())).thenReturn(bolusConstraint);
+ when(MainApp.getConstraintChecker().applyExtendedBolusConstraints(any())).thenReturn(bolusConstraint);
Constraint carbsConstraint = new Constraint<>(0);
when(MainApp.getConstraintChecker().applyCarbsConstraints(any())).thenReturn(carbsConstraint);
Constraint rateConstraint = new Constraint<>(0d);
diff --git a/build.gradle b/build.gradle
index a1277215f5..40012866a3 100644
--- a/build.gradle
+++ b/build.gradle
@@ -8,7 +8,7 @@ buildscript {
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.1.3'
+ classpath 'com.android.tools.build:gradle:3.1.4'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
diff --git a/crowdin.yml b/crowdin.yml
new file mode 100644
index 0000000000..6bf9a2cfdf
--- /dev/null
+++ b/crowdin.yml
@@ -0,0 +1,5 @@
+files:
+ - source: /app/src/main/res/values/strings.xml
+ translation: /app/src/main/res/values-%two_letters_code%/strings.xml
+ - source: /app/src/main/res/values/insight_alerts.xml
+ translation: /app/src/main/res/values-%two_letters_code%/insight_alerts.xml
diff --git a/gource/sample.bat b/gource/sample.bat
new file mode 100644
index 0000000000..48033f0651
--- /dev/null
+++ b/gource/sample.bat
@@ -0,0 +1,2 @@
+gource -1024x768 --stop-position 1.0 --highlight-all-users --hide-filenames --seconds-per-day 0.08 --max-file-lag 0.1 --output-framerate 60 --output-ppm-stream output.ppm -logo c:\github\androidaps\logo\notif_icon.png c:\github\androidaps
+"c:\program files\ffmpeg\bin\ffmpeg" -y -r 60 -f image2pipe -vcodec ppm -i output.ppm -vcodec libx264 -preset ultrafast -pix_fmt yuv420p -crf 1 -threads 0 -bf 0 aaps.mp4
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index b4740f44a7..c25a2b3e46 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
diff --git a/logo/androiaps.eps b/logo/androiaps.eps
new file mode 100644
index 0000000000..42262c55dc
Binary files /dev/null and b/logo/androiaps.eps differ
diff --git a/logo/androiaps_tshirt.pdf b/logo/androiaps_tshirt.pdf
new file mode 100644
index 0000000000..2c911543bc
--- /dev/null
+++ b/logo/androiaps_tshirt.pdf
@@ -0,0 +1,4922 @@
+%PDF-1.5
%
+1 0 obj
<>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>>
endobj
2 0 obj
<>stream
+
+
+
+
+ application/pdf
+
+
+ androiaps
+
+
+ 2018-07-27T11:39:31-04:00
+ 2018-07-27T11:39:31-04:00
+ 2018-07-27T11:39:31-04:00
+ Adobe Illustrator CC 22.0 (Macintosh)
+
+
+
+ 256
+ 168
+ JPEG
+ /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAqAEAAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FUBrm
uaXoemTanqc4t7SAVZz1J7Ko6sx7AYqxLR/zn8o6lqMFi8d5pzXZpa3F7CsUMhOw4uHfr2rTFUV5
h/NfytoOsXGj3i3UmowLGwggh9QyGUBgse43CmprTFUX5R/MTy/5ouLi0sxPa6ha7zWF4ginC9OQ
UM4IB677d8VSnUPzq8nWepT2UaXl6lqeNze2kIlt0INDV+QJoe4FMVYz5H87aLpd1588xXEzz6U2
owvC8SliyzPIqFVbj2I602xVl1l+bnli8vlhhgvvqLF6aw9sUsqIpZmMrEMFop3K4ql6/nt5LM6h
ob9LJn9Mak1uPq1a9a8+f/CVxVG+Y5fLV1528pTS3939bnE0mmJaODayKED8pT4MNhx699sVXa9+
bvlXR9Yk0gx3d/eW/wDvULKESrEQKkOSy/Z78a0xVj3kPzFpmrfml5r1ezueWmS2NrIsz1RVWOKM
PyDU48GDVr74gWqYy/nz5IS5dFiv5rKN/TfVI7etqD/rFg//AAmZw0GSul9zHiZ5DqumzaaupxXM
bac0fri75D0/Tpy58ugAGYZgQardkwI/n15IFwQIr9rBZPTOqi3rag1p9rl6n/CVzM/k/JXS+5jx
Mw1jzZoGk6Adeu7tf0XwV454/wB4JOf2BHxry5dsxoYZSlwgbsrY/oX5veVtW1WDS2hvdNurs0sh
fweisx7CNgzjftWmXZNHOIvY13Itm+YiUE+uaLHfjTn1C2TUGpxs2mjExr0pGTy7+GT8OVXRpWr/
AF3Q9OLLqGo21myKruJ5o4iFckKx5kUDFTT5YxxylyBKtXPmDQbVYGudStYFugGtjJPGglB3Bj5M
OQPtiMcjyBVHqwYBlNVO4I6EZBXYq7FXYq7FXYq7FXYq7FXYq7FXYq8x/OpY4rjyrqF/EZdCs9SV
tUHEugUlOJdADUUVh+HfFUN+dPmryXfeRZLaG9tb++neJtOW3kSVkZXBZ/hLcB6fJd+taYqh/wAv
D9Z/NO6urj97cnQLGT1W3bm8Ftyavia4pVvzAs5m/NXRxYLxvr7SNQhBWil3FrcenU+Iam+KFf8A
KPzN5R0ryLHYX13baZqFk841S2uWWGUyeox5Mr8Wf4OK9O3HtirAJrSI/l5511axtzb6LqOqwfos
FeAMUc7EcV/lAkA/Dtir0r81NMu3/KU2ulxERW0Vq0sEQ/494uJIAHZKBj7DFV2pec/y7k/LSaOK
7tPqT2Bhg0wuhmD+nxSL0ftc1em/Hb7XTfFWGeW7W9tdS/KyG9Vkn9O+fi/2hHI7vF1/4rZcUp1+
TWsaDodlrGl65cQ6b5iivZHvzeOkLyLQcWDvx5KDy2r3r3xQx28sZdab8yNV8r27NplxDDFbyxKQ
szpJHJdemABy5BHbb+YeOZOkIGUEoPJnPlrzp+W8P5aWkc15aJYw2Kw3mmOyeqX4UljMOzuzvy3p
8XXLcuDKcp2N3zQCKed6df3X/QuWpxiRgiX4t0FekTTRSFfpZjmbKI/Mj3I6PRLTzp+W6/lgiG7t
FsFsPQfTC6et6np0aL0ftFy/fjv9rpvmEcOXxuRu+abFMZ0nTtC/5UjpOn+dL2TSobu5ZtMuOLl4
nZ3eFqAN8JXk29BxPUbHL5yl45OMXQ3Xpui7XzXruiea/L+lX2vaf5x0/UpxDDLEkX1u2LURZaxF
gB8f2iTUBsicUZQkREwI+RW3qWpa9pen3ljp9zcrDfaozx6fGys3qPGvJh8IoKVHUjNfHGZAkDYc
2TxC3m8mJ5Dv9I1ezMv5iyyTo6PA7ahJqDyMYJI5ePLj9k7NSlfHfakZPEEon939lMOjK9L8vw6h
+aMUfmO0iv7u18t2jSi4RZU+s+rxd6NyUmvKhzHnkrD6TQ4ymt0CJPI2k+bfMtv53tIfWleMaMLi
2MsR08RhY4rQBWClWqCEpvk/3koROM+/fr5qyf8AJW9nufIkCS+oEtbi4t7dZSTIsKSHgjE/yA8f
alMx9dEDJ7wmLO8xEuxV2KuxV2KuxV2KuxV2KuxV2KqN5Z2l7ay2t3ClxbTKUlhkUMjKexBxVILX
8tfIdrDcQw6LbKl0pSaqlmKkg8QzEsoqB9k4qmtn5f0Wyvnv7SzigvJIUtnmQUYwxABE+SgAfQMV
VJ9G0ufU7bVJrZH1GzV0trkj40WQUYA+4xVKtX/L7yXrF/8ApDUdJguLw05TEMpamw58Cof/AGVc
VTK80DRbzSf0Rc2UT6XxRRZ8QsYWMhkAVaUoVHTFUcqIqBFUBAKBQKAAbUpirGk/LPyCmofX10O2
Fzy5D4T6fKta+lX0/wDhcVTq60bS7u/tNQubaOW9sOf1OdhVo/UFG4/MYql2u+RfKOvXC3OraXDd
XCgATGqOQOgLIVLAeBxVNdP06x06zisrC3S1tIRxigiUKqjr0HidziqSr+XXkZdUOqDRLX68W9T1
OG3OteQT7Aau9aZf+ZyVVmkUx78zvJyL+W2oaR5Z0wBnninFnaruzGZWdlUf50y7S5v3olMoI2Tv
/lW/kq5ng1C90S1fUFVWkkKbM9BUuo+BzXuwOVfmcg2BNJpP9R0vTtSs3stQto7q0kFHglUOhp02
PcdjlMZmJsHdKUaH+X/kzQrw3ulaTDbXZBAnHJ2UN14ly3GvtlmTUTmKJ2RSfNFG7KzIGZDVGIBK
kilR4bZTaW+C8g9ByAoGpvQ9q/RirdBWtNzsTirEta8laxd6ncXul+ZbzS47zj9ZtQkdwgKrw5W5
lqYGK90zJhniBRiDX4+KKTvy35fsPL+i2ukWAb6taqQGc8ndmJZ3Y/zMzEnKsuQzkZFITLK1dirs
VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV
dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd
irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVY752vTbWNsFuGhaadY440klieZyDwjDwhnHJq
VpTbMzR4+KR25C+hrz3dd2nmEIAXRkaG5Fk8hcd2P22q6udTtYX1aN7mGCFr7jK3poGtg1eAT05C
/wAUlajqtOlMy5YocJPDsSeHbz+Y7vm67HqMviRiZgyjEce/9Huqje5+SFXWb8afNMdTP1aaeFLF
BcTvLNNSaqc+AdEZxGtFoCFboa5PwBxAcO4B4thsNvn1+Yahq5cBlx+mRAj6pby9XlYBPCNttied
ou31bU31K0jOpq81vFE15IJZBEvK3VvsBBFMWDM9fde4pkJYocJPDtL6dh3++x3fNuhqMhnGPHZg
Bxbn+aOlcMrsn5dQhI9a1EWU0jaiWhnmhSyRbidpJpis4ZQ4jV0QuEHw0HwN0NazOCNgcO4B4ths
NvPfr82kauXCZcfpkQI+qW8vV1qwLobUPSetou21PVW1TTbf9KJLdwi3N1GJ34CEhS5ZQgSVmjb7
RpUsOhAyEsUOGUuH0m626/o3+5tjnyGcICYOSPDxeo8tr6VI0fLcjkQEJba3qLWU9xHqga1mMKW7
yTzc5pvjLFOUfKNGdW+yKFVptk5aeNiJj6hd7DYfPf8Aa149ZLhMxP0SoRuUt5b+Vxs3y2ocleDU
9Ye+0u0/SCtqKek0kInm9NYDc0PqVQLK7R8Y/wB5uS3ZqHBLHCpSr0G+g519m++33Jjmy8UMfF+9
FEjilXDxddvUSKj6t7N80PFr90LG5uZNaH1OQxolx60gaSU8iTGDHWIFgxou3EBdupJ0wsREfV7h
y+e6I66oynLIPDNAGzufl6evlQCJTUda+uaTbDUVN7+7ZoDPKVW3N0VrIeAErsnCIepuSTsG3yJx
46lLh9HuHPh+zezt9zKOXLeOHH+851xH6ePrt6jVR9W92eajZ67cyWN7efpitm6xqtwZ5QXbkeTI
jR1hHLl9ntRTSlcM9OARDh9XdQ/Xv0Ri1txlk4/3dDe5c/cR6d7+FDoqRalrX1vSrY6kBf8AJWe2
9eUqlv8AW3UiQsn7x+HpxD1N68ujb4nHjqUuH0d9Dnw/Z1O33Jjmy3CHH+851xH6eM89tzVR9W/P
rupxa5fPBd3Y1RRpzxqPrJnmDO5YUaNWj/dLX1D8I3HEe+J042jw+u+VDl89+n2ojrJerJxjwq58
Utz7iPT/ABcueypDqmrm70q2bUQL+qs9sJ5CiW5unX94zJ+9fh6cQ9TevKtG3wHHCpS4fR30OfCP
l1O33bJjmycUIcf7znXEdo8R5mvUa4Y+rfn13U2167EN7dS6so0x4wpuUnmMjOZF3iUR/uusn2P8
kGmxyX5YbREfXfKh+vfpz82J1pAlkMx4NcxKV3Y5Ctv4uXkzTyq142hW5vJBJccpgxEjS8QJnCIX
cBmZForct6jffNbquHxDw8tvLo7rQcfgjjNy3631NCzuaG2+/em2Y7mOxV2KuxV2KuxV2KuxVbLL
HFG0krrHGg5O7EBQB1JJwgWgkAWWEax+bmgWcjRWMUmoOv7akRxV8AzAk/8AA5n4uzpy3PpdLqO3
sMDUQZn7Pn+xHeV/zAstZ0y/vLiE2Z01DNdKCZB6YVm5KQFJ2Q7UyGfRShIRG/FybtH2rDNjlMjh
4BZ67fgJTpX51eWbu69C7hmsEZqRzyAOlO3Phuv3Ee+ZmXsTLEXEiTgaf2mwTlUgYefMfFn0FxBc
QpPbyLNDIA0cqEMrKehBGxGaeUTE0di9FCYkAYmwV+Bk7FXYqx7zqyR6dDK44iOQsbjk6CJQjc2+
AGvw1oD396Zl6OzKh1df2iRGHEf4d7322N8vx8aY1ZXti19YMNOdIryGE/VDJKxdmtYxz+zRqfBH
8RFeJPUb5s8cqkOL6Cd9v5x/afi6zDngZQPAR4gG1n+YN/uG9XRPPmFW8sDbXieiWlsXhklvTLMf
RjaK4FAWUMxCB6eLP/Nk+CVxP8+9tt94/j4dzV4uOpCv7qjxXLb0z+J2v3mX85G2t1ZDUrF/qLKt
7FFWzMkzeo3oIpkoV4noqfHSvAnqKZXKEuGQv6L327/xy72/HlgJwPD/AHgG1y/mjfl7hvV1fMIS
O4sDY3imFg9k0Dve+rMfRQxXA48itWKxhvmZB+1kzGVg39d7bb7x/T93c1eJj4ZAj+6o8Vy29Mvn
tfv4u9GWt/ZG+0q5SxKw3X1ZTDzlYvIwWNZaMo5Ku3xPSvDxAyEsUqlG/pvu99f2d7bDPAGExH+8
4e/maF8um25qxH3IO2uLBbO8tWtWEtosD8lknb6qvBgIwSv2hGQm27M1Dk5RmSJX9V92/n8/uasc
8YEoV/diJ/i9O3Ll/N223N0URHqdik+kXX1Vo45pIYWUyTAzSi5dA4UruAQ0p5btsG7ZE4ZHijfI
E9NtvwPuZDVQHhz4a4pCPM7niIv75b7nYHopW8tqLe5t1sSr26wvDWSUi2WnERElabIwjPGu9Q3T
DIS2lf1X3b+fz3XGYbw4fo4SOfp8uXdttfUFf+krET6Pcm1cJK8MRUvNWeQXTrzoVFVFHlPLrsG7
Y+DL1RvkCem3pH7B9yPzUP3c+E+oiP8AFueIi/vlvz2B6LbWW0Fre2f1Nla3WFokMs3+jAMKRk8a
fCvFDxrUgq22CQlYnf1X3b+f494ZYzCpY+E+jhPOXp8vuG19QWrfUNPrpF0lmwhnliirzlDXDi7m
Ak4ldx9uZuXiA3Y5KWKXqhfIE9NvSP2D7mENTjrHkEfrIHX1euW/L+tM37j0biubNTe2K2jBokSS
EepP/ooVlAiYlaAcWVPh60KnYYDGVCd89um/n+PIso5IcUsQj9IB5y9NVty8wNudGJ2DVvqGnctI
vEtWWK4kjhDmSYNcOt3OoanGtPtyty/mUNtQ4ZYZeqF8hfTb0j9g+5jDU4/RkA+siP8AF6vXLy/r
S376Pe3FNZ+re2UVk/rRqkkNXmCWwSWMCMsVpQBlBC/ykNtgIlQmTz26b7H8faGUZw4pYhE+kAj6
qjRG1/Ecu4g7Mx8n3UNz5etpoVIjLTKGZmYuUmdTJVwG/eEc6HpXNfq8ZhkIPl936HbdnZhkwiQ5
b/ZIi/jzTnMZznYq7FXYq7FXYq7FXYq8U/MDzlc67qLabYMx02J+EaR1PryA05EDqK/ZH05vtHpR
jjxS+r7njO1e0JZ5+HD6B/sj+OTtT/LuXSfKU2sahKVvgY+FolOKB3C/G29Woe3T3xx63jy8MeXe
ubsg4tOckz69tu7dNfyaiimfWYZVDxSRRJIjCoZW5ggj3GVdpkjhIcn2eiJeIDuCB+ld5t/Je1aG
S78uO0cygt+j5W5I1O0cjfEp/wBYmviMv0nbRusvz/W19oezMaMsB3/mn9B/XfvDFfy7883nlrVB
p9+zDSppOFzC9awPWnqAHpQ/bHh75n9o6GOeHFH6xy8/x0dT2P2pLS5OCf8Adk7j+ae/9b34EEVH
TOQfRHYq7FWOedome1sXWQho7pGEIM3700PFT6CuxHKlQVofnTMzRyoyHePLb5uu7SgSIkHlK69W
/wDpb6+VJDbJEdYDDVzIl3BDyu63BCk2ihV4kekvIAyVZqnnvvQnKkTwVw/STtt/O+fl8HBx0cl8
diYjv6v5ny/pXf8AFXOrBei36MQC/b1YLqExWZa8HqM6ygFmZDKVMntxpHxJrUizj9RNbSB39Pl8
OX324/hngAEjcJDa573xda4qv4ejhvnQ21iQ6qjjVGeO7iiLXRNzVOVqqhOLD01qF5Hm3Kriu/Gt
cieGuHeJO23878fL3uRjiDk4uPaYG/q29PKuQ5Xub9VHerBxWznTlQX7PNb3ELR2rNeASl1mUOzM
jSkF67UIpHxJrUiwz9RNbSB39O3L4f8ASVuOMR4BES9UJA1c974utGXP3j0cJ6lG2kUQ120mGqSO
LqO3/eFrmi1jVOHFh6aluKish5fHuK8a1zJ8Mx4R6b7v7fl3N+OMRmE+M1MR/nbbAVXIchz3uVHe
rA21q40n0RqJ5W0lu8I53n+kD96hlZioajMWfioIoAGPGhy2WQcfFw7SB/m7cv7P2tGPCfDEePeB
iec/V9Qu698qFjYAnh3Rtuqpq+nXA1Bm9VIFYsbqkR+sBWi4leILMFi/eEMN+Va5VK+Ax4eV92+3
P9O3wb4kDLGfFtIAfxbeqqrlzqO9Eb3aXxWcY0eSFtUkZbZ4mUh7wG4X44zJz48t+Rk4oCBsGPGj
Zccvr4uEb3/N25H9n7dnGGD91wGZ9JB5z9Q3F3V/0qFgbWeHdMEYLq2mXI1IkyJDHICLqkP+lFTG
FIKhi/GH95QgV5ddqCDwSjw8rPTfb9W+3wcoTHiQycexAH8W3qqq77qPqoje/ILa2iDRrm1OqOfR
MRWTldkzqGKGTmQG+Ldvg5AVFarTLZZP3glw87/m7fjz+9phhvCcZmbFb3Pfervnvz2sDbnGrXh2
1TTLk6mxkYRpKv8ApQWGl2ytGF40rz4Q/vKEBTyrXaB+iUeHz6b+n9Vnb4NkT+8jPjO9D+Lb11VV
31H1VVb2oQWarpFxaNqT/uRGUfneEzoG4epyKhq0q/wcgOQrVKVnLL6+Ph5/1dvxy3+9rjg/dHGZ
mxXWe4urvn57WBY/hpXhP+5XTLn9JFmlRElX/SgION06lBHx/nKw1lIICmtQdoEeiUeHlv039Pf9
u3ezjL97HJxbEAfxen1kcq76j6qrh3veg62qLpl5aS6o5jhCMlHuw88aScS/PiTUg1/d8gOQrVaV
n4nrExH/AHOxr8c+7va44axHGZnbznchdXf6rqxzjVzny07Po0LNKJX5ShyA4CsJWDRgSUf92fg3
8M1eojUyPd936ebvdJPixg3fPv7ztvvtyTPKXJdirsVdirsVdirsVSLzzqT6d5U1G5jJWUx+lGR1
BlYR1Hy5VzI0kOLIA4PaWY48EpDnX37PN/yk0aK916W+mXkmnoGjB6erISEP0AMfnm17RymMKH8T
znYOnE8pmf4PvLPPzOjkk8mX3BS3ExM1OwEq1Oa7QGsod72zEnTSry+8MX/JWKTnq0vE+mRCgbty
+M0zL7UP0j3us9nIn1npt+l6jmoeneG/nRoMNh5hg1CBAkepxs0ijas0RAdv9kGU/Opzq+xc5njM
T/D9zwPtLpBjzCcRQmPtHP8AR8Xpn5bapJqPkvTZpTyliQ27nqf3LFFr7lADmj7SxCGeQHLn83qe
xM5yaWBPMbfLb7mTZgO1dirHPO8d1JY2qQw+pE8/G5YJNIyRFG5lfq7I4JWoG9K0HeuZmiMQSSdw
NuXP4ut7TEjGIAsGW+0jtRv6d/d57Mdt9KvF1aBP0SqR20Ef1GGl1Qf6LHy9RzJ6TfvF40cE0QBv
2TmZLMOD6t5H1fT3nyvl9/vddDTHxR6KEIjg+r+aOZvhO4rff079ChF06+GnTSLptfrUyJqM3pX4
YwCKccUjaX1Q3pvxqCByfi3TllniR4q4vpHp3jzsdarn9g27mkYZ+GTwXxyqe2T6al0u7rbuuVHl
aLtdMvP0pbg6UI/q8EYsoeN0FA+rx1MjmX0j+8Uji45UQBt+JyuWUcH1fUfV9PefK+Xd3+9ux6Y+
IPRXBEcH1/zRzPFXMVvv6RfMINbG/GmzO+mEC6ljTUJxFfFjEIpwEjjMvqqeDhCwIFZCD0JyzxI8
VcX0j07x52OtUe/4NAxT8OzD6yBM1k+mpco3Y2IBPK5G+Vo600q9/TFlC+lqllbi3ktEC3YIdVVh
I7mQp8Lq5IerfCoPVTlU8w4CeL1Su/p/V3Vy82+GlkcsYmA8OHCY/Xz2Nk3WxvY77C+YQFvp9+dO
nnOlf6VM0EWokxXqhY/TZTFEhl5fDRI+SfCN61TLpZIifDxemNmO8effy953+9x4YZnHxcHrnQnt
PlRFAXe20bG3X6UZb6VP+kNMtpNL46fH6MsMYW8DmQzs5kkf1OI41eQrJUqSoNa7VSzemUhL1mwf
p5V3V7ht5t+PTHjjDg/diiPrvi4rsm/ealy2QkFhra6fPOumRpqEjRJdlo70RoAhXgiCUtRWVIy0
fwhR3SmWnJj4hHiPAOX0/q9536+bTHDmGMzjADJIgSsTrlXK+8AWNq33im+j+Xo7rU7S3u9OEWm2
dut3bM31pJGufrEhVizOw2DFykh5DkOozHy6giBkJeuRo/Tyofixts5WDRCWSMJQ/dQiJj674+I+
fxIO44u5vyhoouTd/pSw9KeVE+scBdRKrrT4E9WRhRePGqUFF7qVyOrzcNCB2HL6T9w+/wC9n2dp
uISOSNSlz+ofDc+Vbd3cQsv9BW112w0+DTfU0eBoJbfe6dzcGaV2d5RJwpHzdv3ld2HUHaUNReMz
Mv3hsH6eVDpXXbl3MMmjEc0cYheKNSH1XxcUjzvpud+8fArh07U/qV1dnTFGqOEjuCYr0RxluAZU
T1TVQyKvKPYKtd0Iy85IcQjxegbj6fvrz5Hv73FjgycEsnB++lsdp0LocuLyAuPQX9KIh0qb65pV
u2kldOjMUtupW89RpvrMz+pI3qkJRWZ6SklS/cVpWc3plLi9ZsH6eVDy+G3c2x01zhAw/dxqQ+u+
Lilvz27/AFcuLrujvKeiLc3lzNqenGK7ZAJpVF1CisGQ8I/UkKmhiAqn8u3wsMr1efhAjCXpH9U/
cPPr397f2dpOKRnkjWQjf6wOmws1/COXd3EMw0zTLLTLKOyskMdtEWKKzM5q7F2JZyzGrMTuc1+X
LLJLilzdxgwQxQEICoj489+qKytudirsVdirsVdirsVYp+aETyeTLwrX920TMB4eoo3+/MzQH96H
VdtRJ00vh97GPyUlQTavCT8brA6j2QyA/wDEhmX2oNon3/odZ7OHeY/q/peosqspVgCp2IO4IzUP
UMK/MDzgPJlhZxaXZQ+teNJ6aFeMKLHxLkrGUJJ5imbTs7RfmZEyJqPzdF2x2kdFCIxxFyv3Cq7q
7078meZP8ReX7fUzEIJXLpNECSA6MRsTTYihzF1um8HIYXbndm638zhGSqP6nn358zxmTRbcEGRR
cSMO4VjGF+/ic3PYMTUz7v0vN+1khxYx1HF9vD+pkn5N/wDKExf8Z5v+JZg9s/3/AMA7X2b/AMVH
9Ys4zVO+dirGPPhVrKygMLXDzXKrHD6QmjLcWKtKrPGvBT8RJ2/XmboR6ibqh318vN1fashwRjXF
xSrlxD/OFjYdWM2pT9J25N1NIbCCET37wGr0tEYJC5kqp4Sb8l+05r1BzOl9JND1k0L/AKR5iu/7
nWY/7wCyfCAuRjz9A+k3tsd7H8SEBRbKVXWQG8nhWDTxbAKsiC4pPPGZiCvJeVSfsxioIAOT4dxy
9INm/wCrsDX4JaeOokkH95IAR4eRHH6pDi5bXf8ANiOgtGW3pjULb99Ky6fHEst60B5Hjaxtwicy
l0okm4ZTu5B8crl9JNfXyF+Z57d46dzfjHriLP7oC5cP9EfSeKxseo/iQkBQWcnwyBr2aEW9ibZV
CsiXNJ50aYqRVS27dI12pQ5ZKO4G3oBs3/V2G34JaIT9JNEHIQBHh5ECfqkOLyv3RHRFWYjbVtPi
WeVp7D6sJr1rduIVRGwgjYyHgWWQJShPxNWoNchP6ZSoVO6F+/c7d4v5NuPfJGAJ4sfDcuHbbhPC
DexINd+5QtqymzaaP1guoG3S1tPq1XdyskizzKJm59GlO9d1rUZOUd+E16LJN+4UNvcGqGT08Y4v
3vCIjh60TxS9W/WXfy5pvb6DdnWrTS0mP1vS0jna+NuRAkQuPU9CBvUPAshVONPshhUg5TLNHgOS
tp7Ve91zO2/f76cqGll4kcN+rHUuLh9NcV8MTe21D+raF1XTV0eS6gmkkuvrJijSC2haSSVgryF5
v3tWNQznoQxB3GHDPxQK2qzZPw229zHUw/LmRNy4qAEY2TsTvvv1PvKf+XbT6hrw06fncXlvYsfr
KRFLaOOS5LLDGS7cduICU2C9cxdTLjhxjaJlyvflz/b5udooeFl8KVylGF3VRAMvpG+3Sh3BF+Xv
Ld1pV/czvPHLDMgQBUZZGIIPOVizcmLFm6bFj9FefUCcAK3H42+z5N+l0csWSUiQQR3b/E3vvZ+J
S7XbE6n5xtre3Lx3VpHBcyXLxF40iSVmMaOHHF5SB+z0B3INMvwS8PCZHkbFXvdc/cHF1cPF1MYR
sSjwyutqvkDexPu5JVqumTaXNeLLM1yksaotvbW/OWZqqwaT96CzL8TdqF67jbLsMxkAAFUeZOw+
z3fJxtTilhlKRPECK4YxuR9/q3rc9PqvdbPp0tpq+naZLOWu7P0pXu1gb6vHE93JIkMNJax1+FQK
Gip3WoyQyAxlkraVir3vhG523/WWBwmOSGEn1QqXFw+kDjJER6vT0H9WPdsyfQ/LV7pmrz3bXccl
rLGYxCsZWRm5KyvK5ZuTfb7dWOYObURnjEa3v8V9nydrp9HPHmM+IcJFVW/Tcm9/4v8ATFkOYbsX
Yq7FXYq7FXYq7FXYqhdW06LUtMurCXaO5jaMnw5Cgb6Dvk8czGQkOjVmxDJAwPKQp4XoepX3lDzT
yuIzyt2aC8hH7UZO9K9ezL47Z0OWAz49uvJ4fTZpaPP6hy2Pu/G4e7adqNlqNnHeWUqzW8oqrr+o
+BHcHOdnAxNHm9ziyxyREomwXlv59/8ASi/6Ov8AmTnQdgfx/wCb+l5L2s/yX+d/vU4/K/U7DS/y
7+vX8ywWsM0zPI3z2AHUk9gOuY3amKWTU8MRZIDm9hZ4YtFxzNRBLynzn5ml8x6/PqLKUhoIrWJq
VSJK8QadySWPuc6DRaYYcYj16+95HtLXHU5jk6ch5D8bvYPyb/5QmL/jPN/xLOb7Z/v/AIB7T2b/
AMVH9Ys4zVO+dirH/OtBpsTNEsiJJyc+mJXACMCI1JX4nB4d+uZej+qr/Hm4HaJAx2RdeVnl08zy
+KQWtzqh1Ownk0uKO5aCJZYhCFWMfV15F2LVj+J2UChoq0PUHMuUI8MhxbAmt/Pp3/rLr8eTJxwJ
gBIgcW3L09e7c7c9hvzQSSzrp97bjTVW0glhf1RbBWc+lKGjgUMeRCqkfWo5kH4d8sMd4ni9Ru9/
Mc/tPw72gTIjOPB6IVXp57S2jvvsBHyuuSOt5r9dWsJG02JbgwxK8awKFjUQipkbmfSNWIA3oqjx
ByqUI8MhxbWa38+ne5EMkxOB4BxEC9uXp67+nntz2FdbQcbSJpt7GdNRLWGSF/UW2VWZvSmDRwLy
+KiqkY8ObDplhHqieL1G738xz+0/BpEqjMcHpjVenmaltHffaoj3kckbaz3/AOktKuP0ZGk7LbRS
QLAFZUpxMjnkxj9NXYhd6CnjXK5QjwyHF6Rdb/i7bYZJ8WOQh6jwgiqod532qya3+12lW+o+rcWR
0tYeElq8lwbXiscinmBFRm5LFVVWmy7kVGDLIUJcW5vr9/v+1lp4SMpQ4KA4d+Ha+fp334dgO7dl
KBv8SyNSNV+qKuyj1JKSV3avRK9CP2swSf3fx/H48naAfvidvp+J3/R+lT1zTuULSWlvGbqeaEyz
tH6jL6ZHB6Df4CB8uuHDko7naijUYQRsBZI6d3I/BUUN/iZzSNV+qAcgv7x6SV3cHolfskftbd8B
/u/j+Px5JA/fXt9PxO/6P0pplLkpUA/+KC1I0UWYWvGskn7wmhevSOuwI/a275ff7v4/j8eTjV++
vb6fid/0fpa1rTlaGSW2t42u55IfUmaP1CvpsOD8ep4EDp0644shB3O2658II2AskdL5cj8Eq8zL
eJr2n3EVgLlOcEaOIfVPL1HZmd6jiIkrx8C1RXcZkaajCQMq5nn+Of6HC13FHLGQjxWYj6b6nn3A
Dl3E+8MrzAds7FXYq7FXYq7FXYq7FXYq7FWJeePIVt5hj+tW7C31SNeKSH7EgHRZKb/I5m6TWHFs
d4uq7S7MjqBY2mPt97zKKDzv5UvikKXFrI5pRF9SKSnToGRv15ticOYb0XmYw1WllQEh9oP6E9/O
aHU7nRfLt9cwFHSOQXoA2jmmSJuJ603RvuwdiSiJziD3V7hbk+00Zyx4pkd9+RPDt97CdA8p+bPM
SQ21nFKbCMlkmmLLbRlj8TKTtU034gnNrqNXhw2ZEcX2uh0nZ+o1IAgDwDqfpHf+AyD8xfIUHlvQ
9JNojTkPMNRvqULSOI/TBG/FfhbiP4nMPs7XnPkle3Kh87dj2z2SNLix8IvnxS89q/TT0H8o7W4t
/JNr66GMyySyoGFCUZqA0PjTbNP2vMHOa6U9H7PQMdJG+pJZlmsd47FWN+d7eKW1sXIrPDciSAFI
5FDBG+JhI8QAT7VeXbfauZmjmQSO8V+Obre0sYlGJ6xlY2B+8jlz5/Yxq0Ty+dThnjkl+q3cEIec
xRiQkWcaj4+fPisZjqFQ0ZzvQ7ZsvE4aPOBPfX1H9vXkHW4vBMxIE1kA6C/oHndVw8hsZc6OwRLX
S/0eYST9ds54ZI4xBAIYwY5z6zxrNwUKfVckvtxXbhSszOfFfSYI5m+m3L3Dl172gYsYhw/xYyDy
jw8pb1xUP4jz2obcNWNs4tB/SMEyNJ9WvIYfVcxxCUMLaNKBw9eKp6YoiEAud6H4a5nJwkdYE99c
z5e/mejkYRh4xIcsgHSN/SBzvkPTyBoy50dgkVnpQsDCrMlzZzQywI0MHpIpjuP3josoQFaSyFiw
pxXYr1sOSfFfSYI5m/4fL3D4nq0jDiEOHkcZieUa5S3I4q/nHmKoGq5nPl/RtLu9Ygv7MSALBBLL
O0UdecaIPSEqu3HYJ8KrT7QDGppjajNOMOCXQnr9tfP7NnN0emxzyeLEc4xN0O4bXflHYbc9zbLb
fT3j1O7vnl5/WFjSOMKF4JGOhavxVYk+1c15ncQO528cdTMr5qUWiW8evzawvH1p4Ft2BX4xxatQ
9ehoKqR2qKb1sOcnGIdAbao6UDMcvUxr8H9Hl77McocpAJo9uuuyawKGeS2W1IK7hVfn8LV6HuD4
ClN63HMfD4Ol24w00RmOXqY8P23+PxY/KXJS4aJbDX21rY3D262267gK5aqtXvXcEdhSm9b/ABz4
fh9LtxRpY+N4vXh4ft/F/D4mOUOUg9T09r1LdBL6SRTpNIAoYuI6kKCfs/FQ8vbJwnw37mrLj463
5G0ZkG12KuxV2KuxV2KuxV2KuxV2KuxV2KuZVYEMAQeoPTFSHYq4gEUPTFXYq7FXYqxrz4sh0y3Y
uiWizj64sn1ajR8W+D/SvgHM/DUbitdxXM3QkcR/nVtz5/B1fat8A3qHF6r4eXd6tt+XxSKLT7+P
XreNxZiYwRfUEC2YWEC1APp0Hrf3iSH4RSlKbcqZRyA4/wCLmeL6t/V16cq/FOFHDIZgDw3Q4Po2
9PT+LmDy2qul0AW0uRo8swa2EAuYxqDFdN5yqEkKxPx/cj+8jTc8t2I+Ggy3jHHW/L0/Xty3HXoT
8g44xzGK7j9Q49sdkUfSf4esY9/MjbZNtK0q9PmC0eaG3lWKGB4PTjs+MMPoovwlB6orIJD8Pw/Z
47csx8uUeGQCbJN/Vub+XKvPnbmafTy8YEiJAEeHaGwocv4ud8tuVdUf5u0WCCxibTrSCGOa4Qah
FHFaqZ0EbrEh9cBD+8ZV8aE08Mr0uayeInYeneW3ybu0NMIxBxxAuQ4qEfUKND1bc6865Ijy3pOr
2epSyXJWGyFtDHBaxxQIgIUVHKMBuSOrkr9j4/h75DUZYSgK3lZs2fx3eezPR6fLDKSTWPhFRAjX
Tu3sG9uXq2ZJmE7R2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV
2KsZ89TPHb6eI1pLJc8Vn9RIxF+7YtJ+8SSvADlQCu30Zm6KIJkT0Hz8vi6vtTIYiAjzlKrsCtjv
uDdc6Qlr5VsxpdlqEE9wY4bWOQ2x9PlLwgRVVnClh8CAfDt1p1NbDqiZyiQPUefdu1w0EY44SiZV
GPLbegKvbuHRi6zr9U+scZHubqWGPn61uY7ZVjunEodYuBbizy0ArupB7ZnGO/D0iCeR9X07c/g6
kZTwiVHiyED6o+kVM8QIjR2uVe73Ms8klFuLi3ggYW8EFsqXEjxl2Jt4j9hFXipWgFCVJU0pmBrB
YEid5E7fE/j4u37NNEwA9MRHexf0jpWw9xI2LI77T4bw25kJH1aUTIKAgkKy0IIPZzmFCZjfm7PJ
jEqvobRWQbHYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FW
O+d7gQ6dbqZAvqzqgg5iJpm4krGrEftNToQf1HM0cLkfIfLzdd2lk4YDfmdhdWegvzTDTJr3/Dlt
NdzJ9cFqrTXAIZOfp1L1UUIrvsMqyiPiERHpvZv08pjDEzPq4RZ865sa8t3F3daZrZQR3loIg9lH
6yyF5qScviUDgDxRR7gnrXMzURjGUAdpX6tum3z6ut0mSc4ZDGpwr0+q7O/y6D4X3p15ag1Qxx3e
oS+q8ltAqOjIyMAgJ3ULVufJuQ2IbMXUyjZEeVlz9HHJwiUzZ4R9367+ae5jOa7FXYq7FXYq7FXY
q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUFqmk2+oxxrK8kbQsXjkibi
wYqV7gj9ruOu/XLceUwuurTmwDJV3t3K0dlbR2S2Sp/oyx+iEJJ+CnGhPXpkOM3xdWYxjh4elUgr
Ly9Z2drcwRSzlrmP0nnd6yhQGA4tTahdm6dSTlk85kbNNOLSxhEgE7ir6/j9KYWttFbW0VvFX04l
CLUkmgFNyepyqUrNt8YiIAHRUwMnYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7
FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F
XYq7FXYqg9U1nS9Kihl1G5S1juJkt4WkNA0sleKD3NDiqMxV2KrZZY4o3llcRxxgs7sQFVQKkkno
Biqhp2pafqVol5p9xHd2klfTnhYOh4kqaEbbEUxVbq2r6bpFjJf6lcJa2cXESTSdAWIUdPEnFUUr
KyhlIZWFVYbgg9xireKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvObr8y/
Mup6neW3krQBrFlpz+nc6jJKIoncCrJFy4Vp7E18KblVd/yt6B/JWra2lg0Wr6K8UOoaPOxVo5JZ
liHx8a8dz+zXYjFUHN+aPnmLT08wv5QZPLJCyNKZ1Nx6LU/e8BQ8ab7rSnem+Kpv5j/NKxtLLSho
Nq+s6triLLptilVPpt1eQ0PGhBFPY9KE4qwP8yfNfmS9tNG0fzHoTaRf/pO2uoJklSe3lRFdHAZS
eLKZF2qfo7qsuuPzO8x3XmXV/LmgeXhf3+nSUWZ7hY4hGoAZ5OQXfmfhUHf6MVWS/md5rmuo9C0z
y6t35ohVn1W2W4U29sOVEBl2ViykMfi2rTc1oqjNF/MRtR/SuheZdIOm61Z2kk82nu/OK5gCHn6b
0pv0pvt0J3oqlmkfmHoXl/8ALXR9QsNIENxqck0Wm6HbOzmSVJ2jc+owZyKgHoTuBirHfzR82+cZ
/JkuneZfLjaX9ckia1vIZkmi5I4f05Apbg3EGlTv4YqzPXfzFvNPu7Dy15b0ttb8wvbRyzW4cRxQ
RlAQ0rnbevcjtvuMy8OmBjxyPDFBKv5U/MW/vNfbyz5n0ltD14x+rax8xLDcIAS3puNqgA9CRsd6
7Y5dMBHjgeKKgteavzGv7TzAvljyxpR1vXlQS3aFxFDboQCvqOdqkMD1A3G9TTHFpgY8czwxUlU8
ofmFealrU3lvzFpbaJ5hij9aO3LiSKePu0TjbbwBPz2NBm04jHiieKKgpfd/mV5pvtc1XT/Kflwa
rBok31e/uJbmOAmVSyskaN7oaHfp06ZYNNARBnKuLki2Y+WNbuNa0eG/udOuNKuHLLLY3alZEZDQ
0qF5Kf2WoK5i5YCMqBtkE1ytXnv5h/mdN5X1/TLCKynlt/RvL/VZVt3kX6pa2zNWNwQPhmeP1G6K
uKqvl780tNXylBf+ZmksdUtdIg1bVoXt5IqJIzRFo0YfEDKhAA8V8cVTS/8AzM8n2JnWW7eSSD6o
ohghlmklkv0aW3ihSNWaWRo0LlVBou5oMVUz+afk8aOupmef47o2C6d9Wn+v/XAvI2/1Th63qcfi
px6b9MVaf81fJSaENbe6mW1+uDTZIfq0/wBajvDWlvJbcPWWTbYFd9vHFVl1+avlm1gt2nt9TS7u
I3uP0b+jrtryK3jcxtPNbrGXii5A0ZgAe1cVdqf5teTbG5trZZLq/mvLGPVLddPtLi7rZSsyLOfR
RuKAoa16YqidQ/MrylZ6dpd8tzLfLrSGTSraxglu7idFXk7JDCrvRAfiJG3Q74qk+tfnFoNoPLNx
pyTahp+vXUsEssNrdSyRLDFIXX0o4y/rLKiqYyOVORptiqex/mH5Uku7GzF2Rc6jfXWl20TI6sbq
x5CdGBA404bE9ajxxVLrj83vJMUNtLFPc3n1qGS6SOztLm5kW1jkaI3MiRI5jiLIeLN9obiuKtar
+YdjbXsFxZ3cV5pk2iXOsQ28ME0s06wtFwkjkjqAtJN14lu/bFUH5c/Mp9d0vyZfhksJNflaG7tJ
ra4rJIlo8zLbO3ABAy1Eh5Kw2BxVF6X+cPknU761tbaW7WO9uDZWt9LZ3MVnJdBivoLcOgiMhK7C
u/TriqKuvzS8nWurzaZLcT/6LOtneagttO1jBcuVCwzXaoYUergbtsdjTFWB+RfONh+XVreeVPNM
E1rdW9w81rcRxmRLiOQDiy8fHjt921MVYlrGo3eqr+YepSWctkt3BYTJbSqVYRm6gMTOPFoxy+/F
Xt+oRE/lpcwshqdGdDGRv/vKRSmKvJ/L4vvLlr5N88T2kl1o1vYS2F8Yl5SwB7idll4n9kiUb/R3
GKp35j8xWn5l6zoejeW4JZrOxu477UtSeMxrFGmxUchWtCdu5p17Kp5+XEbL+YP5gFlIrdWtCRTY
iY/qIxVKYdYT8u/PvmCfX4JBo/mOVbmz1OJDIoZSzGJgort6p99ulDiqgl3L5485XnmnS7aSPQ9I
0m4s0uZl4tcTSRS7Rr7er9FN/tUxSkmmWGqWfkfyJ5utrR7620GW8a+tU3cRS3b/ALxV9qHf5Hpi
hOvO3nXT/wAw9Mt/KvlOCa8vbyWOW4mljMcdvHGalnY/w/XtiqrfXo/Lv8yr7WtYhll0DXbaGCPU
o15mGWCNFKOBuAeHTwpStDmyhHxsIjH6o9GPIpdqnnCHzT+avk680q1uF0yCWWKC/kiaMXBpym4V
FSiKRX5nLIYfDwzBO6L3do/nO28sfml5yu9Ttpn0ueeOK41CKNpRbuAxiD8akK4DdPDGeE5MMAOa
3um2i6ofPf5qad5j0e2kXQPL9vLDJfzL6frSzRyLwQddvUrTtvWlRlc4eFhMZH1STzKR+adW/LOT
X9TudUi1fyl5lhdwLi05o9xQ0SUBeS/FSv7Nf5u+W4oZeEAcM4oNPRvyl1DzHqHkizufMAkN4zOI
ppgVllgr+7kcEDcjoe4oe+YWsjEZCI8mQZjmKl5l+YP5Or5r1nUtSWdYZLzTEsIC0twDHM0w9eXi
rcKNbqqBaUJ+0DiqM81flFpmr3vln6my2umaK5iv7Ji8gurESR3K27FixYC4t42ox6V+WKpBb/kV
d2/lG0sBqMdzrljqX6QiuLgzejNHHB9SgglaFopVC2ioOSGoYd6mqqYWv5W63YxWGq6Z+jLHzLp+
oTXsca/W5rOWKe2+qtHNJPJJM0np/wC7FC+HHFVS0/LbzVLqM+p6vfWUl5da9Ya3KtskiRLHZW4g
MKhuRLUUUY/apU06YqiPPP5aahq/mlPMeltazTPZrYXVjfSXcMZEUjyRzRy2jo4YGUhlYEEeB3xV
MvK3kN9D8wQain1aO1i0O00gW1ssiqssE808jRiRpWEbet8IZydt8VSHQ/yx80+XLPQbnRr+ym1j
R4dRs547tJfq01rf3n1pFVk+ONoiqj7Jr0xVXP5a+Y7bSNOnstRtH8z2mt3Gv3Ek0Ui2Ust4ssc0
KojGRECTfCak1FT1xVLvNX5J32raz5g1ay1NbO5vkgn0XZiLO/5wNdzAU6TizjBp4tiqcr5C8yaB
qi3Xky7sYbebTbTSrm31GOV/TFgHWCaIxEVPGVuSNQHrXFUJ5S/KfUNIbQlvr6K4i0vRb3R7n01Z
S5u7hZVZK7BVRSKfdiqpoX5ceY7S28m22oXtnJH5PuZfRkgWVWntPqbW8XJX5cZeTfFQ8adMVVLH
8sb+2/LvSvK7XUEl3p2qR6kbriwTimpm+IXbkG9NuHz9sVeeedv8SRWXmryHob+qutajPLbWU9hd
G9LXsyyy+nMB9Va3LuW9d3qi7EVpir6GZEYqWUEqaqSK0PSoxVvFXYq7FVscUUSBIkVEHRVAA+4Y
quxVp0R0KOoZG2KsKg/QcVbVVVQqgBQKADYADFXYqtSKKMsURULnk/EAVJ7mnfFW2RXUq4DKdipF
QRireKsQ8o+UdR0fzZ5s1W6eJ7XXJreW0VCS4WIScvUBAA/vOxOZObMJQiB/CgBlyoqKFQBVGwUC
gAzGS08UTlS6KxQ1QsAaHxFcNquwK7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq//Z
+
+
+
+ uuid:d6916827-33fd-484e-9513-f8064b0ae656
+ xmp.did:9f74d324-0e2f-490d-a3c9-8c0617bc5686
+ uuid:5D20892493BFDB11914A8590D31508C8
+ proof:pdf
+
+ xmp.iid:0297eb24-1bbe-4975-9a15-49d9391df7d1
+ xmp.did:0297eb24-1bbe-4975-9a15-49d9391df7d1
+ uuid:5D20892493BFDB11914A8590D31508C8
+ proof:pdf
+
+
+
+
+ saved
+ xmp.iid:0297eb24-1bbe-4975-9a15-49d9391df7d1
+ 2018-07-27T11:39:25-04:00
+ Adobe Illustrator CC 22.0 (Macintosh)
+ /
+
+
+ saved
+ xmp.iid:9f74d324-0e2f-490d-a3c9-8c0617bc5686
+ 2018-07-27T11:39:30-04:00
+ Adobe Illustrator CC 22.0 (Macintosh)
+ /
+
+
+
+ Print
+ False
+ False
+ 1
+
+ 297.000000
+ 210.000000
+ Millimeters
+
+
+
+ Cyan
+ Magenta
+ Yellow
+ Black
+
+
+
+
+
+ Default Swatch Group
+ 0
+
+
+
+ White
+ CMYK
+ PROCESS
+ 0.000000
+ 0.000000
+ 0.000000
+ 0.000000
+
+
+ Black
+ CMYK
+ PROCESS
+ 0.000000
+ 0.000000
+ 0.000000
+ 100.000000
+
+
+ CMYK Red
+ CMYK
+ PROCESS
+ 0.000000
+ 100.000000
+ 100.000000
+ 0.000000
+
+
+ CMYK Yellow
+ CMYK
+ PROCESS
+ 0.000000
+ 0.000000
+ 100.000000
+ 0.000000
+
+
+ CMYK Green
+ CMYK
+ PROCESS
+ 100.000000
+ 0.000000
+ 100.000000
+ 0.000000
+
+
+ CMYK Cyan
+ CMYK
+ PROCESS
+ 100.000000
+ 0.000000
+ 0.000000
+ 0.000000
+
+
+ CMYK Blue
+ CMYK
+ PROCESS
+ 100.000000
+ 100.000000
+ 0.000000
+ 0.000000
+
+
+ CMYK Magenta
+ CMYK
+ PROCESS
+ 0.000000
+ 100.000000
+ 0.000000
+ 0.000000
+
+
+ C=15 M=100 Y=90 K=10
+ CMYK
+ PROCESS
+ 15.000000
+ 100.000000
+ 90.000000
+ 10.000000
+
+
+ C=0 M=90 Y=85 K=0
+ CMYK
+ PROCESS
+ 0.000000
+ 90.000000
+ 85.000000
+ 0.000000
+
+
+ C=0 M=80 Y=95 K=0
+ CMYK
+ PROCESS
+ 0.000000
+ 80.000000
+ 95.000000
+ 0.000000
+
+
+ C=0 M=50 Y=100 K=0
+ CMYK
+ PROCESS
+ 0.000000
+ 50.000000
+ 100.000000
+ 0.000000
+
+
+ C=0 M=35 Y=85 K=0
+ CMYK
+ PROCESS
+ 0.000000
+ 35.000000
+ 85.000000
+ 0.000000
+
+
+ C=5 M=0 Y=90 K=0
+ CMYK
+ PROCESS
+ 5.000000
+ 0.000000
+ 90.000000
+ 0.000000
+
+
+ C=20 M=0 Y=100 K=0
+ CMYK
+ PROCESS
+ 20.000000
+ 0.000000
+ 100.000000
+ 0.000000
+
+
+ C=50 M=0 Y=100 K=0
+ CMYK
+ PROCESS
+ 50.000000
+ 0.000000
+ 100.000000
+ 0.000000
+
+
+ C=75 M=0 Y=100 K=0
+ CMYK
+ PROCESS
+ 75.000000
+ 0.000000
+ 100.000000
+ 0.000000
+
+
+ C=85 M=10 Y=100 K=10
+ CMYK
+ PROCESS
+ 85.000000
+ 10.000000
+ 100.000000
+ 10.000000
+
+
+ C=90 M=30 Y=95 K=30
+ CMYK
+ PROCESS
+ 90.000000
+ 30.000000
+ 95.000000
+ 30.000000
+
+
+ C=75 M=0 Y=75 K=0
+ CMYK
+ PROCESS
+ 75.000000
+ 0.000000
+ 75.000000
+ 0.000000
+
+
+ C=80 M=10 Y=45 K=0
+ CMYK
+ PROCESS
+ 80.000000
+ 10.000000
+ 45.000000
+ 0.000000
+
+
+ C=70 M=15 Y=0 K=0
+ CMYK
+ PROCESS
+ 70.000000
+ 15.000000
+ 0.000000
+ 0.000000
+
+
+ C=85 M=50 Y=0 K=0
+ CMYK
+ PROCESS
+ 85.000000
+ 50.000000
+ 0.000000
+ 0.000000
+
+
+ C=100 M=95 Y=5 K=0
+ CMYK
+ PROCESS
+ 100.000000
+ 95.000000
+ 5.000000
+ 0.000000
+
+
+ C=100 M=100 Y=25 K=25
+ CMYK
+ PROCESS
+ 100.000000
+ 100.000000
+ 25.000000
+ 25.000000
+
+
+ C=75 M=100 Y=0 K=0
+ CMYK
+ PROCESS
+ 75.000000
+ 100.000000
+ 0.000000
+ 0.000000
+
+
+ C=50 M=100 Y=0 K=0
+ CMYK
+ PROCESS
+ 50.000000
+ 100.000000
+ 0.000000
+ 0.000000
+
+
+ C=35 M=100 Y=35 K=10
+ CMYK
+ PROCESS
+ 35.000000
+ 100.000000
+ 35.000000
+ 10.000000
+
+
+ C=10 M=100 Y=50 K=0
+ CMYK
+ PROCESS
+ 10.000000
+ 100.000000
+ 50.000000
+ 0.000000
+
+
+ C=0 M=95 Y=20 K=0
+ CMYK
+ PROCESS
+ 0.000000
+ 95.000000
+ 20.000000
+ 0.000000
+
+
+ C=25 M=25 Y=40 K=0
+ CMYK
+ PROCESS
+ 25.000000
+ 25.000000
+ 40.000000
+ 0.000000
+
+
+ C=40 M=45 Y=50 K=5
+ CMYK
+ PROCESS
+ 40.000000
+ 45.000000
+ 50.000000
+ 5.000000
+
+
+ C=50 M=50 Y=60 K=25
+ CMYK
+ PROCESS
+ 50.000000
+ 50.000000
+ 60.000000
+ 25.000000
+
+
+ C=55 M=60 Y=65 K=40
+ CMYK
+ PROCESS
+ 55.000000
+ 60.000000
+ 65.000000
+ 40.000000
+
+
+ C=25 M=40 Y=65 K=0
+ CMYK
+ PROCESS
+ 25.000000
+ 40.000000
+ 65.000000
+ 0.000000
+
+
+ C=30 M=50 Y=75 K=10
+ CMYK
+ PROCESS
+ 30.000000
+ 50.000000
+ 75.000000
+ 10.000000
+
+
+ C=35 M=60 Y=80 K=25
+ CMYK
+ PROCESS
+ 35.000000
+ 60.000000
+ 80.000000
+ 25.000000
+
+
+ C=40 M=65 Y=90 K=35
+ CMYK
+ PROCESS
+ 40.000000
+ 65.000000
+ 90.000000
+ 35.000000
+
+
+ C=40 M=70 Y=100 K=50
+ CMYK
+ PROCESS
+ 40.000000
+ 70.000000
+ 100.000000
+ 50.000000
+
+
+ C=50 M=70 Y=80 K=70
+ CMYK
+ PROCESS
+ 50.000000
+ 70.000000
+ 80.000000
+ 70.000000
+
+
+
+
+
+ Grays
+ 1
+
+
+
+ C=0 M=0 Y=0 K=100
+ CMYK
+ PROCESS
+ 0.000000
+ 0.000000
+ 0.000000
+ 100.000000
+
+
+ C=0 M=0 Y=0 K=90
+ CMYK
+ PROCESS
+ 0.000000
+ 0.000000
+ 0.000000
+ 89.999400
+
+
+ C=0 M=0 Y=0 K=80
+ CMYK
+ PROCESS
+ 0.000000
+ 0.000000
+ 0.000000
+ 79.998800
+
+
+ C=0 M=0 Y=0 K=70
+ CMYK
+ PROCESS
+ 0.000000
+ 0.000000
+ 0.000000
+ 69.999700
+
+
+ C=0 M=0 Y=0 K=60
+ CMYK
+ PROCESS
+ 0.000000
+ 0.000000
+ 0.000000
+ 59.999100
+
+
+ C=0 M=0 Y=0 K=50
+ CMYK
+ PROCESS
+ 0.000000
+ 0.000000
+ 0.000000
+ 50.000000
+
+
+ C=0 M=0 Y=0 K=40
+ CMYK
+ PROCESS
+ 0.000000
+ 0.000000
+ 0.000000
+ 39.999400
+
+
+ C=0 M=0 Y=0 K=30
+ CMYK
+ PROCESS
+ 0.000000
+ 0.000000
+ 0.000000
+ 29.998800
+
+
+ C=0 M=0 Y=0 K=20
+ CMYK
+ PROCESS
+ 0.000000
+ 0.000000
+ 0.000000
+ 19.999700
+
+
+ C=0 M=0 Y=0 K=10
+ CMYK
+ PROCESS
+ 0.000000
+ 0.000000
+ 0.000000
+ 9.999100
+
+
+ C=0 M=0 Y=0 K=5
+ CMYK
+ PROCESS
+ 0.000000
+ 0.000000
+ 0.000000
+ 4.998800
+
+
+
+
+
+ Brights
+ 1
+
+
+
+ C=0 M=100 Y=100 K=0
+ CMYK
+ PROCESS
+ 0.000000
+ 100.000000
+ 100.000000
+ 0.000000
+
+
+ C=0 M=75 Y=100 K=0
+ CMYK
+ PROCESS
+ 0.000000
+ 75.000000
+ 100.000000
+ 0.000000
+
+
+ C=0 M=10 Y=95 K=0
+ CMYK
+ PROCESS
+ 0.000000
+ 10.000000
+ 95.000000
+ 0.000000
+
+
+ C=85 M=10 Y=100 K=0
+ CMYK
+ PROCESS
+ 85.000000
+ 10.000000
+ 100.000000
+ 0.000000
+
+
+ C=100 M=90 Y=0 K=0
+ CMYK
+ PROCESS
+ 100.000000
+ 90.000000
+ 0.000000
+ 0.000000
+
+
+ C=60 M=90 Y=0 K=0
+ CMYK
+ PROCESS
+ 60.000000
+ 90.000000
+ 0.003100
+ 0.003100
+
+
+
+
+
+
+ Adobe PDF library 15.00
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
endstream
endobj
3 0 obj
<>
endobj
7 0 obj
<>/Resources<>/Properties<>>>/Thumb 11 0 R/TrimBox[0.0 0.0 841.89 595.276]/Type/Page>>
endobj
8 0 obj
<>stream
+HWI-IܿS2;^\z$\#_]Q
+7}T9UѮE$IrՄwɸTx3atPWХ\qkJiTx_RrH:|
+P>*ϵJƓ'u)0g+{Wf O
+N[tl길]C)Ctsr zG%_SW^WV8]#7[Ƥ*Ŕ'9ǠKS%3(JݒY/9>̶| =خ%'h,<>XWT,Jc]45$Dq.w+TT/!M[c
+iLŷtIog
+'c[ 22\תM_,ϡEGaC앫H֙)5U*#v M-bGD`ysY_&{ZPs E5\P\l45kz\&8Lӏ_~Y/phذ_pow=XA=chLd%V(T|n9#@