Merge branch 'dev' into insight-artificial-end-delay

This commit is contained in:
Milos Kozak 2020-06-11 14:56:58 +02:00
commit b73196a8d1
151 changed files with 2132 additions and 1041 deletions

View file

@ -1,13 +1,10 @@
buildscript {
repositories {
maven { url 'https://maven.fabric.io/public' }
jcenter()
}
dependencies {
classpath 'io.fabric.tools:gradle:1.+'
classpath 'com.dicedmelon.gradle:jacoco-android:0.1.4'
classpath 'de.undercouch:gradle-download-task:3.4.3'
}
}
apply plugin: 'com.android.application'
@ -15,10 +12,8 @@ apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: 'com.google.gms.google-services'
apply plugin: 'io.fabric'
apply plugin: 'jacoco-android'
apply plugin: 'de.undercouch.download'
apply plugin: 'com.google.firebase.crashlytics'
jacoco {
toolVersion = "0.8.3"
@ -27,13 +22,12 @@ jacoco {
ext {
powermockVersion = "1.7.3"
dexmakerVersion = "1.2"
retrofit2Version = '2.8.1'
okhttp3Version = '4.6.0'
retrofit2Version = '2.9.0'
okhttp3Version = '4.7.2'
}
repositories {
maven { url 'https://maven.fabric.io/public' }
jcenter { url "https://jcenter.bintray.com/" }
mavenCentral()
}
@ -249,12 +243,9 @@ dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.google.android.gms:play-services-wearable:17.0.0'
implementation "com.google.android.gms:play-services-location:17.0.0"
implementation 'com.google.firebase:firebase-core:17.4.0'
implementation 'com.google.firebase:firebase-core:17.4.2'
implementation 'com.google.firebase:firebase-auth:19.3.1'
implementation 'com.google.firebase:firebase-database:19.3.0'
implementation('com.crashlytics.sdk.android:crashlytics:2.10.1@aar') {
transitive = true;
}
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.legacy:legacy-support-v13:1.0.0'
@ -265,12 +256,11 @@ dependencies {
implementation 'androidx.gridlayout:gridlayout:1.0.0'
implementation 'androidx.percentlayout:percentlayout:1.0.0'
implementation "androidx.preference:preference-ktx:1.1.1"
implementation "androidx.activity:activity:${activityVersion}"
implementation "androidx.activity:activity-ktx:${activityVersion}"
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'com.google.android.material:material:1.1.0'
implementation "io.reactivex.rxjava2:rxandroid:2.1.1"
implementation "io.reactivex.rxjava2:rxandroid:${rxandroid_version}"
implementation "com.j256.ormlite:ormlite-core:${ormLiteVersion}"
implementation "com.j256.ormlite:ormlite-android:${ormLiteVersion}"
@ -283,6 +273,7 @@ dependencies {
implementation "com.jjoe64:graphview:4.0.1"
implementation "com.joanzapata.iconify:android-iconify-fontawesome:2.2.2"
implementation 'com.madgag.spongycastle:core:1.58.0.0'
// Omnipod wizard
implementation(name: "com.atech-software.android.library.wizardpager-1.1.1", ext: "aar")
implementation("com.google.android:flexbox:0.3.0") {
@ -308,7 +299,7 @@ dependencies {
implementation 'com.eatthepath:java-otp:0.2.0'
testImplementation "junit:junit:4.13"
testImplementation "org.json:json:20190722"
testImplementation 'org.json:json:20200518'
testImplementation "org.mockito:mockito-core:2.8.47"
testImplementation "org.powermock:powermock-api-mockito2:${powermockVersion}"
testImplementation "org.powermock:powermock-module-junit4-rule-agent:${powermockVersion}"

View file

@ -407,6 +407,7 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_
, 'bg': bg
, 'tick': tick
, 'eventualBG': eventualBG
, 'targetBG': target_bg
, 'insulinReq': 0
, 'reservoir' : reservoir_data // The expected reservoir volume at which to deliver the microbolus (the reservoir volume from right before the last pumphistory run)
, 'deliverAt' : deliverAt // The time at which the microbolus should be delivered

View file

@ -49,7 +49,7 @@ import info.nightscout.androidaps.plugins.general.smsCommunicator.SmsCommunicato
import info.nightscout.androidaps.setupwizard.SetupWizardActivity
import info.nightscout.androidaps.utils.AndroidPermission
import info.nightscout.androidaps.utils.FabricPrivacy
import info.nightscout.androidaps.utils.LocaleHelper
import info.nightscout.androidaps.utils.locale.LocaleHelper
import info.nightscout.androidaps.utils.alertDialogs.OKDialog
import info.nightscout.androidaps.utils.buildHelper.BuildHelper
import info.nightscout.androidaps.utils.extensions.isRunningRealPumpTest
@ -174,6 +174,7 @@ class MainActivity : NoSplashAppCompatActivity() {
private fun processPreferenceChange(ev: EventPreferenceChange) {
if (ev.isChanged(resourceHelper, R.string.key_keep_screen_on)) setWakeLock()
if (ev.isChanged(resourceHelper, R.string.key_skin)) recreate()
}
private fun setupViews() {

View file

@ -37,7 +37,7 @@ import info.nightscout.androidaps.receivers.NetworkChangeReceiver;
import info.nightscout.androidaps.receivers.TimeDateOrTZChangeReceiver;
import info.nightscout.androidaps.services.Intents;
import info.nightscout.androidaps.utils.ActivityMonitor;
import info.nightscout.androidaps.utils.LocaleHelper;
import info.nightscout.androidaps.utils.locale.LocaleHelper;
import info.nightscout.androidaps.utils.sharedPreferences.SP;
public class MainApp extends DaggerApplication {
@ -69,7 +69,7 @@ public class MainApp extends DaggerApplication {
sResources = getResources();
LocaleHelper.INSTANCE.update(this);
sDatabaseHelper = OpenHelperManager.getHelper(sInstance, DatabaseHelper.class);
/*
Thread.setDefaultUncaughtExceptionHandler((thread, ex) -> {
if (ex instanceof InternalError) {
// usually the app trying to spawn a thread while being killed
@ -77,7 +77,7 @@ public class MainApp extends DaggerApplication {
}
aapsLogger.error("Uncaught exception crashing app", ex);
});
*/
registerActivityLifecycleCallbacks(activityMonitor);
JodaTimeAndroid.init(this);

View file

@ -5,7 +5,7 @@ import android.os.Bundle
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceScreen
import info.nightscout.androidaps.R
import info.nightscout.androidaps.utils.LocaleHelper
import info.nightscout.androidaps.utils.locale.LocaleHelper
import info.nightscout.androidaps.utils.resources.ResourceHelper
import javax.inject.Inject

View file

@ -9,7 +9,7 @@ import dagger.android.support.DaggerAppCompatActivity
import info.nightscout.androidaps.R
import info.nightscout.androidaps.interfaces.PluginBase
import info.nightscout.androidaps.plugins.configBuilder.PluginStore
import info.nightscout.androidaps.utils.LocaleHelper
import info.nightscout.androidaps.utils.locale.LocaleHelper
import info.nightscout.androidaps.utils.protection.ProtectionCheck
import javax.inject.Inject

View file

@ -52,6 +52,7 @@ import info.nightscout.androidaps.logging.AAPSLogger;
import info.nightscout.androidaps.logging.LTag;
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventNewHistoryBgData;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventNewHistoryData;
import info.nightscout.androidaps.plugins.pump.insight.database.InsightBolusID;
import info.nightscout.androidaps.plugins.pump.insight.database.InsightHistoryOffset;
@ -386,7 +387,8 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
old.copyFrom(bgReading);
getDaoBgReadings().update(old);
aapsLogger.debug(LTag.DATABASE, "BG: Updating record from: " + from + " New data: " + old.toString());
scheduleBgChange(bgReading);
rxBus.send(new EventNewHistoryBgData(old.date)); // trigger cache invalidation
scheduleBgChange(bgReading); // trigger new calculation
return false;
}
} catch (SQLException e) {
@ -1531,7 +1533,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
//add last one without duration
ProfileSwitch last = getLastProfileSwitchWithoutDuration();
if (last != null) {
if (!profileSwitches.contains(last))
if (!isInList(profileSwitches, last))
profileSwitches.add(last);
}
return profileSwitches;
@ -1541,6 +1543,13 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
return new ArrayList<>();
}
boolean isInList(List<ProfileSwitch> profileSwitches, ProfileSwitch last) {
for (ProfileSwitch ps : profileSwitches) {
if (ps.isEqual(last)) return true;
}
return false;
}
@Nullable
private ProfileSwitch getLastProfileSwitchWithoutDuration() {
try {

View file

@ -8,6 +8,7 @@ import dagger.multibindings.IntoMap
import info.nightscout.androidaps.skins.SkinButtonsOn
import info.nightscout.androidaps.skins.SkinClassic
import info.nightscout.androidaps.skins.SkinInterface
import info.nightscout.androidaps.skins.SkinLargeDisplay
import javax.inject.Qualifier
@Module
@ -25,6 +26,12 @@ open class SkinsModule {
@IntKey(10)
fun bindsSkinButtonsOn(skinButtonsOn: SkinButtonsOn): SkinInterface = skinButtonsOn
@Provides
@Skin
@IntoMap
@IntKey(20)
fun bindsSkinLargeDisplay(skinLargeDisplay: SkinLargeDisplay): SkinInterface = skinLargeDisplay
@Qualifier
annotation class Skin
}

View file

@ -3,10 +3,10 @@ package info.nightscout.androidaps.historyBrowser
import android.app.DatePickerDialog
import android.graphics.Color
import android.os.Bundle
import android.os.SystemClock
import android.util.DisplayMetrics
import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.RelativeLayout
import android.widget.TextView
import com.jjoe64.graphview.GraphView
import dagger.android.HasAndroidInjector
@ -15,12 +15,13 @@ import info.nightscout.androidaps.activities.NoSplashAppCompatActivity
import info.nightscout.androidaps.events.EventCustomCalculationFinished
import info.nightscout.androidaps.events.EventRefreshOverview
import info.nightscout.androidaps.interfaces.ActivePluginProvider
import info.nightscout.androidaps.interfaces.ProfileFunction
import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
import info.nightscout.androidaps.interfaces.ProfileFunction
import info.nightscout.androidaps.plugins.general.overview.OverviewMenus
import info.nightscout.androidaps.plugins.general.overview.graphData.GraphData
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventAutosensBgLoaded
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventAutosensCalculationFinished
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventIobCalculationProgress
import info.nightscout.androidaps.utils.DateUtil
@ -33,6 +34,7 @@ import info.nightscout.androidaps.utils.resources.ResourceHelper
import info.nightscout.androidaps.utils.sharedPreferences.SP
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.schedulers.Schedulers
import kotlinx.android.synthetic.main.activity_historybrowse.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
@ -49,7 +51,8 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
@Inject lateinit var resourceHelper: ResourceHelper
@Inject lateinit var profileFunction: ProfileFunction
@Inject lateinit var defaultValueHelper: DefaultValueHelper
@Inject lateinit var iobCobStaticCalculatorPlugin: IobCobStaticCalculatorPlugin
@Inject lateinit var iobCobCalculatorPluginHistory: IobCobCalculatorPluginHistory
@Inject lateinit var treatmentsPluginHistory: TreatmentsPluginHistory
@Inject lateinit var activePlugin: ActivePluginProvider
@Inject lateinit var buildHelper: BuildHelper
@Inject lateinit var fabricPrivacy: FabricPrivacy
@ -73,12 +76,10 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
historybrowse_left.setOnClickListener {
start -= T.hours(rangeToDisplay.toLong()).msecs()
updateGUI("onClickLeft")
runCalculation("onClickLeft")
}
historybrowse_right.setOnClickListener {
start += T.hours(rangeToDisplay.toLong()).msecs()
updateGUI("onClickRight")
runCalculation("onClickRight")
}
historybrowse_end.setOnClickListener {
@ -89,13 +90,12 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
calendar[Calendar.MINUTE] = 0
calendar[Calendar.HOUR_OF_DAY] = 0
start = calendar.timeInMillis
updateGUI("onClickEnd")
runCalculation("onClickEnd")
}
historybrowse_zoom.setOnClickListener {
rangeToDisplay += 6
rangeToDisplay = if (rangeToDisplay > 24) 6 else rangeToDisplay
updateGUI("rangeChange")
updateGUI("rangeChange", false)
}
historybrowse_zoom.setOnLongClickListener {
val calendar = Calendar.getInstance()
@ -105,7 +105,6 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
calendar[Calendar.MINUTE] = 0
calendar[Calendar.HOUR_OF_DAY] = 0
start = calendar.timeInMillis
updateGUI("resetToMidnight")
runCalculation("onLongClickZoom")
true
}
@ -114,12 +113,15 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
val dateSetListener = DatePickerDialog.OnDateSetListener { _, year, monthOfYear, dayOfMonth ->
val cal = Calendar.getInstance()
cal.timeInMillis = start
cal.set(Calendar.YEAR, year)
cal.set(Calendar.MONTH, monthOfYear)
cal.set(Calendar.DAY_OF_MONTH, dayOfMonth)
cal[Calendar.YEAR] = year
cal[Calendar.MONTH] = monthOfYear
cal[Calendar.DAY_OF_MONTH] = dayOfMonth
cal[Calendar.MILLISECOND] = 0
cal[Calendar.SECOND] = 0
cal[Calendar.MINUTE] = 0
cal[Calendar.HOUR_OF_DAY] = 0
start = cal.timeInMillis
historybrowse_date?.text = dateUtil.dateAndTimeString(start)
updateGUI("onClickDate")
runCalculation("onClickDate")
}
@ -143,24 +145,38 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
overviewMenus.setupChartMenu(overview_chartMenuButton)
prepareGraphs()
savedInstanceState?.let { bundle ->
rangeToDisplay = bundle.getInt("rangeToDisplay", 0)
start = bundle.getLong("start", 0)
}
}
public override fun onPause() {
super.onPause()
disposable.clear()
iobCobStaticCalculatorPlugin.stopCalculation("onPause")
iobCobCalculatorPluginHistory.stopCalculation("onPause")
}
public override fun onResume() {
super.onResume()
disposable.add(rxBus
.toObservable(EventAutosensCalculationFinished::class.java)
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ event: EventAutosensCalculationFinished ->
// catch only events from iobCobStaticCalculatorPlugin
if (event.cause === eventCustomCalculationFinished) {
aapsLogger.debug(LTag.AUTOSENS, "EventAutosensCalculationFinished")
updateGUI("EventAutosensCalculationFinished")
.observeOn(Schedulers.io())
.subscribe({
// catch only events from iobCobCalculatorPluginHistory
if (it.cause is EventCustomCalculationFinished) {
updateGUI("EventAutosensCalculationFinished", bgOnly = false)
}
}) { fabricPrivacy::logException }
)
disposable.add(rxBus
.toObservable(EventAutosensBgLoaded::class.java)
.observeOn(Schedulers.io())
.subscribe({
// catch only events from iobCobCalculatorPluginHistory
if (it.cause is EventCustomCalculationFinished) {
updateGUI("EventAutosensCalculationFinished", bgOnly = true)
}
}) { fabricPrivacy::logException }
)
@ -173,10 +189,13 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
.toObservable(EventRefreshOverview::class.java)
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
if (it.now) {
prepareGraphs()
updateGUI("EventRefreshOverview")
updateGUI("EventRefreshOverview", bgOnly = false)
}
}) { fabricPrivacy::logException }
)
if (start == 0L) {
// set start of current day
val calendar = Calendar.getInstance()
calendar.timeInMillis = System.currentTimeMillis()
@ -186,8 +205,16 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
calendar[Calendar.HOUR_OF_DAY] = 0
start = calendar.timeInMillis
runCalculation("onResume")
SystemClock.sleep(1000)
updateGUI("onResume")
} else {
updateGUI("onResume", bgOnly = false)
}
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putInt("rangeToDisplay", rangeToDisplay)
outState.putLong("start", start)
}
private fun prepareGraphs() {
@ -200,19 +227,28 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
secondaryGraphsLabel.clear()
history_iobgraph.removeAllViews()
for (i in 1 until numOfGraphs) {
val label = TextView(this)
label.layoutParams = LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT).also { it.setMargins(100, 0, 0, -50) }
history_iobgraph.addView(label)
secondaryGraphsLabel.add(label)
val relativeLayout = RelativeLayout(this)
relativeLayout.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
val graph = GraphView(this)
graph.layoutParams = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, resourceHelper.dpToPx(100)).also { it.setMargins(0, 0, 0, resourceHelper.dpToPx(10)) }
graph.layoutParams = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, resourceHelper.dpToPx(100)).also { it.setMargins(0, resourceHelper.dpToPx(15), 0, resourceHelper.dpToPx(10)) }
graph.gridLabelRenderer?.gridColor = resourceHelper.gc(R.color.graphgrid)
graph.gridLabelRenderer?.reloadStyles()
graph.gridLabelRenderer?.isHorizontalLabelsVisible = false
graph.gridLabelRenderer?.labelVerticalWidth = axisWidth
graph.gridLabelRenderer?.numVerticalLabels = 3
graph.viewport.backgroundColor = Color.argb(20, 255, 255, 255) // 8% of gray
history_iobgraph.addView(graph)
relativeLayout.addView(graph)
val label = TextView(this)
val layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT).also { it.setMargins(resourceHelper.dpToPx(30), resourceHelper.dpToPx(25), 0, 0) }
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP)
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT)
label.layoutParams = layoutParams
relativeLayout.addView(label)
secondaryGraphsLabel.add(label)
history_iobgraph.addView(relativeLayout)
secondaryGraphs.add(graph)
}
}
@ -220,35 +256,37 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
}
private fun runCalculation(from: String) {
GlobalScope.launch(Dispatchers.Default) {
treatmentsPluginHistory.initializeData(start - T.hours(8).msecs())
val end = start + T.hours(rangeToDisplay.toLong()).msecs()
iobCobStaticCalculatorPlugin.stopCalculation(from)
iobCobStaticCalculatorPlugin.clearCache()
iobCobStaticCalculatorPlugin.runCalculation(from, end, true, false, eventCustomCalculationFinished)
iobCobCalculatorPluginHistory.stopCalculation(from)
iobCobCalculatorPluginHistory.clearCache()
iobCobCalculatorPluginHistory.runCalculation(from, end, true, false, eventCustomCalculationFinished)
}
}
@Synchronized
fun updateGUI(from: String) {
fun updateGUI(from: String, bgOnly: Boolean) {
aapsLogger.debug(LTag.UI, "updateGUI from: $from")
val pump = activePlugin.activePump
val profile = profileFunction.getProfile()
historybrowse_noprofile?.visibility = (profile == null).toVisibility()
profile ?: return
val lowLine = defaultValueHelper.determineLowLine()
val highLine = defaultValueHelper.determineHighLine()
historybrowse_date?.text = dateUtil.dateAndTimeString(start)
historybrowse_zoom?.text = rangeToDisplay.toString()
GlobalScope.launch(Dispatchers.Main) {
historybrowse_noprofile?.visibility = (profile == null).toVisibility()
profile ?: return@launch
historybrowse_bggraph ?: return@launch
val graphData = GraphData(injector, historybrowse_bggraph, iobCobStaticCalculatorPlugin)
historybrowse_date?.text = dateUtil.dateAndTimeString(start)
historybrowse_zoom?.text = rangeToDisplay.toString()
val graphData = GraphData(injector, historybrowse_bggraph, iobCobCalculatorPluginHistory, treatmentsPluginHistory)
val secondaryGraphsData: ArrayList<GraphData> = ArrayList()
// do preparation in different thread
withContext(Dispatchers.Default) {
val fromTime: Long = start + T.secs(100).msecs()
val toTime: Long = start + T.hours(rangeToDisplay.toLong()).msecs()
val toTime: Long = start + T.hours(rangeToDisplay.toLong()).msecs() + T.secs(100).msecs()
aapsLogger.debug(LTag.UI, "Period: " + dateUtil.dateAndTimeString(fromTime) + " - " + dateUtil.dateAndTimeString(toTime))
val pointer = System.currentTimeMillis()
@ -261,6 +299,13 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
// set manual x bounds to have nice steps
graphData.formatAxis(fromTime, toTime)
// add target line
graphData.addTargetLine(fromTime, toTime, profile, null)
// **** NOW line ****
graphData.addNowLine(pointer)
if (!bgOnly) {
// Treatments
graphData.addTreatments(fromTime, toTime)
if (overviewMenus.setting[0][OverviewMenus.CharType.ACT.ordinal])
@ -270,16 +315,9 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
if (pump.pumpDescription.isTempBasalCapable && overviewMenus.setting[0][OverviewMenus.CharType.BAS.ordinal]) {
graphData.addBasals(fromTime, toTime, lowLine / graphData.maxY / 1.2)
}
// add target line
graphData.addTargetLine(fromTime, toTime, profile, null)
// **** NOW line ****
graphData.addNowLine(pointer)
// ------------------ 2nd graph
for (g in 0 until secondaryGraphs.size) {
val secondGraphData = GraphData(injector, secondaryGraphs[g], iobCobStaticCalculatorPlugin)
val secondGraphData = GraphData(injector, secondaryGraphs[g], iobCobCalculatorPluginHistory, treatmentsPluginHistory)
var useIobForScale = false
var useCobForScale = false
var useDevForScale = false
@ -311,11 +349,13 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
secondaryGraphsData.add(secondGraphData)
}
}
}
// finally enforce drawing of graphs in UI thread
graphData.performUpdate()
if (!bgOnly)
for (g in 0 until secondaryGraphs.size) {
secondaryGraphsLabel[g].text = overviewMenus.enabledTypes(g + 1)
secondaryGraphs[g].visibility = (
secondaryGraphs[g].visibility = (!bgOnly && (
overviewMenus.setting[g + 1][OverviewMenus.CharType.IOB.ordinal] ||
overviewMenus.setting[g + 1][OverviewMenus.CharType.COB.ordinal] ||
overviewMenus.setting[g + 1][OverviewMenus.CharType.DEV.ordinal] ||
@ -323,7 +363,7 @@ class HistoryBrowseActivity : NoSplashAppCompatActivity() {
overviewMenus.setting[g + 1][OverviewMenus.CharType.ACT.ordinal] ||
overviewMenus.setting[g + 1][OverviewMenus.CharType.ABS.ordinal] ||
overviewMenus.setting[g + 1][OverviewMenus.CharType.DEVSLOPE.ordinal]
).toVisibility()
)).toVisibility()
secondaryGraphsData[g].performUpdate()
}
}

View file

@ -9,7 +9,6 @@ import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorP
import info.nightscout.androidaps.plugins.sensitivity.SensitivityAAPSPlugin
import info.nightscout.androidaps.plugins.sensitivity.SensitivityOref1Plugin
import info.nightscout.androidaps.plugins.sensitivity.SensitivityWeightedAveragePlugin
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.FabricPrivacy
import info.nightscout.androidaps.utils.resources.ResourceHelper
@ -18,7 +17,7 @@ import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class IobCobStaticCalculatorPlugin @Inject constructor(
class IobCobCalculatorPluginHistory @Inject constructor(
injector: HasAndroidInjector,
aapsLogger: AAPSLogger,
rxBus: RxBusWrapper,
@ -26,14 +25,14 @@ class IobCobStaticCalculatorPlugin @Inject constructor(
resourceHelper: ResourceHelper,
profileFunction: ProfileFunction,
activePlugin: ActivePluginProvider,
treatmentsPlugin: TreatmentsPlugin,
treatmentsPluginHistory: TreatmentsPluginHistory,
sensitivityOref1Plugin: SensitivityOref1Plugin,
sensitivityAAPSPlugin: SensitivityAAPSPlugin,
sensitivityWeightedAveragePlugin: SensitivityWeightedAveragePlugin,
fabricPrivacy: FabricPrivacy,
dateUtil: DateUtil
) : IobCobCalculatorPlugin(injector, aapsLogger, rxBus, sp, resourceHelper, profileFunction,
activePlugin, treatmentsPlugin, sensitivityOref1Plugin, sensitivityAAPSPlugin, sensitivityWeightedAveragePlugin, fabricPrivacy, dateUtil) {
activePlugin, treatmentsPluginHistory, sensitivityOref1Plugin, sensitivityAAPSPlugin, sensitivityWeightedAveragePlugin, fabricPrivacy, dateUtil) {
override fun onStart() { // do not attach to rxbus
}

View file

@ -0,0 +1,41 @@
package info.nightscout.androidaps.historyBrowser
import android.content.Context
import dagger.android.HasAndroidInjector
import info.nightscout.androidaps.interfaces.ActivePluginProvider
import info.nightscout.androidaps.interfaces.ProfileFunction
import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload
import info.nightscout.androidaps.plugins.treatments.TreatmentService
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.FabricPrivacy
import info.nightscout.androidaps.utils.resources.ResourceHelper
import info.nightscout.androidaps.utils.sharedPreferences.SP
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class TreatmentsPluginHistory @Inject constructor(
injector: HasAndroidInjector,
aapsLogger: AAPSLogger,
rxBus: RxBusWrapper,
resourceHelper: ResourceHelper,
context: Context,
sp: SP,
profileFunction: ProfileFunction,
activePlugin: ActivePluginProvider,
nsUpload: NSUpload,
fabricPrivacy: FabricPrivacy, dateUtil: DateUtil
) : TreatmentsPlugin(injector, aapsLogger, rxBus, resourceHelper, context, sp, profileFunction, activePlugin, nsUpload, fabricPrivacy, dateUtil) {
init {
onStart()
}
override fun onStart() {
service = TreatmentService(injector)
initializeData(range())
}
}

View file

@ -26,16 +26,16 @@ 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.interfaces.ActivePluginProvider;
import info.nightscout.androidaps.interfaces.PumpInterface;
import info.nightscout.androidaps.logging.AAPSLogger;
import info.nightscout.androidaps.logging.LTag;
import info.nightscout.androidaps.plugins.aps.loop.ScriptReader;
import info.nightscout.androidaps.plugins.aps.logger.LoggerCallback;
import info.nightscout.androidaps.plugins.aps.loop.ScriptReader;
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker;
import info.nightscout.androidaps.interfaces.ProfileFunction;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin;
import info.nightscout.androidaps.interfaces.ActivePluginProvider;
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin;
import info.nightscout.androidaps.utils.SafeParse;
import info.nightscout.androidaps.utils.resources.ResourceHelper;
@ -237,7 +237,8 @@ public class DetermineBasalAdapterSMBJS {
) throws JSONException {
String units = profile.getUnits();
Double pumpbolusstep = activePluginProvider.getActivePump().getPumpDescription().bolusStep;
PumpInterface pump = activePluginProvider.getActivePump();
Double pumpbolusstep = pump.getPumpDescription().bolusStep;
mProfile = new JSONObject();
mProfile.put("max_iob", maxIob);
@ -259,13 +260,13 @@ public class DetermineBasalAdapterSMBJS {
mProfile.put("low_temptarget_lowers_sensitivity", false);
mProfile.put("sensitivity_raises_target", SMBDefaults.sensitivity_raises_target);
mProfile.put("resistance_lowers_target", SMBDefaults.resistance_lowers_target);
mProfile.put("sensitivity_raises_target", sp.getBoolean(resourceHelper.gs(R.string.key_sensitivity_raises_target),SMBDefaults.sensitivity_raises_target));
mProfile.put("resistance_lowers_target", sp.getBoolean(resourceHelper.gs(R.string.key_resistance_lowers_target),SMBDefaults.resistance_lowers_target));
mProfile.put("adv_target_adjustments", SMBDefaults.adv_target_adjustments);
mProfile.put("exercise_mode", SMBDefaults.exercise_mode);
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);
mProfile.put("skip_neutral_temps", pump.setNeutralTempAtFullHour());
// min_5m_carbimpact is not used within SMB determinebasal
//if (mealData.usedMinCarbsImpact > 0) {
// mProfile.put("min_5m_carbimpact", mealData.usedMinCarbsImpact);

View file

@ -51,6 +51,9 @@ public class DetermineBasalResultSMB extends APSResult {
} else {
smb = 0d;
}
if (result.has("targetBG")) {
targetBG = result.getDouble("targetBG");
}
if (result.has("deliverAt")) {
String date = result.getString("deliverAt");

View file

@ -108,7 +108,7 @@ class PluginStore @Inject constructor(
(activeProfile as PluginBase).setPluginEnabled(PluginType.PROFILE, true)
aapsLogger.debug(LTag.CONFIGBUILDER, "Defaulting ProfileInterface")
}
setFragmentVisiblities((activeSensitivity as PluginBase).name, pluginsInCategory, PluginType.PROFILE)
setFragmentVisiblities((activeProfile as PluginBase).name, pluginsInCategory, PluginType.PROFILE)
// PluginType.BGSOURCE
pluginsInCategory = getSpecificPluginsList(PluginType.BGSOURCE)

View file

@ -18,9 +18,9 @@ import info.nightscout.androidaps.events.*
import info.nightscout.androidaps.historyBrowser.HistoryBrowseActivity
import info.nightscout.androidaps.interfaces.ActivePluginProvider
import info.nightscout.androidaps.interfaces.CommandQueueProvider
import info.nightscout.androidaps.interfaces.ProfileFunction
import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.plugins.bus.RxBusWrapper
import info.nightscout.androidaps.interfaces.ProfileFunction
import info.nightscout.androidaps.plugins.general.actions.defs.CustomAction
import info.nightscout.androidaps.plugins.general.overview.StatusLightHandler
import info.nightscout.androidaps.queue.Callback
@ -192,17 +192,15 @@ class ActionsFragment : DaggerFragment() {
@Synchronized
fun updateGui() {
actions_profileswitch?.visibility = (activePlugin.activeProfileInterface.profile != null).toVisibility()
val profile = profileFunction.getProfile()
val pump = activePlugin.activePump
actions_temptarget?.visibility = (profile != null).toVisibility()
actions_historybrowser.visibility = (profile != null).toVisibility()
val basalProfileEnabled = buildHelper.isEngineeringModeOrRelease() && pump.pumpDescription.isSetBasalProfileCapable
actions_profileswitch?.visibility = if (!basalProfileEnabled || !pump.isInitialized || pump.isSuspended) View.GONE else View.VISIBLE
actions_profileswitch?.visibility = (
activePlugin.activeProfileInterface.profile != null &&
pump.pumpDescription.isSetBasalProfileCapable &&
pump.isInitialized &&
!pump.isSuspended).toVisibility()
if (!pump.pumpDescription.isExtendedBolusCapable || !pump.isInitialized || pump.isSuspended || pump.isFakingTempsByExtendedBoluses) {
actions_extendedbolus?.visibility = View.GONE
@ -236,12 +234,11 @@ class ActionsFragment : DaggerFragment() {
}
}
actions_fill?.visibility =
if (!pump.pumpDescription.isRefillingCapable || !pump.isInitialized || pump.isSuspended) View.GONE
else View.VISIBLE
actions_temptarget?.visibility = config.APS.toVisibility()
actions_historybrowser.visibility = (profile != null).toVisibility()
actions_fill?.visibility = (pump.pumpDescription.isRefillingCapable && pump.isInitialized && !pump.isSuspended).toVisibility()
actions_temptarget?.visibility = (profile != null && config.APS).toVisibility()
actions_tddstats?.visibility = pump.pumpDescription.supportsTDDs.toVisibility()
statusLightHandler.updateStatusLights(careportal_canulaage, careportal_insulinage, null, careportal_sensorage, careportal_pbage, null)
checkPumpCustomActions()
}

View file

@ -177,10 +177,9 @@ class AutomationPlugin @Inject constructor(
@Synchronized
private fun processActions() {
if (!isEnabled(PluginType.GENERAL))
return
if (loopPlugin.isSuspended || !loopPlugin.isEnabled(PluginType.LOOP)) {
if (loopPlugin.isSuspended || !loopPlugin.isEnabled()) {
aapsLogger.debug(LTag.AUTOMATION, "Loop deactivated")
executionLog.add(resourceHelper.gs(R.string.smscommunicator_loopisdisabled))
return
}
val enabled = constraintChecker.isAutomationEnabled()

View file

@ -35,7 +35,7 @@ class TriggerBolusAgo(injector: HasAndroidInjector) : Trigger(injector) {
}
override fun shouldRun(): Boolean {
val lastBolusTime = treatmentsPlugin.getLastBolusTime(false)
val lastBolusTime = treatmentsPlugin.getLastBolusTime(true)
if (lastBolusTime == 0L)
return if (comparator.value == Comparator.Compare.IS_NOT_AVAILABLE) {
aapsLogger.debug(LTag.AUTOMATION, "Ready for execution: " + friendlyDescription())

View file

@ -35,11 +35,10 @@ class TriggerRecurringTime(injector: HasAndroidInjector) : Trigger(injector) {
}
override fun shouldRun() : Boolean {
val currentMinSinceMidnight = getMinSinceMidnight(DateUtil.now())
val currentMinSinceMidnight = getMinSinceMidnight(dateUtil._now())
val scheduledDayOfWeek = Calendar.getInstance()[Calendar.DAY_OF_WEEK]
val scheduled = getMinSinceMidnight(time.value.toLong())
if (days.isSet(Objects.requireNonNull(InputWeekDay.DayOfWeek.fromCalendarInt(scheduledDayOfWeek)))) {
if (currentMinSinceMidnight >= scheduled && currentMinSinceMidnight - scheduled < 5) {
if (currentMinSinceMidnight >= time.value && currentMinSinceMidnight - time.value < 5) {
aapsLogger.debug(LTag.AUTOMATION, "Ready for execution: " + friendlyDescription())
return true
}

View file

@ -7,7 +7,6 @@ import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.provider.Settings
import androidx.activity.invoke
import androidx.annotation.StringRes
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
@ -221,7 +220,7 @@ class ImportExportPrefs @Inject constructor(
importSharedPreferences(fragmentAct, it)
}
}
callForPrefFile.invoke()
callForPrefFile.launch(null)
}
}
@ -231,7 +230,7 @@ class ImportExportPrefs @Inject constructor(
importSharedPreferences(activity, it)
}
}
callForPrefFile.invoke()
callForPrefFile.launch(null)
}
private fun importSharedPreferences(activity: Activity, importFile: PrefsFile) {

View file

@ -19,7 +19,7 @@ import info.nightscout.androidaps.plugins.general.maintenance.PrefsFileContract
import info.nightscout.androidaps.plugins.general.maintenance.formats.PrefsFormatsHandler
import info.nightscout.androidaps.plugins.general.maintenance.formats.PrefsMetadataKey
import info.nightscout.androidaps.plugins.general.maintenance.formats.PrefsStatus
import info.nightscout.androidaps.utils.LocaleHelper
import info.nightscout.androidaps.utils.locale.LocaleHelper
import info.nightscout.androidaps.utils.resources.ResourceHelper
import kotlinx.android.synthetic.main.maintenance_importlist_activity.*
import javax.inject.Inject

View file

@ -331,7 +331,7 @@ public class NSDeviceStatus {
// test warning level
int level = Levels.INFO;
long now = System.currentTimeMillis();
if (deviceStatusOpenAPSData.clockSuggested != 0 && deviceStatusOpenAPSData.clockSuggested + sp.getInt(R.string.key_nsalarm_urgent_staledatavalue, 16) * 60 * 1000L < now)
if (deviceStatusOpenAPSData.clockSuggested != 0 && deviceStatusOpenAPSData.clockSuggested + sp.getInt(R.string.key_nsalarm_urgent_staledatavalue, 31) * 60 * 1000L < now)
level = Levels.URGENT;
else if (deviceStatusOpenAPSData.clockSuggested != 0 && deviceStatusOpenAPSData.clockSuggested + sp.getInt(R.string.key_nsalarm_staledatavalue, 16) * 60 * 1000L < now)
level = Levels.WARN;

View file

@ -842,14 +842,19 @@ public class NSClientService extends DaggerService {
}
private void handleAnnouncement(JSONObject announcement) {
boolean defaultVal = config.getNSCLIENT();
if (sp.getBoolean(R.string.key_ns_announcements, defaultVal)) {
NSAlarm nsAlarm = new NSAlarm(announcement);
Notification notification = new NotificationWithAction(injector, nsAlarm);
rxBus.send(new EventNewNotification(notification));
rxBus.send(new EventNSClientNewLog("ANNOUNCEMENT", JsonHelper.safeGetString(announcement, "message", "received")));
aapsLogger.debug(LTag.NSCLIENT, announcement.toString());
}
}
private void handleAlarm(JSONObject alarm) {
boolean defaultVal = config.getNSCLIENT();
if (sp.getBoolean(R.string.key_ns_alarms, defaultVal)) {
long snoozedTo = sp.getLong(R.string.key_snoozedTo, 0L);
if (snoozedTo == 0L || System.currentTimeMillis() > snoozedTo) {
NSAlarm nsAlarm = new NSAlarm(alarm);
@ -859,8 +864,11 @@ public class NSClientService extends DaggerService {
rxBus.send(new EventNSClientNewLog("ALARM", JsonHelper.safeGetString(alarm, "message", "received")));
aapsLogger.debug(LTag.NSCLIENT, alarm.toString());
}
}
private void handleUrgentAlarm(JSONObject alarm) {
boolean defaultVal = config.getNSCLIENT();
if (sp.getBoolean(R.string.key_ns_alarms, defaultVal)) {
long snoozedTo = sp.getLong(R.string.key_snoozedTo, 0L);
if (snoozedTo == 0L || System.currentTimeMillis() > snoozedTo) {
NSAlarm nsAlarm = new NSAlarm(alarm);
@ -870,6 +878,7 @@ public class NSClientService extends DaggerService {
rxBus.send(new EventNSClientNewLog("URGENTALARM", JsonHelper.safeGetString(alarm, "message", "received")));
aapsLogger.debug(LTag.NSCLIENT, alarm.toString());
}
}
public void handleNewCal(JSONArray cals, boolean isDelta) {
Bundle bundle = new Bundle();

View file

@ -19,6 +19,7 @@ import android.view.View
import android.view.View.OnLongClickListener
import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.RelativeLayout
import android.widget.TextView
import androidx.core.text.toSpanned
import androidx.recyclerview.widget.LinearLayoutManager
@ -184,6 +185,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
overview_bggraph?.gridLabelRenderer?.gridColor = resourceHelper.gc(R.color.graphgrid)
overview_bggraph?.gridLabelRenderer?.reloadStyles()
overview_bggraph?.gridLabelRenderer?.labelVerticalWidth = axisWidth
overview_bggraph?.layoutParams?.height = resourceHelper.dpToPx(skinProvider.activeSkin().mainGraphHeight)
rangeToDisplay = sp.getInt(R.string.key_rangetodisplay, 6)
@ -477,19 +479,28 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
secondaryGraphsLabel.clear()
overview_iobgraph.removeAllViews()
for (i in 1 until numOfGraphs) {
val label = TextView(context)
label.layoutParams = LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT).also { it.setMargins(100, 0, 0, -120) }
overview_iobgraph.addView(label)
secondaryGraphsLabel.add(label)
val relativeLayout = RelativeLayout(context)
relativeLayout.layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
val graph = GraphView(context)
graph.layoutParams = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, resourceHelper.dpToPx(100)).also { it.setMargins(0, resourceHelper.dpToPx(35), 0, resourceHelper.dpToPx(15)) }
graph.layoutParams = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, resourceHelper.dpToPx(skinProvider.activeSkin().secondaryGraphHeight)).also { it.setMargins(0, resourceHelper.dpToPx(15), 0, resourceHelper.dpToPx(10)) }
graph.gridLabelRenderer?.gridColor = resourceHelper.gc(R.color.graphgrid)
graph.gridLabelRenderer?.reloadStyles()
graph.gridLabelRenderer?.isHorizontalLabelsVisible = false
graph.gridLabelRenderer?.labelVerticalWidth = axisWidth
graph.gridLabelRenderer?.numVerticalLabels = 3
graph.viewport.backgroundColor = Color.argb(20, 255, 255, 255) // 8% of gray
overview_iobgraph.addView(graph)
relativeLayout.addView(graph)
val label = TextView(context)
val layoutParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT).also { it.setMargins(resourceHelper.dpToPx(30), resourceHelper.dpToPx(25), 0, 0) }
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP)
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT)
label.layoutParams = layoutParams
relativeLayout.addView(label)
secondaryGraphsLabel.add(label)
overview_iobgraph.addView(relativeLayout)
secondaryGraphs.add(graph)
}
}
@ -582,70 +593,47 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
loopPlugin.isEnabled() && loopPlugin.isSuperBolus -> {
overview_apsmode.setImageResource(R.drawable.loop_superbolus)
overview_apsmode_text?.text = DateUtil.age(loopPlugin.minutesToEndOfSuspend() * 60000L, true, resourceHelper)
//overview_apsmode_text?.text = String.format(resourceHelper.gs(R.string.loopsuperbolusfor), loopPlugin.minutesToEndOfSuspend())
// overview_apsmode_text?.setBackgroundColor(resourceHelper.gc(R.color.ribbonWarning))
// overview_apsmode_text?.setTextColor(resourceHelper.gc(R.color.ribbonTextWarning))
}
loopPlugin.isDisconnected -> {
overview_apsmode.setImageResource(R.drawable.loop_disconnected)
overview_apsmode_text?.text = DateUtil.age(loopPlugin.minutesToEndOfSuspend() * 60000L, true, resourceHelper)
// overview_apsmode_text?.text = String.format(resourceHelper.gs(R.string.loopdisconnectedfor), loopPlugin.minutesToEndOfSuspend())
// overview_apsmode_text?.setBackgroundColor(resourceHelper.gc(R.color.ribbonCritical))
// overview_apsmode_text?.setTextColor(resourceHelper.gc(R.color.ribbonTextCritical))
}
loopPlugin.isEnabled() && loopPlugin.isSuspended -> {
overview_apsmode.setImageResource(R.drawable.loop_paused)
overview_apsmode_text?.text = DateUtil.age(loopPlugin.minutesToEndOfSuspend() * 60000L, true, resourceHelper)
// overview_apsmode_text?.text = String.format(resourceHelper.gs(R.string.loopsuspendedfor), loopPlugin.minutesToEndOfSuspend())
// overview_apsmode_text?.setBackgroundColor(resourceHelper.gc(R.color.ribbonWarning))
// overview_apsmode_text?.setTextColor(resourceHelper.gc(R.color.ribbonTextWarning))
}
pump.isSuspended -> {
overview_apsmode.setImageResource(R.drawable.loop_paused)
overview_apsmode_text?.text = ""
// overview_apsmode_text?.text = resourceHelper.gs(R.string.pumpsuspended)
// overview_apsmode_text?.setBackgroundColor(resourceHelper.gc(R.color.ribbonWarning))
// overview_apsmode_text?.setTextColor(resourceHelper.gc(R.color.ribbonTextWarning))
}
loopPlugin.isEnabled() && closedLoopEnabled.value() && loopPlugin.isLGS -> {
overview_apsmode.setImageResource(R.drawable.loop_lgs)
overview_apsmode_text?.text = ""
// overview_apsmode_text?.text = resourceHelper.gs(R.string.closedloop)
// overview_apsmode_text?.setBackgroundColor(resourceHelper.gc(R.color.ribbonDefault))
// overview_apsmode_text?.setTextColor(resourceHelper.gc(R.color.ribbonTextDefault))
}
loopPlugin.isEnabled() && closedLoopEnabled.value() -> {
overview_apsmode.setImageResource(R.drawable.loop_closed)
overview_apsmode_text?.text = ""
// overview_apsmode_text?.text = resourceHelper.gs(R.string.closedloop)
// overview_apsmode_text?.setBackgroundColor(resourceHelper.gc(R.color.ribbonDefault))
// overview_apsmode_text?.setTextColor(resourceHelper.gc(R.color.ribbonTextDefault))
}
loopPlugin.isEnabled() && !closedLoopEnabled.value() -> {
overview_apsmode.setImageResource(R.drawable.loop_open)
overview_apsmode_text?.text = ""
// overview_apsmode_text?.text = resourceHelper.gs(R.string.openloop)
// overview_apsmode_text?.setBackgroundColor(resourceHelper.gc(R.color.ribbonDefault))
// overview_apsmode_text?.setTextColor(resourceHelper.gc(R.color.ribbonTextDefault))
}
else -> {
overview_apsmode.setImageResource(R.drawable.loop_disabled)
overview_apsmode_text?.text = ""
// overview_apsmode_text?.text = resourceHelper.gs(R.string.disabledloop)
// overview_apsmode_text?.setBackgroundColor(resourceHelper.gc(R.color.ribbonCritical))
// overview_apsmode_text?.setTextColor(resourceHelper.gc(R.color.ribbonTextCritical))
}
}
} else {
overview_apsmode_text?.visibility = View.GONE
}
val lastRun = loopPlugin.lastRun
// temp target
val tempTarget = treatmentsPlugin.tempTargetFromHistory
@ -653,11 +641,20 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
overview_temptarget?.setTextColor(resourceHelper.gc(R.color.ribbonTextWarning))
overview_temptarget?.setBackgroundColor(resourceHelper.gc(R.color.ribbonWarning))
overview_temptarget?.text = Profile.toTargetRangeString(tempTarget.low, tempTarget.high, Constants.MGDL, units) + " " + DateUtil.untilString(tempTarget.end(), resourceHelper)
} else {
// If the target is not the same as set in the profile then oref has overridden it
val targetUsed = lastRun?.constraintsProcessed?.targetBG ?: 0.0
if (targetUsed != 0.0 && profile.targetMgdl != targetUsed) {
overview_temptarget?.text = Profile.toTargetRangeString(targetUsed, targetUsed, Constants.MGDL, units)
overview_temptarget?.setTextColor(resourceHelper.gc(R.color.ribbonTextWarning))
overview_temptarget?.setBackgroundColor(resourceHelper.gc(R.color.tempTargetBackground))
} else {
overview_temptarget?.setTextColor(resourceHelper.gc(R.color.ribbonTextDefault))
overview_temptarget?.setBackgroundColor(resourceHelper.gc(R.color.ribbonDefault))
overview_temptarget?.text = Profile.toTargetRangeString(profile.targetLowMgdl, profile.targetHighMgdl, Constants.MGDL, units)
}
}
// Basal, TBR
val activeTemp = treatmentsPlugin.getTempBasalFromHistory(System.currentTimeMillis())
@ -741,7 +738,6 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
}
overview_cob?.text = cobText
val lastRun = loopPlugin.lastRun
val predictionsAvailable = if (config.APS) lastRun?.request?.hasPredictions == true else config.NSCLIENT
// pump status from ns
@ -757,7 +753,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
overview_uploader?.setOnClickListener { activity?.let { OKDialog.show(it, resourceHelper.gs(R.string.uploader), nsDeviceStatus.extendedUploaderStatus) } }
// Sensitivity
if (sp.getBoolean(R.string.key_openapsama_useautosens, false)) {
if (sp.getBoolean(R.string.key_openapsama_useautosens, false) && constraintChecker.isAutosensModeEnabled().value()) {
overview_sensitivity_icon.setImageResource(R.drawable.ic_swap_vert_black_48dp_green)
} else {
overview_sensitivity_icon.setImageResource(R.drawable.ic_x_swap_vert_48px_green)
@ -771,7 +767,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
// ****** GRAPH *******
GlobalScope.launch(Dispatchers.Main) {
overview_bggraph ?: return@launch
val graphData = GraphData(injector, overview_bggraph, iobCobCalculatorPlugin)
val graphData = GraphData(injector, overview_bggraph, iobCobCalculatorPlugin, treatmentsPlugin)
val secondaryGraphsData: ArrayList<GraphData> = ArrayList()
// do preparation in different thread
@ -834,30 +830,30 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
// ------------------ 2nd graph
for (g in 0 until secondaryGraphs.size) {
val secondGraphData = GraphData(injector, secondaryGraphs[g], iobCobCalculatorPlugin)
val secondGraphData = GraphData(injector, secondaryGraphs[g], iobCobCalculatorPlugin, treatmentsPlugin)
var useABSForScale = false
var useIobForScale = false
var useCobForScale = false
var useDevForScale = false
var useRatioForScale = false
var useDSForScale = false
var useIAForScale = false
var useABSForScale = false
when {
overviewMenus.setting[g + 1][OverviewMenus.CharType.ABS.ordinal] -> useABSForScale = true
overviewMenus.setting[g + 1][OverviewMenus.CharType.IOB.ordinal] -> useIobForScale = true
overviewMenus.setting[g + 1][OverviewMenus.CharType.COB.ordinal] -> useCobForScale = true
overviewMenus.setting[g + 1][OverviewMenus.CharType.DEV.ordinal] -> useDevForScale = true
overviewMenus.setting[g + 1][OverviewMenus.CharType.SEN.ordinal] -> useRatioForScale = true
overviewMenus.setting[g + 1][OverviewMenus.CharType.ACT.ordinal] -> useIAForScale = true
overviewMenus.setting[g + 1][OverviewMenus.CharType.ABS.ordinal] -> useABSForScale = true
overviewMenus.setting[g + 1][OverviewMenus.CharType.DEVSLOPE.ordinal] -> useDSForScale = true
}
if (overviewMenus.setting[g + 1][OverviewMenus.CharType.ABS.ordinal]) secondGraphData.addAbsIob(fromTime, now, useABSForScale, 1.0)
if (overviewMenus.setting[g + 1][OverviewMenus.CharType.IOB.ordinal]) secondGraphData.addIob(fromTime, now, useIobForScale, 1.0, overviewMenus.setting[g + 1][OverviewMenus.CharType.PRE.ordinal])
if (overviewMenus.setting[g + 1][OverviewMenus.CharType.COB.ordinal]) secondGraphData.addCob(fromTime, now, useCobForScale, if (useCobForScale) 1.0 else 0.5)
if (overviewMenus.setting[g + 1][OverviewMenus.CharType.DEV.ordinal]) secondGraphData.addDeviations(fromTime, now, useDevForScale, 1.0)
if (overviewMenus.setting[g + 1][OverviewMenus.CharType.SEN.ordinal]) secondGraphData.addRatio(fromTime, now, useRatioForScale, 1.0)
if (overviewMenus.setting[g + 1][OverviewMenus.CharType.ACT.ordinal]) secondGraphData.addActivity(fromTime, endTime, useIAForScale, 0.8)
if (overviewMenus.setting[g + 1][OverviewMenus.CharType.ABS.ordinal]) secondGraphData.addAbsIob(fromTime, now, useABSForScale, 1.0)
if (overviewMenus.setting[g + 1][OverviewMenus.CharType.DEVSLOPE.ordinal] && buildHelper.isDev()) secondGraphData.addDeviationSlope(fromTime, now, useDSForScale, 1.0)
// set manual x bounds to have nice steps
@ -871,12 +867,12 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
for (g in 0 until secondaryGraphs.size) {
secondaryGraphsLabel[g].text = overviewMenus.enabledTypes(g + 1)
secondaryGraphs[g].visibility = (
overviewMenus.setting[g + 1][OverviewMenus.CharType.ABS.ordinal] ||
overviewMenus.setting[g + 1][OverviewMenus.CharType.IOB.ordinal] ||
overviewMenus.setting[g + 1][OverviewMenus.CharType.COB.ordinal] ||
overviewMenus.setting[g + 1][OverviewMenus.CharType.DEV.ordinal] ||
overviewMenus.setting[g + 1][OverviewMenus.CharType.SEN.ordinal] ||
overviewMenus.setting[g + 1][OverviewMenus.CharType.ACT.ordinal] ||
overviewMenus.setting[g + 1][OverviewMenus.CharType.ABS.ordinal] ||
overviewMenus.setting[g + 1][OverviewMenus.CharType.DEVSLOPE.ordinal]
).toVisibility()
secondaryGraphsData[g].performUpdate()

View file

@ -61,16 +61,16 @@ class OverviewMenus @Inject constructor(
private val config: Config
) {
enum class CharType(@StringRes val nameId: Int, @ColorRes val colorId: Int, val primary: Boolean, val secondary: Boolean) {
PRE(R.string.overview_show_predictions, R.color.prediction, primary = true, secondary = false),
BAS(R.string.overview_show_basals, R.color.basal, primary = true, secondary = false),
IOB(R.string.overview_show_iob, R.color.iob, primary = false, secondary = true),
COB(R.string.overview_show_cob, R.color.cob, primary = false, secondary = true),
DEV(R.string.overview_show_deviations, R.color.deviations, primary = false, secondary = true),
SEN(R.string.overview_show_sensitivity, R.color.ratio, primary = false, secondary = true),
ACT(R.string.overview_show_activity, R.color.activity, primary = true, secondary = true),
ABS(R.string.overview_show_absinsulin, R.color.iob, primary = false, secondary = true),
DEVSLOPE(R.string.overview_show_deviationslope, R.color.devslopepos, primary = false, secondary = true)
enum class CharType(@StringRes val nameId: Int, @ColorRes val colorId: Int, val primary: Boolean, val secondary: Boolean, @StringRes val shortnameId: Int) {
PRE(R.string.overview_show_predictions, R.color.prediction, primary = true, secondary = false, shortnameId = R.string.prediction_shortname),
BAS(R.string.overview_show_basals, R.color.basal, primary = true, secondary = false,shortnameId = R.string.basal_shortname),
ABS(R.string.overview_show_absinsulin, R.color.iob, primary = false, secondary = true,shortnameId = R.string.abs_insulin_shortname),
IOB(R.string.overview_show_iob, R.color.iob, primary = false, secondary = true,shortnameId = R.string.iob),
COB(R.string.overview_show_cob, R.color.cob, primary = false, secondary = true,shortnameId = R.string.cob),
DEV(R.string.overview_show_deviations, R.color.deviations, primary = false, secondary = true,shortnameId = R.string.deviation_shortname),
SEN(R.string.overview_show_sensitivity, R.color.ratio, primary = false, secondary = true,shortnameId = R.string.sensitivity_shortname),
ACT(R.string.overview_show_activity, R.color.activity, primary = true, secondary = true,shortnameId = R.string.activity_shortname),
DEVSLOPE(R.string.overview_show_deviationslope, R.color.devslopepos, primary = false, secondary = true,shortnameId = R.string.devslope_shortname)
}
companion object {
@ -80,7 +80,7 @@ class OverviewMenus @Inject constructor(
fun enabledTypes(graph: Int): String {
val r = StringBuilder()
for (type in CharType.values()) if (setting[graph][type.ordinal]) {
r.append(type.name)
r.append(resourceHelper.gs(type.shortnameId))
r.append(" ")
}
return r.toString()

View file

@ -34,7 +34,13 @@ import kotlin.math.abs
import kotlin.math.max
import kotlin.math.min
class GraphData(injector: HasAndroidInjector, private val graph: GraphView, private val iobCobCalculatorPlugin: IobCobCalculatorPlugin) {
class GraphData(
injector: HasAndroidInjector,
private val graph: GraphView,
private val iobCobCalculatorPlugin: IobCobCalculatorPlugin,
private val treatmentsPlugin: TreatmentsInterface
) {
// IobCobCalculatorPlugin Cannot be injected: HistoryBrowser
@Inject lateinit var aapsLogger: AAPSLogger
@ -42,8 +48,6 @@ class GraphData(injector: HasAndroidInjector, private val graph: GraphView, priv
@Inject lateinit var resourceHelper: ResourceHelper
@Inject lateinit var activePlugin: ActivePluginProvider
private val treatmentsPlugin: TreatmentsInterface
var maxY = Double.MIN_VALUE
private var minY = Double.MAX_VALUE
private var bgReadingsArray: List<BgReading>? = null
@ -53,7 +57,6 @@ class GraphData(injector: HasAndroidInjector, private val graph: GraphView, priv
init {
injector.androidInjector().inject(this)
units = profileFunction.getUnits()
treatmentsPlugin = activePlugin.activeTreatments
}
@Suppress("UNUSED_PARAMETER")

View file

@ -22,8 +22,6 @@ class NotificationWithAction constructor(
@Inject lateinit var defaultValueHelper: DefaultValueHelper
@Inject lateinit var nsClientPlugin: NSClientPlugin
private var nsAlarm: NSAlarm? = null
init {
injector.androidInjector().inject(this)
}
@ -36,7 +34,6 @@ class NotificationWithAction constructor(
}
constructor (injector: HasAndroidInjector, nsAlarm: NSAlarm) : this(injector) {
this.nsAlarm = nsAlarm
date = System.currentTimeMillis()
when (nsAlarm.level()) {
0 -> {
@ -50,14 +47,14 @@ class NotificationWithAction constructor(
id = NSALARM
level = NORMAL
text = nsAlarm.title()
if (nsAlarm.low() && sp.getBoolean(R.string.key_nsalarm_low, false) || nsAlarm.high() && sp.getBoolean(R.string.key_nsalarm_high, false) || nsAlarm.timeago() && sp.getBoolean(R.string.key_nsalarm_staledata, false)) soundId = R.raw.alarm
soundId = R.raw.alarm
}
2 -> {
id = NSURGENTALARM
level = URGENT
text = nsAlarm.title()
if (nsAlarm.low() && sp.getBoolean(R.string.key_nsalarm_urgent_low, false) || nsAlarm.high() && sp.getBoolean(R.string.key_nsalarm_urgent_high, false) || nsAlarm.timeago() && sp.getBoolean(R.string.key_nsalarm_staledata, false)) soundId = R.raw.urgentalarm
soundId = R.raw.urgentalarm
}
}
buttonText = R.string.snooze

View file

@ -85,7 +85,7 @@ class SmsCommunicatorPlugin @Inject constructor(
"LOOP" to "LOOP STOP/DISABLE/START/ENABLE/RESUME/STATUS\nLOOP SUSPEND 20",
"TREATMENTS" to "TREATMENTS REFRESH",
"NSCLIENT" to "NSCLIENT RESTART",
"PUMP" to "PUMP",
"PUMP" to "PUMP\nPUMP CONNECT\nPUMP DISCONNECT 30\n",
"BASAL" to "BASAL STOP/CANCEL\nBASAL 0.3\nBASAL 0.3 20\nBASAL 30%\nBASAL 30% 20\n",
"BOLUS" to "BOLUS 1.2\nBOLUS 1.2 MEAL",
"EXTENDED" to "EXTENDED STOP/CANCEL\nEXTENDED 2 120",
@ -228,7 +228,8 @@ class SmsCommunicatorPlugin @Inject constructor(
if (splitted.size == 2) processNSCLIENT(splitted, receivedSms)
else sendSMS(Sms(receivedSms.phoneNumber, resourceHelper.gs(R.string.wrongformat)))
"PUMP" ->
if (splitted.size == 1) processPUMP(receivedSms)
if (!remoteCommandsAllowed && splitted.size > 1) sendSMS(Sms(receivedSms.phoneNumber, resourceHelper.gs(R.string.smscommunicator_remotecommandnotallowed)))
else if (splitted.size <= 3) processPUMP(splitted, receivedSms)
else sendSMS(Sms(receivedSms.phoneNumber, resourceHelper.gs(R.string.wrongformat)))
"PROFILE" ->
if (!remoteCommandsAllowed) sendSMS(Sms(receivedSms.phoneNumber, resourceHelper.gs(R.string.smscommunicator_remotecommandnotallowed)))
@ -308,6 +309,11 @@ class SmsCommunicatorPlugin @Inject constructor(
when (splitted[1].toUpperCase(Locale.getDefault())) {
"DISABLE", "STOP" -> {
if (loopPlugin.isEnabled(PluginType.LOOP)) {
val passCode = generatePasscode()
val reply = String.format(resourceHelper.gs(R.string.smscommunicator_loopdisablereplywithcode), passCode)
receivedSms.processed = true
messageToConfirm = AuthRequest(injector, receivedSms, reply, passCode, object : SmsAction() {
override fun run() {
loopPlugin.setPluginEnabled(PluginType.LOOP, false)
commandQueue.cancelTempBasal(true, object : Callback() {
override fun run() {
@ -317,6 +323,8 @@ class SmsCommunicatorPlugin @Inject constructor(
sendSMS(Sms(receivedSms.phoneNumber, replyText))
}
})
}
})
} else
sendSMS(Sms(receivedSms.phoneNumber, resourceHelper.gs(R.string.smscommunicator_loopisdisabled)))
receivedSms.processed = true
@ -324,9 +332,16 @@ class SmsCommunicatorPlugin @Inject constructor(
"ENABLE", "START" -> {
if (!loopPlugin.isEnabled(PluginType.LOOP)) {
val passCode = generatePasscode()
val reply = String.format(resourceHelper.gs(R.string.smscommunicator_loopenablereplywithcode), passCode)
receivedSms.processed = true
messageToConfirm = AuthRequest(injector, receivedSms, reply, passCode, object : SmsAction() {
override fun run() {
loopPlugin.setPluginEnabled(PluginType.LOOP, true)
sendSMS(Sms(receivedSms.phoneNumber, resourceHelper.gs(R.string.smscommunicator_loophasbeenenabled)))
rxBus.send(EventRefreshOverview("SMS_LOOP_START"))
}
})
} else
sendSMS(Sms(receivedSms.phoneNumber, resourceHelper.gs(R.string.smscommunicator_loopisenabled)))
receivedSms.processed = true
@ -343,10 +358,17 @@ class SmsCommunicatorPlugin @Inject constructor(
}
"RESUME" -> {
val passCode = generatePasscode()
val reply = String.format(resourceHelper.gs(R.string.smscommunicator_loopresumereplywithcode), passCode)
receivedSms.processed = true
messageToConfirm = AuthRequest(injector, receivedSms, reply, passCode, object : SmsAction() {
override fun run() {
rxBus.send(EventRefreshOverview("SMS_LOOP_RESUME"))
loopPlugin.createOfflineEvent(0)
sendSMSToAllNumbers(Sms(receivedSms.phoneNumber, resourceHelper.gs(R.string.smscommunicator_loopresumed)))
}
})
}
"SUSPEND" -> {
var duration = 0
@ -420,7 +442,8 @@ class SmsCommunicatorPlugin @Inject constructor(
sendSMS(Sms(receivedSms.phoneNumber, resourceHelper.gs(R.string.wrongformat)))
}
private fun processPUMP(receivedSms: Sms) {
private fun processPUMP(splitted: Array<String>, receivedSms: Sms) {
if (splitted.size == 1) {
commandQueue.readStatus("SMS", object : Callback() {
override fun run() {
val pump = activePlugin.activePump
@ -434,6 +457,51 @@ class SmsCommunicatorPlugin @Inject constructor(
}
})
receivedSms.processed = true
} else if ((splitted.size == 2) && (splitted[1].equals("CONNECT", ignoreCase = true))) {
val passCode = generatePasscode()
val reply = String.format(resourceHelper.gs(R.string.smscommunicator_pumpconnectwithcode), passCode)
receivedSms.processed = true
messageToConfirm = AuthRequest(injector, receivedSms, reply, passCode, object : SmsAction() {
override fun run() {
commandQueue.cancelTempBasal(true, object : Callback() {
override fun run() {
if (!result.success) {
sendSMS(Sms(receivedSms.phoneNumber, resourceHelper.gs(R.string.smscommunicator_pumpconnectfail)))
} else {
loopPlugin.suspendTo(0L)
sendSMS(Sms(receivedSms.phoneNumber, resourceHelper.gs(R.string.smscommunicator_reconnect)))
rxBus.send(EventRefreshOverview("SMS_PUMP_START"))
loopPlugin.createOfflineEvent(0)
}
}
})
}
})
} else if ((splitted.size == 3) && (splitted[1].equals("DISCONNECT", ignoreCase = true))) {
var duration = SafeParse.stringToInt(splitted[2])
duration = Math.max(0, duration)
duration = Math.min(120, duration)
if (duration == 0) {
receivedSms.processed = true
sendSMS(Sms(receivedSms.phoneNumber, resourceHelper.gs(R.string.smscommunicator_wrongduration)))
return
} else {
val passCode = generatePasscode()
val reply = String.format(resourceHelper.gs(R.string.smscommunicator_pumpdisconnectwithcode), duration, passCode)
receivedSms.processed = true
messageToConfirm = AuthRequest(injector, receivedSms, reply, passCode, object : SmsAction() {
override fun run() {
val profile = profileFunction.getProfile()
loopPlugin.disconnectPump(duration, profile)
rxBus.send(EventRefreshOverview("SMS_PUMP_DISCONNECT"))
sendSMS(Sms(receivedSms.phoneNumber, resourceHelper.gs(R.string.smscommunicator_pumpdisconnected)))
}
})
}
} else {
sendSMS(Sms(receivedSms.phoneNumber, resourceHelper.gs(R.string.wrongformat)))
return
}
}
private fun processPROFILE(splitted: Array<String>, receivedSms: Sms) { // load profiles

View file

@ -0,0 +1,8 @@
package info.nightscout.androidaps.plugins.iob.iobCobCalculator
import info.nightscout.androidaps.db.BgReading
class InMemoryGlucoseValue constructor(var timestamp: Long = 0L, var value: Double = 0.0) {
constructor(gv: BgReading) : this(gv.date, gv.value)
}

View file

@ -39,6 +39,7 @@ import info.nightscout.androidaps.logging.LTag;
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
import info.nightscout.androidaps.interfaces.ProfileFunction;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.data.AutosensData;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventNewHistoryBgData;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventNewHistoryData;
import info.nightscout.androidaps.plugins.sensitivity.SensitivityAAPSPlugin;
import info.nightscout.androidaps.plugins.sensitivity.SensitivityOref1Plugin;
@ -79,7 +80,7 @@ public class IobCobCalculatorPlugin extends PluginBase implements IobCobCalculat
private LongSparseArray<BasalData> basalDataTable = new LongSparseArray<>(); // oldest at index 0
private volatile List<BgReading> bgReadings = null; // newest at index 0
private volatile List<BgReading> bucketed_data = null;
private volatile List<InMemoryGlucoseValue> bucketed_data = null;
private final Object dataLock = new Object();
@ -159,7 +160,7 @@ public class IobCobCalculatorPlugin extends PluginBase implements IobCobCalculat
runCalculation("onNewProfile", System.currentTimeMillis(), false, true, event);
}, fabricPrivacy::logException)
);
// EventNewBG
// EventNewBG .... cannot be used for invalidating because only event with last BG is fired
disposable.add(rxBus
.toObservable(EventNewBG.class)
.observeOn(Schedulers.io())
@ -203,7 +204,13 @@ public class IobCobCalculatorPlugin extends PluginBase implements IobCobCalculat
disposable.add(rxBus
.toObservable(EventNewHistoryData.class)
.observeOn(Schedulers.io())
.subscribe(this::newHistoryData, fabricPrivacy::logException)
.subscribe(event -> newHistoryData(event, false), fabricPrivacy::logException)
);
// EventNewHistoryBgData
disposable.add(rxBus
.toObservable(EventNewHistoryBgData.class)
.observeOn(Schedulers.io())
.subscribe(event -> newHistoryData(new EventNewHistoryData(event.getTimestamp()), true), fabricPrivacy::logException)
);
}
@ -225,7 +232,7 @@ public class IobCobCalculatorPlugin extends PluginBase implements IobCobCalculat
this.bgReadings = bgReadings;
}
public List<BgReading> getBucketedData() {
public List<InMemoryGlucoseValue> getBucketedData() {
return bucketed_data;
}
@ -335,15 +342,15 @@ public class IobCobCalculatorPlugin extends PluginBase implements IobCobCalculat
break;
if (older.date == newer.date) { // direct hit
bucketed_data.add(newer);
bucketed_data.add(new InMemoryGlucoseValue(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(injector);
newBgreading.date = currentTime;
newBgreading.value = Math.round(currentBg);
InMemoryGlucoseValue newBgreading = new InMemoryGlucoseValue();
newBgreading.setTimestamp(currentTime);
newBgreading.setValue(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() + ")");
}
@ -360,7 +367,7 @@ public class IobCobCalculatorPlugin extends PluginBase implements IobCobCalculat
}
bucketed_data = new ArrayList<>();
bucketed_data.add(bgReadings.get(0));
bucketed_data.add(new InMemoryGlucoseValue(bgReadings.get(0)));
getAapsLogger().debug(LTag.AUTOSENS, "Adding. bgTime: " + DateUtil.toISOString(bgReadings.get(0).date) + " lastbgTime: " + "none-first-value" + " " + bgReadings.get(0).toString());
int j = 0;
for (int i = 1; i < bgReadings.size(); ++i) {
@ -381,12 +388,12 @@ public class IobCobCalculatorPlugin extends PluginBase implements IobCobCalculat
while (elapsed_minutes > 5) {
nextbgTime = lastbgTime - 5 * 60 * 1000;
j++;
BgReading newBgreading = new BgReading(injector);
newBgreading.date = nextbgTime;
InMemoryGlucoseValue newBgreading = new InMemoryGlucoseValue();
newBgreading.setTimestamp(nextbgTime);
double gapDelta = bgReadings.get(i).value - lastbg;
//console.error(gapDelta, lastbg, elapsed_minutes);
double nextbg = lastbg + (5d / elapsed_minutes * gapDelta);
newBgreading.value = Math.round(nextbg);
newBgreading.setValue(Math.round(nextbg));
//console.error("Interpolated", bucketed_data[j]);
bucketed_data.add(newBgreading);
getAapsLogger().debug(LTag.AUTOSENS, "Adding. bgTime: " + DateUtil.toISOString(bgTime) + " lastbgTime: " + DateUtil.toISOString(lastbgTime) + " " + newBgreading.toString());
@ -396,38 +403,38 @@ public class IobCobCalculatorPlugin extends PluginBase implements IobCobCalculat
lastbgTime = nextbgTime;
}
j++;
BgReading newBgreading = new BgReading(injector);
newBgreading.value = bgReadings.get(i).value;
newBgreading.date = bgTime;
InMemoryGlucoseValue newBgreading = new InMemoryGlucoseValue();
newBgreading.setValue(bgReadings.get(i).value);
newBgreading.setTimestamp(bgTime);
bucketed_data.add(newBgreading);
getAapsLogger().debug(LTag.AUTOSENS, "Adding. bgTime: " + DateUtil.toISOString(bgTime) + " lastbgTime: " + DateUtil.toISOString(lastbgTime) + " " + newBgreading.toString());
} else if (Math.abs(elapsed_minutes) > 2) {
j++;
BgReading newBgreading = new BgReading(injector);
newBgreading.value = bgReadings.get(i).value;
newBgreading.date = bgTime;
InMemoryGlucoseValue newBgreading = new InMemoryGlucoseValue();
newBgreading.setValue(bgReadings.get(i).value);
newBgreading.setTimestamp(bgTime);
bucketed_data.add(newBgreading);
getAapsLogger().debug(LTag.AUTOSENS, "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;
bucketed_data.get(j).setValue((bucketed_data.get(j).getValue() + bgReadings.get(i).value) / 2);
//log.error("***** Average");
}
}
// 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;
InMemoryGlucoseValue current = bucketed_data.get(i);
InMemoryGlucoseValue previous = bucketed_data.get(i + 1);
long msecDiff = current.getTimestamp() - previous.getTimestamp();
long adjusted = (msecDiff - T.mins(5).msecs()) / 1000;
getAapsLogger().debug(LTag.AUTOSENS, "Adjusting bucketed data time. Current: " + DateUtil.toISOString(current.date) + " to: " + DateUtil.toISOString(previous.date + T.mins(5).msecs()) + " by " + adjusted + " sec");
getAapsLogger().debug(LTag.AUTOSENS, "Adjusting bucketed data time. Current: " + DateUtil.toISOString(current.getTimestamp()) + " to: " + DateUtil.toISOString(previous.getTimestamp() + T.mins(5).msecs()) + " by " + adjusted + " sec");
if (Math.abs(adjusted) > 90) {
// too big adjustment, fallback to non 5 min data
getAapsLogger().debug(LTag.AUTOSENS, "Fallback to non 5 min data");
createBucketedDataRecalculated();
return;
}
current.date = previous.date + T.mins(5).msecs();
current.setTimestamp(previous.getTimestamp() + T.mins(5).msecs());
}
getAapsLogger().debug(LTag.AUTOSENS, "Bucketed data created. Size: " + bucketed_data.size());
@ -544,8 +551,8 @@ public class IobCobCalculatorPlugin extends PluginBase implements IobCobCalculat
if (bucketed_data == null)
return null;
for (int index = 0; index < bucketed_data.size(); index++) {
if (bucketed_data.get(index).date <= time)
return bucketed_data.get(index).date;
if (bucketed_data.get(index).getTimestamp() <= time)
return bucketed_data.get(index).getTimestamp();
}
return null;
}
@ -814,15 +821,15 @@ public class IobCobCalculatorPlugin extends PluginBase implements IobCobCalculat
getAapsLogger().debug(LTag.AUTOSENS, "Starting calculation thread: " + from + " to " + dateUtil.dateAndTimeString(end));
if (thread == null || thread.getState() == Thread.State.TERMINATED) {
if (sensitivityOref1Plugin.isEnabled())
thread = new IobCobOref1Thread(injector, this, from, end, bgDataReload, limitDataToOldestAvailable, cause);
thread = new IobCobOref1Thread(injector, this, treatmentsPlugin, from, end, bgDataReload, limitDataToOldestAvailable, cause);
else
thread = new IobCobThread(injector, this, from, end, bgDataReload, limitDataToOldestAvailable, cause);
thread = new IobCobThread(injector, this, treatmentsPlugin, from, end, bgDataReload, limitDataToOldestAvailable, cause);
thread.start();
}
}
// When historical data is changed (comming from NS etc) finished calculations after this date must be invalidated
private void newHistoryData(EventNewHistoryData ev) {
private void newHistoryData(EventNewHistoryData ev, boolean bgDataReload) {
//log.debug("Locking onNewHistoryData");
stopCalculation("onEventNewHistoryData");
synchronized (dataLock) {
@ -862,7 +869,7 @@ public class IobCobCalculatorPlugin extends PluginBase implements IobCobCalculat
}
}
}
runCalculation("onEventNewHistoryData", System.currentTimeMillis(), false, true, ev);
runCalculation("onEventNewHistoryData", System.currentTimeMillis(), bgDataReload, true, ev);
//log.debug("Releasing onNewHistoryData");
}

View file

@ -30,11 +30,13 @@ import info.nightscout.androidaps.interfaces.ProfileFunction;
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.general.overview.notifications.Notification;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.data.AutosensData;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventAutosensBgLoaded;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventAutosensCalculationFinished;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventIobCalculationProgress;
import info.nightscout.androidaps.plugins.sensitivity.SensitivityAAPSPlugin;
import info.nightscout.androidaps.plugins.sensitivity.SensitivityWeightedAveragePlugin;
import info.nightscout.androidaps.db.Treatment;
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin;
import info.nightscout.androidaps.utils.DateUtil;
import info.nightscout.androidaps.utils.DecimalFormatter;
import info.nightscout.androidaps.utils.FabricPrivacy;
@ -61,7 +63,6 @@ public class IobCobOref1Thread extends Thread {
@Inject ResourceHelper resourceHelper;
@Inject ProfileFunction profileFunction;
@Inject Context context;
@Inject ActivePluginProvider activePluginProvider;
@Inject SensitivityAAPSPlugin sensitivityAAPSPlugin;
@Inject SensitivityWeightedAveragePlugin sensitivityWeightedAveragePlugin;
@Inject BuildHelper buildHelper;
@ -71,6 +72,7 @@ public class IobCobOref1Thread extends Thread {
private final HasAndroidInjector injector;
private final IobCobCalculatorPlugin iobCobCalculatorPlugin; // cannot be injected : HistoryBrowser uses different instance
private final TreatmentsPlugin treatmentsPlugin; // cannot be injected : HistoryBrowser uses different instance
private boolean bgDataReload;
private boolean limitDataToOldestAvailable;
private String from;
@ -78,11 +80,12 @@ public class IobCobOref1Thread extends Thread {
private PowerManager.WakeLock mWakeLock;
IobCobOref1Thread(HasAndroidInjector injector, IobCobCalculatorPlugin iobCobCalculatorPlugin, String from, long end, boolean bgDataReload, boolean limitDataToOldestAvailable, Event cause) {
IobCobOref1Thread(HasAndroidInjector injector, IobCobCalculatorPlugin iobCobCalculatorPlugin, TreatmentsPlugin treatmentsPlugin, String from, long end, boolean bgDataReload, boolean limitDataToOldestAvailable, Event cause) {
super();
injector.androidInjector().inject(this);
this.injector = injector;
this.iobCobCalculatorPlugin = iobCobCalculatorPlugin;
this.treatmentsPlugin = treatmentsPlugin;
this.bgDataReload = bgDataReload;
this.limitDataToOldestAvailable = limitDataToOldestAvailable;
@ -114,8 +117,9 @@ public class IobCobOref1Thread extends Thread {
if (bgDataReload) {
iobCobCalculatorPlugin.loadBgData(end);
iobCobCalculatorPlugin.createBucketedData();
rxBus.send(new EventAutosensBgLoaded(cause));
}
List<BgReading> bucketed_data = iobCobCalculatorPlugin.getBucketedData();
List<InMemoryGlucoseValue> bucketed_data = iobCobCalculatorPlugin.getBucketedData();
LongSparseArray<AutosensData> autosensDataTable = iobCobCalculatorPlugin.getAutosensDataTable();
if (bucketed_data == null || bucketed_data.size() < 3) {
@ -123,7 +127,7 @@ public class IobCobOref1Thread extends Thread {
return;
}
long prevDataTime = IobCobCalculatorPlugin.roundUpTime(bucketed_data.get(bucketed_data.size() - 3).date);
long prevDataTime = IobCobCalculatorPlugin.roundUpTime(bucketed_data.get(bucketed_data.size() - 3).getTimestamp());
aapsLogger.debug(LTag.AUTOSENS, "Prev data time: " + dateUtil.dateAndTimeString(prevDataTime));
AutosensData previous = autosensDataTable.get(prevDataTime);
// start from oldest to be able sub cob
@ -137,7 +141,7 @@ public class IobCobOref1Thread extends Thread {
return;
}
// check if data already exists
long bgTime = bucketed_data.get(i).date;
long bgTime = bucketed_data.get(i).getTimestamp();
bgTime = IobCobCalculatorPlugin.roundUpTime(bgTime);
if (bgTime > IobCobCalculatorPlugin.roundUpTime(now()))
continue;
@ -169,14 +173,14 @@ public class IobCobOref1Thread extends Thread {
double bg;
double avgDelta;
double delta;
bg = bucketed_data.get(i).value;
if (bg < 39 || bucketed_data.get(i + 3).value < 39) {
bg = bucketed_data.get(i).getValue();
if (bg < 39 || bucketed_data.get(i + 3).getValue() < 39) {
aapsLogger.error("! value < 39");
continue;
}
autosensData.bg = bg;
delta = (bg - bucketed_data.get(i + 1).value);
avgDelta = (bg - bucketed_data.get(i + 3).value) / 3;
delta = (bg - bucketed_data.get(i + 1).getValue());
avgDelta = (bg - bucketed_data.get(i + 3).getValue()) / 3;
IobTotal iob = iobCobCalculatorPlugin.calculateFromTreatmentsAndTemps(bgTime, profile);
@ -240,7 +244,7 @@ public class IobCobOref1Thread extends Thread {
}
}
List<Treatment> recentCarbTreatments = activePluginProvider.getActiveTreatments().getCarbTreatments5MinBackFromHistory(bgTime);
List<Treatment> recentCarbTreatments = treatmentsPlugin.getCarbTreatments5MinBackFromHistory(bgTime);
for (Treatment recentCarbTreatment : recentCarbTreatments) {
autosensData.carbsFromBolus += recentCarbTreatment.carbs;
boolean isAAPSOrWeighted = sensitivityAAPSPlugin.isEnabled() || sensitivityWeightedAveragePlugin.isEnabled();
@ -363,7 +367,7 @@ public class IobCobOref1Thread extends Thread {
// add an extra negative deviation if a high temptarget is running and exercise mode is set
// TODO AS-FIX
if (false && sp.getBoolean(R.string.key_high_temptarget_raises_sensitivity, SMBDefaults.high_temptarget_raises_sensitivity)) {
TempTarget tempTarget = activePluginProvider.getActiveTreatments().getTempTargetFromHistory(bgTime);
TempTarget tempTarget = treatmentsPlugin.getTempTargetFromHistory(bgTime);
if (tempTarget != null && tempTarget.target() >= 100) {
autosensData.extraDeviation.add(-(tempTarget.target() - 100) / 20);
}

View file

@ -28,11 +28,13 @@ import info.nightscout.androidaps.interfaces.ProfileFunction;
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.general.overview.notifications.Notification;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.data.AutosensData;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventAutosensBgLoaded;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventAutosensCalculationFinished;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventIobCalculationProgress;
import info.nightscout.androidaps.plugins.sensitivity.SensitivityAAPSPlugin;
import info.nightscout.androidaps.plugins.sensitivity.SensitivityWeightedAveragePlugin;
import info.nightscout.androidaps.db.Treatment;
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin;
import info.nightscout.androidaps.utils.DateUtil;
import info.nightscout.androidaps.utils.DecimalFormatter;
import info.nightscout.androidaps.utils.FabricPrivacy;
@ -58,7 +60,6 @@ public class IobCobThread extends Thread {
@Inject ResourceHelper resourceHelper;
@Inject ProfileFunction profileFunction;
@Inject Context context;
@Inject ActivePluginProvider activePluginProvider;
@Inject SensitivityAAPSPlugin sensitivityAAPSPlugin;
@Inject SensitivityWeightedAveragePlugin sensitivityWeightedAveragePlugin;
@Inject BuildHelper buildHelper;
@ -68,6 +69,7 @@ public class IobCobThread extends Thread {
private final HasAndroidInjector injector;
private final IobCobCalculatorPlugin iobCobCalculatorPlugin; // cannot be injected : HistoryBrowser uses different instance
private final TreatmentsPlugin treatmentsPlugin; // cannot be injected : HistoryBrowser uses different instance
private boolean bgDataReload;
private boolean limitDataToOldestAvailable;
private String from;
@ -75,11 +77,12 @@ public class IobCobThread extends Thread {
private PowerManager.WakeLock mWakeLock;
@Inject IobCobThread(HasAndroidInjector injector, IobCobCalculatorPlugin iobCobCalculatorPlugin, String from, long end, boolean bgDataReload, boolean limitDataToOldestAvailable, Event cause) {
@Inject IobCobThread(HasAndroidInjector injector, IobCobCalculatorPlugin iobCobCalculatorPlugin, TreatmentsPlugin treatmentsPlugin, String from, long end, boolean bgDataReload, boolean limitDataToOldestAvailable, Event cause) {
super();
injector.androidInjector().inject(this);
this.injector = injector;
this.iobCobCalculatorPlugin = iobCobCalculatorPlugin;
this.treatmentsPlugin = treatmentsPlugin;
this.bgDataReload = bgDataReload;
this.limitDataToOldestAvailable = limitDataToOldestAvailable;
@ -111,8 +114,9 @@ public class IobCobThread extends Thread {
if (bgDataReload) {
iobCobCalculatorPlugin.loadBgData(end);
iobCobCalculatorPlugin.createBucketedData();
rxBus.send(new EventAutosensBgLoaded(cause));
}
List<BgReading> bucketed_data = iobCobCalculatorPlugin.getBucketedData();
List<InMemoryGlucoseValue> bucketed_data = iobCobCalculatorPlugin.getBucketedData();
LongSparseArray<AutosensData> autosensDataTable = iobCobCalculatorPlugin.getAutosensDataTable();
if (bucketed_data == null || bucketed_data.size() < 3) {
@ -120,7 +124,7 @@ public class IobCobThread extends Thread {
return;
}
long prevDataTime = IobCobCalculatorPlugin.roundUpTime(bucketed_data.get(bucketed_data.size() - 3).date);
long prevDataTime = IobCobCalculatorPlugin.roundUpTime(bucketed_data.get(bucketed_data.size() - 3).getTimestamp());
aapsLogger.debug(LTag.AUTOSENS, "Prev data time: " + dateUtil.dateAndTimeString(prevDataTime));
AutosensData previous = autosensDataTable.get(prevDataTime);
// start from oldest to be able sub cob
@ -134,7 +138,7 @@ public class IobCobThread extends Thread {
return;
}
// check if data already exists
long bgTime = bucketed_data.get(i).date;
long bgTime = bucketed_data.get(i).getTimestamp();
bgTime = IobCobCalculatorPlugin.roundUpTime(bgTime);
if (bgTime > IobCobCalculatorPlugin.roundUpTime(now()))
continue;
@ -166,14 +170,14 @@ public class IobCobThread extends Thread {
double bg;
double avgDelta;
double delta;
bg = bucketed_data.get(i).value;
if (bg < 39 || bucketed_data.get(i + 3).value < 39) {
bg = bucketed_data.get(i).getValue();
if (bg < 39 || bucketed_data.get(i + 3).getValue() < 39) {
aapsLogger.error("! value < 39");
continue;
}
autosensData.bg = bg;
delta = (bg - bucketed_data.get(i + 1).value);
avgDelta = (bg - bucketed_data.get(i + 3).value) / 3;
delta = (bg - bucketed_data.get(i + 1).getValue());
avgDelta = (bg - bucketed_data.get(i + 3).getValue()) / 3;
IobTotal iob = iobCobCalculatorPlugin.calculateFromTreatmentsAndTemps(bgTime, profile);
@ -237,7 +241,7 @@ public class IobCobThread extends Thread {
}
}
List<Treatment> recentCarbTreatments = activePluginProvider.getActiveTreatments().getCarbTreatments5MinBackFromHistory(bgTime);
List<Treatment> recentCarbTreatments = treatmentsPlugin.getCarbTreatments5MinBackFromHistory(bgTime);
for (Treatment recentCarbTreatment : recentCarbTreatments) {
autosensData.carbsFromBolus += recentCarbTreatment.carbs;
boolean isAAPSOrWeighted = sensitivityAAPSPlugin.isEnabled() || sensitivityWeightedAveragePlugin.isEnabled();

View file

@ -0,0 +1,6 @@
package info.nightscout.androidaps.plugins.iob.iobCobCalculator.events
import info.nightscout.androidaps.events.Event
import info.nightscout.androidaps.events.EventLoop
class EventAutosensBgLoaded(var cause: Event) : EventLoop()

View file

@ -0,0 +1,5 @@
package info.nightscout.androidaps.plugins.iob.iobCobCalculator.events
import info.nightscout.androidaps.events.Event
class EventNewHistoryBgData(val timestamp: Long) : Event()

View file

@ -597,6 +597,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements PumpInterface,
bolusMessage.setDuration(0);
bolusMessage.setExtendedAmount(0);
bolusMessage.setImmediateAmount(insulin);
bolusMessage.setVibration(sp.getBoolean(detailedBolusInfo.isSMB ? R.string.key_disable_vibration_auto : R.string.key_disable_vibration ,false));
bolusID = connectionService.requestMessage(bolusMessage).await().getBolusId();
bolusCancelled = false;
}
@ -720,7 +721,8 @@ public class LocalInsightPlugin extends PumpPluginBase implements PumpInterface,
PumpEnactResult cancelTBRResult = cancelTempBasalOnly();
if (cancelTBRResult.success) {
PumpEnactResult ebResult = setExtendedBolusOnly((absoluteRate - getBaseBasalRate()) / 60D
* ((double) durationInMinutes), durationInMinutes);
* ((double) durationInMinutes), durationInMinutes,
sp.getBoolean(R.string.key_disable_vibration_auto,false));
if (ebResult.success) {
result.success = true;
result.enacted = true;
@ -798,7 +800,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements PumpInterface,
@NonNull @Override
public PumpEnactResult setExtendedBolus(Double insulin, Integer durationInMinutes) {
PumpEnactResult result = cancelExtendedBolusOnly();
if (result.success) result = setExtendedBolusOnly(insulin, durationInMinutes);
if (result.success) result = setExtendedBolusOnly(insulin, durationInMinutes, sp.getBoolean(R.string.key_disable_vibration,false));
try {
fetchStatus();
readHistory();
@ -812,7 +814,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements PumpInterface,
return result;
}
public PumpEnactResult setExtendedBolusOnly(Double insulin, Integer durationInMinutes) {
public PumpEnactResult setExtendedBolusOnly(Double insulin, Integer durationInMinutes, boolean disableVibration) {
PumpEnactResult result = new PumpEnactResult(getInjector());
try {
DeliverBolusMessage bolusMessage = new DeliverBolusMessage();
@ -820,6 +822,7 @@ public class LocalInsightPlugin extends PumpPluginBase implements PumpInterface,
bolusMessage.setDuration(durationInMinutes);
bolusMessage.setExtendedAmount(insulin);
bolusMessage.setImmediateAmount(0);
bolusMessage.setVibration(disableVibration);
int bolusID = connectionService.requestMessage(bolusMessage).await().getBolusId();
InsightBolusID insightBolusID = new InsightBolusID();
insightBolusID.bolusID = bolusID;

View file

@ -14,6 +14,7 @@ public class DeliverBolusMessage extends AppLayerMessage {
private double extendedAmount;
private int duration;
private int bolusId;
private boolean disableVibration = false;
public DeliverBolusMessage() {
super(MessagePriority.NORMAL, true, true, Service.REMOTE_CONTROL);
@ -22,7 +23,11 @@ public class DeliverBolusMessage extends AppLayerMessage {
@Override
protected ByteBuf getData() {
ByteBuf byteBuf = new ByteBuf(22);
// 805 => Old value with vibration (2.6.1 and earlier), 252 => new value without vibrations for firmware 3.x
if (disableVibration)
byteBuf.putUInt16LE(252);
else
byteBuf.putUInt16LE(805);
byteBuf.putUInt16LE(BolusTypeIDs.IDS.getID(bolusType));
byteBuf.putUInt16LE(31);
byteBuf.putUInt16LE(0);
@ -57,6 +62,8 @@ public class DeliverBolusMessage extends AppLayerMessage {
this.duration = duration;
}
public void setVibration(boolean disableVibration) { this.disableVibration = disableVibration;}
public int getBolusId() {
return bolusId;
}

View file

@ -1571,6 +1571,10 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter
this.hasTimeDateOrTimeZoneChanged = true;
}
@Override public boolean setNeutralTempAtFullHour() {
return sp.getBoolean(R.string.key_set_neutral_temps, true);
}
private void setEnableCustomAction(MedtronicCustomActionType customAction, boolean isEnabled) {

View file

@ -61,14 +61,11 @@ import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil;
*/
public class MedtronicCommunicationManager extends RileyLinkCommunicationManager {
@Inject AAPSLogger aapsLogger;
@Inject MedtronicPumpStatus medtronicPumpStatus;
@Inject MedtronicPumpPlugin medtronicPumpPlugin;
@Inject MedtronicConverter medtronicConverter;
@Inject MedtronicUtil medtronicUtil;
@Inject MedtronicPumpHistoryDecoder medtronicPumpHistoryDecoder;
@Inject RileyLinkServiceData rileyLinkServiceData;
@Inject ServiceTaskExecutor serviceTaskExecutor;
private final int MAX_COMMAND_TRIES = 3;
private final int DEFAULT_TIMEOUT = 2000;

View file

@ -95,13 +95,12 @@ public class AapsOmnipodManager implements OmnipodCommunicationManagerInterface
private final OmnipodManager delegate;
@Deprecated
//TODO: remove and use injection
private static AapsOmnipodManager instance;
private Date lastBolusTime;
private Double lastBolusUnits;
@Deprecated
public static AapsOmnipodManager getInstance() {
return instance;
}

View file

@ -7,7 +7,6 @@ import java.util.Date;
import info.nightscout.androidaps.data.DetailedBolusInfo;
import info.nightscout.androidaps.data.PumpEnactResult;
import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.logging.LTag;
import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
import info.nightscout.androidaps.plugins.pump.omnipod.defs.OmnipodPumpPluginInterface;
@ -103,7 +102,7 @@ public class OmnipodUIPostprocessor {
private boolean isLogEnabled() {
return L.isEnabled(LTag.PUMP);
return true; //L.isEnabled(LTag.PUMP);
}
public RxBusWrapper getRxBus() {

View file

@ -12,12 +12,14 @@ import info.nightscout.androidaps.interfaces.PluginDescription
import info.nightscout.androidaps.interfaces.PluginType
import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload
import info.nightscout.androidaps.plugins.pump.virtual.VirtualPumpPlugin
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.T
import info.nightscout.androidaps.utils.buildHelper.BuildHelper
import info.nightscout.androidaps.utils.extensions.isRunningTest
import info.nightscout.androidaps.utils.resources.ResourceHelper
import info.nightscout.androidaps.utils.sharedPreferences.SP
import java.util.*
import javax.inject.Inject
import javax.inject.Singleton
@ -29,13 +31,14 @@ class RandomBgPlugin @Inject constructor(
injector: HasAndroidInjector,
resourceHelper: ResourceHelper,
aapsLogger: AAPSLogger,
private val virtualPumpPlugin: VirtualPumpPlugin,
private val buildHelper: BuildHelper
private val sp: SP,
private val nsUpload: NSUpload
) : PluginBase(PluginDescription()
.mainType(PluginType.BGSOURCE)
.fragmentClass(BGSourceFragment::class.java.name)
.pluginName(R.string.randombg)
.shortName(R.string.randombg_short)
.preferencesId(R.xml.pref_bgsource)
.description(R.string.description_source_randombg),
aapsLogger, resourceHelper, injector
), BgSourceInterface {
@ -55,7 +58,7 @@ class RandomBgPlugin @Inject constructor(
}
override fun advancedFilteringSupported(): Boolean {
return false
return true
}
override fun onStart() {
@ -69,7 +72,7 @@ class RandomBgPlugin @Inject constructor(
}
override fun specialEnableCondition(): Boolean {
return isRunningTest() || virtualPumpPlugin.isEnabled(PluginType.PUMP) && buildHelper.isEngineeringMode()
return true //isRunningTest() || virtualPumpPlugin.isEnabled(PluginType.PUMP) && buildHelper.isEngineeringMode()
}
override fun handleNewData(intent: Intent) {
@ -85,7 +88,12 @@ class RandomBgPlugin @Inject constructor(
bgReading.value = bgMgdl
bgReading.date = DateUtil.now()
bgReading.raw = bgMgdl
MainApp.getDbHelper().createIfNotExists(bgReading, "RandomBG")
if (MainApp.getDbHelper().createIfNotExists(bgReading, "RandomBG")) {
if (sp.getBoolean(R.string.key_dexcomg5_nsupload, false))
nsUpload.uploadBg(bgReading, "AndroidAPS-RandomBG")
if (sp.getBoolean(R.string.key_dexcomg5_xdripupload, false))
nsUpload.sendToXdrip(bgReading)
}
aapsLogger.debug(LTag.BGSOURCE, "Generated BG: $bgReading")
}
}

View file

@ -45,6 +45,7 @@ import info.nightscout.androidaps.plugins.bus.RxBusWrapper;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventNewHistoryData;
import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicPumpPlugin;
import info.nightscout.androidaps.plugins.pump.medtronic.data.MedtronicHistoryData;
import info.nightscout.androidaps.utils.DateUtil;
import info.nightscout.androidaps.utils.FabricPrivacy;
import info.nightscout.androidaps.utils.JsonHelper;
import io.reactivex.disposables.CompositeDisposable;
@ -588,6 +589,30 @@ public class TreatmentService extends OrmLiteBaseService<DatabaseHelper> {
}
}
/**
* Returns the newest record with insulin > 0
*/
@Nullable
public Treatment getLastBolus(boolean excludeSMB) {
try {
QueryBuilder<Treatment, Long> queryBuilder = getDao().queryBuilder();
Where where = queryBuilder.where();
where.gt("insulin", 0);
where.and().le("date", DateUtil.now());
where.and().eq("isValid", true);
if (excludeSMB) where.and().eq("isSMB", false);
queryBuilder.orderBy("date", false);
queryBuilder.limit(1L);
List<Treatment> result = getDao().query(queryBuilder.prepare());
if (result.isEmpty())
return null;
return result.get(0);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public void deleteNS(JSONObject json) {
String _id = JsonHelper.safeGetString(json, "_id");
if (_id != null && !_id.isEmpty())

View file

@ -178,7 +178,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
return this.service;
}
private long range() {
protected long range() {
double dia = Constants.defaultDIA;
if (profileFunction.getProfile() != null)
dia = profileFunction.getProfile().getDia();
@ -335,33 +335,27 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface
@Override
public long getLastBolusTime() {
long now = System.currentTimeMillis();
long last = 0;
synchronized (treatments) {
for (Treatment t : treatments) {
if (!t.isValid)
continue;
if (t.date > last && t.insulin > 0 && t.date <= now)
last = t.date;
Treatment last = getService().getLastBolus(false);
if (last == null) {
getAapsLogger().debug(LTag.DATATREATMENTS, "Last bolus time: NOTHING FOUND");
return 0;
}
else {
getAapsLogger().debug(LTag.DATATREATMENTS, "Last bolus time: " + dateUtil.dateAndTimeString(last.date));
return last.date;
}
getAapsLogger().debug(LTag.DATATREATMENTS, "Last bolus time: " + dateUtil.dateAndTimeString(last));
return last;
}
public long getLastBolusTime(boolean isSMB) {
long now = System.currentTimeMillis();
long last = 0;
synchronized (treatments) {
for (Treatment t : treatments) {
if (!t.isValid)
continue;
if (t.date > last && t.insulin > 0 && t.date <= now && isSMB == t.isSMB)
last = t.date;
public long getLastBolusTime(boolean excludeSMB) {
Treatment last = getService().getLastBolus(excludeSMB);
if (last == null) {
getAapsLogger().debug(LTag.DATATREATMENTS, "Last manual bolus time: NOTHING FOUND");
return 0;
}
else {
getAapsLogger().debug(LTag.DATATREATMENTS, "Last manual bolus time: " + dateUtil.dateAndTimeString(last.date));
return last.date;
}
getAapsLogger().debug(LTag.DATATREATMENTS, "Last manual bolus time: " + dateUtil.dateAndTimeString(last));
return last;
}
@Override

View file

@ -34,7 +34,7 @@ import info.nightscout.androidaps.setupwizard.elements.*
import info.nightscout.androidaps.setupwizard.events.EventSWUpdate
import info.nightscout.androidaps.utils.AndroidPermission
import info.nightscout.androidaps.utils.CryptoUtil
import info.nightscout.androidaps.utils.LocaleHelper.update
import info.nightscout.androidaps.utils.locale.LocaleHelper.update
import info.nightscout.androidaps.utils.extensions.isRunningTest
import info.nightscout.androidaps.utils.protection.ProtectionCheck
import info.nightscout.androidaps.utils.resources.ResourceHelper

View file

@ -20,7 +20,7 @@ import info.nightscout.androidaps.setupwizard.elements.SWItem
import info.nightscout.androidaps.setupwizard.events.EventSWUpdate
import info.nightscout.androidaps.utils.AndroidPermission
import info.nightscout.androidaps.utils.FabricPrivacy
import info.nightscout.androidaps.utils.LocaleHelper.update
import info.nightscout.androidaps.utils.locale.LocaleHelper.update
import info.nightscout.androidaps.utils.alertDialogs.OKDialog.show
import info.nightscout.androidaps.utils.alertDialogs.OKDialog.showConfirmation
import info.nightscout.androidaps.utils.resources.ResourceHelper

View file

@ -8,7 +8,9 @@ import javax.inject.Singleton
@Singleton
class SkinButtonsOn @Inject constructor(private val config: Config) : SkinInterface {
override val description: Int get() = R.string.buttonson_desrciption
override val description: Int get() = R.string.buttonson_description
override val mainGraphHeight: Int get() = 200
override val secondaryGraphHeight: Int get() = 100
override fun overviewLayout(isLandscape: Boolean, isTablet: Boolean, isSmallHeight: Boolean): Int =
when {

View file

@ -8,7 +8,9 @@ import javax.inject.Singleton
@Singleton
class SkinClassic @Inject constructor(private val config: Config): SkinInterface {
override val description: Int get() = R.string.classic_desrciption
override val description: Int get() = R.string.classic_description
override val mainGraphHeight: Int get() = 200
override val secondaryGraphHeight: Int get() = 100
override fun overviewLayout(isLandscape: Boolean, isTablet: Boolean, isSmallHeight: Boolean): Int =
when {

View file

@ -6,5 +6,7 @@ import androidx.annotation.StringRes
interface SkinInterface {
@get:StringRes val description : Int
val mainGraphHeight : Int // in dp
val secondaryGraphHeight : Int // in dp
@LayoutRes fun overviewLayout(isLandscape : Boolean, isTablet : Boolean, isSmallHeight : Boolean): Int
}

View file

@ -0,0 +1,23 @@
package info.nightscout.androidaps.skins
import info.nightscout.androidaps.Config
import info.nightscout.androidaps.R
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class SkinLargeDisplay @Inject constructor(private val config: Config): SkinInterface {
override val description: Int get() = R.string.largedisplay_description
override val mainGraphHeight: Int get() = 400
override val secondaryGraphHeight: Int get() = 150
override fun overviewLayout(isLandscape: Boolean, isTablet: Boolean, isSmallHeight: Boolean): Int =
when {
config.NSCLIENT && isTablet -> R.layout.overview_fragment_nsclient_tablet
config.NSCLIENT -> R.layout.overview_fragment_nsclient
isSmallHeight || isLandscape -> R.layout.overview_fragment_landscape
else -> R.layout.overview_fragment
}
}

View file

@ -1,6 +1,5 @@
package info.nightscout.androidaps.utils;
import android.os.Build;
import android.text.Html;
import android.text.Spanned;
@ -8,7 +7,6 @@ import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Iterator;
@ -24,33 +22,24 @@ public class JSONFormatter {
final JsonVisitor visitor = new JsonVisitor(1, '\t');
try {
if (jsonString.equals("undefined"))
return Html.fromHtml("undefined");
return HtmlHelper.INSTANCE.fromHtml("undefined");
else if (jsonString.getBytes()[0] == '[')
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return Html.fromHtml(visitor.visit(new JSONArray(jsonString), 0), Html.FROM_HTML_MODE_COMPACT);
} else {
return Html.fromHtml(visitor.visit(new JSONArray(jsonString), 0));
}
else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return Html.fromHtml(visitor.visit(new JSONObject(jsonString), 0), Html.FROM_HTML_MODE_COMPACT);
} else {
return Html.fromHtml(visitor.visit(new JSONObject(jsonString), 0));
}
}
return HtmlHelper.INSTANCE.fromHtml(visitor.visit(new JSONArray(jsonString), 0));
else
return HtmlHelper.INSTANCE.fromHtml(visitor.visit(new JSONObject(jsonString), 0));
} catch (JSONException e) {
log.error("Unhandled exception", e);
return Html.fromHtml("");
return HtmlHelper.INSTANCE.fromHtml("");
}
}
public static Spanned format(final JSONObject object) {
final JsonVisitor visitor = new JsonVisitor(1, '\t');
try {
return Html.fromHtml(visitor.visit(object, 0));
return HtmlHelper.INSTANCE.fromHtml(visitor.visit(object, 0));
} catch (JSONException e) {
log.error("Unhandled exception", e);
return Html.fromHtml("");
return HtmlHelper.INSTANCE.fromHtml("");
}
}

View file

@ -16,6 +16,8 @@
android:layout_weight="1"
android:gravity="center_vertical"
android:scaleType="centerInside"
android:scaleX="2"
android:scaleY="2"
android:src="@drawable/icon_cp_age_canula" />
<TextView
@ -33,6 +35,8 @@
android:layout_weight="1"
android:gravity="center_vertical"
android:scaleType="centerInside"
android:scaleX="2"
android:scaleY="2"
android:src="@drawable/icon_cp_age_insulin" />
<TextView
@ -57,6 +61,8 @@
android:layout_weight="1"
android:gravity="center_vertical"
android:scaleType="centerInside"
android:scaleX="2"
android:scaleY="2"
android:src="@drawable/icon_cp_age_sensor" />
<TextView
@ -74,6 +80,8 @@
android:layout_weight="1"
android:gravity="center_vertical"
android:scaleType="centerInside"
android:scaleX="2"
android:scaleY="2"
android:src="@drawable/icon_cp_age_battery" />
<TextView

View file

@ -381,12 +381,6 @@
<string name="careportal_insulinage_label">Insulien ouderdom</string>
<string name="careportal_pbage_label">Pomp battery ouderdom</string>
<string name="ns_alarmoptions">Alarm Opsies</string>
<string name="nsalarm_urgenthigh">Nood hoog</string>
<string name="nsalarm_high">Hoog</string>
<string name="nsalarm_low">Laag</string>
<string name="nsalarm_urgentlow">Nood laag</string>
<string name="nsalarm_staledata">Ou data</string>
<string name="nsalarm_urgentstaledata">Nood ou data</string>
<string name="nsalarm_staledatavalue_label">Ou data drumpel [min]</string>
<string name="nsalarm_urgent_staledatavalue_label">Nood ou data drumpel [min]</string>
<string name="openapsama_autosens_period">Interval vir autosens [h]</string>

View file

@ -20,7 +20,9 @@
<string name="objectives_autosens_gate">Една седмица успешно дневно използване с редовно въвеждане на въглехидрати</string>
<string name="objectives_ama_objective">Активиране на допълнителни функции за дневно използване, включително и advanced meal assist (АМА)</string>
<string name="objectives_smb_objective">Добавяне на допълнителни функции за използване през деня, като SMB</string>
<string name="objectives_auto_objective">Разрешаване на автоматизация</string>
<string name="objectives_smb_gate">Трябва да прочетете wiki и увеличите maxIOB за да може SMB да работи добре! Добро начало е maxIOB = средния болус за хранене + 3 пъти най-големия базал от профила</string>
<string name="objectives_auto_gate">Прочетете документацията как работи автоматизацията. Настройте първите си прости правила. Вместо да прави действия нека AAPS покаже само известие. Когато сте сигурни, автоматизацията се задейства в точното време, за да заменете известяването с реални действия. (https: //androidaps.readthedocs.io/en/latest/EN/Usage/Automation.html)</string>
<string name="objectives_bgavailableinns">КЗ да се вижда в NS</string>
<string name="objectives_pumpstatusavailableinns">Статуса на помпата да е достъпен в NS</string>
<string name="objectives_manualenacts">Ръчно приложени</string>

View file

@ -1,2 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<string name="biometric_title">Изисква се удостоверяване</string>
<string name="biometric_description">Поставете пръста си върху четеца на пръстови отпечатъци, за да потвърдите самоличността си</string>
<string name="settings_protection">Защита на настройките</string>
<string name="application_protection">Защита на приложението</string>
<string name="bolus_protection">Защита от болус</string>
<string name="master_password">Главна парола</string>
<string name="settings_password">Парола за настройки</string>
<string name="application_password">Парола за приложението</string>
<string name="bolus_password">Парола за болус</string>
<string name="biometric">Биометрични данни</string>
<string name="custom_password">Допълнителна парола</string>
<string name="noprotection">Няма защита</string>
<string name="protection">Защита</string>
<string name="master_password_missing">Главната парола не е зададена!\n\nМоля, настройте Вашата главна парола в Предпочитания (%1$s &#8594; %2$s)</string>
<string name="password_set">Паролата е зададена!</string>
<string name="password_not_set">Паролата не е зададена</string>
<string name="password_not_changed">Паролата не е променена</string>
<string name="password_cleared">Паролата е изчистена!</string>
<string name="password_hint">Въведете парола</string>
</resources>

View file

@ -130,6 +130,7 @@
<string name="apsmode_title">APS режим</string>
<string name="closedloop">Затворен кръг</string>
<string name="openloop">Отворен кръг</string>
<string name="lowglucosesuspend">Спиране на базал при ниска КЗ</string>
<string name="disabledloop">Loop изключен</string>
<string name="disableloop">Изключи Loop</string>
<string name="enableloop">Включи Loop</string>
@ -170,6 +171,52 @@
<string name="openapsma_maxbasal_summary">Макс. лимит на временен базал [Е/ч] </string>
<string name="openapsma_maxiob_title">Максимален IOB</string>
<string name="openapsma_maxiob_summary">Този параметър се нарича максимален IOB в OpenAPS и подразбиране е 0. След няколко дни или седмици можете да го увеличите.</string>
<string name="password_preferences_encrypt_prompt">Главна парола, която ще бъде използвана за криптиране на експортирани настройки.</string>
<string name="password_preferences_decrypt_prompt">Парола, която е била използвана за криптиране на експортираните настройки.</string>
<string name="preferences_export_canceled">Експорт неуспешен! Настройките не са експортирани!</string>
<string name="preferences_import_canceled">Импорт неуспешен! Настройките не са импортирани!</string>
<string name="preferences_import_list_title">Изберете файл</string>
<string name="check_preferences_before_import">Моля, проверете насстройките преди импортирането:</string>
<string name="check_preferences_cannot_import">Настройите не могат да бъдат импортирани!</string>
<string name="check_preferences_dangerous_import">Настройите не трябва да бъдат импортирани! (опасни)</string>
<string name="check_preferences_details_btn">Разясняване на проблеми с импорт…</string>
<string name="check_preferences_details_title">Подробности за проблеми с импорта</string>
<string name="check_preferences_import_btn">Импорт</string>
<string name="check_preferences_import_anyway_btn">Импортирай все пак (ОПАСНО!)</string>
<string name="metadata_warning_different_flavour">Настройките са създадени с различен вариант на AAPS (%1$s) докато Вие сте с: %2$s.\n\nНякои настройки може да липсват или са невалидни!След импортиране, моля, проверете и актуализирайте своите настройки.</string>
<string name="metadata_warning_different_device">Настройките са създадени на друго устройство. Това е ОК, ако импортирате от по-стар/различен телефон, но се уверете, че тези настройки са правилни!</string>
<string name="metadata_warning_outdated_format">Използвате остарял формат от старите версии на AAPS, който не е защитен! Използвайте го само като крайна мярка, или експортирайте в JSON формат.</string>
<string name="metadata_warning_old_export">Импортираните настройки са стари %1$s дни! Може би имате по-актуални настройки или сте избрали грешен файл? Не забравяйте да експортирате настройки редовно!</string>
<string name="metadata_warning_date_format">Невалиден формат на датата!</string>
<string name="metadata_warning_different_version">Настройки от различна под-версия на приложението. Това е ОК, ако импортирате след надстройка, но проверете след вноса, ако настройки са все още правилни!</string>
<string name="metadata_urgent_different_version">Настройки от различна главна версия на приложението. Основните версии се различават значително и могат да имат несъвместими настройки! Уверете се, че след импорт, че преференциите са все още правилни!</string>
<string name="metadata_label_format">Формат на файла</string>
<string name="metadata_label_created_at">Създаден на</string>
<string name="metadata_label_aaps_version">Версия на AAPS</string>
<string name="metadata_label_aaps_flavour">вариант</string>
<string name="metadata_label_device_name">Име на пациента</string>
<string name="metadata_label_device_model">Модел на телефона:</string>
<string name="metadata_label_encryption">Криптиране</string>
<string name="metadata_format_old">Стар формат</string>
<string name="metadata_format_new">Нов формат</string>
<string name="metadata_format_debug">Нов формат (некриптирани)</string>
<string name="metadata_format_other">Непознат формат</string>
<string name="prefdecrypt_settings_tampered">Файлът с настройки е преправян</string>
<string name="prefdecrypt_settings_secure">Файлът с настройки е сигурен</string>
<string name="prefdecrypt_settings_unencrypted">Използване на нешифровани настройки е рисково</string>
<string name="prefdecrypt_wrong_json">Грешка във формат JSON, липсва поле (формат, съдържание, метаданни или сигурност)</string>
<string name="prefdecrypt_wrong_password">Грешка при декриптиране, грешна парола</string>
<string name="prefdecrypt_issue_missing_file_hash">Контролна сума (hash) липсва, не може да се провери автентичността на настройките!</string>
<string name="prefdecrypt_issue_modified">Файлът е бил модифициран след експорт!</string>
<string name="prefdecrypt_issue_parsing">Грешка при декриптиране, възстановяването неуспешно!</string>
<string name="prefdecrypt_issue_wrong_pass">Грешка при декриптиране, грешна парола или файлът с настройки е модифициран! Възможно е импортираният файл да е експортиран с различна парола.</string>
<string name="prefdecrypt_issue_wrong_format">Липсва конфигурация на шифроване, форматът на настройките е невалиден!</string>
<string name="prefdecrypt_issue_wrong_algorithm">Неподдържан или непотвърден алгоритъм за криптиране!</string>
<string name="exported_today">експортирани днес</string>
<string name="exported_ago" comment="at placeholder we add pluralized number of hours/minutes">от преди %1$s</string>
<string name="exported_at" comment="at placeholder we add export date">от %1$s</string>
<string name="exported_less_than_hour_ago">от преди по-малко от час</string>
<string name="in_directory" comment="placeholder is for exported file path">в директория: %1$s</string>
<string name="end_user_license_agreement">Лицензионно споразумение с краен потребител</string>
<string name="end_user_license_agreement_text">НЕ ТРЯБВА ДА СЕ ИЗПОЛЗВА ЗА ВЗЕМАНЕ НА МЕДИЦИНСКИ РЕШЕНИЯ. НЯМА ГАРАНЦИЯ ЗА ПРОГРАМАТА, ДО СТЕПЕНТА, ПОЗВОЛЕНА ОТ ПРИЛОЖИМОТО ПРАВО. ОСВЕН КОГАТО Е ПОСОЧЕНО ДРУГО В ПИСМЕН ВИД, ПРИТЕЖАТЕЛИТЕ НА АВТОРСКОТО ПРАВО И/ИЛИ ДРУГИ СТРАНИ ПРЕДОСТАВЯТ ПРОГРАМАТА \"КАКТО Е\", БЕЗ ГАРАНЦИИ ОТ ВСЯКАКЪВ ВИД, ИЗРАЗЕНИ ИЛИ ПОДРАЗБИРАЩИ СЕ, ВКЛЮЧИТЕЛНО, НО НЕ САМО, ПОДРАЗБИРАЩИ СЕ ГАРАНЦИИ ЗА ПРОДАВАЕМОСТ И ПРИГОДНОСТ ЗА КОНКРЕТНА ЦЕЛ. ЦЕЛИЯ РИСК ПО ОТНОШЕНИЕ НА КАЧЕСТВОТО И ЕФЕКТИВНОСТТА НА ПРОГРАМАТА Е САМО ВАШ. АКО ПРОГРАМАТА НЕ СРАБОТИ, ВИЕ ПОЕМАТЕ ВСИЧКИ НЕОБХОДИМИ РАЗХОДИ ЗА ОБСЛУЖВАНЕ, РЕМОНТ ИЛИ КОРЕКЦИЯ.</string>
<string name="end_user_license_agreement_i_understand">Разбирам и приемам</string>
@ -217,6 +264,9 @@
<string name="smscommunicator_carbsreplywithcode">За да въведете %1$dг в %2$s отговорете с код %3$s</string>
<string name="smscommunicator_basalpctreplywithcode">За да стартирате базал от %1$d%%Е/ч за %2$d мин отговорете с код %3$s</string>
<string name="smscommunicator_suspendreplywithcode">За да спрете APS за %1$d минути отговорете с код %2$s</string>
<string name="smscommunicator_loopresumereplywithcode">За възстановяване на кръга отговорете с код %1$s</string>
<string name="smscommunicator_loopenablereplywithcode">За активирнае на кръга отговорете с код %1$s</string>
<string name="smscommunicator_loopdisablereplywithcode">За изключване на кръга отговорете с код %1$s</string>
<string name="smscommunicator_tempbasalset">Временен базал от %1$.2fЕ/ч за %2$d мин стартиран успешно</string>
<string name="smscommunicator_extendedset">Удължен болус %1$.2fU за %2$d мин стартиран успешно</string>
<string name="smscommunicator_carbsset">Въглехидрати %1$dг въведени</string>
@ -353,6 +403,9 @@
<string name="adult">Възрастен</string>
<string name="resistantadult">Възрастни с голяма инсулинова резистентност</string>
<string name="patientage_summary">Изберете възраст за определяне лимитите на безопасност</string>
<string name="patient_name">Име на пациента</string>
<string name="patient_name_summary">Моля, посочете име на пациента или измислено име, за да се различават</string>
<string name="patient_name_default" comment="This is default patient display name, when user does not provide real one">Потребител</string>
<string name="Glimp">Glimp</string>
<string name="needwhitelisting">%1$s се нуждае от изключване от списъка за оптимизиране на батерията за пълна функционалност</string>
<string name="loopsuspended">Loop изключен</string>
@ -387,12 +440,26 @@
<string name="enablesuperbolus">Разреши използването на Суперболус</string>
<string name="enablesuperbolus_summary">Разреши функцията суперболус в съветника. Не я разрешавайте докато не научите какво наистина прави. ТОВА МОЖЕ ДА СЪЗДАДЕ ОПАСНОСТ ОТ ПРЕДОЗИРАНЕ С ИНСУЛИН.</string>
<string name="show_statuslights">Покажи статус светлини на началния екран</string>
<string name="statuslights_cage_warning">Праг за възраст на канюла [часа]</string>
<string name="statuslights_cage_critical">Праг за критична възраст на канюла [часа]</string>
<string name="statuslights_iage_warning">Праг за инсулинова възраст [часа]</string>
<string name="statuslights_iage_critical">Праг за критична инсулинова възраст [часа]</string>
<string name="statuslights_sage_warning">Праг за възраст на сензор [часа]</string>
<string name="statuslights_sage_critical">Праг за критична възраст на сензор [часа]</string>
<string name="statuslights_bage_warning">Аларма при възраст на батерия над [часа]</string>
<string name="statuslights_bage_critical">Праг за критична възраст на батерията над [часа]</string>
<string name="statuslights_res_warning">Ниво за аларма за останал инсулин в резервоара [Е]</string>
<string name="statuslights_res_critical">Критично ниво на останал инсулин в резервоар [Е]</string>
<string name="statuslights_bat_warning">Аларма при заряд на батерия под [%]</string>
<string name="statuslights_bat_critical">Критично ниво на батерията под [%]</string>
<string name="prediction_shortname">Предв</string>
<string name="iob">IOB</string>
<string name="cob">СОВ</string>
<string name="basal_shortname">БАЗА</string>
<string name="deviation_shortname">Откл</string>
<string name="activity_shortname">АКТ</string>
<string name="abs_insulin_shortname">АБС</string>
<string name="devslope_shortname">ОТК.НАКЛ</string>
<string name="nav_about">За приложението</string>
<string name="smscommunicator_missingsmspermission">SMS команда забранена</string>
<string name="smscommunicator_missingphonestatepermission">Липсва разрешение до данни от телефона</string>
@ -410,12 +477,8 @@
<string name="doprofileswitch">Смени профил</string>
<string name="careportal_pbage_label">Възраст на батерията на помпата</string>
<string name="ns_alarmoptions">Опции за аларми</string>
<string name="nsalarm_urgenthigh">Много висока</string>
<string name="nsalarm_high">Висока</string>
<string name="nsalarm_low">Ниска</string>
<string name="nsalarm_urgentlow">Много ниска</string>
<string name="nsalarm_staledata">Стари данни</string>
<string name="nsalarm_urgentstaledata">Много стари данни</string>
<string name="ns_alarms">Известяване при NS аларми</string>
<string name="ns_announcements">Създаване на известия от NS съобщения</string>
<string name="nsalarm_staledatavalue_label">Когато няма данни повече от [мин]</string>
<string name="nsalarm_urgent_staledatavalue_label">Много стари данни при повече от [мин]</string>
<string name="openapsama_autosens_period">Интервал за autosens [ч]</string>
@ -503,8 +566,13 @@
<string name="bgsource_upload">Настройки при качване на КЗ към Nightscout</string>
<string name="wear_detailed_delta_title">Показвай подробна делта</string>
<string name="wear_detailed_delta_summary">Показвай делта с още един десетичен знак</string>
<string name="smbinterval_summary">Интервал между SMB в минути</string>
<string name="smbmaxminutes">Максимум минути СМБ</string>
<string name="smbmaxminutes_summary">Максимални минути за ограничаване на базала от SMB</string>
<string name="uamsmbmaxminutes">Максимум минути за отчитане на необявени хранения UAM</string>
<string name="uamsmbmaxminutes_summary">Максимални минути за ограничаване на базала при SMB за UAM</string>
<string name="carbsReqThreshold">Праг на предложение за въгл.</string>
<string name="carbsReqThreshold_summary">Когато се предлагат въгл., при колко да се покаже уведомление</string>
<string name="dexcomg5_xdripupload_title">Изпращай данни за КЗ към xDrip+</string>
<string name="dexcomg5_xdripupload_summary">В xDrip+ изберете 640g/Eversense за източник на данни</string>
<string name="nsclientbg">КЗ от NS</string>
@ -563,6 +631,8 @@
<string name="extendedbolusdeliveryerror">Грешка при доставяне на удължен болус</string>
<string name="insightpump_shortname">Sight</string>
<string name="ago">преди</string>
<string name="set_neutral_temps_title">Прилагане на неутрални временни базали</string>
<string name="set_neutral_temps_summary">Ако е вкл, то ще анулира временен базал на всеки час. Това може да помогне за спиране на звук/вибрация от някой помпи на всеки час.</string>
<string name="enablesmbalways">Разреши SMB постоянно</string>
<string name="enablesmbalways_summary">Разрешава SMB постоянно и независимо от болусите. Възможно само с източник на КЗ с добра филтрация като G5 </string>
<string name="enablesmbaftercarbs">Разреши SMB след въглехидрати</string>
@ -734,6 +804,10 @@
<string name="high_temptarget_raises_sensitivity_summary"><![CDATA[Да вдигам ли чувствителността при цели над 5.6]]></string>
<string name="low_temptarget_lowers_sensitivity_title">Ниските цели да свалят ли чувствителността ?</string>
<string name="low_temptarget_lowers_sensitivity_summary"><![CDATA[Да се понижава ли чувствителността при цели < 5.6 ммол/л?]]></string>
<string name="resistance_lowers_target_title">Съпротивление намалява целта</string>
<string name="resistance_lowers_target_summary">Когато се установи резистентност, намалява целевата глюкоза.</string>
<string name="sensitivity_raises_target_title">Чувствителността увеличава целта</string>
<string name="sensitivity_raises_target_summary">Когато се установи чувствителност, повишаване на целевата глюкоза</string>
<string name="combo_invalid_setup">Невалидни настройки на помпата, проверете wiki и се уверете че меню Quick Info се казва QUICK INFO, с помощта на 360 софтуера.</string>
<string name="custom">По избор</string>
<string name="careportal_removestartedevents"> AndroidAPS стартира</string>
@ -742,6 +816,7 @@
<string name="error_adding_treatment_title">Данните за лечението не са пълни</string>
<string name="maintenance_settings">Настройки за поддръжка</string>
<string name="maintenance_email">Имейл</string>
<string name="maintenance_encrypt_exported_prefs">Криптиране на експортирани настройки</string>
<string name="maintenance_amount">Брой логове за изпращане</string>
<string name="maintenance">Поддръжка</string>
<string name="maintenance_shortname">ПОДДР</string>
@ -783,6 +858,10 @@
<string name="log_alerts">Записвай аларми</string>
<string name="enable_tbr_emulation">Разреши емулация на временни базали</string>
<string name="enable_tbr_emulation_summary">Използвайте удължени болуси вместо временни базали да се заобиколи ограничението от 250%%</string>
<string name="disable_vibration">Изключи вибрациите при ръчен болус</string>
<string name="disable_vibration_summary">За болус и разширен болус (само на разположение с Insight фърмуер 3.x)</string>
<string name="disable_vibration_auto">Изключи вибрациите при автоматичен болус</string>
<string name="disable_vibration_auto_summary">За SMB и временни базали с емулация (достъпна само с Insight фърмуер 3.x)</string>
<string name="disconnect_delay">Забавяне при прекъсване на връзката [сек]</string>
<string name="serial_number">Сериен номер</string>
<string name="release_software_version">Софтуер версия</string>
@ -927,6 +1006,8 @@
<string name="exists">съществува</string>
<string name="notexists">не съществува</string>
<string name="temptargetcompared">Временна цел %1$s</string>
<string name="btdevicecompared">Bluetooth връзка към устройство %1$s %2$s</string>
<string name="btdevice">Връзка с Bluetooth устройство </string>
<string name="wifissidcompared">WiFi SSID %1$s %2$s</string>
<string name="autosenscompared">Аутосенс %1$s %2$s %%</string>
<string name="autosenslabel">Аутосенс %</string>
@ -981,6 +1062,7 @@
<string name="medtronic_pump_battery_alkaline">Алкални</string>
<string name="medtronic_pump_battery_lithium">Литиева</string>
<string name="medtronic_pump_battery_nizn">NiZn батерия</string>
<string name="medtronic_pump_battery_nimh">NiMH (батерия)</string>
<string name="medtronic_bolus_debugging">Болус/Корекция подробно</string>
<!-- RL BLE Scanning -->
<string name="rileylink_scanner_scan_scan">СКАНИРАЙ</string>
@ -1122,6 +1204,7 @@
<string name="objectives_button_unfinish">Изчисти приключение</string>
<string name="objectives_button_unstart">Изчисти стартираните</string>
<string name="doyouwantresetstart">Искате ли да нулирате прогреса си?</string>
<string name="time_or_timezone_change">Време и/или промяна на часовата зона на помпата</string>
<string name="nopumpselected">Не е избрана помпа</string>
<string name="setupwizard_units_prompt">Изберете единиците, в които искате да работите</string>
<string name="ns_ploadlocalprofile">Качване на локални промени в НС профила</string>
@ -1171,19 +1254,148 @@
<string name="loop_smbexecution_time_label">Макс. време за изпълнение за SMB</string>
<string name="loop_tbrrequest_time_label">Диапазон между временни базали</string>
<string name="loop_tbrexecution_time_label">Продължителност на временни базали</string>
<string name="insight_alert_notification_channel">Информация за Insight Pump</string>
<!-- SMS Communicator & OTP Authenticator -->
<string name="smscommunicator_code_from_authenticator_for" comment="This is continuation of sentence: To [ACTION] reply with code">от приложението AUTHENTICATOR за: %1$s</string>
<string name="smscommunicator_otp_enabled">Активиране на удостоверител</string>
<string name="smscommunicator_otp_enabled_summary">Удостоверяване чрез еднократна парола, генерирана с Google Authenticator или подобна програма за 2-факторна оторизация.</string>
<string name="smscommunicator_otp_pin">Допълнителен PIN в края на токен</string>
<string name="smscommunicator_otp_pin_summary">Допълнителни цифри, които следва да бъдат залепени в края на всяка генерирана еднократна парола</string>
<string name="smscomunicator_tab_otp_label">Настройка на удостоверителя</string>
<string name="smscommunicator_otp_verify_label">ОТР за проверка:</string>
<string name="smscommunicator_otp_reset_btn">Нулиране на удостоверители</string>
<string name="smscommunicator_otp_reset_title">Нулиране на ключва</string>
<string name="smscommunicator_otp_reset_prompt">Сигурни ли сте, че ще анулирате ключа на Authenticator? Той ще направи всички конфигурирани в момента аудиентикатори невалидни, и вие ще трябва да ги настроите отново.</string>
<string name="smscommunicator_otp_reset_successful">Генериран е нов ключ! Моля, използвайте актуализирания QRCode.</string>
<string name="smscommunicator_otp_step1_install_header">1. Инсталиране на удостоверител</string>
<string name="smscommunicator_otp_step2_provisioning_header">2. Сканиране на кода за настройка на AndroidAPS OTP </string>
<string name="smscommunicator_otp_step3_test_header">3. Тест на еднократна парола</string>
<string name="smscommunicator_otp_reset_header">Нулиране на удостоверители</string>
<string name="smscommunicator_otp_install_info">На всеки следящ телефона инсталирайте приложение Аутентификатор, който поддържа RFC 6238 ТОТР токени. Популярни безплатни приложения:\n • Authy\n • Google Authenticator\n • LastPass Authenticator\n • FreeOTP Authenticator</string>
<string name="smscommunicator_otp_provisioning_warning">Не давайте този код е онлайн!\nИзползвайте го само за сканиране на телефони последовател.</string>
<string name="smscommunicator_otp_reset_warning">При нулиране на на удостоверителя, всички вече използвани удостоверения са невалидни. Ще трябва да ги настроите отново!</string>
<string name="onconnect">При свързване</string>
<string name="ondisconnect">При изключване</string>
<string name="overview_show_predictions">Прогнозни КЗ</string>
<string name="overview_show_deviationslope">Наклон на отклонението</string>
<string name="authorizationfailed">Удостоверяването неуспешно</string>
<string name="overview_show_absinsulin">Абсолютен инсулин</string>
<string name="master_password_summary">Главната парола се използва за архивиране на настройки и за подмяна на защитата в приложението. Запомни я или я пази на сигурно място.</string>
<string name="passwords_dont_match">Паролите не съвпадат</string>
<string name="current_master_password">Сегашна главна парола</string>
<string name="statuslights">Индикатори</string>
<string name="statuslights_copy_ns">Копиране на настройки от NS</string>
<string name="copyexistingvalues">Копиране на профил от NS (ако има)?</string>
<string name="classic_description">Оригинален изглед</string>
<string name="buttonson_description">Бутоните винаги се показват на дъното на екрана.</string>
<string name="largedisplay_description">Голям екран</string>
<string name="skin">Тема</string>
<!-- Omnipod -->
<!-- Omnipod - Base -->
<string name="description_pump_omnipod">Интеграция на помпата Omnipod, изисква RileyLink устройство (с фърмуер минимум 2.0 ) .</string>
<!-- Omnipod Configuration -->
<string name="omnipod_config_beep_bolus_enabled">Звук при болус активен</string>
<string name="omnipod_config_beep_basal_enabled">Звук при базал активен</string>
<string name="omnipod_config_beep_smb_enabled">Звук при SMB активен</string>
<string name="omnipod_config_beep_tbr_enabled">Звук при временен базал активен</string>
<string name="omnipod_config_pod_debugging_options_enabled">Опции за отстраняване на грешки в под активирани</string>
<string name="omnipod_config_timechange_enabled">Разрешено е DST/Timezone</string>
<!-- Omnipod - Fragment -->
<string name="omnipod_pod_mgmt">Под Mgmt</string>
<string name="omnipod_pod_status">Статус на под</string>
<string name="omnipod_reservoir_left">%1$.2f Е остават</string>
<string name="omnipod_reservoir_over50">Над 50 Е</string>
<string name="omnipod_pod_address">Адрес на под</string>
<string name="omnipod_pod_expiry">Срокът на пода изтича</string>
<string name="omnipod_pod_name_no_info">Няма информация.</string>
<string name="omnipod_pod_no_pod_connected">Няма активен под</string>
<string name="omnipod_pod_not_initalized">Под не е инициализиран</string>
<string name="omnipod_pod_active_alerts">Сигнали за активен под</string>
<string name="omnipod_ack_short">Ack Предупреждения</string>
<!-- Omnipod - Dialogs -->
<string name="omnipod_frequency">Omnipod (433.91 MHz)</string>
<!-- Omnipod - Error -->
<string name="omnipod_error_operation_not_possible_no_configuration">Забранено действие.\n\n Първо трябва да конфигурурате Omnipod , преди да използвате тази операция,.</string>
<string name="omnipod_error_operation_not_possible_no_profile">Операцията не е възможна.\n\n Трябва да изчакате няколко минути, докато AAPS се опита да зададе профил за първи път.</string>
<string name="omnipod_error_illegal_init_action_type">Неправилен PodInitActionType: %1$s</string>
<string name="omnipod_error_pod_not_attached">Няма активен под.</string>
<string name="omnipod_driver_error_setup_action_verification_failed">Грешка при проверка на командата</string>
<string name="omnipod_driver_error_unexpected_exception_type">Непредвидена грешка. Моля, докладвайте! (тип: %1$s).</string>
<string name="omnipod_driver_error_invalid_parameters">Неуспешна комуникация: получени грешни входни параметри.</string>
<string name="omnipod_driver_error_communication_failed_timeout">Връзката е неуспешна: таймаут.</string>
<string name="omnipod_driver_error_communication_failed_unexpected_exception">Комуникацията е неуспешна: възникнала е неочаквана грешка. Моля, докладвайте!</string>
<string name="omnipod_driver_error_crc_mismatch">Неуспешна комуникация: проверката на целостта на съобщението е неуспешна.</string>
<string name="omnipod_driver_error_invalid_packet_type">Неуспешна комуникация: получени грешни входни параметри.</string>
<string name="omnipod_driver_error_invalid_progress_state">Съобщението е неуспешно: Pod е в лошо състояние.</string>
<string name="omnipod_driver_error_invalid_response">Неуспешна комуникация: получени грешни входни параметри.</string>
<string name="omnipod_driver_error_invalid_message_sequence_number">Неуспешна комуникация: получи съобщение с невалиден номер на последователност от Pod.</string>
<string name="omnipod_driver_error_invalid_message_address">Неуспешна комуникация: получи съобщение с невалиден номер на последователност от Pod.</string>
<string name="omnipod_driver_error_message_decoding_failed">Неуспешна комуникация: получени грешни входни параметри.</string>
<string name="omnipod_driver_error_nonce_resync_failed">Комуникацията е неуспешна: nonce ресинхронизирането е неуспешно.</string>
<string name="omnipod_driver_error_nonce_out_of_sync">Комуникацията е неуспешна: nonce ресинхронизирането е неуспешно.</string>
<string name="omnipod_driver_error_not_enough_data">Комуникацията е неуспешна: няма достатъчно данни, получени от Pod.</string>
<string name="omnipod_driver_error_pod_fault">Грешка на Pod (%1$03d %2$s). Моля, деактивирайте вашия Pod и стартирайте нов.</string>
<string name="omnipod_driver_error_pod_returned_error_response">Комуникацията е неуспешна: Pod върна отговор с грешка.</string>
<!-- Omnipod - Pod Mgmt -->
<string name="omnipod_pod_mgmt_title">Управление на Pod</string>
<string name="omnipod_cmd_init_pod">Инициализация на Pod</string>
<string name="omnipod_cmd_deactivate_pod">Деактивирай под</string>
<string name="omnipod_cmd_reset_pod">Нулиране на под</string>
<string name="omnipod_cmd_pod_history">История на под</string>
<string name="omnipod_cmd_set_bolus">Стартирай болус</string>
<string name="omnipod_cmd_cancel_bolus">Отмяна на болус</string>
<string name="omnipod_cmd_set_tbr">Приложи временен базал</string>
<string name="omnipod_cmd_cancel_tbr">Отказ на базал</string>
<string name="omnipod_cmd_cancel_tbr_forced">Отказ на базал</string>
<string name="omnipod_cmd_set_basal_schedule">Задаване на график за базал</string>
<string name="omnipod_cmd_get_pod_status">Получу статус на под</string>
<string name="omnipod_cmd_get_pod_info">Получи информация за Pod</string>
<string name="omnipod_cmd_set_time">Задаване на час</string>
<string name="omnipod_cmd_configure_alerts">Конфигуриране на аларми</string>
<string name="omnipod_cmd_acknowledge_alerts">Потвърждение на аларми</string>
<string name="omnipod_cmd_suspend_delivery">Спиране на доставката на инсулин</string>
<string name="omnipod_cmd_resume_delivery">Подновяване на доставката</string>
<string name="omnipod_cmd_unknown_entry">Непознат запис</string>
<string name="omnipod_cmd_bolus_value">%1$.1fЕ</string>
<string name="omnipod_cmd_bolus_value_with_carbs">%1$.1f U, CH=%2$.1f g</string>
<string name="omnipod_cmd_tbr_value">Скорост: %1$.1f U, Продължителност: %2$d мин.</string>
<string name="omnipod_cmd_reset_pod_desc">Ако натиснете <b>OK</b>, състоянието на Pod ще бъде нулирано и няма да можете да общувате с него повече. Правете това, само ако вече не можеш да се свързвате с него. Ако все още можете да общувате с Под, моля, използвайте опцията <b>Деактивирай Pod</b>.</string>
<string name="omnipod_cmd_pod_history_na">Историята на Pod не е достъпна в момента.</string>
<string name="omnipod_init_pod_wizard_step1_title">Напълни Pod</string>
<string name="omnipod_init_pod_wizard_step1_desc">\nНапълнете с достатъчно инсулин за 3 дни.\n\nИзчакайте два сигнала от Pod по време на процеса на зареждане. Те показват, че е вмъкнат минималният размер от 85U. Уверете се, че сте изпразнил напълно спринцовката, дори след като сте чули двата сигнала.\n\nСлед пълнене на Pod, моля натиснете <b>Следващ</b>.\n\n<b>Забележка:</b> не вадете капачката на капсулата на Podв този момент.</string>
<string name="omnipod_init_pod_wizard_step2_title">Пълнене</string>
<string name="omnipod_init_pod_wizard_step2_action_header">Опитвам се да се сдвоя с Pod.\n\nКогато всички елементи са проверени, можете да натиснете <b>Следващ</b>.\n\n<b>Забележка:</b> задръжте Pod много близо до RileyLink в този момент.</string>
<string name="omnipod_init_pod_wizard_step3_title">Прикрепете Pod</string>
<string name="omnipod_init_pod_wizard_step3_desc">\nПодгответе мястото за инфузия. Отстранете капачката на Pod и лепенката и прикрепете капсулата към мястото за инфузия.\n\nАко канюла стърчи, моля натиснете <b>Отказ</b> и изхвърлете вашия Pod.\n\nПрес <b>Следваща</b> да се вмъкне канюлата и да започне базалната доставка.</string>
<string name="omnipod_init_pod_wizard_step4_title">Вмъкване на канюла</string>
<string name="omnipod_init_pod_wizard_step4_action_header">Опитвам се да определя първоначалния базален график и да вмъкна канюлата.\n\nКогато всички елементи са проверени, можете да натиснете <b>Следващ</b>.</string>
<string name="omnipod_init_pod_wizard_pod_info_title">Информация за Pod</string>
<string name="omnipod_init_pod_wizard_pod_info_init_pod_description">\Podе активна.\n\nВашият базален график е програмиран и канюлата вмъкната.\n\nМоля, проверете дали канюлата е поставена правилно или заменете Pod, ако чувствате, че не е.</string>
<string name="omnipod_remove_pod_wizard_step1_title">Деактивирай Pod</string>
<string name="omnipod_remove_pod_wizard_step1_desc">\nНатиснете <b>Следващ</b> , за да деактивирате Pod.\n\n<b>Забележка:</b> Това ще спре всички доставки на инсулин и деактивира Pod.</string>
<string name="omnipod_remove_pod_wizard_step2_title">Деактивиране на Pod</string>
<string name="omnipod_remove_pod_wizard_step2_action_header">Деактивиране на Pod.\n\nКогато всички елементи са проверени, можете да натиснете <b>Следващ</b>.\n\n<b>Забележка:</b> Ако деактивирането непрекъснато се проваля, моля натиснете <b>Отказ</b> и използвайте опция <b>Нулирай Pod</b> , за да възстановите състоянието на Pod.</string>
<string name="omnipod_init_pod_wizard_pod_info_remove_pod_description">Pod изключен.\n\nмоля, извадете Pod от тялото си и го хвърли.</string>
<string name="omnipod_init_pod_pair_pod">Сдвояване на под</string>
<string name="omnipod_init_pod_prime_pod">Пълнене на под</string>
<string name="omnipod_init_pod_fill_cannula">Напълни канула</string>
<string name="omnipod_init_pod_set_basal_profile">Приложи базалният профил</string>
<string name="omnipod_deactivate_pod_cancel_delivery">Отмяна</string>
<string name="omnipod_deactivate_pod_deactivate_pod">Деактивирай под</string>
<!-- Omnipod Dash -->
<!-- Omnipod - Base -->
<string name="description_pump_omnipod_dash">Интеграция на Omnipod Dash.</string>
<string name="omnipod_alert_finish_pairing_reminder">Край на напомняне за сдвояване</string>
<string name="omnipod_alert_finish_setup_reminder_reminder">Край на напомнянето за настройка</string>
<string name="omnipod_alert_expiration">Подът скоро ще изтече</string>
<string name="omnipod_alert_expiration_advisory">Подът скоро ще изтече</string>
<string name="omnipod_alert_shutdown_imminent">Спирането е неизбежно</string>
<string name="omnipod_alert_low_reservoir">Минимален инсулин в резервоара</string>
<string name="omnipod_alert_unknown_alert">Непозната аларма</string>
<string name="omnipod_error_set_basal_failed_uncertain">Задаването на базален профил може да е неуспешно. Доставката на инсулин може да бъде спряна! Моля, опреснете статуса на под.</string>
<string name="omnipod_error_set_temp_basal_failed_uncertain">Стартиране на временен базал неуспешно. Ако е имало вече такъв, той може да е бил отменен! Моля, обновете статуса на пода.</string>
<string name="omnipod_error_set_time_failed_uncertain">Задаването на време може да е неуспешно. Доставката на инсулин може да бъде спряна! Моля, опреснете статуса на под.</string>
<string name="omnipod_bolus_failed_uncertain">Не може да се провери статус на болус. Моля, уверете се, че вашият под е стартирал болус или го отменете.</string>
<string name="omnipod_rl_stats">Статистика на RL</string>
<string name="omnipod_read_pulse_log_short">Pulse лог</string>
</resources>

View file

@ -264,6 +264,9 @@
<string name="smscommunicator_carbsreplywithcode">Pro zadání %1$dg na %2$s odpovězte pomocí SMS s kódem %3$s</string>
<string name="smscommunicator_basalpctreplywithcode">Pro spuštění bazálu %1$d%% na %2$d min odpovězte SMS s kódem %3$s</string>
<string name="smscommunicator_suspendreplywithcode">K pozastavení smyčky na %1$d minut odpověz SMS s kódem %2$s</string>
<string name="smscommunicator_loopresumereplywithcode">Chcete-li obnovit smyčku, odpovězte SMS s kódem %1$s</string>
<string name="smscommunicator_loopenablereplywithcode">Chcete-li povolit smyčku, odpovězte SMS s kódem %1$s</string>
<string name="smscommunicator_loopdisablereplywithcode">Chcete-li zakázat smyčku, odpovězte SMS s kódem %1$s</string>
<string name="smscommunicator_tempbasalset">Dočasný bazál %1$.2fU/h na %2$d minut spuštěn</string>
<string name="smscommunicator_extendedset">Prodloužený bolus %1$.2fU na %2$d min úspěšně spuštěn</string>
<string name="smscommunicator_carbsset">Sacharidy %1$dg byly úspěšně zadány</string>
@ -468,12 +471,8 @@
<string name="doprofileswitch">Proveďte přepnutí profilu</string>
<string name="careportal_pbage_label">Stáří baterie v pumpě</string>
<string name="ns_alarmoptions">Nastavení alarmů</string>
<string name="nsalarm_urgenthigh">Urgentně vysoká</string>
<string name="nsalarm_high">Vysoká</string>
<string name="nsalarm_low">Nízká</string>
<string name="nsalarm_urgentlow">Urgentně nízká</string>
<string name="nsalarm_staledata">Zastaralá data</string>
<string name="nsalarm_urgentstaledata">Urgentně zastaralá data</string>
<string name="ns_alarms">Vytvořit oznámení z alarmů NS</string>
<string name="ns_announcements">Vytvořit oznámení z NS upozornění </string>
<string name="nsalarm_staledatavalue_label">Mezní hodnota pro zastaralá data [min]</string>
<string name="nsalarm_urgent_staledatavalue_label">Urgentní mezní hodnota pro zastaralá data [min]</string>
<string name="openapsama_autosens_period">Interval pro detekci senzitivity [h]</string>
@ -626,6 +625,8 @@
<string name="extendedbolusdeliveryerror">Chyba spuštění extended bolusu</string>
<string name="insightpump_shortname">Insight</string>
<string name="ago">zpět</string>
<string name="set_neutral_temps_title">Nastavit neutrální dočasný bazál</string>
<string name="set_neutral_temps_summary">Je-li povoleno, zastaví dočasný bazál před koncem každé hodiny. To může u některých pump pomoci zastavit pípání/vibrace v celou hodinu.</string>
<string name="enablesmbalways">Vždy povolit SMB</string>
<string name="enablesmbalways_summary">Povolit SMB nezávisle na bolusech. Možno pouze se zdroji glykémií s dobrým filtrováním dat, jako např. G5</string>
<string name="enablesmbaftercarbs">Povolit SMB po jídle</string>
@ -851,6 +852,10 @@
<string name="log_alerts">Zaznamenat výstrahy</string>
<string name="enable_tbr_emulation">Povolit emulaci dočasných bazálů</string>
<string name="enable_tbr_emulation_summary">Používat prodloužené bolusy na obejití limitu dočasných bazálů 250%%</string>
<string name="disable_vibration">Zakázat vibrace při ručním podání bolusu</string>
<string name="disable_vibration_summary">Pro bolus a prodloužený bolus (dostupné pouze s Insight firmware 3.x)</string>
<string name="disable_vibration_auto">Zakázat vibrace při automatickém podání bolusu</string>
<string name="disable_vibration_auto_summary">Pro SMB a Dočasný bazál s emulací TBR (k dispozici pouze s Insight firmware 3.x)</string>
<string name="disconnect_delay">Limit pro odpojení [s]</string>
<string name="serial_number">Sériové číslo</string>
<string name="release_software_version">Verze softwaru</string>
@ -1275,8 +1280,6 @@
<string name="statuslights">Stavové indikátory</string>
<string name="statuslights_copy_ns">Zkopírovat nastavení z NS</string>
<string name="copyexistingvalues">Zkopírovat nastavení NS (existuje-li)?</string>
<string name="classic_desrciption">Původní vzhled</string>
<string name="buttonson_desrciption">Tlačítka jsou vždy zobrazena v dolní části obrazovky</string>
<string name="skin">Vzhled</string>
<!-- Omnipod -->
<!-- Omnipod - Base -->
@ -1347,9 +1350,43 @@
<string name="omnipod_cmd_bolus_value">%1$.1f U</string>
<string name="omnipod_cmd_bolus_value_with_carbs">%1$.1f U, Sach=%2$.1f g</string>
<string name="omnipod_cmd_tbr_value">Rychlost: %1$.1f U, doba trvání: %2$d min</string>
<string name="omnipod_cmd_reset_pod_desc">Pokud stisknete <b>OK</b>, stav Podu bude vynuceně resetován a již nebudete moci komunikovat s Podem. Udělejte to pouze v případě, že s Podem již nelze komunikovat. Pokud stále můžete komunikovat s Podem, použijte volbu <b>Deaktivovat Pod</b>.</string>
<string name="omnipod_cmd_pod_history_na">Historie Podu není v daném okamžiku k dispozici.</string>
<string name="omnipod_init_pod_wizard_step1_title">Naplňte Pod</string>
<string name="omnipod_init_pod_wizard_step1_desc">\nNaplňte nový Pod dostatkem inzulínu na 3 dny.\n\nSledujte dvě pípnutí z Podu během procesu plnění. Tyto ukazují, že minimální množství 85U bylo naplněno. Ujistěte se, že stříkačka je zcela vyprázdněná a to i po vyslechnutí dvou pípnutí.\n\nPo naplnění Podu, prosím, stiskněte <b>Další</b>.\n\n<b>Poznámka:</b> prozatím nesundavejte kryt jehly.</string>
<string name="omnipod_init_pod_wizard_step2_title">Plnění</string>
<string name="omnipod_init_pod_wizard_step2_action_header">Snažím se spárovat s novým Podem a naplnit ho.\n\nJakmile budou zaškrtnuty všechny položky, můžete stisknout <b>Další</b>.\n\n<b>Poznámka:</b> ponechte prosím Pod velmi blízko RileyLinku.</string>
<string name="omnipod_init_pod_wizard_step3_title">Nasaďte Pod</string>
<string name="omnipod_init_pod_wizard_step3_desc">\nPřipravte infuzní místo. Odstraňte krytku jehly a náplasti a nalepte Pod.\n\nPokud se kanyla odlepí, stiskněte <b>Zrušit</b> a zahoďte Pod.\n\nStiskněte <b>Další</b> pro vložení kanyly a spuštění bazálů.</string>
<string name="omnipod_init_pod_wizard_step4_title">Vkládání kanyly</string>
<string name="omnipod_init_pod_wizard_step4_action_header">Snažím se nastavit počáteční základní bazální plán a vložit kanylu.\n\nPři zaškrtnutí všech položek můžete stisknout tlačítko <b>Další</b>.</string>
<string name="omnipod_init_pod_wizard_pod_info_title">Pod Info</string>
<string name="omnipod_init_pod_wizard_pod_info_init_pod_description">\nPod je nyní aktivní.\n\nVáš bazál byl naprogramován a kanyla byla vložena.\n\nOvěřte, prosím, že kanyla byla vložena správně a případně vyměňte Pod.</string>
<string name="omnipod_remove_pod_wizard_step1_title">Deaktivovat Pod</string>
<string name="omnipod_remove_pod_wizard_step1_desc">\nStiskněte <b>Další</b> pro deaktivaci Podu.\n\n<b>Poznámka:</b> Zastavíte veškerý výdej inzulínu a deaktivujete Pod.</string>
<string name="omnipod_remove_pod_wizard_step2_title">Deaktivace Podu</string>
<string name="omnipod_remove_pod_wizard_step2_action_header">Deaktivace Podu.\n\nKdyž jsou zaškrtnuty všechny položky, můžete stisknout <b>Další</b>.\n\n<b>Poznámka:</b> Pokud deaktivace nepřetržitě selhává, prosím stiskněte <b>Zrušit</b> a použijte možnost <b>Resetovat Pod</b> pro resetování stavu Podu.</string>
<string name="omnipod_init_pod_wizard_pod_info_remove_pod_description">Pod deaktivován.\n\nOdstraňte Pod z těla a znehodnoťte jej.</string>
<string name="omnipod_init_pod_pair_pod">Párování Podu</string>
<string name="omnipod_init_pod_prime_pod">Plnění Podu</string>
<string name="omnipod_init_pod_fill_cannula">Plnění kanyly</string>
<string name="omnipod_init_pod_set_basal_profile">Nastavit bazální profil</string>
<string name="omnipod_deactivate_pod_cancel_delivery">Zrušit podávání</string>
<string name="omnipod_deactivate_pod_deactivate_pod">Deaktivovat Pod</string>
<!-- Omnipod Dash -->
<!-- Omnipod - Base -->
<string name="description_pump_omnipod_dash">Integrace pumpy pro Omnipod Dash.</string>
<string name="omnipod_alert_finish_pairing_reminder">Upomínka dokončení párování</string>
<string name="omnipod_alert_finish_setup_reminder_reminder">Upomínka dokončení nastavení</string>
<string name="omnipod_alert_expiration">Životnost Podu brzy skončí</string>
<string name="omnipod_alert_expiration_advisory">Pod brzy vyprší</string>
<string name="omnipod_alert_shutdown_imminent">Blíží se vypnutí</string>
<string name="omnipod_alert_low_reservoir">Nízký stav zásobníku</string>
<string name="omnipod_alert_unknown_alert">Neznámá výstraha</string>
<string name="omnipod_error_set_basal_failed_uncertain">Nastavení bazálního profilu se možná nezdařilo. Výdej může být pozastaven! Obnovte prosím stav Podu.</string>
<string name="omnipod_error_set_temp_basal_failed_uncertain">Nastavení dočasného bazálu mohlo být neúspěšné. Pokud je dočasný bazál již spuštěn, mohl by být zrušen! Aktualizujte prosím stav Podu.</string>
<string name="omnipod_error_set_time_failed_uncertain">Nastavení času se možná nezdařilo. Výdej může být pozastaven! Obnovte prosím stav Podu.</string>
<string name="omnipod_bolus_failed_uncertain">Nelze ověřit, zda byl bolus úspěšný. Ověřte prosím, zda Váš Pod dodává bolus nebo ho zrušte.</string>
<string name="omnipod_rl_stats">Statistika RL</string>
<string name="omnipod_read_pulse_log_short">Pulse Log</string>
</resources>

View file

@ -2,7 +2,7 @@
<resources>
<string name="connection_failed">Verbindung fehlgeschlagen</string>
<string name="connection_lost">Verbindung unterbrochen</string>
<string name="pairing_rejected">Pairing abgelehnt</string>
<string name="pairing_rejected">Kopplung abgelehnt</string>
<string name="socket_creation_failed">Erstellen des Sockets fehlgeschlagen</string>
<string name="timeout">Zeitüberschreitung</string>
<string name="maximum_number_of_bolus_type_already_running">Maximale Anzahl an Boli dieses Typs bereits aktiv</string>

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="biometric_title">Authentifizierung erforderlich</string>
<string name="biometric_description">Legen Deinen Finger auf den Fingerabdrucksensors, um Deine Identität zu bestätigen.</string>
<string name="biometric_description">Lege Deinen Finger auf den Fingerabdrucksensor, um Deine Identität zu bestätigen.</string>
<string name="settings_protection">Schutz der Einstellungen</string>
<string name="application_protection">Schutz der App</string>
<string name="bolus_protection">Bolus-Schutz</string>
@ -14,7 +14,7 @@
<string name="custom_password">Benutzerdefiniertes Passwort</string>
<string name="noprotection">Kein Schutz</string>
<string name="protection">Schutz</string>
<string name="master_password_missing">Das Master-Passwort ist nicht festgelegt!\n\nLege Dein Master-Passwort bitte in en Einstellungen fest (%1$s &#8594; %2$s)</string>
<string name="master_password_missing">Das Master-Passwort ist nicht festgelegt!\n\nLege Dein Master-Passwort bitte in den Einstellungen fest (%1$s &#8594; %2$s)</string>
<string name="password_set">Passwort festgelegt!</string>
<string name="password_not_set">Passwort nicht festgelegt</string>
<string name="password_not_changed">Passwort nicht geändert</string>

View file

@ -18,7 +18,7 @@
<string name="description_actions">Einige Schaltflächen, um auf häufig verwendete Funktionen zugreifen zu können.</string>
<string name="description_config_builder">Dient zum Konfigurieren der aktiven Plugins</string>
<string name="description_objectives">Das Programm kennenlernen</string>
<string name="description_food">Zeigt die Essens-Vorlagen aus Nightscout an</string>
<string name="description_food">Zeigt die Essensvorlagen aus Nightscout an</string>
<string name="description_insulin_rapid">Insulinprofil für Humalog und NovoRapid / NovoLog</string>
<string name="description_insulin_ultra_rapid">Insulinprofil für Fiasp</string>
<string name="description_insulin_free_peak">Erlaubt dir, das Wirkmaximum der Insulinaktivität zu definieren, und sollte nur von erfahrenen Anwendern genutzt werden</string>
@ -27,26 +27,26 @@
<string name="description_ma">Stand des Algorithmus in 2016</string>
<string name="description_ama">Stand des Algorithmus in 2017</string>
<string name="description_smb">Der aktuellste Algorithmus für erfahrene Nutzer</string>
<string name="description_overview">Zeigt den aktuellen Status deines Loops und Knöpfe für die geläufigsten Aktionen an</string>
<string name="description_overview">Zeigt den aktuellen Status deines Loops und Schaltflächen für die geläufigsten Aktionen an</string>
<string name="description_persistent_notification">Zeigt eine fortlaufende Benachrichtigung mit einer kurzen Übersicht darüber, was dein Loop derzeit tut</string>
<string name="description_profile_local">Definiere ein Profil, was auch offline verfügbar ist.</string>
<string name="description_profile_nightscout">Stellt das Profil zur Verfügung, das in Nightscout definiert ist</string>
<string name="description_profile_simple">Definiere ein Profil mit nur einem Zeitblock.</string>
<string name="description_pump_combo">Pumpen-Integration für Accu-Chek Combo Pumpen; erfordert, dass ruffy installiert ist</string>
<string name="description_pump_mdi">Pumpen-Integration für Personen, die täglich mehrere Injektionen für ihre Diabetestherapie vornehmen</string>
<string name="description_pump_virtual">Pumpen-Integration für Pumpen, die noch nicht über einen Treiber verfügen (Open Loop)</string>
<string name="description_pump_mdi">Pumpenintegration für Personen, die täglich mehrere Injektionen für ihre Diabetestherapie vornehmen</string>
<string name="description_pump_virtual">Pumpenintegration für Pumpen, die noch nicht über einen Treiber verfügen (Open Loop)</string>
<string name="description_sensitivity_aaps">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.</string>
<string name="description_sensitivity_oref1">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.</string>
<string name="description_sensitivity_weighted_average">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.</string>
<string name="description_source_eversense">Empfange BZ-Werte von der gepatchten Eversense App.</string>
<string name="description_source_glimp">Empfange Blutzucker-Werte von Glimp.</string>
<string name="description_source_mm640g">Empfange Blutzucker-Werte vom 600SeriesAndroidUploader.</string>
<string name="description_source_ns_client">Lade Blutzucker-Daten von Nightscout</string>
<string name="description_source_xdrip">Empfange Blutzucker-Werte von xDrip.</string>
<string name="description_source_eversense">Empfange BZ-Werte von der gepatchten Eversense-App.</string>
<string name="description_source_glimp">Empfange Blutzuckerwerte von Glimp.</string>
<string name="description_source_mm640g">Empfange Blutzuckerwerte vom 600SeriesAndroidUploader.</string>
<string name="description_source_ns_client">Lade Blutzuckerdaten von Nightscout</string>
<string name="description_source_xdrip">Empfange Blutzuckerwerte von xDrip.</string>
<string name="description_treatments">Speichert alle eingegebenen Behandlungen</string>
<string name="description_wear">Überwache und steuere AndroidAPS mit Deiner WearOS-Smartwatch.</string>
<string name="description_xdrip_status_line">Zeige Loop-Informationen auf Deinem xDrip+-Watchface.</string>
<string name="description_sms_communicator">Steuere AndroiAPS fern mittels SMS-Anweisungen.</string>
<string name="description_sms_communicator">AndroidAPS mit SMS-Befehlen fernsteuern.</string>
<string name="treatments_insulin_label_string">Insulin:</string>
<string name="treatments_carbs_label_string">Kohlenhydrate:</string>
<string name="treatments_iob_label_string">IOB:</string>
@ -72,7 +72,7 @@
<string name="openapsma_currenttemp_label">Aktuelle TBR</string>
<string name="openapsma_iobdata_label">IOB-Daten</string>
<string name="openapsma_profile_label">Profil</string>
<string name="openapsma_mealdata_label">Mahlzeiten-Daten</string>
<string name="openapsma_mealdata_label">Mahlzeitendaten</string>
<string name="result">Ergebnis</string>
<string name="result_insulin_carbs">Ergebnis: %1$s %2$s</string>
<string name="openapsma_noglucosedata">Keine BZ-Werte verfügbar</string>
@ -94,7 +94,7 @@
<string name="configbuilder_profile">Profil</string>
<string name="configbuilder_profile_description">Welches Profil soll AndroidAPS nutzen?</string>
<string name="configbuilder_aps">APS</string>
<string name="configbuilder_aps_description">Welcher APS-Algorithmus soll Therapie-Anpassungen vornehmen?</string>
<string name="configbuilder_aps_description">Welcher APS-Algorithmus soll Therapieanpassungen vornehmen?</string>
<string name="configbuilder_general">Allgemein</string>
<string name="configbuilder_general_description">Dies sind einige generelle Plugins, die Du vielleicht hilfreich findest.</string>
<string name="configbuilder_constraints_description">Welche Beschränkungen werden angewendet?</string>
@ -117,7 +117,7 @@
<string name="setbasalquestion">Akzeptiere neue TBR:</string>
<string name="overview_treatment_label">Bolus</string>
<string name="overview_calculator_label">Rechner</string>
<string name="constraintapllied">Beschränkungen angewendet!</string>
<string name="constraintapllied">Beschränkung angewendet!</string>
<string name="confirmation">Bestätigung</string>
<string name="bolus">Bolus</string>
<string name="sms_bolus">Bolus:</string>
@ -135,7 +135,7 @@
<string name="disableloop">Deaktiviere Loop</string>
<string name="enableloop">Aktiviere Loop</string>
<string name="openloop_newsuggestion">Neue Empfehlung verfügbar</string>
<string name="unsupportednsversion">Nicht unterstütze Nightscout-Version</string>
<string name="unsupportednsversion">Nicht unterstützte Nightscout-Version</string>
<string name="loopdisabled">LOOP DEAKTIVIERT DURCH BESCHRÄNKUNGEN</string>
<string name="treatments_wizard_basaliob_label">Basal-IOB</string>
<string name="bolusconstraintapplied">Bolus-Beschränkung angewendet</string>
@ -151,10 +151,10 @@
<string name="careportal_newnstreatment_percent_label">Prozent</string>
<string name="careportal_newnstreatment_absolute_label">Absolut</string>
<string name="careportal_newnstreatment_notes_label">Notiz</string>
<string name="event_time_label">Ereignis-Zeit</string>
<string name="event_time_label">Ereigniszeit</string>
<string name="careportal_newnstreatment_profile_label">Profil</string>
<string name="careportal_newnstreatment_enteredby_title">Eingegeben durch</string>
<string name="careportal_newnstreatment_glucosetype">Glukose-Art</string>
<string name="careportal_newnstreatment_glucosetype">Glukoseart</string>
<string name="noprofile">Bisher noch kein Profil von Nightscout geladen</string>
<string name="overview_tempbasal_button">TBR</string>
<string name="overview_extendedbolus_button">Verzögerter Bolus</string>
@ -167,10 +167,10 @@
<string name="filenotfound">Datei nicht gefunden</string>
<string name="nav_export">Einstellungen exportieren</string>
<string name="nav_import">Einstellungen importieren</string>
<string name="openapsma_maxbasal_title">Max IE/h, die als TBR gesetzt werden können</string>
<string name="openapsma_maxbasal_title">Max. IE/h, die als TBR gesetzt werden können</string>
<string name="openapsma_maxbasal_summary">Dieser Wert wird \"max basal\" in OpenAPS genannt.</string>
<string name="openapsma_maxiob_title">Maximales Basal-IOB, das OpenAPS abgeben darf [IE]</string>
<string name="openapsma_maxiob_summary">Maximale Menge von nicht Bolus-IOB, die OpenAPs abgeben kann.</string>
<string name="openapsma_maxiob_summary">Maximale Menge von Nicht-Bolus-IOB, die OpenAPS abgeben kann.</string>
<string name="password_preferences_encrypt_prompt">Du wirst nach dem Master-Passwort gefragt. Mit diesem werden die exportierten Einstellungen verschlüsselt.</string>
<string name="password_preferences_decrypt_prompt">Du wirst nach dem Master-Passwort gefragt. Mit diesem werden die importierten Einstellungen entschlüsselt.</string>
<string name="preferences_export_canceled">Export abgebrochen! Einstellungen wurden NICHT exportiert!</string>
@ -185,7 +185,7 @@
<string name="check_preferences_import_anyway_btn">Trotzdem importieren (GEFÄHRLICH!)</string>
<string name="metadata_warning_different_flavour">Einstellungen wurden mit einer anderen Variante von AAPS erstellt (%1$s). Du nutzt: %2$s.\n\nEinige Einstellungen können fehlen oder ungültig sein - überprüfe und aktualisiere Deine Einstellungen nach dem Import .</string>
<string name="metadata_warning_different_device">Einstellungen wurden auf einem anderen Gerät erstellt. Das ist OK, wenn Du von einem älteren/anderen Handy importierst. Stelle aber sicher, dass die importierten Einstellungen korrekt sind!</string>
<string name="metadata_warning_outdated_format">Du verwendest das veraltete Format einer alten AAPS-Version das nicht sicher ist! Verwende dieses nur als letzte Möglichkeit, wenn Du keinen Export im aktuellen JSON-Format hast.</string>
<string name="metadata_warning_outdated_format">Du verwendest das veraltete Format einer alten AAPS-Version, das nicht sicher ist! Verwende dieses nur als letzte Möglichkeit, wenn Du keinen Export im aktuellen JSON-Format hast.</string>
<string name="metadata_warning_old_export">Die importierten Einstellungen sind bereits %1$s Tage alt! Hast Du aktuellere Einstellungen oder evtl. die falsche Datei gewählt? Denke daran, die Einstellungen regelmäßig zu exportieren.</string>
<string name="metadata_warning_date_format">Ungültiges Datums-/Zeitformat!</string>
<string name="metadata_warning_different_version">Einstellungen stammen aus einer Vorgängerversion (Nebenversion). Du kannst diese importieren, prüfe aber unbedingt nach dem Import, ob diese noch korrekt sind!</string>
@ -201,7 +201,7 @@
<string name="metadata_format_new">Neues verschlüsseltes Format</string>
<string name="metadata_format_debug">Neues Debugformat (unverschlüsselt)</string>
<string name="metadata_format_other">Unbekanntes Export-Format</string>
<string name="prefdecrypt_settings_tampered">Einstellungen-Datei wurde manipuliert.</string>
<string name="prefdecrypt_settings_tampered">Konfigurationsdatei wurde manipuliert.</string>
<string name="prefdecrypt_settings_secure">Einstellungsdatei ist sicher.</string>
<string name="prefdecrypt_settings_unencrypted">Nicht sicheres, unverschlüsseltes Einstellungsformat verwenden</string>
<string name="prefdecrypt_wrong_json">Fehler im JSON-Format, fehlendes erforderliches Feld (Format, Inhalt, Metadaten oder Sicherheit)</string>
@ -218,7 +218,7 @@
<string name="exported_less_than_hour_ago">vor weniger als einer Stunde exportiert</string>
<string name="in_directory" comment="placeholder is for exported file path">in Verzeichnis: %1$s</string>
<string name="end_user_license_agreement">Endbenutzervereinbarung</string>
<string name="end_user_license_agreement_text">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.</string>
<string name="end_user_license_agreement_text">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, ÜBERNIMMST DU ALLE NOTWENDIGEN KRANKHEITSKOSTEN, SERVICELEISTUNGEN, REPARATUREN ODER KORREKTUREN.</string>
<string name="end_user_license_agreement_i_understand">Ich verstehe und stimme zu.</string>
<string name="save">Speichern</string>
<string name="reloadprofile">Profil neuladen</string>
@ -227,14 +227,14 @@
<string name="smscommunicator_allowednumbers_summary">+XXXXXXXXXX;+YYYYYYYYYY</string>
<string name="smscommunicator_bolusreplywithcode">Um einen Bolus von %1$.2f IE abzugeben, antworte mit dem Code %2$s.</string>
<string name="smscommunicator_mealbolusreplywithcode">Um einen Mahlzeitenbolus von %1$.2f IE abzugeben, antworte mit dem Code %2$s.</string>
<string name="smscommunicator_temptargetwithcode">Um ein Temp Target von %1$s zu setzen, antworte mit dem Code %2$s</string>
<string name="smscommunicator_temptargetwithcode">Um ein temporäres Ziel von %1$s zu setzen, antworte mit dem Code %2$s</string>
<string name="smscommunicator_temptargetcancel">Um das temporäre Ziel zu stoppen, antworte mit dem Code %1$s</string>
<string name="smscommunicator_stopsmswithcode">Um den SMS Remote Service zu deaktivieren, antworte mit dem Code %1$s.\n\nBeachte, dass Du diesen nur am AAPS Master Smartphone wieder aktivieren kannst.</string>
<string name="smscommunicator_stoppedsms">SMS Remote Service gestoppt. Verwende das AAPS Master, um ihn wieder zu aktivieren.</string>
<string name="smscommunicator_stopsmswithcode">Um die SMS-Fernsteuerung zu deaktivieren, antworte mit dem Code %1$s\n\nBeachte, dass Du diesen nur am AAPS-Master-Smartphone wieder aktivieren kannst.</string>
<string name="smscommunicator_stoppedsms">SMS-Fernsteuerung gestoppt. Verwende das AAPS-Master-Smartphone, um sie wieder zu aktivieren.</string>
<string name="smscommunicator_calibrationreplywithcode">Um die Kalibrierung %1$.2f zu senden, antworte mit dem Code %2$s.</string>
<string name="smscommunicator_bolusfailed">Bolus fehlgeschlagen</string>
<string name="smscommunicator_remotebolusmindistance_summary">Minimale Dauer in Minuten, die nach einem Remote Bolus verstrichen sein muss, bevor ein neuer abgegeben werden kann.</string>
<string name="smscommunicator_remotebolusmindistance">Anzahl Minuten, die mindestens zwischen zwei Bolusgaben liegen müssen.</string>
<string name="smscommunicator_remotebolusmindistance_summary">Minimale Dauer in Minuten, die nach einem Remote-Bolus verstrichen sein muss, bevor ein neuer abgegeben werden kann.</string>
<string name="smscommunicator_remotebolusmindistance">Anzahl der Minuten, die mindestens zwischen zwei Remote-Bolusabgaben liegen müssen.</string>
<string name="smscommunicator_remotebolusmindistance_caveat">Aus Sicherheitsgründen musst Du mindestens zwei Telefonnummern eintragen, um diese Voreinstellung zu ändern.</string>
<string name="bolusdelivered">Bolus %1$.2fIE erfolgreich abgegeben</string>
<string name="bolusrequested">Werde %1$.2fIE abgeben</string>
@ -243,7 +243,7 @@
<string name="smscommunicator_mealbolusdelivered_tt">Ziel %1$s für %2$d Minuten</string>
<string name="smscommunicator_tt_set">Ziel %1$s für %2$d Minuten erfolgreich gesetzt.</string>
<string name="smscommunicator_tt_canceled">Temporäres Ziel wurde erfolgreich abgebrochen</string>
<string name="smscommunicator_remotecommandsallowed">Erlaube externe Befehle per SMS</string>
<string name="smscommunicator_remotecommandsallowed">Erlaube Fernsteuerung per SMS</string>
<string name="danarprofile">DanaR Profil-Einstellungen</string>
<string name="danarprofile_dia">DIA [h]</string>
<string name="danarprofile_dia_summary">Dauer der Insulinwirkung</string>
@ -251,7 +251,7 @@
<string name="bolusstopped">Bolus gestoppt</string>
<string name="bolusstopping">Bolus wird gestoppt</string>
<string name="smscommunicator_loophasbeendisabled">Loop wurde deaktiviert.</string>
<string name="smscommunicator_loophasbeenenabled">Loop wurde aktiviert</string>
<string name="smscommunicator_loophasbeenenabled">Lopp wurde aktiviert.</string>
<string name="smscommunicator_loopisdisabled">Loop ist deaktiviert.</string>
<string name="smscommunicator_loopisenabled">Loop ist aktiviert.</string>
<string name="valuelimitedto">%1$.2f limitiert auf %2$.2f</string>
@ -264,19 +264,22 @@
<string name="smscommunicator_carbsreplywithcode">Um %1$dg Kohlenhydrate um %2$s einzugeben, antworte mit dem Code %3$s</string>
<string name="smscommunicator_basalpctreplywithcode">Um die Basalrate von %1$d%% für %2$d Minuten zu setzen, antworte mit dem Code %3$s</string>
<string name="smscommunicator_suspendreplywithcode">Um das Loopen für %1$d Minuten zu pausieren, antworte mit dem Code %2$s.</string>
<string name="smscommunicator_loopresumereplywithcode">Um den Loop fortzusetzen, antworte mit dem Code %1$s</string>
<string name="smscommunicator_loopenablereplywithcode">Um den Loop zu aktivieren, antworte mit dem Code %1$s</string>
<string name="smscommunicator_loopdisablereplywithcode">Um den Loop zu deaktivieren, antworte mit dem Code %1$s</string>
<string name="smscommunicator_tempbasalset">TBR mit %1$.2f IE/h für %2$d min wurde erfolgreich gestartet.</string>
<string name="smscommunicator_extendedset">Der erweiterte Bolus %1$.2f IE/h für %2$d Minuten wurde erfolgreich gestartet</string>
<string name="smscommunicator_carbsset">%1$dg Kohlenhydrate erfolgreich erfasst</string>
<string name="smscommunicator_carbsset">%1$dg Kohlenhydrate erfolgreich erfasst.</string>
<string name="smscommunicator_carbsfailed">Eingabe von %1$dg Kohlenhydraten ist fehlgeschlagen.</string>
<string name="smscommunicator_tempbasalset_percent">Die temporäre Basalrate wurde erfolgreich für %2$d Minuten auf %1$d%% gesetzt</string>
<string name="smscommunicator_tempbasalset_percent">Die temporäre Basalrate wurde erfolgreich für %2$d Minuten auf %1$d%% gesetzt.</string>
<string name="smscommunicator_tempbasalfailed">Das Starten der TBR ist fehlgeschlagen.</string>
<string name="smscommunicator_extendedfailed">Die Abgabe des erweiterten Bolus ist fehlgeschlagen</string>
<string name="smscommunicator_basalstopreplywithcode">Antworte mit dem Code %1$s, um die temporäre Basalrate zu beenden</string>
<string name="smscommunicator_extendedstopreplywithcode">Antworte mit dem Code %1$s, um den erweiterten Bolus zu beenden</string>
<string name="smscommunicator_extendedfailed">Die Abgabe des erweiterten Bolus ist fehlgeschlagen.</string>
<string name="smscommunicator_basalstopreplywithcode">Antworte mit dem Code %1$s, um die temporäre Basalrate zu beenden.</string>
<string name="smscommunicator_extendedstopreplywithcode">Antworte mit dem Code %1$s, um den erweiterten Bolus zu beenden.</string>
<string name="smscommunicator_tempbasalcanceled">TBR abgebrochen</string>
<string name="smscommunicator_extendedcanceled">Die Abgabe des erweiterten Bolus wurde abgebrochen</string>
<string name="smscommunicator_extendedcanceled">Die Abgabe des erweiterten Bolus wurde abgebrochen.</string>
<string name="smscommunicator_tempbasalcancelfailed">Das Abbrechen der TBR ist fehlgeschlagen.</string>
<string name="smscommunicator_extendedcancelfailed">Der Abbruch des erweiterten Bolus ist fehlgeschlagen</string>
<string name="smscommunicator_extendedcancelfailed">Der Abbruch des erweiterten Bolus ist fehlgeschlagen.</string>
<string name="smscommunicator_unknowncommand">Unbekannter Befehl oder falsche Antwort</string>
<string name="quickwizard">QuickWizard</string>
<string name="quickwizardsettings">QuickWizard-Einstellungen</string>
@ -326,7 +329,7 @@
<string name="array_of_elements">Array mit %1$d Elementen.\nWert:</string>
<string name="openapsma_autosensdata_label">Autosens-Daten</string>
<string name="openapsma_scriptdebugdata_label">Skript Debug</string>
<string name="openapsama_useautosens">Nutze Autosense</string>
<string name="openapsama_useautosens">Nutze Autosens</string>
<string name="refresheventsfromnightscout">Aktualisiere Einträge von Nightscout</string>
<string name="deletefuturetreatments">Lösche Behandlungen in der Zukunft</string>
<string name="eatingsoon">Bald essen</string>
@ -352,7 +355,7 @@
<string name="profile">Profil</string>
<string name="openapsama_max_daily_safety_multiplier_summary">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.</string>
<string name="openapsama_current_basal_safety_multiplier_summary">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.</string>
<string name="openapsama_autosens_max_summary">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 der BZ-Zielwert eingestellt werden können. 1.2 ist dabei der Multiplikationsfaktor und erlaubt eine Anpassung um 20%%.</string>
<string name="openapsama_autosens_max_summary">Standardwert: 1.2\nDies ist eine Sicherheitsgrenze für Autosens (und bald auch Autotune), die besagt, wie stark Autosens Basalraten erhöhen darf und wie niedrig der ISF (Insulin-Sensitivitäts-Faktor) und der BZ-Zielwert eingestellt werden können. 1.2 ist dabei der Multiplikationsfaktor und erlaubt eine Anpassung um 20%%.</string>
<string name="openapsama_autosens_min_summary">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.</string>
<string name="openapsama_autosens_adjusttargets">Autosens passt Zielwerte ebenfalls an</string>
<string name="openapsama_autosens_adjusttargets_summary">Vorgabe: erlaubt.\nErlaubt Autosens den Ziel-BZ-Bereich in Verbindung mit ISF und Basal anzupassen.</string>
@ -401,7 +404,7 @@
<string name="resistantadult">Insulinresistenter Erwachsener</string>
<string name="patientage_summary">Bitte wähle das Patientenalter, um die Sicherheits-Limits festzulegen</string>
<string name="patient_name">Name des Patienten</string>
<string name="patient_name_summary">Gib den Namen des Patienten oder einen Spitznamen für die Unterscheidung zwischen mehreren Setups an.</string>
<string name="patient_name_summary">Bitte gib den Namen des Patienten oder einen Spitznamen an, um mehrere Setups unterscheiden zu können.</string>
<string name="patient_name_default" comment="This is default patient display name, when user does not provide real one">Nutzer</string>
<string name="Glimp">Glimp</string>
<string name="needwhitelisting">%1$s benötigt eine deaktivierte Akku-Leistungsoptimierung, um korrekt arbeiten zu können.</string>
@ -449,8 +452,14 @@
<string name="statuslights_res_critical">Warnschwelle kritischer Reservoirstand [IE]</string>
<string name="statuslights_bat_warning">Warnschwelle Batteriestand [%]</string>
<string name="statuslights_bat_critical">Warnschwelle kritischer Batteriestand [%]</string>
<string name="prediction_shortname">PRED</string>
<string name="iob">IOB</string>
<string name="cob">COB</string>
<string name="basal_shortname">BAS</string>
<string name="deviation_shortname">DEV</string>
<string name="activity_shortname">ACT</string>
<string name="abs_insulin_shortname">ABS</string>
<string name="devslope_shortname">DEVSLOPE</string>
<string name="nav_about">Über</string>
<string name="smscommunicator_missingsmspermission">SMS-Steuerung nicht erlaubt</string>
<string name="smscommunicator_missingphonestatepermission">Fehlende Berechtigung für den Zugriff auf den Telefonstatus</string>
@ -468,12 +477,8 @@
<string name="doprofileswitch">Profilwechsel durchführen</string>
<string name="careportal_pbage_label">Batteriealter</string>
<string name="ns_alarmoptions">Alarm-Optionen</string>
<string name="nsalarm_urgenthigh">Sehr hoch</string>
<string name="nsalarm_high">Hoch</string>
<string name="nsalarm_low">Niedrig</string>
<string name="nsalarm_urgentlow">Sehr niedrig</string>
<string name="nsalarm_staledata">Veraltete Daten</string>
<string name="nsalarm_urgentstaledata">Stark veraltete Daten</string>
<string name="ns_alarms">Benachrichtigungen über NS-Alarme</string>
<string name="ns_announcements">Benachrichtigungen über NS-Ankündigungen</string>
<string name="nsalarm_staledatavalue_label">Veraltete Daten seit [min]</string>
<string name="nsalarm_urgent_staledatavalue_label">Stark veraltete Daten seit [min]</string>
<string name="openapsama_autosens_period">Intervall für Autosens [h]</string>
@ -506,7 +511,7 @@
<string name="mdtp_cancel">Abbrechen</string>
<string name="notloadedplugins">Es sind nicht alle Profile geladen!</string>
<string name="valuesnotstored">Werte nicht gespeichert!</string>
<string name="ns_localbroadcasts">Aktiviere die Datenübertragung zu anderen Apps (z.B. xDrip). Nicht aktivieren falls Du mehr als eine Instanz von AAPS oder NSClient installiert hast!</string>
<string name="ns_localbroadcasts">Aktiviere die Datenübertragung zu anderen Apps (z.B. xDrip). Nicht aktivieren, falls Du mehr als eine Instanz von AAPS oder NSClient installiert hast!</string>
<string name="ns_localbroadcasts_title">Aktiviere lokale Broadcasts</string>
<string name="careportal_activity_label">AKTIVITÄT &amp; FEEDBACK</string>
<string name="careportal_carbsandbolus_label">CARBS &amp; BOLUS</string>
@ -561,10 +566,10 @@
<string name="bgsource_upload">BZ Upload Einstellungen</string>
<string name="wear_detailed_delta_title">Zeige detailliertes Delta</string>
<string name="wear_detailed_delta_summary">Delta wird mit Dezimalstelle angezeigt.</string>
<string name="smbinterval_summary">Wie häufig SMBs angegeben werden (in Min.)</string>
<string name="smbinterval_summary">Wie häufig SMBs abgegeben werden (in Min.)</string>
<string name="smbmaxminutes">SMB max. Minuten</string>
<string name="smbmaxminutes_summary">SMB Basal-Limit in Minuten</string>
<string name="uamsmbmaxminutes">UAM SMB max minutes</string>
<string name="uamsmbmaxminutes">UAM SMB max. Minuten</string>
<string name="uamsmbmaxminutes_summary">SMB Basal-Limit in Minuten für UAM</string>
<string name="carbsReqThreshold">Schwellenwert für KH-Empfehlung</string>
<string name="dexcomg5_xdripupload_title">Sende BZ-Werte zu xDrip+</string>
@ -625,6 +630,8 @@
<string name="extendedbolusdeliveryerror">Fehler bei der Abgabe eines verzögerten Bolus</string>
<string name="insightpump_shortname">Sight</string>
<string name="ago">her</string>
<string name="set_neutral_temps_title">Neutrale TBR setzen</string>
<string name="set_neutral_temps_summary">Wenn diese Option aktiviert ist, wird die TBR vor Ende jeder Stunde abgebrochen. Dies kann dazu beitragen, einige Pumpen davon abzuhalten, zur vollen Stunde zu vibrieren / zu piepsen.</string>
<string name="enablesmbalways">SMB immer aktivieren</string>
<string name="enablesmbalways_summary">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.</string>
<string name="enablesmbaftercarbs">Aktiviere SMB nach Mahlzeiten.</string>
@ -832,9 +839,9 @@ Unerwartetes Verhalten.</string>
<string name="loop_openmode_min_change">Minimaler Wert zur Anfrage einer Änderung [%]</string>
<string name="loop_openmode_min_change_summary" formatted="false">Open Loop schlägt neue Änderungen nur dann vor, wenn die Änderung größer als dieser Wert ist. Der Standard-Wert ist 20%.</string>
<string name="searching_for_devices">Geräte werden gesucht…</string>
<string name="pairing_completed">Pairing abgeschlossen</string>
<string name="pairing_completed">Kopplung abgeschlossen</string>
<string name="code_compare">Stimmen die Codes auf diesem Gerät und auf deiner Pumpe überein?</string>
<string name="insight_pairing">Insight Pairing</string>
<string name="insight_pairing">Insight Kopplung</string>
<string name="insight_local">Accu-Chek Insight</string>
<string name="insight_delivered">%1$.2f U / %2$.2f U abgegeben</string>
<string name="insight_alert_formatter">%1$s: %2$s</string>
@ -851,6 +858,10 @@ Unerwartetes Verhalten.</string>
<string name="log_alerts">Alarme protokollieren</string>
<string name="enable_tbr_emulation">TBR-Emulation aktivieren</string>
<string name="enable_tbr_emulation_summary">Verzögerte Boli an Stelle von TBRs verwenden, um die Beschränkung auf 250%% zu umgehen</string>
<string name="disable_vibration">Vibrationen bei manueller Bolus-Abgabe deaktivieren</string>
<string name="disable_vibration_summary">Für Boli und verlängerte Boli (nur mit Insight Firmware 3.x verfügbar)</string>
<string name="disable_vibration_auto">Vibrationen bei automatischer Bolus-Abgabe deaktivieren</string>
<string name="disable_vibration_auto_summary">Für SMB und Temporäre Basalraten mit TBR Emulation (nur mit Insight Firmware 3.x verfügbar)</string>
<string name="disconnect_delay">Verbindungsabbau-Verzögerung [s]</string>
<string name="serial_number">Seriennummer</string>
<string name="release_software_version">Release-Softwareversion</string>
@ -862,8 +873,8 @@ Unerwartetes Verhalten.</string>
<string name="bluetooth_address">Bluetooth-Adresse</string>
<string name="system_id_appendix">System-ID-Appendix</string>
<string name="manufacturing_date">Herstellungsdatum</string>
<string name="delete_pairing">Pairing löschen</string>
<string name="pairing_information">Pairinginformationen</string>
<string name="delete_pairing">Kopplung aufheben</string>
<string name="pairing_information">Kopplungsinformation</string>
<string name="start_pump">Pumpe starten</string>
<string name="stop_pump">Pumpe stoppen</string>
<string name="operating_mode">Betriebsmodus</string>
@ -1275,8 +1286,9 @@ Unerwartetes Verhalten.</string>
<string name="statuslights">Statusanzeige</string>
<string name="statuslights_copy_ns">Einstellung aus NS kopieren</string>
<string name="copyexistingvalues">NS-Einstellungen kopieren (falls vorhanden)?</string>
<string name="classic_desrciption">Ursprüngliches Erscheinungsbild</string>
<string name="buttonson_desrciption">Schaltflächen werden immer am unteren Rand des Bildschirms angezeigt</string>
<string name="classic_description">Ursprüngliches Erscheinungsbild</string>
<string name="buttonson_description">Schaltflächen werden immer am unteren Rand des Bildschirms angezeigt</string>
<string name="largedisplay_description">Großer Bildschirm</string>
<string name="skin">Erscheinungsbild</string>
<!-- Omnipod -->
<!-- Omnipod - Base -->

View file

@ -386,12 +386,6 @@
<string name="careportal_insulinage_label">Χρόνος ζωής Ινσουλίνης</string>
<string name="careportal_pbage_label">Χρόνος ζωής μπαταρίας αντλίας</string>
<string name="ns_alarmoptions">Επιλογές συναγερμού</string>
<string name="nsalarm_urgenthigh">Επείγον υψηλό</string>
<string name="nsalarm_high">Υψηλό</string>
<string name="nsalarm_low">Χαμηλό</string>
<string name="nsalarm_urgentlow">Επείγον χαμηλό</string>
<string name="nsalarm_staledata">Παλιά δεδομένα</string>
<string name="nsalarm_urgentstaledata">Επείγον παλιά δεδομένα</string>
<string name="nsalarm_staledatavalue_label">Οριακή τιμή για παλιά δεδομένα [min]</string>
<string name="nsalarm_urgent_staledatavalue_label">Επείγουσα οριακή τιμή για παλιά δεδομένα [min]</string>
<string name="openapsama_autosens_period">Εσωτερικά διαστήματα για autosense [h] </string>

View file

@ -441,12 +441,6 @@
<string name="doprofileswitch">Cambio de perfil</string>
<string name="careportal_pbage_label">Edad batería bomba</string>
<string name="ns_alarmoptions">Opciones alarma</string>
<string name="nsalarm_urgenthigh">Urgente alto</string>
<string name="nsalarm_high">Alto</string>
<string name="nsalarm_low">Bajo</string>
<string name="nsalarm_urgentlow">Urgente bajo</string>
<string name="nsalarm_staledata">Datos anticuados</string>
<string name="nsalarm_urgentstaledata">Datos antiguos urgentes</string>
<string name="nsalarm_staledatavalue_label">Datos antiguos limite [min]</string>
<string name="nsalarm_urgent_staledatavalue_label">Datos antiguos urgentes limite [min]</string>
<string name="openapsama_autosens_period">Intervalo para autosens [h]</string>

View file

@ -469,12 +469,6 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
<string name="doprofileswitch">Changer de profil</string>
<string name="careportal_pbage_label">Age batterie pompe</string>
<string name="ns_alarmoptions">Options d\'alarme</string>
<string name="nsalarm_urgenthigh">Haute urgent</string>
<string name="nsalarm_high">Haute</string>
<string name="nsalarm_low">Basse</string>
<string name="nsalarm_urgentlow">Basse urgent</string>
<string name="nsalarm_staledata">Données obsolètes</string>
<string name="nsalarm_urgentstaledata">Urgent données obsolètes</string>
<string name="nsalarm_staledatavalue_label">Seuil sans nouvelle donnée Glyc. [min]</string>
<string name="nsalarm_urgent_staledatavalue_label">Seuil d\'urgence pour les données obsolètes [min]</string>
<string name="openapsama_autosens_period">Plage pour Autosens [h]</string>
@ -852,6 +846,10 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
<string name="log_alerts">Enreg. alertes</string>
<string name="enable_tbr_emulation">Activer lémulation de DBT</string>
<string name="enable_tbr_emulation_summary">Utilisez des Bolus étendus au lieu de DBTs pour contourner la limite de 250%%</string>
<string name="disable_vibration">Désactiver les vibrations des bolus manuels</string>
<string name="disable_vibration_summary">Concerne les bolus et bolus étendus (disponible uniquement pour les firmwares 3.x)</string>
<string name="disable_vibration_auto">Désactiver les vibrations des bolus automatiques</string>
<string name="disable_vibration_auto_summary">Concerne les SMB et les basal temp avec émulation DBT (disponible uniquement pour les firmwares 3.x)</string>
<string name="disconnect_delay">Délai de déconnexion [s]</string>
<string name="serial_number">Numéro de série</string>
<string name="release_software_version">Version du logiciel</string>
@ -1276,8 +1274,6 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
<string name="statuslights">Voyants d\'état</string>
<string name="statuslights_copy_ns">Copier les paramètres depuis NS</string>
<string name="copyexistingvalues">Copier les paramètres NS (s\'ils existent)?</string>
<string name="classic_desrciption">Thème d\'origine</string>
<string name="buttonson_desrciption">Les boutons sont toujours affichés en bas de l\'écran</string>
<string name="skin">Thème</string>
<!-- Omnipod -->
<!-- Omnipod - Base -->
@ -1376,7 +1372,6 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S
<string name="description_pump_omnipod_dash">Intégration de la pompe Omnipod Dash.</string>
<string name="omnipod_alert_finish_pairing_reminder">Rappel fin d\'appairage</string>
<string name="omnipod_alert_finish_setup_reminder_reminder">Rappel fin de configuration</string>
<string name="omnipod_alert_expiration">Le Pod expire bientôt</string>
<string name="omnipod_alert_expiration_advisory">Le Pod expire bientôt</string>
<string name="omnipod_alert_shutdown_imminent">Arrêt imminent</string>
<string name="omnipod_alert_low_reservoir">Réservoir bas</string>

View file

@ -264,6 +264,9 @@
<string name="smscommunicator_carbsreplywithcode">Per inserire %1$dg a %2$s rispondi col codice %3$s</string>
<string name="smscommunicator_basalpctreplywithcode">Per avviare la basale %1$d%% per %2$d min rispondi col codice %3$s</string>
<string name="smscommunicator_suspendreplywithcode">Per sospendere il loop per %1$d minuti rispondi col codice %2$s</string>
<string name="smscommunicator_loopresumereplywithcode">Per riprendere il loop rispondi col codice %1$s</string>
<string name="smscommunicator_loopenablereplywithcode">Per abilitare il loop rispondi col codice %1$s</string>
<string name="smscommunicator_loopdisablereplywithcode">Per disabilitare il loop rispondi col codice %1$s</string>
<string name="smscommunicator_tempbasalset">Basale temporanea %1$.2fU/h per %2$d min avviata con successo</string>
<string name="smscommunicator_extendedset">Bolo esteso %1$.2fU/h per %2$d min avviato con successo</string>
<string name="smscommunicator_carbsset">CHO %1$dg inseriti con successo</string>
@ -449,8 +452,14 @@
<string name="statuslights_res_critical">Soglia livello serbatoio critico [U]</string>
<string name="statuslights_bat_warning">Soglia di avviso livello batteria [%]</string>
<string name="statuslights_bat_critical">Soglia livello batteria critico [%]</string>
<string name="prediction_shortname">PRED</string>
<string name="iob">IOB</string>
<string name="cob">COB</string>
<string name="basal_shortname">BAS</string>
<string name="deviation_shortname">DEV</string>
<string name="activity_shortname">ATT</string>
<string name="abs_insulin_shortname">ASS</string>
<string name="devslope_shortname">PENDEV</string>
<string name="nav_about">Informazioni su</string>
<string name="smscommunicator_missingsmspermission">Autorizzazione SMS mancante</string>
<string name="smscommunicator_missingphonestatepermission">Autorizzazione stato telefono mancante</string>
@ -468,12 +477,8 @@
<string name="doprofileswitch">Cambia profilo</string>
<string name="careportal_pbage_label">Età batteria micro</string>
<string name="ns_alarmoptions">Opzioni allarme</string>
<string name="nsalarm_urgenthigh">Molto alto</string>
<string name="nsalarm_high">Alto</string>
<string name="nsalarm_low">Basso</string>
<string name="nsalarm_urgentlow">Molto basso</string>
<string name="nsalarm_staledata">Dati non aggiornati</string>
<string name="nsalarm_urgentstaledata">Dati non aggiornati da molto tempo</string>
<string name="ns_alarms">Crea notifiche da allarmi NS</string>
<string name="ns_announcements">Crea notifiche da avvisi NS</string>
<string name="nsalarm_staledatavalue_label">Soglia dati non aggiornati [min]</string>
<string name="nsalarm_urgent_staledatavalue_label">Soglia dati non aggiornati da molto tempo [min]</string>
<string name="openapsama_autosens_period">Intervallo per autosens [h]</string>
@ -626,6 +631,8 @@
<string name="extendedbolusdeliveryerror">Errore erogazione bolo esteso</string>
<string name="insightpump_shortname">Sight</string>
<string name="ago">fa</string>
<string name="set_neutral_temps_title">Imposta basali temporanee neutre</string>
<string name="set_neutral_temps_summary">Se abilitato, cancellerà una basale temporanea prima della fine di ogni ora. Questo metodo può aiutare a fermare alcuni micro dall\'emettere un suono/vibrare allo scoccare dell\'ora.</string>
<string name="enablesmbalways">Abilita SMB sempre</string>
<string name="enablesmbalways_summary">Abilita SMB sempre, indipendentemente dai boli. Possibile solo con sorgente glicemia con un buon filtraggio dei dati, come G5</string>
<string name="enablesmbaftercarbs">Abilita SMB dopo i CHO</string>
@ -851,6 +858,10 @@
<string name="log_alerts">Registra avvisi</string>
<string name="enable_tbr_emulation">Abilita emulazione TBR</string>
<string name="enable_tbr_emulation_summary">Usa i bolli estesi invece dei TBR per aggirare il limite del 250%%</string>
<string name="disable_vibration">Erogazione bolo manuale: disabilita vibrazioni</string>
<string name="disable_vibration_summary">Per bolo e bolo esteso (disponibile solo con firmware Insight 3.x)</string>
<string name="disable_vibration_auto">Erogazione bolo automatica: disabilita vibrazioni</string>
<string name="disable_vibration_auto_summary">Per SMB e basale temporanea con emulazione TBR (disponibile solo con firmware Insight 3.x)</string>
<string name="disconnect_delay">Ritardo disconnessione [s]</string>
<string name="serial_number">Numero seriale</string>
<string name="release_software_version">Versione Release software</string>
@ -1275,8 +1286,9 @@
<string name="statuslights">Indicatori di stato</string>
<string name="statuslights_copy_ns">Copia impostazioni da NS</string>
<string name="copyexistingvalues">Copiare impostazioni NS (se esiste)?</string>
<string name="classic_desrciption">Tema originale</string>
<string name="buttonson_desrciption">I tasti vengono sempre visualizzati nella parte inferiore dello schermo</string>
<string name="classic_description">Tema originale</string>
<string name="buttonson_description">I tasti vengono sempre visualizzati nella parte inferiore dello schermo</string>
<string name="largedisplay_description">Visualizzazione ampia</string>
<string name="skin">Tema</string>
<!-- Omnipod -->
<!-- Omnipod - Base -->

View file

@ -408,12 +408,6 @@
<string name="doprofileswitch">프로파일 변경 실행</string>
<string name="careportal_pbage_label">펌프배터리사용기간</string>
<string name="ns_alarmoptions">알람 옵션</string>
<string name="nsalarm_urgenthigh">위험 고혈당</string>
<string name="nsalarm_high">고혈당</string>
<string name="nsalarm_low">저혈당</string>
<string name="nsalarm_urgentlow">위험 저혈당</string>
<string name="nsalarm_staledata">누락 데이터</string>
<string name="nsalarm_urgentstaledata">위험 누락 데이터</string>
<string name="nsalarm_staledatavalue_label">누락 데이터 기준값 [min]</string>
<string name="nsalarm_urgent_staledatavalue_label">위험 누락 데이터 기준값 [min]</string>
<string name="openapsama_autosens_period">autosens 시간 [h]</string>

View file

@ -450,12 +450,6 @@
<string name="doprofileswitch">Profilio keitimas</string>
<string name="careportal_pbage_label">Baterija</string>
<string name="ns_alarmoptions">Aliarmų nustatymai</string>
<string name="nsalarm_urgenthigh">Kritiškai aukštas</string>
<string name="nsalarm_high">Aukštas</string>
<string name="nsalarm_low">Žemas</string>
<string name="nsalarm_urgentlow">Kritiškai žemas</string>
<string name="nsalarm_staledata">Seni duomenys</string>
<string name="nsalarm_urgentstaledata">Kritiškai seni duomenys</string>
<string name="nsalarm_staledatavalue_label">Seni duomenys, riba [min]</string>
<string name="nsalarm_urgent_staledatavalue_label">Kritiškai seni duomenys, riba [min]</string>
<string name="openapsama_autosens_period">Autosens intervalas [h]</string>

View file

@ -408,12 +408,6 @@
<string name="doprofileswitch">Profiel wissel uitvoeren</string>
<string name="careportal_pbage_label">Ouderdom batterij</string>
<string name="ns_alarmoptions">Alarm opties</string>
<string name="nsalarm_urgenthigh">Zeer hoog</string>
<string name="nsalarm_high">Hoog</string>
<string name="nsalarm_low">Laag</string>
<string name="nsalarm_urgentlow">Zeer laag</string>
<string name="nsalarm_staledata">Oude gegevens</string>
<string name="nsalarm_urgentstaledata">Dringend oude gegevens vernieuwen</string>
<string name="nsalarm_staledatavalue_label">Oude gegevens sinds [min]</string>
<string name="nsalarm_urgent_staledatavalue_label">Alarm oude gegevens sinds [min]</string>
<string name="openapsama_autosens_period">Interval voor autosens [uur]</string>
@ -895,6 +889,7 @@
<string name="recurringTime">Herhaal tijd</string>
<string name="every">Elke</string>
<string name="never">Nooit</string>
<string name="mins">%1$dmin</string>
<string name="condition">Voorwaarde:</string>
<string name="action">Actie:</string>
<string name="iob_u">IOB [E]:</string>

View file

@ -459,12 +459,6 @@
<string name="doprofileswitch">Zmień profil</string>
<string name="careportal_pbage_label">Czas baterii pompy</string>
<string name="ns_alarmoptions">Opcje alarmu</string>
<string name="nsalarm_urgenthigh">Uwaga wysoki</string>
<string name="nsalarm_high">Wysoki</string>
<string name="nsalarm_low">Niski</string>
<string name="nsalarm_urgentlow">Uwaga niski</string>
<string name="nsalarm_staledata">Nieaktualne dane</string>
<string name="nsalarm_urgentstaledata">Uwaga, nieaktualne dane</string>
<string name="nsalarm_staledatavalue_label">Próg nieaktualne dane [min]</string>
<string name="nsalarm_urgent_staledatavalue_label">Próg uwaga nieaktualne dane [min]</string>
<string name="openapsama_autosens_period">Przedział czasowy dla autosens [h]</string>

View file

@ -171,8 +171,8 @@
<string name="openapsma_maxbasal_summary">Este valor é chamado max basal no contexto do OpenAPS</string>
<string name="openapsma_maxiob_title">Basal Máxima IOB que OpenAPS pode dar [U]</string>
<string name="openapsma_maxiob_summary">Este valor é denominado Max IOB em contexto OpenAPS \nEste é o valor máximo de insulina em [U] que APS pode dar de uma vez.</string>
<string name="password_preferences_encrypt_prompt">Será perguntado pela password mestre, que será usada para encriptar preferências exportadas.</string>
<string name="password_preferences_decrypt_prompt">Será perguntado pela password mestre, que será necessária para desencriptar preferências importadas.</string>
<string name="password_preferences_encrypt_prompt">Será perguntado pela senha mestre, que será usada para encriptar preferências exportadas.</string>
<string name="password_preferences_decrypt_prompt">Será perguntado pela senha mestre, que será necessária para desencriptar preferências importadas.</string>
<string name="preferences_export_canceled">Exportação cancelada! Preferências NÃO foram exportadas!</string>
<string name="preferences_import_canceled">Importação cancelada! Preferências NÃO foram importadas!</string>
<string name="preferences_import_list_title">Seleccione o ficheiro para importação</string>
@ -205,11 +205,11 @@
<string name="prefdecrypt_settings_secure">Ficheiro de configurações é seguro</string>
<string name="prefdecrypt_settings_unencrypted">A usar um formato de configurações não seguro e não encriptado</string>
<string name="prefdecrypt_wrong_json">Erro de formato JSON, campo necessário ausente (formato, conteúdo, metadados ou segurança)</string>
<string name="prefdecrypt_wrong_password">Erro ao desencriptar, a password inserida não pode desencriptar o ficheiro</string>
<string name="prefdecrypt_wrong_password">Erro ao desencriptar, a senha inserida não pode desencriptar o ficheiro</string>
<string name="prefdecrypt_issue_missing_file_hash">Ficheiro de verificação (hash) em falta, não é possível verificar a autenticidade de configurações!</string>
<string name="prefdecrypt_issue_modified">Ficheiro foi modificado após exportação!</string>
<string name="prefdecrypt_issue_parsing">Erro Desencriptação, a análise de preferências falhou!</string>
<string name="prefdecrypt_issue_wrong_pass">Erro de Desencriptação, a password é inválida ou configurações de arquivo foram modificadas! Pode acontecer que o ficheiro importado foi exportado com uma Password Mestre diferente.</string>
<string name="prefdecrypt_issue_wrong_pass">Erro de Desencriptação, a senha é inválida ou configurações de arquivo foram modificadas! Pode acontecer que o ficheiro importado foi exportado com uma Senha Mestre diferente.</string>
<string name="prefdecrypt_issue_wrong_format">Configuração de encriptação ausente, formato de configurações é inválido!</string>
<string name="prefdecrypt_issue_wrong_algorithm">Algoritmo de encriptação não suportado ou não especificado!</string>
<string name="exported_today">exportado hoje</string>
@ -226,7 +226,7 @@
<string name="smscommunicator_allowednumbers">Números de telefone permitidos</string>
<string name="smscommunicator_allowednumbers_summary">+XXXXXXXXXX;+YYYYYYYYYY</string>
<string name="smscommunicator_bolusreplywithcode">Para dar bolus %1$.2fU responder com código %2$s</string>
<string name="smscommunicator_mealbolusreplywithcode">Para dar bólus %1$.2fU responder com código %2$s</string>
<string name="smscommunicator_mealbolusreplywithcode">Para administrar bólus %1$.2fU responder com código %2$s</string>
<string name="smscommunicator_temptargetwithcode">Para definir o Alvo Tempo %1$s responda com o código %2$s</string>
<string name="smscommunicator_temptargetcancel">Para cancelar Alvo Temp responda com o código %1$s</string>
<string name="smscommunicator_stopsmswithcode">Para desactivar o Serviço Remoto SMS de responda com o código %1$s.\n\nTenha em mente que será capaz de o reactivar directamente apenas a partir do telemóvel mestre do AAPS.</string>
@ -239,7 +239,7 @@
<string name="bolusdelivered">Bolus %1$.2fU entregue com sucesso</string>
<string name="bolusrequested">Vão ser administradas %1$.2fU</string>
<string name="smscommunicator_bolusdelivered">Bólus %1$.2fU enviado com êxito</string>
<string name="smscommunicator_mealbolusdelivered">Bólus de refeição %1$.2fU entregue com sucesso</string>
<string name="smscommunicator_mealbolusdelivered">Bólus de refeição %1$.2fU administrado com sucesso</string>
<string name="smscommunicator_mealbolusdelivered_tt">Alvo %1$s para %2$d minutos</string>
<string name="smscommunicator_tt_set">Alvo %1$s para %2$d minutos definido com sucesso</string>
<string name="smscommunicator_tt_canceled">Alvo Temp cancelado com êxito</string>
@ -264,6 +264,9 @@
<string name="smscommunicator_carbsreplywithcode">Para inserir %1$dg em %2$s responda com código %3$s</string>
<string name="smscommunicator_basalpctreplywithcode">Para começar a basal %1$d%% U/h durante %2$d min responda com o código %3$s</string>
<string name="smscommunicator_suspendreplywithcode">Para suspender o loop por %1$d minutos resposta com código %2$s</string>
<string name="smscommunicator_loopresumereplywithcode">Para retomar o loop responda com o código %1$s</string>
<string name="smscommunicator_loopenablereplywithcode">Para activar o loop responda com o código %1$s</string>
<string name="smscommunicator_loopdisablereplywithcode">Para desactivar o loop responda com o código %1$s</string>
<string name="smscommunicator_tempbasalset">Basal temporária %1$.2fU/h para %2$d min iniciada com êxito</string>
<string name="smscommunicator_extendedset">Bólus estendido %1$.2fU/h para %2$d min iniciado com êxito</string>
<string name="smscommunicator_carbsset">Hidratos %1$dg inseridos com sucesso</string>
@ -449,8 +452,14 @@
<string name="statuslights_res_critical">Limite crítico de nível de reservatório [U]</string>
<string name="statuslights_bat_warning">Limite de aviso de nível de bateria [%]</string>
<string name="statuslights_bat_critical">Limite de crítico de nível de bateria [%]</string>
<string name="prediction_shortname">PREV</string>
<string name="iob">IOB</string>
<string name="cob">COB</string>
<string name="basal_shortname">BAS</string>
<string name="deviation_shortname">DESV</string>
<string name="activity_shortname">ACT</string>
<string name="abs_insulin_shortname">ABS</string>
<string name="devslope_shortname">DESVINCLI</string>
<string name="nav_about">Sobre</string>
<string name="smscommunicator_missingsmspermission">Falta de permissão SMS</string>
<string name="smscommunicator_missingphonestatepermission">Falta permissão do estado do telefone</string>
@ -468,12 +477,8 @@
<string name="doprofileswitch">Fazer Mudança De Perfil</string>
<string name="careportal_pbage_label">Idade bateria bomba</string>
<string name="ns_alarmoptions">Opções Alarme</string>
<string name="nsalarm_urgenthigh">Urgência hiperglicemia</string>
<string name="nsalarm_high">Alta</string>
<string name="nsalarm_low">Baixa</string>
<string name="nsalarm_urgentlow">Urgência hipoglicemia</string>
<string name="nsalarm_staledata">Dados Obsoletos</string>
<string name="nsalarm_urgentstaledata">Dados obsoletos urgentes</string>
<string name="ns_alarms">Criar notificações dos alarmes NS</string>
<string name="ns_announcements">Criar notificações a partir dos anúncios NS</string>
<string name="nsalarm_staledatavalue_label">Tempo limite para dados obsoletos [min]</string>
<string name="nsalarm_urgent_staledatavalue_label">Tempo limite para Urgência por dados obsoletos [min]</string>
<string name="openapsama_autosens_period">Intervalo para autosens [h]</string>
@ -626,6 +631,8 @@
<string name="extendedbolusdeliveryerror">Erro na entrega Bólus Estendido</string>
<string name="insightpump_shortname">Visão</string>
<string name="ago">atrás</string>
<string name="set_neutral_temps_title">Definir basais temporárias neutras</string>
<string name="set_neutral_temps_summary">Se activado, ele irá cancelar basal temporária antes do final de cada hora. Este método pode ajudar a parar o sinal sonoro/vibração em algumas bombas, de hora em hora.</string>
<string name="enablesmbalways">SMB sempre activado</string>
<string name="enablesmbalways_summary">SMB sempre activo independentemente dos bolus. Possível apenas quando o medidor tive um bom filtro de dados como o G5</string>
<string name="enablesmbaftercarbs">Ativar SMB após carbos</string>
@ -851,6 +858,10 @@
<string name="log_alerts">Alertas de registo</string>
<string name="enable_tbr_emulation">Ativar a emulação TBR</string>
<string name="enable_tbr_emulation_summary">Usar bólus prolongados em vez de basais temporárias para contornar o limite de 250%%</string>
<string name="disable_vibration">Desactivar vibrações na entrega manual de bólus</string>
<string name="disable_vibration_summary">Para bólus e bólus estendidos (só disponível com o firmware Insight 3.x)</string>
<string name="disable_vibration_auto">Desactivar vibrações na entrega automática de bólus</string>
<string name="disable_vibration_auto_summary">Para SMB e Basal Temp com emulação DBT (só disponível com firmware Insight 3.x)</string>
<string name="disconnect_delay">Atraso de desconexão [s]</string>
<string name="serial_number">Número de série</string>
<string name="release_software_version">Lançar versão de software</string>
@ -1247,9 +1258,9 @@
<!-- SMS Communicator & OTP Authenticator -->
<string name="smscommunicator_code_from_authenticator_for" comment="This is continuation of sentence: To [ACTION] reply with code">a partir da app Autenticador para: %1$s</string>
<string name="smscommunicator_otp_enabled">Activar Autenticador</string>
<string name="smscommunicator_otp_enabled_summary">Autenticar comandos usando Uma-Password-Única que sejam geradas pelo Google Authenticator ou app 2FA similar.</string>
<string name="smscommunicator_otp_enabled_summary">Autenticar comandos usando Uma-Senha-Única que sejam geradas pelo Google Authenticator ou app 2FA similar.</string>
<string name="smscommunicator_otp_pin">PIN adicional no token final</string>
<string name="smscommunicator_otp_pin_summary">Dígitos adicionais que devem ser memorizados e colados no final de cada Uma-Password-Única que seja gerada</string>
<string name="smscommunicator_otp_pin_summary">Dígitos adicionais que devem ser memorizados e colados no final de cada Uma-Senha-Única que seja gerada</string>
<string name="smscomunicator_tab_otp_label">Configuração do Autenticador</string>
<string name="smscommunicator_otp_verify_label">OTP para verificar:</string>
<string name="smscommunicator_otp_reset_btn">Repor Autenticadores</string>
@ -1258,7 +1269,7 @@
<string name="smscommunicator_otp_reset_successful">Nova Chave do Autenticador foi gerada! Por favor, use o QRCode actualizado para os autenticadores.</string>
<string name="smscommunicator_otp_step1_install_header">1. Instalar Autenticador</string>
<string name="smscommunicator_otp_step2_provisioning_header">2. Pesquise o código para configurar os códigos OTP do AndroidAPS</string>
<string name="smscommunicator_otp_step3_test_header">3. Teste Uma-Password-Única</string>
<string name="smscommunicator_otp_step3_test_header">3. Testar Uma-Senha-Única</string>
<string name="smscommunicator_otp_reset_header">Repor Autenticadores</string>
<string name="smscommunicator_otp_install_info">Instalar uma app Autenticador que suporte Tokens RFC 6238 TOTP em cada telefone seguidor. Populares aplicativos gratuitos são:\n • Authy\n • o Google Authenticator\n • LastPass Autenticador\n • FreeOTP Autenticador</string>
<string name="smscommunicator_otp_provisioning_warning">NÃO PARTILHE este código online!\nUse-o apenas para a instalação da app Autenticador nos telefones seguidores.</string>
@ -1269,22 +1280,22 @@
<string name="overview_show_deviationslope">Desvio de inclinação</string>
<string name="authorizationfailed">Falha na autorização</string>
<string name="overview_show_absinsulin">Insulina absoluta</string>
<string name="master_password_summary">Password Mestre é usada para encriptação da cópia de segurança e substituir segurança na aplicação. Lembre-se dela ou guarde-a em um lugar seguro.</string>
<string name="passwords_dont_match">As passwords não coincidem</string>
<string name="current_master_password">Password Mestre actual</string>
<string name="master_password_summary">Senha Mestre é usada para encriptação da cópia de segurança e substituir segurança na aplicação. Lembre-se dela ou guarde-a em um lugar seguro.</string>
<string name="passwords_dont_match">As senhas não coincidem</string>
<string name="current_master_password">Senha Mestre actual</string>
<string name="statuslights">Luzes de Estado</string>
<string name="statuslights_copy_ns">Copiar definições do NS</string>
<string name="copyexistingvalues">Copiar definições do NS (se existir)?</string>
<string name="classic_desrciption">Tema gráfico original</string>
<string name="buttonson_desrciption">Os botões são sempre exibidos na parte inferior do ecrã</string>
<string name="skin">Tema gráfico</string>
<!-- Omnipod -->
<!-- Omnipod - Base -->
<string name="description_pump_omnipod">Integração de bomba para Omnipod, requer RileyLink (com pelo menos firmware 2.0) dispositivo.</string>
<!-- Omnipod Configuration -->
<string name="omnipod_config_beep_bolus_enabled">Beep Bólus Activado</string>
<string name="omnipod_config_beep_basal_enabled">Beep Basal Activado</string>
<string name="omnipod_config_beep_smb_enabled">Beep SMB Activado</string>
<string name="omnipod_config_beep_tbr_enabled">Beep DBT Activado</string>
<string name="omnipod_config_beep_bolus_enabled">Sinal Bólus Activado</string>
<string name="omnipod_config_beep_basal_enabled">Sinal Basal Activado</string>
<string name="omnipod_config_beep_smb_enabled">Sinal SMB Activado</string>
<string name="omnipod_config_beep_tbr_enabled">Sinal DBT Activado</string>
<string name="omnipod_config_pod_debugging_options_enabled">Opções de Depuração do Pod habilitadas</string>
<string name="omnipod_config_timechange_enabled">Detecção de DST/Fuso Horário Activado</string>
<!-- Omnipod - Fragment -->
<string name="omnipod_pod_mgmt">Gestão Pod</string>
@ -1301,8 +1312,27 @@
<!-- Omnipod - Dialogs -->
<string name="omnipod_frequency">Omnipod (433.91 MHz)</string>
<!-- Omnipod - Error -->
<string name="omnipod_error_operation_not_possible_no_configuration">A operação não é possível.\n\nPrecisa configurar o Omnipod primeiro, antes de pode usar esta operação.</string>
<string name="omnipod_error_operation_not_possible_no_profile">A operação não é possível.\n\n Precisa de esperar alguns minutos, até que AAPS tente definir o perfil para a primeira vez.</string>
<string name="omnipod_error_illegal_init_action_type">PodInitActionType Ilegal: %1$s</string>
<string name="omnipod_error_pod_not_attached">Nenhum Pod Activo.</string>
<string name="omnipod_driver_error_setup_action_verification_failed">A verificação do comando falhou.</string>
<string name="omnipod_driver_error_unexpected_exception_type">Ocorreu um erro inesperado. Por favor reporte! (digite: %1$s).</string>
<string name="omnipod_driver_error_invalid_parameters">Falha na comunicação: foram recebidos parâmetros de entrada inválidos.</string>
<string name="omnipod_driver_error_communication_failed_timeout">Falha na comunicação: tempo limite.</string>
<string name="omnipod_driver_error_communication_failed_unexpected_exception">Falha na comunicação: ocorreu um erro inesperado. Por favor, reporte!</string>
<string name="omnipod_driver_error_crc_mismatch">Falha na comunicação: mensagem de falha de verificação de integridade.</string>
<string name="omnipod_driver_error_invalid_packet_type">Falha na comunicação: recebeu um pacote inválido do Pod.</string>
<string name="omnipod_driver_error_invalid_progress_state">Falha na comunicação: o Pod está em um estado errado.</string>
<string name="omnipod_driver_error_invalid_response">Falha na comunicação: recebeu uma resposta inválida do Pod.</string>
<string name="omnipod_driver_error_invalid_message_sequence_number">Falha na comunicação: recebeu uma mensagem com número de sequência inválido do Pod.</string>
<string name="omnipod_driver_error_invalid_message_address">Falha na comunicação: recebeu uma mensagem com um endereço inválido do Pod.</string>
<string name="omnipod_driver_error_message_decoding_failed">Falha na comunicação: falha ao descodificar a mensagem do Pod.</string>
<string name="omnipod_driver_error_nonce_resync_failed">Falha na comunicação: nonce resync falhou.</string>
<string name="omnipod_driver_error_nonce_out_of_sync">Falha na comunicação: nonce fora de sincronização.</string>
<string name="omnipod_driver_error_not_enough_data">Falha na comunicação: não há dados suficientes recebidos do Pod.</string>
<string name="omnipod_driver_error_pod_fault">Uma falha de Pod (%1$03d %2$s) foi detectada. Por favor, desactive o Pod e inicie um novo.</string>
<string name="omnipod_driver_error_pod_returned_error_response">Falha na comunicação: o Pod devolveu uma resposta de erro.</string>
<!-- Omnipod - Pod Mgmt -->
<string name="omnipod_pod_mgmt_title">Gestão Pod</string>
<string name="omnipod_cmd_init_pod">Iniciar Pod</string>
@ -1326,19 +1356,29 @@
<string name="omnipod_cmd_bolus_value">%1$.1f U</string>
<string name="omnipod_cmd_bolus_value_with_carbs">%1$.1f U, HC=%2$.1f g</string>
<string name="omnipod_cmd_tbr_value">Taxa: %1$.1f U, Duração: %2$d min</string>
<string name="omnipod_cmd_reset_pod_desc">Se pressionar <b>OK</b>, o estado do Pod vai ser forçado a redefinir e você não será capaz de comunicar mais com o Pod. Faça isso somente se você não pode comunicar mais com o Pod. Se ainda pode comunicar com o Pod, por favor, use o <b>Desactivar Pod</b> opção.</string>
<string name="omnipod_cmd_pod_history_na">Histórico do Pod não disponível no momento.</string>
<string name="omnipod_init_pod_wizard_step1_title">Encher o Pod</string>
<string name="omnipod_init_pod_wizard_step1_desc">\nPreencher o novo Pod com insulina suficiente para 3 dias.\n\nOuvir dois sinais sonoros a partir do Pod durante o processo de enchimento. Isso indica que a quantidade mínima de 85U foi inserida. Certifique-se de esvaziar completamente a seringa, mesmo depois de ouvir dois sinais sonoros.\n\nDepois de preencher o Pod, por favor, pressione <b>Próximo</b>.\n\n<b>Nota:</b> não remova a tampa da agulha do Pod neste momento.</string>
<string name="omnipod_init_pod_wizard_step2_title">A Purgar</string>
<string name="omnipod_init_pod_wizard_step2_action_header">A tentar emparelhar com o novo Pod e purgá-lo.\n\nQuando todos os itens forem verificados, pode pressionar <b>Próximo</b>.\n\n<b>Nota:</b> por favor, mantenha o Pod muito perto do RileyLink neste momento.</string>
<string name="omnipod_init_pod_wizard_step3_title">Anexar o Pod</string>
<string name="omnipod_init_pod_wizard_step3_desc">\nPrepare o local de infusão. Remova a tampa da agulha do Pod e o adesivo e fixe o Pod no local de infusão.\n\nSe a canula sair, por favor, pressione <b>Cancelar</b> e descarte o seu Pod.\n\nPressione <b>Próximo</b> para inserir a canula e começar a administração da basal.</string>
<string name="omnipod_init_pod_wizard_step4_title">A inserir canula</string>
<string name="omnipod_init_pod_wizard_step4_action_header">A tentar definir um plano da basal inicial e inserir canula.\n\nQuando todos os itens estiverem verificados, pode pressionar <b>Próximo</b>.</string>
<string name="omnipod_init_pod_wizard_pod_info_title">Info Pod</string>
<string name="omnipod_init_pod_wizard_pod_info_init_pod_description">\nO Pod está agora activo.\n\nO seu plano de basal foi programado e a canula foi inserida.\n\nPor favor, verifique se a canula foi inserida correctamente e substitua o seu Pod se você se sente que não.</string>
<string name="omnipod_remove_pod_wizard_step1_title">Desactivar Pod</string>
<string name="omnipod_remove_pod_wizard_step1_desc">\nPressione <b>Próximo</b> para desactivar o Pod.\n\n<b>Nota:</b> Isto irá suspender toda a administração de insulina e desactivar o Pod.</string>
<string name="omnipod_remove_pod_wizard_step2_title">A Desactivar Pod</string>
<string name="omnipod_remove_pod_wizard_step2_action_header">A desactivar o Pod.\n\nQuando todos os itens forem verificados, pode pressionar <b>Próximo</b>.\n\n<b>Nota:</b> Se desactivar falhar continuamente, por favor, pressione <b>Cancelar</b> e use o <b>Repor Pod</b> opção para forçar a repor o estado do Pod.</string>
<string name="omnipod_init_pod_wizard_pod_info_remove_pod_description">Pod desactivado.\n\nPor favor, remova o Pod do seu corpo e descarte-o.</string>
<string name="omnipod_init_pod_pair_pod">Emparelhar Pod</string>
<string name="omnipod_init_pod_prime_pod">Purgar Pod</string>
<string name="omnipod_init_pod_fill_cannula">Enchimento de Canula</string>
<string name="omnipod_init_pod_set_basal_profile">Definir Perfil Basal</string>
<string name="omnipod_deactivate_pod_cancel_delivery">Cancelar Administração</string>
<string name="omnipod_deactivate_pod_deactivate_pod">Desacitvar Pod</string>
<string name="omnipod_deactivate_pod_deactivate_pod">Desactivar Pod</string>
<!-- Omnipod Dash -->
<!-- Omnipod - Base -->
<string name="description_pump_omnipod_dash">Integração da Bomba para Omnipod Dash.</string>
@ -1349,6 +1389,10 @@
<string name="omnipod_alert_shutdown_imminent">Encerramento iminente</string>
<string name="omnipod_alert_low_reservoir">Reservatório baixo</string>
<string name="omnipod_alert_unknown_alert">Alerta desconhecido</string>
<string name="omnipod_error_set_basal_failed_uncertain">Pode ter falhado ao definir perfil da basal. A administração pode estar suspensa! Por favor, actualize o estado do Pod.</string>
<string name="omnipod_error_set_temp_basal_failed_uncertain">Pode ter falhado ao definir basal temporária. Se houve uma basal temporária já em execução, pode ter sido cancelada! Por favor, actualize o estado do Pod.</string>
<string name="omnipod_error_set_time_failed_uncertain">Pode ter falhado ao definir a hora. A administração pode estar suspensa! Por favor, actualize o estado do Pod.</string>
<string name="omnipod_bolus_failed_uncertain">Não é possível verificar se o bólus foi bem-sucedido. Por favor, verifique se o Pod está administrar ou cancelar o bólus.</string>
<string name="omnipod_rl_stats">Estatísticas RL</string>
<string name="omnipod_read_pulse_log_short">Registo de Pulse</string>
</resources>

View file

@ -115,7 +115,7 @@
<string name="extendedcarbs_hint1">https://androidaps.readthedocs.io/en/latest/EN/Usage/Extended-Carbs.html</string>
<string name="nsclient_label">Tópico: Monitorização Remota</string>
<string name="nsclient_howcanyou">Como pode monitorizar AAPS do seu filho remotamente?</string>
<string name="nsclient_nightscout">A usar um site Nightscout.</string>
<string name="nsclient_nightscout">Usando um site Nightscout.</string>
<string name="nsclient_dexcomfollow">App Dex om Follow se estiver a usar a app original Dexcom (Glic apenas).</string>
<string name="nsclient_dexcomfollowxdrip">Dexcom Follow se estiver a usar a app xDrip.</string>
<string name="nsclient_xdripfollower">xDrip a correr no modo seguidor.</string>

View file

@ -143,7 +143,7 @@
<string name="careportal_newnstreatment_other">Outro</string>
<string name="careportal_newnstreatment_meter">Medidor</string>
<string name="careportal_newnstreatment_sensor">Sensor</string>
<string name="careportal_newnstreatment_carbs_label">Hidratos de Carbono</string>
<string name="careportal_newnstreatment_carbs_label">Hidratos</string>
<string name="careportal_newnstreatment_insulin_label">Insulina</string>
<string name="careportal_newnstreatment_carbtime_label">Tempo Hidratos</string>
<string name="careportal_newnstreatment_split_label">Dividir</string>
@ -264,6 +264,9 @@
<string name="smscommunicator_carbsreplywithcode">Para inserir %1$dg em %2$s responda com código %3$s</string>
<string name="smscommunicator_basalpctreplywithcode">Para começar a basal %1$d%% U/h durante %2$d min responda com o código %3$s</string>
<string name="smscommunicator_suspendreplywithcode">Para suspender o loop por %1$d minutos resposta com código %2$s</string>
<string name="smscommunicator_loopresumereplywithcode">Para retomar o loop responda com o código %1$s</string>
<string name="smscommunicator_loopenablereplywithcode">Para activar o loop responda com o código %1$s</string>
<string name="smscommunicator_loopdisablereplywithcode">Para desactivar o loop responda com o código %1$s</string>
<string name="smscommunicator_tempbasalset">Basal temporária %1$.2fU/h para %2$d min iniciada com êxito</string>
<string name="smscommunicator_extendedset">Bólus prolongado %1$.2fU/h para %2$d min iniciado com êxito</string>
<string name="smscommunicator_carbsset">Hidratos %1$dg inseridos com sucesso</string>
@ -370,12 +373,12 @@
<string name="executing">A Executar</string>
<string name="virtualpump_settings">Definições da bomba virtual</string>
<string name="virtualpump_uploadstatus_title">Enviar estado para NS</string>
<string name="nsclientinternal">NSCliente</string>
<string name="nsclientinternal_shortname">NSCI</string>
<string name="nsclientinternal">ClienteNS</string>
<string name="nsclientinternal_shortname">CLNS</string>
<string name="nsclientinternal_url">URL:</string>
<string name="nsclientinternal_autoscroll">Rolar automático</string>
<string name="restart">Reiniciar</string>
<string name="nsclientinternal_title">NSCliente</string>
<string name="nsclientinternal_title">ClienteNS</string>
<string name="nsclientinternal_url_title">Nightscout URL</string>
<string name="nsclientinternal_url_dialogmessage">Introduza o Nightscout URL</string>
<string name="nsclientinternal_secret_title">NS API secret</string>
@ -388,7 +391,7 @@
<string name="status">Estado:</string>
<string name="paused">Em pausa</string>
<string name="clearlog">Limpar Registo</string>
<string name="nowritepermission">NSCliente sem permissões para alterar dados. Tem a senha API correta?</string>
<string name="nowritepermission">ClienteNS sem permissões para alterar dados. Tem a senha API correta?</string>
<string name="wear_settings">Definições Wear</string>
<string name="wear_detailedIOB_title">Mostrar IOB detalhada</string>
<string name="wear_detailedIOB_summary">Dividir IOB entre IOB de bolus e de basal na face do relógio</string>
@ -449,8 +452,14 @@
<string name="statuslights_res_critical">Limite crítico de nível de reservatório [U]</string>
<string name="statuslights_bat_warning">Limite de aviso de nível de bateria [%]</string>
<string name="statuslights_bat_critical">Limite de crítico de nível de bateria [%]</string>
<string name="prediction_shortname">PREV</string>
<string name="iob">IOB</string>
<string name="cob">COB</string>
<string name="basal_shortname">BAS</string>
<string name="deviation_shortname">DESV</string>
<string name="activity_shortname">ACT</string>
<string name="abs_insulin_shortname">ABS</string>
<string name="devslope_shortname">DESVINCLI</string>
<string name="nav_about">Acerca</string>
<string name="smscommunicator_missingsmspermission">Falta de permissão SMS</string>
<string name="smscommunicator_missingphonestatepermission">Falta permissão do estado do telefone</string>
@ -468,12 +477,8 @@
<string name="doprofileswitch">Fazer Mudança De Perfil</string>
<string name="careportal_pbage_label">Idade bateria bomba</string>
<string name="ns_alarmoptions">Opções Alarme</string>
<string name="nsalarm_urgenthigh">Urgência hiperglicemia</string>
<string name="nsalarm_high">Alto</string>
<string name="nsalarm_low">Baixo</string>
<string name="nsalarm_urgentlow">Urgência hipoglicemia</string>
<string name="nsalarm_staledata">Dados Obsoletos</string>
<string name="nsalarm_urgentstaledata">Dados obsoletos urgentes</string>
<string name="ns_alarms">Criar notificações dos alarmes NS</string>
<string name="ns_announcements">Criar notificações a partir dos anúncios NS</string>
<string name="nsalarm_staledatavalue_label">Tempo limite para dados obsoletos [min]</string>
<string name="nsalarm_urgent_staledatavalue_label">Tempo limite para Urgência por dados obsoletos [min]</string>
<string name="openapsama_autosens_period">Intervalo para autosens [h]</string>
@ -506,7 +511,7 @@
<string name="mdtp_cancel">Cancelar</string>
<string name="notloadedplugins">Nem todos perfis foram carregados!</string>
<string name="valuesnotstored">Valores não guardados!</string>
<string name="ns_localbroadcasts">Activar transmissões para outras aplicações (como xDrip). Não habilite se tiver mais de uma instância de AAPS ou NSClient instalado!</string>
<string name="ns_localbroadcasts">Activar transmissões para outras aplicações (como xDrip). Não habilite se tiver mais de uma instância de AAPS ou ClienteNS instalado!</string>
<string name="ns_localbroadcasts_title">Activar partilha local.</string>
<string name="careportal_activity_label">ACTIVIDADE &amp; FEEDBACK</string>
<string name="careportal_carbsandbolus_label">HIDRATOS &amp; BÓLUS</string>
@ -570,7 +575,7 @@
<string name="carbsReqThreshold_summary">Quando Hidratos são sugeridos, quantos hidratos irá solicitar uma notificação</string>
<string name="dexcomg5_xdripupload_title">Enviar dados Glic. para xDrip+</string>
<string name="dexcomg5_xdripupload_summary">Seleccionar 640g/Eversense como fonte no xDrip+</string>
<string name="nsclientbg">Glic NSCliente</string>
<string name="nsclientbg">Glic ClienteNS</string>
<string name="overview_editquickwizard_usebg">Cálculos Glic</string>
<string name="overview_editquickwizard_usebolusiob">Cálculo de Bólus IOB</string>
<string name="overview_editquickwizard_usebasaliob">Cálculo de Basal IOB</string>
@ -584,7 +589,7 @@
<string name="overview_editquickwizard_usetemptarget">Cálculo alvo temporário</string>
<string name="loopenabled">Loop activado</string>
<string name="apsselected">APS seleccionado</string>
<string name="nsclienthaswritepermission">NSCLiente tem permissão de escrita</string>
<string name="nsclienthaswritepermission">ClienteNS tem permissão de escrita</string>
<string name="closedmodeenabled">Modo fechado ativado</string>
<string name="maxiobset">IOB máxima definida correctamente</string>
<string name="hasbgdata">Glicemia disponivel desde a fonte selecionada</string>
@ -626,6 +631,8 @@
<string name="extendedbolusdeliveryerror">Erro na administração Bólus Prolongado</string>
<string name="insightpump_shortname">Visão</string>
<string name="ago">atrás</string>
<string name="set_neutral_temps_title">Definir basais temporárias neutras</string>
<string name="set_neutral_temps_summary">Se activado, ele irá cancelar basal temporária antes do final de cada hora. Este método pode ajudar a parar o sinal sonoro/vibração em algumas bombas, de hora em hora.</string>
<string name="enablesmbalways">SMB sempre activado</string>
<string name="enablesmbalways_summary">SMB sempre activo independentemente dos bolus. Possível apenas quando o medidor tive um bom filtro de dados como o G5</string>
<string name="enablesmbaftercarbs">Activar SMB após hidratos</string>
@ -759,7 +766,7 @@
<string name="wear_wizard_settings_summary">Resultado cálculos incluídos no Assistente:</string>
<string name="wear_display_settings">Configurações Ecrã</string>
<string name="wear_general_settings">Configurações Gerais</string>
<string name="enable_nsclient">Activar NSCliente</string>
<string name="enable_nsclient">Activar ClienteNS</string>
<string name="welcometosetupwizard">Bem-vindo ao assistente de configuração. Vai guiá-lo(a) através do processo de instalação\n</string>
<string name="pumpsetup">Configurações da bomba</string>
<string name="readstatus">Ler estado</string>
@ -770,7 +777,7 @@
<string name="sensitivitysetup">Configurar plugin Sensibilidade</string>
<string name="setupwizard_sensitivity_description">Plugin de Sensibilidade é usado para detecção de sensibilidade e cálculos COB. Para mais info visite:</string>
<string name="setupwizard_sensitivity_url">https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COB</string>
<string name="nsclientinfotext">NSCliente gere a ligação ao Nightscout. Pode saltar esta parte mas não será possível passar os objectivos até que o configure.</string>
<string name="nsclientinfotext">ClienteNS gere a ligação ao Nightscout. Pode saltar esta parte mas não será possível passar os objectivos até que o configure.</string>
<string name="diawarning">Lembre-se: novos perfis de insulina requerem diâmetro de pelo menos 5h. DIA 56h no novo perfil é igual ao diâmetro 3h nos antigos perfis de insulina.</string>
<string name="bgsourcesetup">Configure a fonte das glicemias</string>
<string name="setupwizard_profile_description">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\"</string>
@ -821,7 +828,7 @@
<string name="openaps_noasdata">Sem dados Autosens disponíveis</string>
<string name="nav_logsettings">Definições de registo</string>
<string name="resettodefaults">Repor definições por defeito</string>
<string name="nsmalfunction">Erro de funcionamento do NSCliente. Pondere reiniciar o NS e NSCliente.</string>
<string name="nsmalfunction">Erro de funcionamento do ClienteNS. Pondere reiniciar o NS e ClienteNS.</string>
<string name="as">AS</string>
<string name="versionavailable">Disponível %1$s disponível</string>
<string name="time_offset">Fuso horário</string>
@ -851,6 +858,10 @@
<string name="log_alerts">Alertas de registo</string>
<string name="enable_tbr_emulation">Activar a emulação DBT</string>
<string name="enable_tbr_emulation_summary">Usar bólus prolongados em vez de basais temporárias para contornar o limite de 250%%</string>
<string name="disable_vibration">Desactivar vibrações na entrega manual de bólus</string>
<string name="disable_vibration_summary">Para bólus e bólus estendidos (só disponível com o firmware Insight 3.x)</string>
<string name="disable_vibration_auto">Desactivar vibrações na entrega automática de bólus</string>
<string name="disable_vibration_auto_summary">Para SMB e Basal Temp com emulação DBT (só disponível com firmware Insight 3.x)</string>
<string name="disconnect_delay">Atraso de desconexão [s]</string>
<string name="serial_number">Número de série</string>
<string name="release_software_version">Lançar versão de software</string>
@ -1275,8 +1286,9 @@
<string name="statuslights">Luzes de Estado</string>
<string name="statuslights_copy_ns">Copiar definições do NS</string>
<string name="copyexistingvalues">Copiar definições do NS (se existir)?</string>
<string name="classic_desrciption">Tema gráfico original</string>
<string name="buttonson_desrciption">Os botões são sempre exibidos na parte inferior do ecrã</string>
<string name="classic_description">Tema Gráfico Original</string>
<string name="buttonson_description">Os botões são sempre exibidos na parte inferior do ecrã</string>
<string name="largedisplay_description">Mostrador Grande</string>
<string name="skin">Tema gráfico</string>
<!-- Omnipod -->
<!-- Omnipod - Base -->

View file

@ -383,12 +383,6 @@
<string name="careportal_insulinage_label">Vechime insulină</string>
<string name="careportal_pbage_label">Vechime baterie pompă</string>
<string name="ns_alarmoptions">Opțiuni alarmare</string>
<string name="nsalarm_urgenthigh">Hiper urgent</string>
<string name="nsalarm_high">Hiper</string>
<string name="nsalarm_low">Hipo</string>
<string name="nsalarm_urgentlow">Hipo urgent</string>
<string name="nsalarm_staledata">Date învechite</string>
<string name="nsalarm_urgentstaledata">Date mult prea vechi</string>
<string name="nsalarm_staledatavalue_label">Prag vechime date [min]</string>
<string name="nsalarm_urgent_staledatavalue_label">Prag date mult prea vechi [min]</string>
<string name="openapsama_autosens_period">Interval pentru autosens [o]</string>

View file

@ -264,6 +264,9 @@
<string name="smscommunicator_carbsreplywithcode">Чтобы ввести %1$d г в %2$s ответьте кодом %3$s</string>
<string name="smscommunicator_basalpctreplywithcode">Для начала подачи базала %1$d%% на %2$d мин. ответьте кодом %3$s</string>
<string name="smscommunicator_suspendreplywithcode">для приостановки цикла на %1$d мин ответьте кодом %2$s</string>
<string name="smscommunicator_loopresumereplywithcode">Чтобы возобновить цикл ответьте кодом %1$s</string>
<string name="smscommunicator_loopenablereplywithcode">Чтобы включить цикл ответьте кодом %1$s</string>
<string name="smscommunicator_loopdisablereplywithcode">Чтобы отключить цикл ответьте кодом %1$s</string>
<string name="smscommunicator_tempbasalset">врем базал %1$.2fU/h на %2$d мин начат успешно</string>
<string name="smscommunicator_extendedset">Пролонгированный болюс %1$.2fед. на %2$d мин. начат успешно</string>
<string name="smscommunicator_carbsset">Углеводы %1$d г введены успешно</string>
@ -449,8 +452,14 @@
<string name="statuslights_res_critical">Порог критического уровня наполненности резервуара [U]</string>
<string name="statuslights_bat_warning">Порог предупреждения о разрядке батареи [%]</string>
<string name="statuslights_bat_critical">Порог предупреждения о критическом уровне разрядки батареи [%]</string>
<string name="prediction_shortname">ОЖИД</string>
<string name="iob">IOB акт инс</string>
<string name="cob">акт углев</string>
<string name="basal_shortname">БАЗ</string>
<string name="deviation_shortname">ОТКЛН</string>
<string name="activity_shortname">НАГР</string>
<string name="abs_insulin_shortname">НАДО</string>
<string name="devslope_shortname">ЛИНОТКЛН</string>
<string name="nav_about">о приложении</string>
<string name="smscommunicator_missingsmspermission">отсутствует смс подтверждение</string>
<string name="smscommunicator_missingphonestatepermission">Отсутствует разрешение телефона</string>
@ -468,12 +477,8 @@
<string name="doprofileswitch">Переключить профиль</string>
<string name="careportal_pbage_label">Батарея помпы работает</string>
<string name="ns_alarmoptions">опции оповещения</string>
<string name="nsalarm_urgenthigh">Тревога выс</string>
<string name="nsalarm_high">Высокий</string>
<string name="nsalarm_low">Низкий</string>
<string name="nsalarm_urgentlow">Тревога низкий</string>
<string name="nsalarm_staledata">Устаревшие данные</string>
<string name="nsalarm_urgentstaledata">Тревога! устаревшие данные</string>
<string name="ns_alarms">Создать уведомления из оповещений NS</string>
<string name="ns_announcements">Создать уведомления из оповещений NS</string>
<string name="nsalarm_staledatavalue_label">Порог оповещения об устаревших данных [min] (мин)</string>
<string name="nsalarm_urgent_staledatavalue_label">Порог тревоги об устаревших данных [min] (мин)</string>
<string name="openapsama_autosens_period">Интервал для autosens [h] (ч)</string>
@ -626,6 +631,8 @@
<string name="extendedbolusdeliveryerror">Подача пролонгированного болюса не состоялась</string>
<string name="insightpump_shortname">Поле обзора</string>
<string name="ago">тому назад</string>
<string name="set_neutral_temps_title">Установить нейтральные временные базалы</string>
<string name="set_neutral_temps_summary">Если эта опция включена, то она отменяет временный базал до конца каждого часа. Такой метод помогает прекратить почасовую вибрацию некоторых помп.</string>
<string name="enablesmbalways">Всегда включать супер микро болюс SMB</string>
<string name="enablesmbalways_summary">Всегда включать супер микро болюс SMB независимо от болюсов. Возможно только для источников СК с хорошей фильтрацией данных вроде G5</string>
<string name="enablesmbaftercarbs">Активировать супер микро болюс SMB после углеводов</string>
@ -853,6 +860,10 @@ Context | Edit Context</string>
<string name="log_alerts">Журнал оповещений</string>
<string name="enable_tbr_emulation">Включить эмуляцию TBR</string>
<string name="enable_tbr_emulation_summary">Использовать пролонгированные болюсы вместо временных базалов TBR чтобы обойти лимит в 250%%</string>
<string name="disable_vibration">Отключение вибраций при ручном болюсе</string>
<string name="disable_vibration_summary">Для болюса и пролонгированного болюса (доступно только для Insight прошивки 3.х)</string>
<string name="disable_vibration_auto">Отключение вибрации при ручном болюсе</string>
<string name="disable_vibration_auto_summary">Для микроболюсов SMB и временных базалов с эмуляцией TBR (доступно только для Insight с прошивкой версии 3.x)</string>
<string name="disconnect_delay">Задержка разъединения [s]</string>
<string name="serial_number">Серийный номер</string>
<string name="release_software_version">Версия ПО</string>
@ -1277,8 +1288,6 @@ Context | Edit Context</string>
<string name="statuslights">Индикаторы состояния</string>
<string name="statuslights_copy_ns">Копировать параметры из NS</string>
<string name="copyexistingvalues">Копировать настройки NS (если есть)?</string>
<string name="classic_desrciption">Исходная тема оформления</string>
<string name="buttonson_desrciption">Кнопки всегда отображаются в нижней части экрана</string>
<string name="skin">Тема оформления</string>
<!-- Omnipod -->
<!-- Omnipod - Base -->
@ -1377,7 +1386,7 @@ Context | Edit Context</string>
<string name="description_pump_omnipod_dash">Интеграция с помпой Omnompod Dash.</string>
<string name="omnipod_alert_finish_pairing_reminder">Напоминание о завершении сопряжения</string>
<string name="omnipod_alert_finish_setup_reminder_reminder">Напоминание о завершении настройки</string>
<string name="omnipod_alert_expiration">Срок Pod\'a истекает в ближайшее время</string>
<string name="omnipod_alert_expiration">Срок работы Pod\'a истекает</string>
<string name="omnipod_alert_expiration_advisory">Срок Pod\'a истекает в ближайшее время</string>
<string name="omnipod_alert_shutdown_imminent">Остановка неизбежна</string>
<string name="omnipod_alert_low_reservoir">В резервуаре мало инсулина</string>

View file

@ -264,6 +264,9 @@
<string name="smscommunicator_carbsreplywithcode">Pre zadanie %1$dg na %2$s odpovedz SMS kódom %3$s</string>
<string name="smscommunicator_basalpctreplywithcode">Pre spustenie bazálu %1$d%% na %2$d min odpovedzte SMS s kódom %3$s</string>
<string name="smscommunicator_suspendreplywithcode">Pre pozastavenie uzavretého okruhu na %1$d minút odpovedaj SMS s kódom %2$s</string>
<string name="smscommunicator_loopresumereplywithcode">Pre obnovenie uzavretého okruhu, odpovedzte SMS s kódom %1$s</string>
<string name="smscommunicator_loopenablereplywithcode">Pre povolenie uzavretého okruhu, odpovedzte SMS s kódom %1$s</string>
<string name="smscommunicator_loopdisablereplywithcode">Pre zakázanie uzavretého okruhu, odpovedzte SMS s kódom %1$s</string>
<string name="smscommunicator_tempbasalset">Dočasný bazál %1$.2fJI/h spustený na %2$d minút</string>
<string name="smscommunicator_extendedset">Predĺžený bolus %1$.2fJI na %2$d min úspešne spustený</string>
<string name="smscommunicator_carbsset">Sacharidy %1$dg zadané úspešne</string>
@ -468,12 +471,8 @@
<string name="doprofileswitch">Vykonajte zmenu profilu</string>
<string name="careportal_pbage_label">Vek batérie v pumpe</string>
<string name="ns_alarmoptions">Nastavenie alarmov</string>
<string name="nsalarm_urgenthigh">Veľmi vysoká</string>
<string name="nsalarm_high">Vysoká</string>
<string name="nsalarm_low">Nízka</string>
<string name="nsalarm_urgentlow">Veľmi nízka</string>
<string name="nsalarm_staledata">Zastaralé dáta</string>
<string name="nsalarm_urgentstaledata">Veľmi zastaralé dáta</string>
<string name="ns_alarms">Vytvoriť oznámenia z alarmov NS</string>
<string name="ns_announcements">Vytvoriť oznámenia z upozornení NS</string>
<string name="nsalarm_staledatavalue_label">Hraničná hodnota pre zastaralé dáta [min]</string>
<string name="nsalarm_urgent_staledatavalue_label">Vysoká hraničná hodnota pre zastaralé dáta [min]</string>
<string name="openapsama_autosens_period">Interval pre automatickú detekciu citlivosti [h]</string>
@ -626,6 +625,8 @@
<string name="extendedbolusdeliveryerror">Chyba pri podávaní predĺženého bolusu</string>
<string name="insightpump_shortname">Sight</string>
<string name="ago">pred</string>
<string name="set_neutral_temps_title">Nastaviť neutrálny dočasný bazál</string>
<string name="set_neutral_temps_summary">Ak je povolená táto možnosť, zastaví sa dočasný bazál pred koncom každej hodiny. To môže u niektorých púmp pomôcť zastaviť pípanie/vibrácie na celú hodinu.</string>
<string name="enablesmbalways">Vždy povoliť SMB</string>
<string name="enablesmbalways_summary">Povoliť SMB nezávisle na bolusoch. Možno iba zo zdrojom glykémií s dobrým filtrovaním dát, ako napr. G5</string>
<string name="enablesmbaftercarbs">Povoliť SMB po jedle</string>
@ -851,6 +852,10 @@
<string name="log_alerts">Zaznamenať výstrahy</string>
<string name="enable_tbr_emulation">Povoliť emuláciu dočasných bazálov</string>
<string name="enable_tbr_emulation_summary">Používať predĺžené bolusy namiesto dočasných bázalov, aby sme sa vyhli 250%% limitu</string>
<string name="disable_vibration">Zakázať vibrácie pri ručnom podaní bolusu</string>
<string name="disable_vibration_summary">Pre bolus a predĺžený bolus (dostupné iba s Insight firmware 3.x)</string>
<string name="disable_vibration_auto">Zakázať vibrácie pri automatickom podaní bolusu</string>
<string name="disable_vibration_auto_summary">Pre SMB a Dočasný bazál s emuláciou TBR (k dispozícii iba s Insight firmware 3.x)</string>
<string name="disconnect_delay">Oneskorenie odpojenia [s]</string>
<string name="serial_number">Sériové číslo</string>
<string name="release_software_version">Verzia softwaru</string>
@ -1275,8 +1280,6 @@
<string name="statuslights">Indikátory stavu</string>
<string name="statuslights_copy_ns">Kopírovať nastavenia z NS</string>
<string name="copyexistingvalues">Skopírovať nastavenia NS (ak existujú)?</string>
<string name="classic_desrciption">Pôvodný vzhľad</string>
<string name="buttonson_desrciption">Tlačidlá sú vždy zobrazené v spodnej časti obrazovky</string>
<string name="skin">Vzhľad</string>
<!-- Omnipod -->
<!-- Omnipod - Base -->

View file

@ -130,7 +130,7 @@
<string name="isf_profile">Om du ändrar ISF-värdet i din profil är det tillräckligt för att tillämpa ändringen.</string>
<string name="isf_hint1">https://androidaps.readthedocs.io/en/latest/EN/Getting-Started/FAQ.html#insulin-sensitivity-factor-isf-mmol-l-u-or-mg-dl-u</string>
<string name="isf_hint2">https://androidaps.readthedocs.io/en/latest/EN/Usage/Profiles.html</string>
<string name="ic_label">Ämne: IC-kvoten</string>
<string name="ic_label">Ämne: KH-kvot</string>
<string name="ic_increasingvalue">Högre IC-kvot leder till mindre insulin som levereras för en given mängd kolhydrater.</string>
<string name="ic_decreasingvalue">Lägre IC-kvot leder till mindre insulin som levereras för en given mängd kolhydrater.</string>
<string name="ic_noeffect">Om du har 0 COB, kommer en förändring av IC-kvoten leda till en annan mängd insulin för att korrigera din BG-nivå.</string>

View file

@ -132,12 +132,12 @@ Eversense-appen.</string>
<string name="closedloop">Closed Loop</string>
<string name="openloop">Open Loop</string>
<string name="lowglucosesuspend">Stopp innan lågt</string>
<string name="disabledloop">Loop avstängd</string>
<string name="disabledloop">Loop inaktiverad</string>
<string name="disableloop">Inaktivera loop</string>
<string name="enableloop">Aktivera loop</string>
<string name="openloop_newsuggestion">Ny rekommendation tillgänglig</string>
<string name="unsupportednsversion">Versionen av Nightscout stöds inte</string>
<string name="loopdisabled">LOOP STOPPAD PGA BEGRÄNSNINGAR</string>
<string name="loopdisabled">LOOP INAKTIVERAD PGA BEGRÄNSNINGAR</string>
<string name="treatments_wizard_basaliob_label">IOB från basal</string>
<string name="bolusconstraintapplied">Bolusspärr aktiverad</string>
<string name="carbsconstraintapplied">Kolhydratsspärr aktiverad</string>
@ -251,9 +251,9 @@ Eversense-appen.</string>
<string name="uploading">Laddar upp</string>
<string name="bolusstopped">Bolus avbruten</string>
<string name="bolusstopping">Avbryter bolus</string>
<string name="smscommunicator_loophasbeendisabled">Loop stängdes av. </string>
<string name="smscommunicator_loophasbeenenabled">Loop aktiverades</string>
<string name="smscommunicator_loopisdisabled">Loop är avstängd</string>
<string name="smscommunicator_loophasbeendisabled">Loop inaktiverad.</string>
<string name="smscommunicator_loophasbeenenabled">Loop aktiverad</string>
<string name="smscommunicator_loopisdisabled">Loop är inaktiverad</string>
<string name="smscommunicator_loopisenabled">Loop är aktiverad</string>
<string name="valuelimitedto">%1$.2f begränsat till %2$.2f</string>
<string name="valueoutofrange">Värdet %1$s är utanför hård begränsning</string>
@ -265,6 +265,9 @@ Eversense-appen.</string>
<string name="smscommunicator_carbsreplywithcode">Om du vill ange %1$dg kl. %2$s, svara med kod %3$s</string>
<string name="smscommunicator_basalpctreplywithcode">För att starta temp basal %1$d%% i %2$d min, svara med kod %3$s</string>
<string name="smscommunicator_suspendreplywithcode">För att pausa loop i %1$d minuter, svara med kod %2$s</string>
<string name="smscommunicator_loopresumereplywithcode">För att återuppta loopen, svara med kod %1$s</string>
<string name="smscommunicator_loopenablereplywithcode">För att aktivera loopen, svara med kod %1$s</string>
<string name="smscommunicator_loopdisablereplywithcode">För att inaktivera loopen, svara med kod %1$s</string>
<string name="smscommunicator_tempbasalset">Temp basal %1$.2f enheter/tim i %2$d min startad</string>
<string name="smscommunicator_extendedset">Förlängd bolus %1$.2f enheter över %2$d min har startats</string>
<string name="smscommunicator_carbsset">%1$dg kolhydrater registrerat</string>
@ -279,8 +282,8 @@ Eversense-appen.</string>
<string name="smscommunicator_tempbasalcancelfailed">Misslyckades med att avbryta temp basal</string>
<string name="smscommunicator_extendedcancelfailed">Avbryter förlängd bolus</string>
<string name="smscommunicator_unknowncommand">Okänt kommando eller fel svar</string>
<string name="quickwizard">Kalkylator</string>
<string name="quickwizardsettings">Kalkylatorinställningar</string>
<string name="quickwizard">Snabbsteg</string>
<string name="quickwizardsettings">Inställningar för snabbsteg</string>
<string name="overview_editquickwizard_buttontext">Knapptext:</string>
<string name="overview_editquickwizard_carbs">KH:</string>
<string name="overview_editquickwizard_valid">Giltig:</string>
@ -423,7 +426,7 @@ Eversense-appen.</string>
<string name="resume">Återuppta</string>
<string name="reconnect">Återanslut Pump</string>
<string name="smscommunicator_wrongduration">Fel duration</string>
<string name="smscommunicator_loopsuspended">Loop pausad. </string>
<string name="smscommunicator_loopsuspended">Loop pausad</string>
<string name="smscommunicator_loopresumed">Loop återupptagen</string>
<string name="treatments_wizard_bgtrend_label">15 min trend</string>
<string name="treatments_wizard_cob_label">COB</string>
@ -450,8 +453,14 @@ Eversense-appen.</string>
<string name="statuslights_res_critical">Akut varningsnivå för reservoar [U]</string>
<string name="statuslights_bat_warning">Varningsnivå för batteri [%]</string>
<string name="statuslights_bat_critical">Akut varningsnivå för batteri [%]</string>
<string name="prediction_shortname">Prog</string>
<string name="iob">IOB</string>
<string name="cob">COB</string>
<string name="basal_shortname">Bas</string>
<string name="deviation_shortname">Dev</string>
<string name="activity_shortname">Akt</string>
<string name="abs_insulin_shortname">Abs</string>
<string name="devslope_shortname">Devslope</string>
<string name="nav_about">Om</string>
<string name="smscommunicator_missingsmspermission">Saknar behörighet att skicka SMS</string>
<string name="smscommunicator_missingphonestatepermission">Behörighet saknas</string>
@ -469,12 +478,8 @@ Eversense-appen.</string>
<string name="doprofileswitch">Genomför profilbyte</string>
<string name="careportal_pbage_label">Pumpbatteri ålder</string>
<string name="ns_alarmoptions">Larminställningar</string>
<string name="nsalarm_urgenthigh">Akut hög</string>
<string name="nsalarm_high">Hög</string>
<string name="nsalarm_low">Låg</string>
<string name="nsalarm_urgentlow">Akut låg</string>
<string name="nsalarm_staledata">BG-data saknas</string>
<string name="nsalarm_urgentstaledata">BG-data saknas (akut larm)</string>
<string name="ns_alarms">Skapa aviseringar från NS-larm</string>
<string name="ns_announcements">Skapa aviseringar från NS-meddelanden</string>
<string name="nsalarm_staledatavalue_label">Första varning efter [min]</string>
<string name="nsalarm_urgent_staledatavalue_label">Akut varning efter [min]</string>
<string name="openapsama_autosens_period">Intervall för autosens [tim]</string>
@ -627,6 +632,8 @@ Eversense-appen.</string>
<string name="extendedbolusdeliveryerror">Förlängd bolus misslyckad</string>
<string name="insightpump_shortname">Sight</string>
<string name="ago">sedan</string>
<string name="set_neutral_temps_title">Sätt neutrala temp basaler</string>
<string name="set_neutral_temps_summary">Om aktiverad, kommer en eventuell temporär basal automatiskt avbrytas före utgången av varje timme. Denna metod kan förhindra att vissa pumpar piper/vibrerar.</string>
<string name="enablesmbalways">Använd alltid SMB</string>
<string name="enablesmbalways_summary">Använd alltid SMB oberoende av bolus. Endast möjligt med en bra filtrerad BG-källa, t ex Dexcom G5.</string>
<string name="enablesmbaftercarbs">Använd SMB efter kolhydrater</string>
@ -652,7 +659,7 @@ Eversense-appen.</string>
<string name="ns_create_announcements_from_errors_title">Skapa notiser vid fel</string>
<string name="ns_create_announcements_from_errors_summary">Skapa notiser i Nightscout vid fel eller lokala meddelanden (även synliga i Careportal/Behandlingar)</string>
<string name="wear_predictions_summary">Visa BG-prognos på klockan.</string>
<string name="wear_predictions_title">Prognos</string>
<string name="wear_predictions_title">BG-prognos</string>
<string name="data_choices">Dataval</string>
<string name="fabric_upload">Uppladdning till Fabric</string>
<string name="allow_automated_crash_reporting">Tillåt automatisk rapportering av appkrascher och användningsinformation till utvecklarna via fabric.io-tjänsten.</string>
@ -675,7 +682,7 @@ Eversense-appen.</string>
<string name="overview_show_basals">Basaler</string>
<string name="no_action_selected">Ingen åtgärd vald. Inget ändras.</string>
<string name="start_hypo_tt">Starta \"Hypo\"</string>
<string name="closed_loop_disabled_on_dev_branch">Du kör nu dev-versionen. Closed Loop inte tillåtet.</string>
<string name="closed_loop_disabled_on_dev_branch">Du kör nu dev-versionen. Closed Loop inaktiverat.</string>
<string name="engineering_mode_enabled">Engineering Mode aktiverat</string>
<string name="not_eng_mode_or_release">Engineering Mode inte aktiverat och appen körs inte som release</string>
<string name="combo_actvity_reading_basal_profile">Läser basalprofil</string>
@ -852,6 +859,10 @@ Eversense-appen.</string>
<string name="log_alerts">Logga varningar</string>
<string name="enable_tbr_emulation">Aktivera emulering av temp basal</string>
<string name="enable_tbr_emulation_summary">Använda förlängda bolusar istället för temp basaler för att kringgå 250%%-begränsningen</string>
<string name="disable_vibration">Inaktivera vibration för manuell bolus</string>
<string name="disable_vibration_summary">För bolus och förlängd bolus (endast tillgängligt med Insight firmware 3.x)</string>
<string name="disable_vibration_auto">Inaktivera vibration för automatisk bolus</string>
<string name="disable_vibration_auto_summary">För SMB och temp basal med TBR-emulering (endast tillgängligt med Insight firmware 3.x)</string>
<string name="disconnect_delay">Fördröjning av frånkoppling [s]</string>
<string name="serial_number">Serienummer</string>
<string name="release_software_version">Mjukvaruversion Release</string>
@ -1266,7 +1277,7 @@ Eversense-appen.</string>
<string name="smscommunicator_otp_reset_warning">Genom att återställa autentiseringsfunktionen kommer alla redan driftsatta autentiserare bli ogiltiga. Du kommer behöva sätta upp dem igen!</string>
<string name="onconnect">Vid anslutning</string>
<string name="ondisconnect">Vid frånkoppling</string>
<string name="overview_show_predictions">Beräknade resultat</string>
<string name="overview_show_predictions">BG-prognos</string>
<string name="overview_show_deviationslope">Avvikelsekurva</string>
<string name="authorizationfailed">Behörighetskontroll misslyckades</string>
<string name="overview_show_absinsulin">Absolut insulinmängd</string>
@ -1276,8 +1287,9 @@ Eversense-appen.</string>
<string name="statuslights">Statuslampor</string>
<string name="statuslights_copy_ns">Kopiera inställningar från NS</string>
<string name="copyexistingvalues">Kopiera NS-inställningar (om det finns)?</string>
<string name="classic_desrciption">Ursprungligt tema</string>
<string name="buttonson_desrciption">Knappar visas alltid längst ned på skärmen</string>
<string name="classic_description">Ursprungligt tema</string>
<string name="buttonson_description">Knappar visas alltid längst ned på skärmen</string>
<string name="largedisplay_description">Stor skärm</string>
<string name="skin">Tema</string>
<!-- Omnipod -->
<!-- Omnipod - Base -->
@ -1376,7 +1388,7 @@ Eversense-appen.</string>
<string name="description_pump_omnipod_dash">Pumpintegration för Omnipod Dash.</string>
<string name="omnipod_alert_finish_pairing_reminder">Påminnelse att slutföra parkoppling</string>
<string name="omnipod_alert_finish_setup_reminder_reminder">Påminnelse att slutföra installation</string>
<string name="omnipod_alert_expiration">Pod kommer att gå ut inom kort</string>
<string name="omnipod_alert_expiration">Pod löper snart ut</string>
<string name="omnipod_alert_expiration_advisory">Pod kommer att gå ut inom kort</string>
<string name="omnipod_alert_shutdown_imminent">Pod kommer snart att stängas av</string>
<string name="omnipod_alert_low_reservoir">Låg reservoar</string>

View file

@ -355,12 +355,6 @@ Aktif Karbonhidratın ne kadar hızlı sindirildiğine ve KŞ\'nin beklenenden d
<string name="careportal_insulinage_label">İnsülin yaşı</string>
<string name="careportal_pbage_label">Pompa pil yaşı</string>
<string name="ns_alarmoptions">Alarm türleri</string>
<string name="nsalarm_urgenthigh">ırı yüksek</string>
<string name="nsalarm_high">Yüksek</string>
<string name="nsalarm_low">Düşük</string>
<string name="nsalarm_urgentlow">Çok düşük</string>
<string name="nsalarm_staledata">Eski veriler</string>
<string name="nsalarm_urgentstaledata">Acil durum verileri</string>
<string name="nsalarm_staledatavalue_label">Eski veri eşiği [min]</string>
<string name="nsalarm_urgent_staledatavalue_label">Acil durum verileri eşiği [min]</string>
<string name="openapsama_autosens_period">Autosens [h] için aralık</string>

View file

@ -378,12 +378,6 @@
<string name="careportal_insulinage_label">胰岛素使用时间</string>
<string name="careportal_pbage_label">泵电池使用时间</string>
<string name="ns_alarmoptions">报警选项</string>
<string name="nsalarm_urgenthigh">紧急高</string>
<string name="nsalarm_high"></string>
<string name="nsalarm_low"></string>
<string name="nsalarm_urgentlow">紧急低</string>
<string name="nsalarm_staledata">陈旧数据</string>
<string name="nsalarm_urgentstaledata">紧急陈旧数据</string>
<string name="nsalarm_staledatavalue_label">陈旧数据阈值 [min]</string>
<string name="nsalarm_urgent_staledatavalue_label">紧急陈旧数据阈值 [min]</string>
<string name="openapsama_autosens_period">Autosens间隔的 [h]</string>

View file

@ -22,6 +22,7 @@
</string-array>
<string-array name="languagesArray">
<item>@string/default_lang</item>
<item>@string/en_lang</item>
<item>@string/af_lang</item>
<item>@string/bg_lang</item>
@ -45,6 +46,7 @@
<item>@string/zh_lang</item>
</string-array>
<string-array name="languagesValues" translatable="false">
<item>default</item>
<item>en</item>
<item>af</item>
<item>bg</item>

View file

@ -1,4 +1,5 @@
<resources>
<string name="default_lang" translatable="false">System default</string>
<string name="en_lang" translatable="false">English</string>
<string name="cs_lang" translatable="false">Czech</string>
<string name="af_lang" translatable="false">Afrikaans</string>
@ -299,6 +300,11 @@
<string name="smscommunicator_loopisenabled">Loop is enabled</string>
<string name="valuelimitedto">%1$.2f limited to %2$.2f</string>
<string name="valueoutofrange">Value %1$s is out of hard limits</string>
<string name="smscommunicator_pumpconnectwithcode">To connect pump reply with code %1$s</string>
<string name="smscommunicator_pumpconnectfail">Connection to pump failed</string>
<string name="smscommunicator_pumpdisconnectwithcode">To disconnect pump for %1d minutes reply with code %2$s</string>
<string name="smscommunicator_pumpdisconnected">Pump disconnected</string>
<string name="smscommunicator_reconnect">Pump reconnected</string>
<string name="smscommunicator_remotecommandnotallowed">Remote command is not allowed</string>
<string name="smscommunicator_remotebolusnotallowed">Remote bolus not available. Try again later.</string>
<string name="smscommunicator_basalreplywithcode">To start basal %1$.2fU/h for %2$d min reply with code %3$s</string>
@ -307,6 +313,9 @@
<string name="smscommunicator_carbsreplywithcode">To enter %1$dg at %2$s reply with code %3$s</string>
<string name="smscommunicator_basalpctreplywithcode">To start basal %1$d%% for %2$d min reply with code %3$s</string>
<string name="smscommunicator_suspendreplywithcode">To suspend loop for %1$d minutes reply with code %2$s</string>
<string name="smscommunicator_loopresumereplywithcode">To resume loop reply with code %1$s</string>
<string name="smscommunicator_loopenablereplywithcode">To enable loop reply with code %1$s</string>
<string name="smscommunicator_loopdisablereplywithcode">To disable loop reply with code %1$s</string>
<string name="smscommunicator_tempbasalset">Temp basal %1$.2fU/h for %2$d min started successfully</string>
<string name="smscommunicator_extendedset">Extended bolus %1$.2fU for %2$d min started successfully</string>
<string name="smscommunicator_carbsset">Carbs %1$dg entered successfully</string>
@ -527,8 +536,14 @@
<string name="statuslights_bat_warning">Threshold warning battery level [%]</string>
<string name="key_statuslights_bat_critical" translatable="false">statuslights_bat_critical</string>
<string name="statuslights_bat_critical">Threshold critical battery level [%]</string>
<string name="prediction_shortname">PRED</string>
<string name="iob">IOB</string>
<string name="cob">COB</string>
<string name="basal_shortname">BAS</string>
<string name="deviation_shortname">DEV</string>
<string name="activity_shortname">ACT</string>
<string name="abs_insulin_shortname">ABS</string>
<string name="devslope_shortname">DEVSLOPE</string>
<string name="nav_about">About</string>
<string name="smscommunicator_missingsmspermission">Missing SMS permission</string>
<string name="smscommunicator_missingphonestatepermission">Missing phone state permission</string>
@ -548,20 +563,12 @@
<string name="doprofileswitch">Do Profile Switch</string>
<string name="careportal_pbage_label">Pump battery age</string>
<string name="ns_alarmoptions">Alarm options</string>
<string name="key_nsalarm_urgent_high" translatable="false">nsalarm_urgent_high</string>
<string name="key_nsalarm_high" translatable="false">nsalarm_high</string>
<string name="key_nsalarm_low" translatable="false">nsalarm_low</string>
<string name="key_nsalarm_urgent_low" translatable="false">nsalarm_urgent_low</string>
<string name="key_nsalarm_staledata" translatable="false">nsalarm_staledata</string>
<string name="key_nsalarm_urgent_staledata" translatable="false">nsalarm_urgent_staledata</string>
<string name="key_ns_announcements" translatable="false">ns_announcements</string>
<string name="key_ns_alarms" translatable="false">ns_alarms</string>
<string name="key_nsalarm_staledatavalue" translatable="false">nsalarm_staledatavalue</string>
<string name="key_nsalarm_urgent_staledatavalue" translatable="false">nsalarm_urgent_staledatavalue</string>
<string name="nsalarm_urgenthigh">Urgent high</string>
<string name="nsalarm_high">High</string>
<string name="nsalarm_low">Low</string>
<string name="nsalarm_urgentlow">Urgent low</string>
<string name="nsalarm_staledata">Stale data</string>
<string name="nsalarm_urgentstaledata">Urgent stale data</string>
<string name="ns_alarms">Create notifications from NS alarms</string>
<string name="ns_announcements">Create notifications from NS announcements</string>
<string name="nsalarm_staledatavalue_label">Stale data threshold [min]</string>
<string name="nsalarm_urgent_staledatavalue_label">Urgent stale data threshold [min]</string>
<string name="openapsama_autosens_period">Interval for autosens [h]</string>
@ -740,6 +747,9 @@
<string name="key_enableSMB_with_temptarget" translatable="false">enableSMB_with_temptarget</string>
<string name="key_enableSMB_after_carbs" translatable="false">enableSMB_after_carbs</string>
<string name="key_allowSMB_with_high_temptarget" translatable="false">enableSMB_with_high_temptarget</string>
<string name="key_set_neutral_temps" translatable="false">set_neutral_temps</string>
<string name="set_neutral_temps_title">Set neutral temp basals</string>
<string name="set_neutral_temps_summary">If enabled, it will cancel a temporary basal before the end of each hour. This method can help stop some pumps beeping/vibrating on the hour.</string>
<string name="enablesmbalways">Enable SMB always</string>
<string name="enablesmbalways_summary">Enable SMB always independently to boluses. Possible only with BG source with nice filtering of data like G5</string>
<string name="enablesmbaftercarbs">Enable SMB after carbs</string>
@ -1016,6 +1026,12 @@
<string name="log_alerts">Log alerts</string>
<string name="enable_tbr_emulation">Enable TBR emulation</string>
<string name="enable_tbr_emulation_summary">Use extended boluses instead of TBRs to bypass the 250%% limit</string>
<string name="key_disable_vibration" translatable="false">insight_disable_vibration</string>
<string name="disable_vibration">Disable vibrations on manual bolus delivery</string>
<string name="disable_vibration_summary">For bolus and extended bolus (only available with Insight firmware 3.x)</string>
<string name="key_disable_vibration_auto" translatable="false">insight_disable_vibration_auto</string>
<string name="disable_vibration_auto">Disable vibrations on automated bolus delivery</string>
<string name="disable_vibration_auto_summary">For SMB and Temp Basal with TBR emulation (only available with Insight firmware 3.x)</string>
<string name="disconnect_delay">Disconnect delay [s]</string>
<string name="serial_number">Serial number</string>
<string name="release_software_version">Release software version</string>
@ -1537,8 +1553,9 @@
<string name="key_statuslights_copy_ns" translatable="false">statuslights_copy_ns</string>
<string name="copyexistingvalues">Copy NS settings (if exists)?</string>
<string name="key_statuslights_overview_advanced" translatable="false">statuslights_overview_advanced</string>
<string name="classic_desrciption">Original skin</string>
<string name="buttonson_desrciption">Buttons are always displayed on bottom of screen</string>
<string name="classic_description">Original skin</string>
<string name="buttonson_description">Buttons are always displayed on bottom of screen</string>
<string name="largedisplay_description">Large display</string>
<string name="key_skin" translatable="false">skin</string>
<string name="skin">Skin</string>
@ -1675,7 +1692,7 @@
<string name="description_pump_omnipod_dash">Pump integration for Omnipod Dash.</string>
<string name="omnipod_alert_finish_pairing_reminder">Finish pairing reminder</string>
<string name="omnipod_alert_finish_setup_reminder_reminder">Finish setup reminder</string>
<string name="omnipod_alert_expiration">Pod wil expire soon</string>
<string name="omnipod_alert_expiration">Pod will expire soon</string>
<string name="omnipod_alert_expiration_advisory">Pod will expire soon</string>
<string name="omnipod_alert_shutdown_imminent">Shutdown is imminent</string>
<string name="omnipod_alert_low_reservoir">Low reservoir</string>

View file

@ -14,7 +14,7 @@
android:title="@string/unitsnosemicolon" />
<ListPreference
android:defaultValue="en"
android:defaultValue="default"
android:entries="@array/languagesArray"
android:entryValues="@array/languagesValues"
android:key="@string/key_language"

View file

@ -48,6 +48,18 @@
android:summary="@string/enable_tbr_emulation_summary"
android:title="@string/enable_tbr_emulation" />
<SwitchPreference
android:defaultValue="false"
android:key="@string/key_disable_vibration"
android:summary="@string/disable_vibration_summary"
android:title="@string/disable_vibration" />
<SwitchPreference
android:defaultValue="false"
android:key="@string/key_disable_vibration_auto"
android:summary="@string/disable_vibration_auto_summary"
android:title="@string/disable_vibration_auto" />
<EditTextPreference
android:defaultValue="5"
android:inputType="number"

View file

@ -48,6 +48,12 @@
android:summary="@string/enable_tbr_emulation_summary"
android:title="@string/enable_tbr_emulation" />
<SwitchPreference
android:defaultValue="false"
android:key="@string/key_disable_vibration"
android:summary="@string/disable_vibration_summary"
android:title="@string/disable_vibration" />
<EditTextPreference
android:defaultValue="5"
android:inputType="number"

View file

@ -98,6 +98,12 @@
<intent android:action="info.nightscout.androidaps.plugins.PumpCommon.dialog.RileyLinkBLEScanActivity" />
</Preference>
<SwitchPreference
android:defaultValue="true"
android:key="@string/key_set_neutral_temps"
android:summary="@string/set_neutral_temps_summary"
android:title="@string/set_neutral_temps_title" />
</PreferenceCategory>
</androidx.preference.PreferenceScreen>

View file

@ -42,29 +42,12 @@
android:title="@string/ns_alarmoptions">
<SwitchPreference
android:defaultValue="false"
android:key="@string/key_nsalarm_urgent_high"
android:title="@string/nsalarm_urgenthigh" />
android:key="@string/key_ns_alarms"
android:title="@string/ns_alarms" />
<SwitchPreference
android:defaultValue="false"
android:key="@string/key_nsalarm_high"
android:title="@string/nsalarm_high" />
<SwitchPreference
android:defaultValue="false"
android:key="@string/key_nsalarm_low"
android:title="@string/nsalarm_low" />
<SwitchPreference
android:defaultValue="false"
android:key="@string/key_nsalarm_urgent_low"
android:title="@string/nsalarm_urgentlow" />
<SwitchPreference
android:defaultValue="false"
android:key="@string/key_nsalarm_staledata"
android:title="@string/nsalarm_staledata" />
android:key="@string/key_ns_announcements"
android:title="@string/ns_announcements" />
<info.nightscout.androidaps.utils.textValidator.ValidatingEditTextPreference
android:defaultValue="16"
@ -79,11 +62,6 @@
validate:minNumber="15"
validate:testType="numericRange" />
<SwitchPreference
android:defaultValue="false"
android:key="@string/key_nsalarm_urgent_staledata"
android:title="@string/nsalarm_urgentstaledata" />
<info.nightscout.androidaps.utils.textValidator.ValidatingEditTextPreference
android:defaultValue="31"
android:digits="0123456789"

View file

@ -77,13 +77,13 @@
android:defaultValue="3"
android:digits="0123456789"
android:inputType="number"
android:key="key_smbinterval"
android:key="@string/key_smbinterval"
android:maxLines="20"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="@string/smbinterval_summary"
validate:maxNumber="10"
validate:minNumber="1"
validate:minNumber="3"
validate:testType="numericRange" />
<info.nightscout.androidaps.utils.textValidator.ValidatingEditTextPreference

View file

@ -20,6 +20,7 @@ class DanaRS_Packet_APS_Set_Event_HistoryTest : DanaRSTestBase() {
it.dateUtil = dateUtil
}
if (it is DanaRS_Packet_APS_Set_Event_History) {
it.danaPump = danaPump
}
}
}

View file

@ -34,7 +34,7 @@ class DanaRS_Packet_Option_Get_Pump_TimeTest : DanaRSTestBase() {
putByteToArray(array, 5, 35) // second 35
packet.handleMessage(array)
Assert.assertEquals(DateTime(2019, 2, 4, 20, 11, 35).millis, danaPump.pumpTime)
Assert.assertEquals(DateTime(2019, 2, 4, 20, 11, 35).millis, danaPump.getPumpTime())
Assert.assertEquals("OPTION__GET_PUMP_TIME", packet.friendlyName)
}
}

View file

@ -30,7 +30,7 @@ class TriggerBolusAgoTest : TriggerTestBase() {
@Test
fun shouldRunTest() {
`when`(treatmentsPlugin.getLastBolusTime(false)).thenReturn(now) // Set last bolus time to now
`when`(treatmentsPlugin.getLastBolusTime(true)).thenReturn(now) // Set last bolus time to now
`when`(DateUtil.now()).thenReturn(now + 10 * 60 * 1000) // set current time to now + 10 min
var t = TriggerBolusAgo(injector).setValue(110).comparator(Comparator.Compare.IS_EQUAL)
Assert.assertEquals(110, t.minutesAgo.value)
@ -53,7 +53,7 @@ class TriggerBolusAgoTest : TriggerTestBase() {
Assert.assertTrue(t.shouldRun())
t = TriggerBolusAgo(injector).setValue(390).comparator(Comparator.Compare.IS_EQUAL_OR_LESSER)
Assert.assertTrue(t.shouldRun())
PowerMockito.`when`(treatmentsPlugin.getLastBolusTime(false)).thenReturn(0L) // Set last bolus time to 0
PowerMockito.`when`(treatmentsPlugin.getLastBolusTime(true)).thenReturn(0L) // Set last bolus time to 0
t = TriggerBolusAgo(injector).comparator(Comparator.Compare.IS_NOT_AVAILABLE)
Assert.assertTrue(t.shouldRun())
}

View file

@ -1,6 +1,8 @@
package info.nightscout.androidaps.plugins.general.automation.triggers
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.MidnightTime
import info.nightscout.androidaps.utils.T
import org.json.JSONObject
import org.junit.Assert
import org.junit.Before
@ -14,32 +16,23 @@ import org.powermock.modules.junit4.PowerMockRunner
@PrepareForTest(DateUtil::class)
class TriggerRecurringTimeTest : TriggerTestBase() {
var now = 1514766900000L
var now : Long = 0L
@Before fun mock() {
PowerMockito.mockStatic(DateUtil::class.java)
PowerMockito.`when`(DateUtil.now()).thenReturn(now)
// val calendar = GregorianCalendar()
// calendar.timeInMillis = now
// PowerMockito.`when`(DateUtil.gregorianCalendar()).thenReturn(calendar)
now = MidnightTime.calc() + T.mins(95).msecs() // 95 min from midnight
PowerMockito.`when`(dateUtil._now()).thenReturn(now)
}
@Test fun shouldRunTest() {
// limit by validTo
var t: TriggerRecurringTime = TriggerRecurringTime(injector).time(94)
var t: TriggerRecurringTime = TriggerRecurringTime(injector).time(89)
t.days.setAll(true)
Assert.assertFalse(t.shouldRun())
// scheduled 1 min before
// t = new TriggerRecurringTime().hour(1).minute(34);
// t.setAll(true);
// Assert.assertTrue(t.shouldRun());
// already run
t = TriggerRecurringTime(injector).time(94)
t.days.setAll(true)
Assert.assertFalse(t.shouldRun())
Assert.assertTrue(t.shouldRun())
}
private var timeJson = "{\"data\":{\"WEDNESDAY\":false,\"MONDAY\":false,\"THURSDAY\":false,\"SUNDAY\":false,\"TUESDAY\":false,\"FRIDAY\":false,\"SATURDAY\":false,\"time\":4444},\"type\":\"info.nightscout.androidaps.plugins.general.automation.triggers.TriggerRecurringTime\"}"

View file

@ -223,6 +223,15 @@ class SmsCommunicatorPluginTest : TestBaseWithProfile() {
`when`(resourceHelper.gs(R.string.smscommunicator_mealbolusdelivered_tt)).thenReturn("Target %1\$s for %2\$d minutes")
`when`(resourceHelper.gs(R.string.sms_actualbg)).thenReturn("BG:")
`when`(resourceHelper.gs(R.string.sms_lastbg)).thenReturn("Last BG:")
`when`(resourceHelper.gs(R.string.smscommunicator_loopdisablereplywithcode)).thenReturn("To disable loop reply with code %1\$s")
`when`(resourceHelper.gs(R.string.smscommunicator_loopenablereplywithcode)).thenReturn("To enable loop reply with code %1\$s")
`when`(resourceHelper.gs(R.string.smscommunicator_loopresumereplywithcode)).thenReturn("To resume loop reply with code %1\$s")
`when`(resourceHelper.gs(R.string.smscommunicator_pumpdisconnectwithcode)).thenReturn("To disconnect pump for %1d minutes reply with code %2\$s")
`when`(resourceHelper.gs(R.string.smscommunicator_pumpconnectwithcode)).thenReturn("To connect pump reply with code %1\$s")
`when`(resourceHelper.gs(R.string.smscommunicator_reconnect)).thenReturn("Pump reconnected")
`when`(resourceHelper.gs(R.string.smscommunicator_pumpconnectfail)).thenReturn("Connection to pump failed")
`when`(resourceHelper.gs(R.string.smscommunicator_pumpdisconnected)).thenReturn("Pump disconnected")
}
@Test
@ -344,7 +353,11 @@ class SmsCommunicatorPluginTest : TestBaseWithProfile() {
smsCommunicatorPlugin.processSms(sms)
Assert.assertFalse(sms.ignored)
Assert.assertEquals("LOOP DISABLE", smsCommunicatorPlugin.messages[0].text)
Assert.assertEquals("Loop has been disabled Temp basal canceled", smsCommunicatorPlugin.messages[1].text)
Assert.assertTrue(smsCommunicatorPlugin.messages[1].text.contains("To disable loop reply with code "))
var passCode: String = smsCommunicatorPlugin.messageToConfirm?.confirmCode!!
smsCommunicatorPlugin.processSms(Sms("1234", passCode))
Assert.assertEquals(passCode, smsCommunicatorPlugin.messages[2].text)
Assert.assertEquals("Loop has been disabled Temp basal canceled", smsCommunicatorPlugin.messages[3].text)
Assert.assertTrue(hasBeenRun)
//LOOP ENABLE : already enabled
@ -368,7 +381,11 @@ class SmsCommunicatorPluginTest : TestBaseWithProfile() {
smsCommunicatorPlugin.processSms(sms)
Assert.assertFalse(sms.ignored)
Assert.assertEquals("LOOP ENABLE", smsCommunicatorPlugin.messages[0].text)
Assert.assertEquals("Loop has been enabled", smsCommunicatorPlugin.messages[1].text)
Assert.assertTrue(smsCommunicatorPlugin.messages[1].text.contains("To enable loop reply with code "))
passCode = smsCommunicatorPlugin.messageToConfirm?.confirmCode!!
smsCommunicatorPlugin.processSms(Sms("1234", passCode))
Assert.assertEquals(passCode, smsCommunicatorPlugin.messages[2].text)
Assert.assertEquals("Loop has been enabled", smsCommunicatorPlugin.messages[3].text)
Assert.assertTrue(hasBeenRun)
//LOOP RESUME : already enabled
@ -377,7 +394,11 @@ class SmsCommunicatorPluginTest : TestBaseWithProfile() {
smsCommunicatorPlugin.processSms(sms)
Assert.assertFalse(sms.ignored)
Assert.assertEquals("LOOP RESUME", smsCommunicatorPlugin.messages[0].text)
Assert.assertEquals("Loop resumed", smsCommunicatorPlugin.messages[1].text)
Assert.assertTrue(smsCommunicatorPlugin.messages[1].text.contains("To resume loop reply with code "))
passCode = smsCommunicatorPlugin.messageToConfirm?.confirmCode!!
smsCommunicatorPlugin.processSms(Sms("1234", passCode))
Assert.assertEquals(passCode, smsCommunicatorPlugin.messages[2].text)
Assert.assertEquals("Loop resumed", smsCommunicatorPlugin.messages[3].text)
//LOOP SUSPEND 1 2: wrong format
smsCommunicatorPlugin.messages = ArrayList()
@ -402,7 +423,7 @@ class SmsCommunicatorPluginTest : TestBaseWithProfile() {
Assert.assertFalse(sms.ignored)
Assert.assertEquals("LOOP SUSPEND 100", smsCommunicatorPlugin.messages[0].text)
Assert.assertTrue(smsCommunicatorPlugin.messages[1].text.contains("To suspend loop for 100 minutes reply with code "))
var passCode: String = smsCommunicatorPlugin.messageToConfirm?.confirmCode!!
passCode = smsCommunicatorPlugin.messageToConfirm?.confirmCode!!
smsCommunicatorPlugin.processSms(Sms("1234", passCode))
Assert.assertEquals(passCode, smsCommunicatorPlugin.messages[2].text)
Assert.assertEquals("Loop suspended Temp basal canceled", smsCommunicatorPlugin.messages[3].text)
@ -500,6 +521,74 @@ class SmsCommunicatorPluginTest : TestBaseWithProfile() {
Assert.assertEquals("PUMP", smsCommunicatorPlugin.messages[0].text)
Assert.assertEquals("Virtual Pump", smsCommunicatorPlugin.messages[1].text)
//PUMP CONNECT 1 2: wrong format
smsCommunicatorPlugin.messages = ArrayList()
sms = Sms("1234", "PUMP CONNECT 1 2")
smsCommunicatorPlugin.processSms(sms)
Assert.assertFalse(sms.ignored)
Assert.assertEquals("PUMP CONNECT 1 2", smsCommunicatorPlugin.messages[0].text)
Assert.assertEquals("Wrong format", smsCommunicatorPlugin.messages[1].text)
//PUMP CONNECT BLABLA
smsCommunicatorPlugin.messages = ArrayList()
sms = Sms("1234", "PUMP BLABLA")
smsCommunicatorPlugin.processSms(sms)
Assert.assertFalse(sms.ignored)
Assert.assertEquals("PUMP BLABLA", smsCommunicatorPlugin.messages[0].text)
Assert.assertEquals("Wrong format", smsCommunicatorPlugin.messages[1].text)
//PUMP CONNECT
PowerMockito.`when`(loopPlugin.isEnabled(PluginType.LOOP)).thenReturn(true)
smsCommunicatorPlugin.messages = ArrayList()
sms = Sms("1234", "PUMP CONNECT")
smsCommunicatorPlugin.processSms(sms)
Assert.assertFalse(sms.ignored)
Assert.assertEquals("PUMP CONNECT", smsCommunicatorPlugin.messages[0].text)
Assert.assertTrue(smsCommunicatorPlugin.messages[1].text.contains("To connect pump reply with code "))
passCode = smsCommunicatorPlugin.messageToConfirm?.confirmCode!!
smsCommunicatorPlugin.processSms(Sms("1234", passCode))
Assert.assertEquals(passCode, smsCommunicatorPlugin.messages[2].text)
Assert.assertEquals("Pump reconnected", smsCommunicatorPlugin.messages[3].text)
//PUMP DISCONNECT 1 2: wrong format
smsCommunicatorPlugin.messages = ArrayList()
sms = Sms("1234", "PUMP DISCONNECT 1 2")
smsCommunicatorPlugin.processSms(sms)
Assert.assertFalse(sms.ignored)
Assert.assertEquals("PUMP DISCONNECT 1 2", smsCommunicatorPlugin.messages[0].text)
Assert.assertEquals("Wrong format", smsCommunicatorPlugin.messages[1].text)
//PUMP DISCONNECT 0
smsCommunicatorPlugin.messages = ArrayList()
sms = Sms("1234", "PUMP DISCONNECT 0")
smsCommunicatorPlugin.processSms(sms)
Assert.assertFalse(sms.ignored)
Assert.assertEquals("Wrong duration", smsCommunicatorPlugin.messages[1].text)
//PUMP DISCONNECT 30
smsCommunicatorPlugin.messages = ArrayList()
sms = Sms("1234", "PUMP DISCONNECT 30")
smsCommunicatorPlugin.processSms(sms)
Assert.assertFalse(sms.ignored)
Assert.assertEquals("PUMP DISCONNECT 30", smsCommunicatorPlugin.messages[0].text)
Assert.assertTrue(smsCommunicatorPlugin.messages[1].text.contains("To disconnect pump for"))
passCode = smsCommunicatorPlugin.messageToConfirm?.confirmCode!!
smsCommunicatorPlugin.processSms(Sms("1234", passCode))
Assert.assertEquals(passCode, smsCommunicatorPlugin.messages[2].text)
Assert.assertEquals("Pump disconnected", smsCommunicatorPlugin.messages[3].text)
//PUMP DISCONNECT 30
smsCommunicatorPlugin.messages = ArrayList()
sms = Sms("1234", "PUMP DISCONNECT 200")
smsCommunicatorPlugin.processSms(sms)
Assert.assertFalse(sms.ignored)
Assert.assertEquals("PUMP DISCONNECT 200", smsCommunicatorPlugin.messages[0].text)
Assert.assertTrue(smsCommunicatorPlugin.messages[1].text.contains("To disconnect pump for"))
passCode = smsCommunicatorPlugin.messageToConfirm?.confirmCode!!
smsCommunicatorPlugin.processSms(Sms("1234", passCode))
Assert.assertEquals(passCode, smsCommunicatorPlugin.messages[2].text)
Assert.assertEquals("Pump disconnected", smsCommunicatorPlugin.messages[3].text)
//HELP
smsCommunicatorPlugin.messages = ArrayList()
sms = Sms("1234", "HELP")

View file

@ -143,8 +143,8 @@ class IobCobCalculatorPluginTest : TestBase() {
iobCobCalculatorPlugin.bgReadings = bgReadingList
Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData)
iobCobCalculatorPlugin.createBucketedData()
Assert.assertEquals(bgReadingList[0].date, iobCobCalculatorPlugin.bucketedData[0].date)
Assert.assertEquals(bgReadingList[3].date, iobCobCalculatorPlugin.bucketedData[3].date)
Assert.assertEquals(bgReadingList[0].date, iobCobCalculatorPlugin.bucketedData[0].timestamp)
Assert.assertEquals(bgReadingList[3].date, iobCobCalculatorPlugin.bucketedData[3].timestamp)
Assert.assertEquals(bgReadingList.size.toLong(), iobCobCalculatorPlugin.bucketedData.size.toLong())
// Missing value should be replaced
@ -155,8 +155,8 @@ class IobCobCalculatorPluginTest : TestBase() {
iobCobCalculatorPlugin.bgReadings = bgReadingList
Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData)
iobCobCalculatorPlugin.createBucketedData()
Assert.assertEquals(bgReadingList[0].date, iobCobCalculatorPlugin.bucketedData[0].date)
Assert.assertEquals(bgReadingList[2].date, iobCobCalculatorPlugin.bucketedData[3].date)
Assert.assertEquals(bgReadingList[0].date, iobCobCalculatorPlugin.bucketedData[0].timestamp)
Assert.assertEquals(bgReadingList[2].date, iobCobCalculatorPlugin.bucketedData[3].timestamp)
Assert.assertEquals(bgReadingList.size + 1.toLong(), iobCobCalculatorPlugin.bucketedData.size.toLong())
// drift should be cleared
@ -169,10 +169,10 @@ class IobCobCalculatorPluginTest : TestBase() {
iobCobCalculatorPlugin.bgReadings = bgReadingList
Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData)
iobCobCalculatorPlugin.createBucketedData()
Assert.assertEquals(T.mins(20).msecs(), iobCobCalculatorPlugin.bucketedData[0].date)
Assert.assertEquals(T.mins(15).msecs(), iobCobCalculatorPlugin.bucketedData[1].date)
Assert.assertEquals(T.mins(10).msecs(), iobCobCalculatorPlugin.bucketedData[2].date)
Assert.assertEquals(T.mins(5).msecs(), iobCobCalculatorPlugin.bucketedData[3].date)
Assert.assertEquals(T.mins(20).msecs(), iobCobCalculatorPlugin.bucketedData[0].timestamp)
Assert.assertEquals(T.mins(15).msecs(), iobCobCalculatorPlugin.bucketedData[1].timestamp)
Assert.assertEquals(T.mins(10).msecs(), iobCobCalculatorPlugin.bucketedData[2].timestamp)
Assert.assertEquals(T.mins(5).msecs(), iobCobCalculatorPlugin.bucketedData[3].timestamp)
Assert.assertEquals(bgReadingList.size.toLong(), iobCobCalculatorPlugin.bucketedData.size.toLong())
// bucketed data should return null if not enough bg data
@ -192,8 +192,8 @@ class IobCobCalculatorPluginTest : TestBase() {
iobCobCalculatorPlugin.bgReadings = bgReadingList
Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData)
iobCobCalculatorPlugin.createBucketedData()
Assert.assertEquals(T.mins(50).msecs(), iobCobCalculatorPlugin.bucketedData[0].date)
Assert.assertEquals(T.mins(20).msecs(), iobCobCalculatorPlugin.bucketedData[6].date)
Assert.assertEquals(T.mins(50).msecs(), iobCobCalculatorPlugin.bucketedData[0].timestamp)
Assert.assertEquals(T.mins(20).msecs(), iobCobCalculatorPlugin.bucketedData[6].timestamp)
Assert.assertEquals(7, iobCobCalculatorPlugin.bucketedData.size.toLong())
Assert.assertEquals(100.0, iobCobCalculatorPlugin.bucketedData[0].value, 1.0)
Assert.assertEquals(90.0, iobCobCalculatorPlugin.bucketedData[1].value, 1.0)
@ -208,8 +208,8 @@ class IobCobCalculatorPluginTest : TestBase() {
iobCobCalculatorPlugin.bgReadings = bgReadingList
Assert.assertEquals(false, iobCobCalculatorPlugin.isAbout5minData)
iobCobCalculatorPlugin.createBucketedData()
Assert.assertEquals(T.mins(50).msecs(), iobCobCalculatorPlugin.bucketedData[0].date)
Assert.assertEquals(T.mins(20).msecs(), iobCobCalculatorPlugin.bucketedData[6].date)
Assert.assertEquals(T.mins(50).msecs(), iobCobCalculatorPlugin.bucketedData[0].timestamp)
Assert.assertEquals(T.mins(20).msecs(), iobCobCalculatorPlugin.bucketedData[6].timestamp)
Assert.assertEquals(7, iobCobCalculatorPlugin.bucketedData.size.toLong())
Assert.assertEquals(100.0, iobCobCalculatorPlugin.bucketedData[0].value, 1.0)
Assert.assertEquals(90.0, iobCobCalculatorPlugin.bucketedData[1].value, 1.0)
@ -342,8 +342,8 @@ class IobCobCalculatorPluginTest : TestBase() {
iobCobCalculatorPlugin.bgReadings = bgReadingList
Assert.assertEquals(true, iobCobCalculatorPlugin.isAbout5minData)
iobCobCalculatorPlugin.createBucketedData()
Assert.assertEquals(DateUtil.fromISODateString("2018-09-05T13:34:57Z").time, iobCobCalculatorPlugin.bucketedData[0].date)
Assert.assertEquals(DateUtil.fromISODateString("2018-09-05T03:44:57Z").time, iobCobCalculatorPlugin.bucketedData[iobCobCalculatorPlugin.bucketedData.size - 1].date)
Assert.assertEquals(DateUtil.fromISODateString("2018-09-05T13:34:57Z").time, iobCobCalculatorPlugin.bucketedData[0].timestamp)
Assert.assertEquals(DateUtil.fromISODateString("2018-09-05T03:44:57Z").time, iobCobCalculatorPlugin.bucketedData[iobCobCalculatorPlugin.bucketedData.size - 1].timestamp)
// 5min 4sec data
bgReadingList.clear()

View file

@ -25,6 +25,6 @@ class MsgSettingPumpTimeTest : DanaRTestBase() {
packet.intFromBuff(bytes, 0, 1)
).time
packet.handleMessage(bytes)
Assert.assertEquals(time, danaPump.pumpTime)
Assert.assertEquals(time, danaPump.getPumpTime())
}
}

View file

@ -10,26 +10,26 @@ public class DecimalFormatterTest {
@Test
public void to0DecimalTest() {
Assert.assertEquals("1", DecimalFormatter.to0Decimal(1.33d));
Assert.assertEquals("1U", DecimalFormatter.to0Decimal(1.33d, "U"));
Assert.assertEquals("1", DecimalFormatter.to0Decimal(1.33d).replace(",", "."));
Assert.assertEquals("1U", DecimalFormatter.to0Decimal(1.33d, "U").replace(",", "."));
}
@Test
public void to1DecimalTest() {
Assert.assertEquals("1.3", DecimalFormatter.to1Decimal(1.33d));
Assert.assertEquals("1.3U", DecimalFormatter.to1Decimal(1.33d, "U"));
Assert.assertEquals("1.3", DecimalFormatter.to1Decimal(1.33d).replace(",", "."));
Assert.assertEquals("1.3U", DecimalFormatter.to1Decimal(1.33d, "U").replace(",", "."));
}
@Test
public void to2DecimalTest() {
Assert.assertEquals("1.33", DecimalFormatter.to2Decimal(1.3333d));
Assert.assertEquals("1.33U", DecimalFormatter.to2Decimal(1.3333d, "U"));
Assert.assertEquals("1.33", DecimalFormatter.to2Decimal(1.3333d).replace(",", "."));
Assert.assertEquals("1.33U", DecimalFormatter.to2Decimal(1.3333d, "U").replace(",", "."));
}
@Test
public void to3DecimalTest() {
Assert.assertEquals("1.333", DecimalFormatter.to3Decimal(1.3333d));
Assert.assertEquals("1.333U", DecimalFormatter.to3Decimal(1.3333d, "U"));
Assert.assertEquals("1.333", DecimalFormatter.to3Decimal(1.3333d).replace(",", "."));
Assert.assertEquals("1.333U", DecimalFormatter.to3Decimal(1.3333d, "U").replace(",", "."));
}
@Test

View file

@ -9,20 +9,19 @@ buildscript {
rxkotlin_version = '2.4.0'
room_version = '2.2.5'
lifecycle_version = '2.2.0'
dagger_version = '2.27'
coroutinesVersion = '1.3.5'
activityVersion = '1.2.0-alpha04'
dagger_version = '2.28'
coroutinesVersion = '1.3.7'
activityVersion = '1.2.0-alpha05'
ormLiteVersion = "4.46"
}
repositories {
google()
jcenter()
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.3'
classpath 'com.google.gms:google-services:4.3.3'
classpath 'io.fabric.tools:gradle:1.31.2'
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.1.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
@ -58,3 +57,9 @@ allprojects {
task clean(type: Delete) {
delete rootProject.buildDir
}
subprojects {
tasks.withType(Test) {
maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1
}
}

View file

@ -58,12 +58,11 @@ dependencies {
//Logger
implementation 'org.slf4j:slf4j-api:1.7.30'
//Fabric
implementation 'com.google.firebase:firebase-core:17.4.0'
implementation('com.crashlytics.sdk.android:crashlytics:2.10.1@aar') {
transitive = true;
}
implementation 'com.google.firebase:firebase-analytics-ktx:17.4.2'
implementation 'com.google.firebase:firebase-crashlytics:17.0.0'
//RxBus
implementation "io.reactivex.rxjava2:rxandroid:2.1.1"
implementation "io.reactivex.rxjava2:rxandroid:${rxandroid_version}"
implementation 'org.apache.commons:commons-lang3:3.10'
// Graphview cannot be upgraded

View file

@ -2,7 +2,7 @@ package info.nightscout.androidaps.activities
import android.content.Context
import dagger.android.support.DaggerAppCompatActivity
import info.nightscout.androidaps.utils.LocaleHelper
import info.nightscout.androidaps.utils.locale.LocaleHelper
open class DialogAppCompatActivity : DaggerAppCompatActivity() {
public override fun attachBaseContext(newBase: Context) {

View file

@ -4,7 +4,7 @@ import android.content.Context
import android.os.Bundle
import dagger.android.support.DaggerAppCompatActivity
import info.nightscout.androidaps.core.R
import info.nightscout.androidaps.utils.LocaleHelper
import info.nightscout.androidaps.utils.locale.LocaleHelper
//@Suppress("registered")
open class NoSplashAppCompatActivity : DaggerAppCompatActivity() {

View file

@ -82,7 +82,7 @@ public class Profile {
if (units != null)
this.units = units;
else {
fabricPrivacy.log("Profile failover failed too");
fabricPrivacy.logCustom("Profile failover failed too");
this.units = Constants.MGDL;
}
}
@ -100,6 +100,7 @@ public class Profile {
}
protected void init(JSONObject json, int percentage, int timeshift) {
if (json == null) return;
units = null;
dia = Constants.defaultDIA;
timeZone = TimeZone.getDefault();
@ -404,6 +405,10 @@ public class Profile {
return toMgdl(getIsfTimeFromMidnight(secondsFromMidnight(time)), units);
}
public double getIsfMgdlTimeFromMidnight(int timeAsSeconds) {
return toMgdl(getIsfTimeFromMidnight(timeAsSeconds), units);
}
public double getIsfTimeFromMidnight(int timeAsSeconds) {
if (isf_v == null)
isf_v = convertToSparseArray(isf);
@ -525,7 +530,6 @@ public class Profile {
public double getTargetMgdl(int timeAsSeconds) {
return toMgdl((getTargetLowTimeFromMidnight(timeAsSeconds) + getTargetHighTimeFromMidnight(timeAsSeconds)) / 2, units);
}
public double getTargetLowMgdl() {
return toMgdl(getTargetLowTimeFromMidnight(secondsFromMidnight()), units);
}

View file

@ -1,3 +1,3 @@
package info.nightscout.androidaps.events
class EventRebuildTabs @JvmOverloads constructor(var recreate: Boolean = false) : Event()
class EventRebuildTabs constructor(var recreate: Boolean = false) : Event()

View file

@ -119,4 +119,8 @@ public interface PumpInterface {
default boolean isUnreachableAlertTimeoutExceeded(long alertTimeoutMilliseconds) {
return false;
}
default boolean setNeutralTempAtFullHour() {
return false;
}
}

View file

@ -12,19 +12,7 @@ class L @Inject constructor(
private var logElements: MutableList<LogElement> = ArrayList()
companion object {
@Deprecated("Use Dagger")
lateinit var instance: L
@Deprecated("Use Dagger")
@JvmStatic
fun isEnabled(ltag: LTag): Boolean {
return instance.findByName(ltag.name).enabled
}
}
init {
instance= this
LTag.values().forEach { logElements.add(LogElement(it, sp)) }
}

Some files were not shown because too many files have changed in this diff Show more